]> Git Repo - qemu.git/blob - usb-linux.c
softfloat-native: remove
[qemu.git] / usb-linux.c
1 /*
2  * Linux host USB redirector
3  *
4  * Copyright (c) 2005 Fabrice Bellard
5  *
6  * Copyright (c) 2008 Max Krasnyansky
7  *      Support for host device auto connect & disconnect
8  *      Major rewrite to support fully async operation
9  *
10  * Copyright 2008 TJ <[email protected]>
11  *      Added flexible support for /dev/bus/usb /sys/bus/usb/devices in addition
12  *      to the legacy /proc/bus/usb USB device discovery and handling
13  *
14  * Permission is hereby granted, free of charge, to any person obtaining a copy
15  * of this software and associated documentation files (the "Software"), to deal
16  * in the Software without restriction, including without limitation the rights
17  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
18  * copies of the Software, and to permit persons to whom the Software is
19  * furnished to do so, subject to the following conditions:
20  *
21  * The above copyright notice and this permission notice shall be included in
22  * all copies or substantial portions of the Software.
23  *
24  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
25  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
26  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
27  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
28  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
29  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
30  * THE SOFTWARE.
31  */
32
33 #include "qemu-common.h"
34 #include "qemu-timer.h"
35 #include "monitor.h"
36 #include "sysemu.h"
37
38 #include <dirent.h>
39 #include <sys/ioctl.h>
40 #include <signal.h>
41
42 #include <linux/usbdevice_fs.h>
43 #include <linux/version.h>
44 #include "hw/usb.h"
45
46 /* We redefine it to avoid version problems */
47 struct usb_ctrltransfer {
48     uint8_t  bRequestType;
49     uint8_t  bRequest;
50     uint16_t wValue;
51     uint16_t wIndex;
52     uint16_t wLength;
53     uint32_t timeout;
54     void *data;
55 };
56
57 typedef int USBScanFunc(void *opaque, int bus_num, int addr, char *port,
58                         int class_id, int vendor_id, int product_id,
59                         const char *product_name, int speed);
60
61 //#define DEBUG
62
63 #ifdef DEBUG
64 #define DPRINTF printf
65 #else
66 #define DPRINTF(...)
67 #endif
68
69 #define USBDBG_DEVOPENED "husb: opened %s/devices\n"
70
71 #define USBPROCBUS_PATH "/proc/bus/usb"
72 #define PRODUCT_NAME_SZ 32
73 #define MAX_ENDPOINTS 15
74 #define MAX_PORTLEN 16
75 #define USBDEVBUS_PATH "/dev/bus/usb"
76 #define USBSYSBUS_PATH "/sys/bus/usb"
77
78 static char *usb_host_device_path;
79
80 #define USB_FS_NONE 0
81 #define USB_FS_PROC 1
82 #define USB_FS_DEV 2
83 #define USB_FS_SYS 3
84
85 static int usb_fs_type;
86
87 /* endpoint association data */
88 #define ISO_FRAME_DESC_PER_URB 32
89 #define ISO_URB_COUNT 3
90 #define INVALID_EP_TYPE 255
91
92 /* devio.c limits single requests to 16k */
93 #define MAX_USBFS_BUFFER_SIZE 16384
94
95 typedef struct AsyncURB AsyncURB;
96
97 struct endp_data {
98     uint8_t type;
99     uint8_t halted;
100     uint8_t iso_started;
101     AsyncURB *iso_urb;
102     int iso_urb_idx;
103     int iso_buffer_used;
104     int max_packet_size;
105 };
106
107 struct USBAutoFilter {
108     uint32_t bus_num;
109     uint32_t addr;
110     char     *port;
111     uint32_t vendor_id;
112     uint32_t product_id;
113 };
114
115 typedef struct USBHostDevice {
116     USBDevice dev;
117     int       fd;
118
119     uint8_t   descr[1024];
120     int       descr_len;
121     int       configuration;
122     int       ninterfaces;
123     int       closing;
124     Notifier  exit;
125
126     struct endp_data endp_table[MAX_ENDPOINTS];
127     QLIST_HEAD(, AsyncURB) aurbs;
128
129     /* Host side address */
130     int bus_num;
131     int addr;
132     char port[MAX_PORTLEN];
133     struct USBAutoFilter match;
134
135     QTAILQ_ENTRY(USBHostDevice) next;
136 } USBHostDevice;
137
138 static QTAILQ_HEAD(, USBHostDevice) hostdevs = QTAILQ_HEAD_INITIALIZER(hostdevs);
139
140 static int usb_host_close(USBHostDevice *dev);
141 static int parse_filter(const char *spec, struct USBAutoFilter *f);
142 static void usb_host_auto_check(void *unused);
143 static int usb_host_read_file(char *line, size_t line_size,
144                             const char *device_file, const char *device_name);
145
146 static int is_isoc(USBHostDevice *s, int ep)
147 {
148     return s->endp_table[ep - 1].type == USBDEVFS_URB_TYPE_ISO;
149 }
150
151 static int is_valid(USBHostDevice *s, int ep)
152 {
153     return s->endp_table[ep - 1].type != INVALID_EP_TYPE;
154 }
155
156 static int is_halted(USBHostDevice *s, int ep)
157 {
158     return s->endp_table[ep - 1].halted;
159 }
160
161 static void clear_halt(USBHostDevice *s, int ep)
162 {
163     s->endp_table[ep - 1].halted = 0;
164 }
165
166 static void set_halt(USBHostDevice *s, int ep)
167 {
168     s->endp_table[ep - 1].halted = 1;
169 }
170
171 static int is_iso_started(USBHostDevice *s, int ep)
172 {
173     return s->endp_table[ep - 1].iso_started;
174 }
175
176 static void clear_iso_started(USBHostDevice *s, int ep)
177 {
178     s->endp_table[ep - 1].iso_started = 0;
179 }
180
181 static void set_iso_started(USBHostDevice *s, int ep)
182 {
183     s->endp_table[ep - 1].iso_started = 1;
184 }
185
186 static void set_iso_urb(USBHostDevice *s, int ep, AsyncURB *iso_urb)
187 {
188     s->endp_table[ep - 1].iso_urb = iso_urb;
189 }
190
191 static AsyncURB *get_iso_urb(USBHostDevice *s, int ep)
192 {
193     return s->endp_table[ep - 1].iso_urb;
194 }
195
196 static void set_iso_urb_idx(USBHostDevice *s, int ep, int i)
197 {
198     s->endp_table[ep - 1].iso_urb_idx = i;
199 }
200
201 static int get_iso_urb_idx(USBHostDevice *s, int ep)
202 {
203     return s->endp_table[ep - 1].iso_urb_idx;
204 }
205
206 static void set_iso_buffer_used(USBHostDevice *s, int ep, int i)
207 {
208     s->endp_table[ep - 1].iso_buffer_used = i;
209 }
210
211 static int get_iso_buffer_used(USBHostDevice *s, int ep)
212 {
213     return s->endp_table[ep - 1].iso_buffer_used;
214 }
215
216 static void set_max_packet_size(USBHostDevice *s, int ep, uint8_t *descriptor)
217 {
218     int raw = descriptor[4] + (descriptor[5] << 8);
219     int size, microframes;
220
221     size = raw & 0x7ff;
222     switch ((raw >> 11) & 3) {
223     case 1:  microframes = 2; break;
224     case 2:  microframes = 3; break;
225     default: microframes = 1; break;
226     }
227     DPRINTF("husb: max packet size: 0x%x -> %d x %d\n",
228             raw, microframes, size);
229     s->endp_table[ep - 1].max_packet_size = size * microframes;
230 }
231
232 static int get_max_packet_size(USBHostDevice *s, int ep)
233 {
234     return s->endp_table[ep - 1].max_packet_size;
235 }
236
237 /*
238  * Async URB state.
239  * We always allocate iso packet descriptors even for bulk transfers
240  * to simplify allocation and casts.
241  */
242 struct AsyncURB
243 {
244     struct usbdevfs_urb urb;
245     struct usbdevfs_iso_packet_desc isocpd[ISO_FRAME_DESC_PER_URB];
246     USBHostDevice *hdev;
247     QLIST_ENTRY(AsyncURB) next;
248
249     /* For regular async urbs */
250     USBPacket     *packet;
251     int more; /* large transfer, more urbs follow */
252
253     /* For buffered iso handling */
254     int iso_frame_idx; /* -1 means in flight */
255 };
256
257 static AsyncURB *async_alloc(USBHostDevice *s)
258 {
259     AsyncURB *aurb = qemu_mallocz(sizeof(AsyncURB));
260     aurb->hdev = s;
261     QLIST_INSERT_HEAD(&s->aurbs, aurb, next);
262     return aurb;
263 }
264
265 static void async_free(AsyncURB *aurb)
266 {
267     QLIST_REMOVE(aurb, next);
268     qemu_free(aurb);
269 }
270
271 static void async_complete(void *opaque)
272 {
273     USBHostDevice *s = opaque;
274     AsyncURB *aurb;
275
276     while (1) {
277         USBPacket *p;
278
279         int r = ioctl(s->fd, USBDEVFS_REAPURBNDELAY, &aurb);
280         if (r < 0) {
281             if (errno == EAGAIN) {
282                 return;
283             }
284             if (errno == ENODEV && !s->closing) {
285                 printf("husb: device %d.%d disconnected\n",
286                        s->bus_num, s->addr);
287                 usb_host_close(s);
288                 usb_host_auto_check(NULL);
289                 return;
290             }
291
292             DPRINTF("husb: async. reap urb failed errno %d\n", errno);
293             return;
294         }
295
296         DPRINTF("husb: async completed. aurb %p status %d alen %d\n",
297                 aurb, aurb->urb.status, aurb->urb.actual_length);
298
299         /* If this is a buffered iso urb mark it as complete and don't do
300            anything else (it is handled further in usb_host_handle_iso_data) */
301         if (aurb->iso_frame_idx == -1) {
302             if (aurb->urb.status == -EPIPE) {
303                 set_halt(s, aurb->urb.endpoint & 0xf);
304             }
305             aurb->iso_frame_idx = 0;
306             continue;
307         }
308
309         p = aurb->packet;
310
311         if (p) {
312             switch (aurb->urb.status) {
313             case 0:
314                 p->len += aurb->urb.actual_length;
315                 break;
316
317             case -EPIPE:
318                 set_halt(s, p->devep);
319                 p->len = USB_RET_STALL;
320                 break;
321
322             default:
323                 p->len = USB_RET_NAK;
324                 break;
325             }
326
327             if (aurb->urb.type == USBDEVFS_URB_TYPE_CONTROL) {
328                 usb_generic_async_ctrl_complete(&s->dev, p);
329             } else if (!aurb->more) {
330                 usb_packet_complete(&s->dev, p);
331             }
332         }
333
334         async_free(aurb);
335     }
336 }
337
338 static void usb_host_async_cancel(USBDevice *dev, USBPacket *p)
339 {
340     USBHostDevice *s = DO_UPCAST(USBHostDevice, dev, dev);
341     AsyncURB *aurb;
342
343     QLIST_FOREACH(aurb, &s->aurbs, next) {
344         if (p != aurb->packet) {
345             continue;
346         }
347
348         DPRINTF("husb: async cancel: packet %p, aurb %p\n", p, aurb);
349
350         /* Mark it as dead (see async_complete above) */
351         aurb->packet = NULL;
352
353         int r = ioctl(s->fd, USBDEVFS_DISCARDURB, aurb);
354         if (r < 0) {
355             DPRINTF("husb: async. discard urb failed errno %d\n", errno);
356         }
357     }
358 }
359
360 static int usb_host_claim_interfaces(USBHostDevice *dev, int configuration)
361 {
362     int dev_descr_len, config_descr_len;
363     int interface, nb_interfaces;
364     int ret, i;
365
366     if (configuration == 0) /* address state - ignore */
367         return 1;
368
369     DPRINTF("husb: claiming interfaces. config %d\n", configuration);
370
371     i = 0;
372     dev_descr_len = dev->descr[0];
373     if (dev_descr_len > dev->descr_len) {
374         goto fail;
375     }
376
377     i += dev_descr_len;
378     while (i < dev->descr_len) {
379         DPRINTF("husb: i is %d, descr_len is %d, dl %d, dt %d\n",
380                 i, dev->descr_len,
381                dev->descr[i], dev->descr[i+1]);
382
383         if (dev->descr[i+1] != USB_DT_CONFIG) {
384             i += dev->descr[i];
385             continue;
386         }
387         config_descr_len = dev->descr[i];
388
389         printf("husb: config #%d need %d\n", dev->descr[i + 5], configuration);
390
391         if (configuration < 0 || configuration == dev->descr[i + 5]) {
392             configuration = dev->descr[i + 5];
393             break;
394         }
395
396         i += config_descr_len;
397     }
398
399     if (i >= dev->descr_len) {
400         fprintf(stderr,
401                 "husb: update iface failed. no matching configuration\n");
402         goto fail;
403     }
404     nb_interfaces = dev->descr[i + 4];
405
406 #ifdef USBDEVFS_DISCONNECT
407     /* earlier Linux 2.4 do not support that */
408     {
409         struct usbdevfs_ioctl ctrl;
410         for (interface = 0; interface < nb_interfaces; interface++) {
411             ctrl.ioctl_code = USBDEVFS_DISCONNECT;
412             ctrl.ifno = interface;
413             ctrl.data = 0;
414             ret = ioctl(dev->fd, USBDEVFS_IOCTL, &ctrl);
415             if (ret < 0 && errno != ENODATA) {
416                 perror("USBDEVFS_DISCONNECT");
417                 goto fail;
418             }
419         }
420     }
421 #endif
422
423     /* XXX: only grab if all interfaces are free */
424     for (interface = 0; interface < nb_interfaces; interface++) {
425         ret = ioctl(dev->fd, USBDEVFS_CLAIMINTERFACE, &interface);
426         if (ret < 0) {
427             if (errno == EBUSY) {
428                 printf("husb: update iface. device already grabbed\n");
429             } else {
430                 perror("husb: failed to claim interface");
431             }
432         fail:
433             return 0;
434         }
435     }
436
437     printf("husb: %d interfaces claimed for configuration %d\n",
438            nb_interfaces, configuration);
439
440     dev->ninterfaces   = nb_interfaces;
441     dev->configuration = configuration;
442     return 1;
443 }
444
445 static int usb_host_release_interfaces(USBHostDevice *s)
446 {
447     int ret, i;
448
449     DPRINTF("husb: releasing interfaces\n");
450
451     for (i = 0; i < s->ninterfaces; i++) {
452         ret = ioctl(s->fd, USBDEVFS_RELEASEINTERFACE, &i);
453         if (ret < 0) {
454             perror("husb: failed to release interface");
455             return 0;
456         }
457     }
458
459     return 1;
460 }
461
462 static void usb_host_handle_reset(USBDevice *dev)
463 {
464     USBHostDevice *s = DO_UPCAST(USBHostDevice, dev, dev);
465
466     DPRINTF("husb: reset device %u.%u\n", s->bus_num, s->addr);
467
468     ioctl(s->fd, USBDEVFS_RESET);
469
470     usb_host_claim_interfaces(s, s->configuration);
471 }
472
473 static void usb_host_handle_destroy(USBDevice *dev)
474 {
475     USBHostDevice *s = (USBHostDevice *)dev;
476
477     usb_host_close(s);
478     QTAILQ_REMOVE(&hostdevs, s, next);
479     qemu_remove_exit_notifier(&s->exit);
480 }
481
482 static int usb_linux_update_endp_table(USBHostDevice *s);
483
484 /* iso data is special, we need to keep enough urbs in flight to make sure
485    that the controller never runs out of them, otherwise the device will
486    likely suffer a buffer underrun / overrun. */
487 static AsyncURB *usb_host_alloc_iso(USBHostDevice *s, uint8_t ep, int in)
488 {
489     AsyncURB *aurb;
490     int i, j, len = get_max_packet_size(s, ep);
491
492     aurb = qemu_mallocz(ISO_URB_COUNT * sizeof(*aurb));
493     for (i = 0; i < ISO_URB_COUNT; i++) {
494         aurb[i].urb.endpoint      = ep;
495         aurb[i].urb.buffer_length = ISO_FRAME_DESC_PER_URB * len;
496         aurb[i].urb.buffer        = qemu_malloc(aurb[i].urb.buffer_length);
497         aurb[i].urb.type          = USBDEVFS_URB_TYPE_ISO;
498         aurb[i].urb.flags         = USBDEVFS_URB_ISO_ASAP;
499         aurb[i].urb.number_of_packets = ISO_FRAME_DESC_PER_URB;
500         for (j = 0 ; j < ISO_FRAME_DESC_PER_URB; j++)
501             aurb[i].urb.iso_frame_desc[j].length = len;
502         if (in) {
503             aurb[i].urb.endpoint |= 0x80;
504             /* Mark as fully consumed (idle) */
505             aurb[i].iso_frame_idx = ISO_FRAME_DESC_PER_URB;
506         }
507     }
508     set_iso_urb(s, ep, aurb);
509
510     return aurb;
511 }
512
513 static void usb_host_stop_n_free_iso(USBHostDevice *s, uint8_t ep)
514 {
515     AsyncURB *aurb;
516     int i, ret, killed = 0, free = 1;
517
518     aurb = get_iso_urb(s, ep);
519     if (!aurb) {
520         return;
521     }
522
523     for (i = 0; i < ISO_URB_COUNT; i++) {
524         /* in flight? */
525         if (aurb[i].iso_frame_idx == -1) {
526             ret = ioctl(s->fd, USBDEVFS_DISCARDURB, &aurb[i]);
527             if (ret < 0) {
528                 printf("husb: discard isoc in urb failed errno %d\n", errno);
529                 free = 0;
530                 continue;
531             }
532             killed++;
533         }
534     }
535
536     /* Make sure any urbs we've killed are reaped before we free them */
537     if (killed) {
538         async_complete(s);
539     }
540
541     for (i = 0; i < ISO_URB_COUNT; i++) {
542         qemu_free(aurb[i].urb.buffer);
543     }
544
545     if (free)
546         qemu_free(aurb);
547     else
548         printf("husb: leaking iso urbs because of discard failure\n");
549     set_iso_urb(s, ep, NULL);
550     set_iso_urb_idx(s, ep, 0);
551     clear_iso_started(s, ep);
552 }
553
554 static int urb_status_to_usb_ret(int status)
555 {
556     switch (status) {
557     case -EPIPE:
558         return USB_RET_STALL;
559     default:
560         return USB_RET_NAK;
561     }
562 }
563
564 static int usb_host_handle_iso_data(USBHostDevice *s, USBPacket *p, int in)
565 {
566     AsyncURB *aurb;
567     int i, j, ret, max_packet_size, offset, len = 0;
568
569     max_packet_size = get_max_packet_size(s, p->devep);
570     if (max_packet_size == 0)
571         return USB_RET_NAK;
572
573     aurb = get_iso_urb(s, p->devep);
574     if (!aurb) {
575         aurb = usb_host_alloc_iso(s, p->devep, in);
576     }
577
578     i = get_iso_urb_idx(s, p->devep);
579     j = aurb[i].iso_frame_idx;
580     if (j >= 0 && j < ISO_FRAME_DESC_PER_URB) {
581         if (in) {
582             /* Check urb status  */
583             if (aurb[i].urb.status) {
584                 len = urb_status_to_usb_ret(aurb[i].urb.status);
585                 /* Move to the next urb */
586                 aurb[i].iso_frame_idx = ISO_FRAME_DESC_PER_URB - 1;
587             /* Check frame status */
588             } else if (aurb[i].urb.iso_frame_desc[j].status) {
589                 len = urb_status_to_usb_ret(
590                                         aurb[i].urb.iso_frame_desc[j].status);
591             /* Check the frame fits */
592             } else if (aurb[i].urb.iso_frame_desc[j].actual_length > p->len) {
593                 printf("husb: received iso data is larger then packet\n");
594                 len = USB_RET_NAK;
595             /* All good copy data over */
596             } else {
597                 len = aurb[i].urb.iso_frame_desc[j].actual_length;
598                 memcpy(p->data,
599                        aurb[i].urb.buffer +
600                            j * aurb[i].urb.iso_frame_desc[0].length,
601                        len);
602             }
603         } else {
604             len = p->len;
605             offset = (j == 0) ? 0 : get_iso_buffer_used(s, p->devep);
606
607             /* Check the frame fits */
608             if (len > max_packet_size) {
609                 printf("husb: send iso data is larger then max packet size\n");
610                 return USB_RET_NAK;
611             }
612
613             /* All good copy data over */
614             memcpy(aurb[i].urb.buffer + offset, p->data, len);
615             aurb[i].urb.iso_frame_desc[j].length = len;
616             offset += len;
617             set_iso_buffer_used(s, p->devep, offset);
618
619             /* Start the stream once we have buffered enough data */
620             if (!is_iso_started(s, p->devep) && i == 1 && j == 8) {
621                 set_iso_started(s, p->devep);
622             }
623         }
624         aurb[i].iso_frame_idx++;
625         if (aurb[i].iso_frame_idx == ISO_FRAME_DESC_PER_URB) {
626             i = (i + 1) % ISO_URB_COUNT;
627             set_iso_urb_idx(s, p->devep, i);
628         }
629     } else {
630         if (in) {
631             set_iso_started(s, p->devep);
632         } else {
633             DPRINTF("hubs: iso out error no free buffer, dropping packet\n");
634         }
635     }
636
637     if (is_iso_started(s, p->devep)) {
638         /* (Re)-submit all fully consumed / filled urbs */
639         for (i = 0; i < ISO_URB_COUNT; i++) {
640             if (aurb[i].iso_frame_idx == ISO_FRAME_DESC_PER_URB) {
641                 ret = ioctl(s->fd, USBDEVFS_SUBMITURB, &aurb[i]);
642                 if (ret < 0) {
643                     printf("husb error submitting iso urb %d: %d\n", i, errno);
644                     if (!in || len == 0) {
645                         switch(errno) {
646                         case ETIMEDOUT:
647                             len = USB_RET_NAK;
648                             break;
649                         case EPIPE:
650                         default:
651                             len = USB_RET_STALL;
652                         }
653                     }
654                     break;
655                 }
656                 aurb[i].iso_frame_idx = -1;
657             }
658         }
659     }
660
661     return len;
662 }
663
664 static int usb_host_handle_data(USBDevice *dev, USBPacket *p)
665 {
666     USBHostDevice *s = DO_UPCAST(USBHostDevice, dev, dev);
667     struct usbdevfs_urb *urb;
668     AsyncURB *aurb;
669     int ret, rem;
670     uint8_t *pbuf;
671     uint8_t ep;
672
673     if (!is_valid(s, p->devep)) {
674         return USB_RET_NAK;
675     }
676
677     if (p->pid == USB_TOKEN_IN) {
678         ep = p->devep | 0x80;
679     } else {
680         ep = p->devep;
681     }
682
683     if (is_halted(s, p->devep)) {
684         ret = ioctl(s->fd, USBDEVFS_CLEAR_HALT, &ep);
685         if (ret < 0) {
686             DPRINTF("husb: failed to clear halt. ep 0x%x errno %d\n",
687                    ep, errno);
688             return USB_RET_NAK;
689         }
690         clear_halt(s, p->devep);
691     }
692
693     if (is_isoc(s, p->devep)) {
694         return usb_host_handle_iso_data(s, p, p->pid == USB_TOKEN_IN);
695     }
696
697     rem = p->len;
698     pbuf = p->data;
699     p->len = 0;
700     while (rem) {
701         aurb = async_alloc(s);
702         aurb->packet = p;
703
704         urb = &aurb->urb;
705         urb->endpoint      = ep;
706         urb->type          = USBDEVFS_URB_TYPE_BULK;
707         urb->usercontext   = s;
708         urb->buffer        = pbuf;
709
710         if (rem > MAX_USBFS_BUFFER_SIZE) {
711             urb->buffer_length = MAX_USBFS_BUFFER_SIZE;
712             aurb->more         = 1;
713         } else {
714             urb->buffer_length = rem;
715             aurb->more         = 0;
716         }
717         pbuf += urb->buffer_length;
718         rem  -= urb->buffer_length;
719
720         ret = ioctl(s->fd, USBDEVFS_SUBMITURB, urb);
721
722         DPRINTF("husb: data submit: ep 0x%x, len %u, more %d, packet %p, aurb %p\n",
723                 urb->endpoint, urb->buffer_length, aurb->more, p, aurb);
724
725         if (ret < 0) {
726             DPRINTF("husb: submit failed. errno %d\n", errno);
727             async_free(aurb);
728
729             switch(errno) {
730             case ETIMEDOUT:
731                 return USB_RET_NAK;
732             case EPIPE:
733             default:
734                 return USB_RET_STALL;
735             }
736         }
737     }
738
739     return USB_RET_ASYNC;
740 }
741
742 static int ctrl_error(void)
743 {
744     if (errno == ETIMEDOUT) {
745         return USB_RET_NAK;
746     } else {
747         return USB_RET_STALL;
748     }
749 }
750
751 static int usb_host_set_address(USBHostDevice *s, int addr)
752 {
753     DPRINTF("husb: ctrl set addr %u\n", addr);
754     s->dev.addr = addr;
755     return 0;
756 }
757
758 static int usb_host_set_config(USBHostDevice *s, int config)
759 {
760     usb_host_release_interfaces(s);
761
762     int ret = ioctl(s->fd, USBDEVFS_SETCONFIGURATION, &config);
763
764     DPRINTF("husb: ctrl set config %d ret %d errno %d\n", config, ret, errno);
765
766     if (ret < 0) {
767         return ctrl_error();
768     }
769     usb_host_claim_interfaces(s, config);
770     return 0;
771 }
772
773 static int usb_host_set_interface(USBHostDevice *s, int iface, int alt)
774 {
775     struct usbdevfs_setinterface si;
776     int i, ret;
777
778     for (i = 1; i <= MAX_ENDPOINTS; i++) {
779         if (is_isoc(s, i)) {
780             usb_host_stop_n_free_iso(s, i);
781         }
782     }
783
784     si.interface  = iface;
785     si.altsetting = alt;
786     ret = ioctl(s->fd, USBDEVFS_SETINTERFACE, &si);
787
788     DPRINTF("husb: ctrl set iface %d altset %d ret %d errno %d\n",
789             iface, alt, ret, errno);
790
791     if (ret < 0) {
792         return ctrl_error();
793     }
794     usb_linux_update_endp_table(s);
795     return 0;
796 }
797
798 static int usb_host_handle_control(USBDevice *dev, USBPacket *p,
799                int request, int value, int index, int length, uint8_t *data)
800 {
801     USBHostDevice *s = DO_UPCAST(USBHostDevice, dev, dev);
802     struct usbdevfs_urb *urb;
803     AsyncURB *aurb;
804     int ret;
805
806     /*
807      * Process certain standard device requests.
808      * These are infrequent and are processed synchronously.
809      */
810
811     /* Note request is (bRequestType << 8) | bRequest */
812     DPRINTF("husb: ctrl type 0x%x req 0x%x val 0x%x index %u len %u\n",
813             request >> 8, request & 0xff, value, index, length);
814
815     switch (request) {
816     case DeviceOutRequest | USB_REQ_SET_ADDRESS:
817         return usb_host_set_address(s, value);
818
819     case DeviceOutRequest | USB_REQ_SET_CONFIGURATION:
820         return usb_host_set_config(s, value & 0xff);
821
822     case InterfaceOutRequest | USB_REQ_SET_INTERFACE:
823         return usb_host_set_interface(s, index, value);
824     }
825
826     /* The rest are asynchronous */
827
828     if (length > sizeof(dev->data_buf)) {
829         fprintf(stderr, "husb: ctrl buffer too small (%d > %zu)\n",
830                 length, sizeof(dev->data_buf));
831         return USB_RET_STALL;
832     }
833
834     aurb = async_alloc(s);
835     aurb->packet = p;
836
837     /*
838      * Setup ctrl transfer.
839      *
840      * s->ctrl is laid out such that data buffer immediately follows
841      * 'req' struct which is exactly what usbdevfs expects.
842      */
843     urb = &aurb->urb;
844
845     urb->type     = USBDEVFS_URB_TYPE_CONTROL;
846     urb->endpoint = p->devep;
847
848     urb->buffer        = &dev->setup_buf;
849     urb->buffer_length = length + 8;
850
851     urb->usercontext = s;
852
853     ret = ioctl(s->fd, USBDEVFS_SUBMITURB, urb);
854
855     DPRINTF("husb: submit ctrl. len %u aurb %p\n", urb->buffer_length, aurb);
856
857     if (ret < 0) {
858         DPRINTF("husb: submit failed. errno %d\n", errno);
859         async_free(aurb);
860
861         switch(errno) {
862         case ETIMEDOUT:
863             return USB_RET_NAK;
864         case EPIPE:
865         default:
866             return USB_RET_STALL;
867         }
868     }
869
870     return USB_RET_ASYNC;
871 }
872
873 static int usb_linux_get_configuration(USBHostDevice *s)
874 {
875     uint8_t configuration;
876     struct usb_ctrltransfer ct;
877     int ret;
878
879     if (usb_fs_type == USB_FS_SYS) {
880         char device_name[32], line[1024];
881         int configuration;
882
883         sprintf(device_name, "%d-%s", s->bus_num, s->port);
884
885         if (!usb_host_read_file(line, sizeof(line), "bConfigurationValue",
886                                 device_name)) {
887             goto usbdevfs;
888         }
889         if (sscanf(line, "%d", &configuration) != 1) {
890             goto usbdevfs;
891         }
892         return configuration;
893     }
894
895 usbdevfs:
896     ct.bRequestType = USB_DIR_IN;
897     ct.bRequest = USB_REQ_GET_CONFIGURATION;
898     ct.wValue = 0;
899     ct.wIndex = 0;
900     ct.wLength = 1;
901     ct.data = &configuration;
902     ct.timeout = 50;
903
904     ret = ioctl(s->fd, USBDEVFS_CONTROL, &ct);
905     if (ret < 0) {
906         perror("usb_linux_get_configuration");
907         return -1;
908     }
909
910     /* in address state */
911     if (configuration == 0) {
912         return -1;
913     }
914
915     return configuration;
916 }
917
918 static uint8_t usb_linux_get_alt_setting(USBHostDevice *s,
919     uint8_t configuration, uint8_t interface)
920 {
921     uint8_t alt_setting;
922     struct usb_ctrltransfer ct;
923     int ret;
924
925     if (usb_fs_type == USB_FS_SYS) {
926         char device_name[64], line[1024];
927         int alt_setting;
928
929         sprintf(device_name, "%d-%s:%d.%d", s->bus_num, s->port,
930                 (int)configuration, (int)interface);
931
932         if (!usb_host_read_file(line, sizeof(line), "bAlternateSetting",
933                                 device_name)) {
934             goto usbdevfs;
935         }
936         if (sscanf(line, "%d", &alt_setting) != 1) {
937             goto usbdevfs;
938         }
939         return alt_setting;
940     }
941
942 usbdevfs:
943     ct.bRequestType = USB_DIR_IN | USB_RECIP_INTERFACE;
944     ct.bRequest = USB_REQ_GET_INTERFACE;
945     ct.wValue = 0;
946     ct.wIndex = interface;
947     ct.wLength = 1;
948     ct.data = &alt_setting;
949     ct.timeout = 50;
950     ret = ioctl(s->fd, USBDEVFS_CONTROL, &ct);
951     if (ret < 0) {
952         /* Assume alt 0 on error */
953         return 0;
954     }
955
956     return alt_setting;
957 }
958
959 /* returns 1 on problem encountered or 0 for success */
960 static int usb_linux_update_endp_table(USBHostDevice *s)
961 {
962     uint8_t *descriptors;
963     uint8_t devep, type, configuration, alt_interface;
964     int interface, length, i;
965
966     for (i = 0; i < MAX_ENDPOINTS; i++)
967         s->endp_table[i].type = INVALID_EP_TYPE;
968
969     i = usb_linux_get_configuration(s);
970     if (i < 0)
971         return 1;
972     configuration = i;
973
974     /* get the desired configuration, interface, and endpoint descriptors
975      * from device description */
976     descriptors = &s->descr[18];
977     length = s->descr_len - 18;
978     i = 0;
979
980     if (descriptors[i + 1] != USB_DT_CONFIG ||
981         descriptors[i + 5] != configuration) {
982         DPRINTF("invalid descriptor data - configuration\n");
983         return 1;
984     }
985     i += descriptors[i];
986
987     while (i < length) {
988         if (descriptors[i + 1] != USB_DT_INTERFACE ||
989             (descriptors[i + 1] == USB_DT_INTERFACE &&
990              descriptors[i + 4] == 0)) {
991             i += descriptors[i];
992             continue;
993         }
994
995         interface = descriptors[i + 2];
996         alt_interface = usb_linux_get_alt_setting(s, configuration, interface);
997
998         /* the current interface descriptor is the active interface
999          * and has endpoints */
1000         if (descriptors[i + 3] != alt_interface) {
1001             i += descriptors[i];
1002             continue;
1003         }
1004
1005         /* advance to the endpoints */
1006         while (i < length && descriptors[i +1] != USB_DT_ENDPOINT) {
1007             i += descriptors[i];
1008         }
1009
1010         if (i >= length)
1011             break;
1012
1013         while (i < length) {
1014             if (descriptors[i + 1] != USB_DT_ENDPOINT) {
1015                 break;
1016             }
1017
1018             devep = descriptors[i + 2];
1019             switch (descriptors[i + 3] & 0x3) {
1020             case 0x00:
1021                 type = USBDEVFS_URB_TYPE_CONTROL;
1022                 break;
1023             case 0x01:
1024                 type = USBDEVFS_URB_TYPE_ISO;
1025                 set_max_packet_size(s, (devep & 0xf), descriptors + i);
1026                 break;
1027             case 0x02:
1028                 type = USBDEVFS_URB_TYPE_BULK;
1029                 break;
1030             case 0x03:
1031                 type = USBDEVFS_URB_TYPE_INTERRUPT;
1032                 break;
1033             default:
1034                 DPRINTF("usb_host: malformed endpoint type\n");
1035                 type = USBDEVFS_URB_TYPE_BULK;
1036             }
1037             s->endp_table[(devep & 0xf) - 1].type = type;
1038             s->endp_table[(devep & 0xf) - 1].halted = 0;
1039
1040             i += descriptors[i];
1041         }
1042     }
1043     return 0;
1044 }
1045
1046 static int usb_host_open(USBHostDevice *dev, int bus_num,
1047                          int addr, char *port, const char *prod_name)
1048 {
1049     int fd = -1, ret;
1050     struct usbdevfs_connectinfo ci;
1051     char buf[1024];
1052
1053     if (dev->fd != -1) {
1054         goto fail;
1055     }
1056     printf("husb: open device %d.%d\n", bus_num, addr);
1057
1058     if (!usb_host_device_path) {
1059         perror("husb: USB Host Device Path not set");
1060         goto fail;
1061     }
1062     snprintf(buf, sizeof(buf), "%s/%03d/%03d", usb_host_device_path,
1063              bus_num, addr);
1064     fd = open(buf, O_RDWR | O_NONBLOCK);
1065     if (fd < 0) {
1066         perror(buf);
1067         goto fail;
1068     }
1069     DPRINTF("husb: opened %s\n", buf);
1070
1071     dev->bus_num = bus_num;
1072     dev->addr = addr;
1073     strcpy(dev->port, port);
1074     dev->fd = fd;
1075
1076     /* read the device description */
1077     dev->descr_len = read(fd, dev->descr, sizeof(dev->descr));
1078     if (dev->descr_len <= 0) {
1079         perror("husb: reading device data failed");
1080         goto fail;
1081     }
1082
1083 #ifdef DEBUG
1084     {
1085         int x;
1086         printf("=== begin dumping device descriptor data ===\n");
1087         for (x = 0; x < dev->descr_len; x++) {
1088             printf("%02x ", dev->descr[x]);
1089         }
1090         printf("\n=== end dumping device descriptor data ===\n");
1091     }
1092 #endif
1093
1094
1095     /*
1096      * Initial configuration is -1 which makes us claim first
1097      * available config. We used to start with 1, which does not
1098      * always work. I've seen devices where first config starts
1099      * with 2.
1100      */
1101     if (!usb_host_claim_interfaces(dev, -1)) {
1102         goto fail;
1103     }
1104
1105     ret = ioctl(fd, USBDEVFS_CONNECTINFO, &ci);
1106     if (ret < 0) {
1107         perror("usb_host_device_open: USBDEVFS_CONNECTINFO");
1108         goto fail;
1109     }
1110
1111     printf("husb: grabbed usb device %d.%d\n", bus_num, addr);
1112
1113     ret = usb_linux_update_endp_table(dev);
1114     if (ret) {
1115         goto fail;
1116     }
1117
1118     if (ci.slow) {
1119         dev->dev.speed = USB_SPEED_LOW;
1120     } else {
1121         dev->dev.speed = USB_SPEED_HIGH;
1122     }
1123
1124     if (!prod_name || prod_name[0] == '\0') {
1125         snprintf(dev->dev.product_desc, sizeof(dev->dev.product_desc),
1126                  "host:%d.%d", bus_num, addr);
1127     } else {
1128         pstrcpy(dev->dev.product_desc, sizeof(dev->dev.product_desc),
1129                 prod_name);
1130     }
1131
1132     /* USB devio uses 'write' flag to check for async completions */
1133     qemu_set_fd_handler(dev->fd, NULL, async_complete, dev);
1134
1135     usb_device_attach(&dev->dev);
1136     return 0;
1137
1138 fail:
1139     dev->fd = -1;
1140     if (fd != -1) {
1141         close(fd);
1142     }
1143     return -1;
1144 }
1145
1146 static int usb_host_close(USBHostDevice *dev)
1147 {
1148     int i;
1149
1150     if (dev->fd == -1) {
1151         return -1;
1152     }
1153
1154     qemu_set_fd_handler(dev->fd, NULL, NULL, NULL);
1155     dev->closing = 1;
1156     for (i = 1; i <= MAX_ENDPOINTS; i++) {
1157         if (is_isoc(dev, i)) {
1158             usb_host_stop_n_free_iso(dev, i);
1159         }
1160     }
1161     async_complete(dev);
1162     dev->closing = 0;
1163     usb_device_detach(&dev->dev);
1164     ioctl(dev->fd, USBDEVFS_RESET);
1165     close(dev->fd);
1166     dev->fd = -1;
1167     return 0;
1168 }
1169
1170 static void usb_host_exit_notifier(struct Notifier* n)
1171 {
1172     USBHostDevice *s = container_of(n, USBHostDevice, exit);
1173
1174     if (s->fd != -1) {
1175         ioctl(s->fd, USBDEVFS_RESET);
1176     }
1177 }
1178
1179 static int usb_host_initfn(USBDevice *dev)
1180 {
1181     USBHostDevice *s = DO_UPCAST(USBHostDevice, dev, dev);
1182
1183     dev->auto_attach = 0;
1184     s->fd = -1;
1185     QTAILQ_INSERT_TAIL(&hostdevs, s, next);
1186     s->exit.notify = usb_host_exit_notifier;
1187     qemu_add_exit_notifier(&s->exit);
1188     usb_host_auto_check(NULL);
1189     return 0;
1190 }
1191
1192 static struct USBDeviceInfo usb_host_dev_info = {
1193     .product_desc   = "USB Host Device",
1194     .qdev.name      = "usb-host",
1195     .qdev.size      = sizeof(USBHostDevice),
1196     .init           = usb_host_initfn,
1197     .handle_packet  = usb_generic_handle_packet,
1198     .cancel_packet  = usb_host_async_cancel,
1199     .handle_data    = usb_host_handle_data,
1200     .handle_control = usb_host_handle_control,
1201     .handle_reset   = usb_host_handle_reset,
1202     .handle_destroy = usb_host_handle_destroy,
1203     .usbdevice_name = "host",
1204     .usbdevice_init = usb_host_device_open,
1205     .qdev.props     = (Property[]) {
1206         DEFINE_PROP_UINT32("hostbus",  USBHostDevice, match.bus_num,    0),
1207         DEFINE_PROP_UINT32("hostaddr", USBHostDevice, match.addr,       0),
1208         DEFINE_PROP_STRING("hostport", USBHostDevice, match.port),
1209         DEFINE_PROP_HEX32("vendorid",  USBHostDevice, match.vendor_id,  0),
1210         DEFINE_PROP_HEX32("productid", USBHostDevice, match.product_id, 0),
1211         DEFINE_PROP_END_OF_LIST(),
1212     },
1213 };
1214
1215 static void usb_host_register_devices(void)
1216 {
1217     usb_qdev_register(&usb_host_dev_info);
1218 }
1219 device_init(usb_host_register_devices)
1220
1221 USBDevice *usb_host_device_open(const char *devname)
1222 {
1223     struct USBAutoFilter filter;
1224     USBDevice *dev;
1225     char *p;
1226
1227     dev = usb_create(NULL /* FIXME */, "usb-host");
1228
1229     if (strstr(devname, "auto:")) {
1230         if (parse_filter(devname, &filter) < 0) {
1231             goto fail;
1232         }
1233     } else {
1234         if ((p = strchr(devname, '.'))) {
1235             filter.bus_num    = strtoul(devname, NULL, 0);
1236             filter.addr       = strtoul(p + 1, NULL, 0);
1237             filter.vendor_id  = 0;
1238             filter.product_id = 0;
1239         } else if ((p = strchr(devname, ':'))) {
1240             filter.bus_num    = 0;
1241             filter.addr       = 0;
1242             filter.vendor_id  = strtoul(devname, NULL, 16);
1243             filter.product_id = strtoul(p + 1, NULL, 16);
1244         } else {
1245             goto fail;
1246         }
1247     }
1248
1249     qdev_prop_set_uint32(&dev->qdev, "hostbus",   filter.bus_num);
1250     qdev_prop_set_uint32(&dev->qdev, "hostaddr",  filter.addr);
1251     qdev_prop_set_uint32(&dev->qdev, "vendorid",  filter.vendor_id);
1252     qdev_prop_set_uint32(&dev->qdev, "productid", filter.product_id);
1253     qdev_init_nofail(&dev->qdev);
1254     return dev;
1255
1256 fail:
1257     qdev_free(&dev->qdev);
1258     return NULL;
1259 }
1260
1261 int usb_host_device_close(const char *devname)
1262 {
1263 #if 0
1264     char product_name[PRODUCT_NAME_SZ];
1265     int bus_num, addr;
1266     USBHostDevice *s;
1267
1268     if (strstr(devname, "auto:")) {
1269         return usb_host_auto_del(devname);
1270     }
1271     if (usb_host_find_device(&bus_num, &addr, product_name,
1272                                     sizeof(product_name), devname) < 0) {
1273         return -1;
1274     }
1275     s = hostdev_find(bus_num, addr);
1276     if (s) {
1277         usb_device_delete_addr(s->bus_num, s->dev.addr);
1278         return 0;
1279     }
1280 #endif
1281
1282     return -1;
1283 }
1284
1285 static int get_tag_value(char *buf, int buf_size,
1286                          const char *str, const char *tag,
1287                          const char *stopchars)
1288 {
1289     const char *p;
1290     char *q;
1291     p = strstr(str, tag);
1292     if (!p) {
1293         return -1;
1294     }
1295     p += strlen(tag);
1296     while (qemu_isspace(*p)) {
1297         p++;
1298     }
1299     q = buf;
1300     while (*p != '\0' && !strchr(stopchars, *p)) {
1301         if ((q - buf) < (buf_size - 1)) {
1302             *q++ = *p;
1303         }
1304         p++;
1305     }
1306     *q = '\0';
1307     return q - buf;
1308 }
1309
1310 /*
1311  * Use /proc/bus/usb/devices or /dev/bus/usb/devices file to determine
1312  * host's USB devices. This is legacy support since many distributions
1313  * are moving to /sys/bus/usb
1314  */
1315 static int usb_host_scan_dev(void *opaque, USBScanFunc *func)
1316 {
1317     FILE *f = NULL;
1318     char line[1024];
1319     char buf[1024];
1320     int bus_num, addr, speed, device_count, class_id, product_id, vendor_id;
1321     char product_name[512];
1322     int ret = 0;
1323
1324     if (!usb_host_device_path) {
1325         perror("husb: USB Host Device Path not set");
1326         goto the_end;
1327     }
1328     snprintf(line, sizeof(line), "%s/devices", usb_host_device_path);
1329     f = fopen(line, "r");
1330     if (!f) {
1331         perror("husb: cannot open devices file");
1332         goto the_end;
1333     }
1334
1335     device_count = 0;
1336     bus_num = addr = speed = class_id = product_id = vendor_id = 0;
1337     for(;;) {
1338         if (fgets(line, sizeof(line), f) == NULL) {
1339             break;
1340         }
1341         if (strlen(line) > 0) {
1342             line[strlen(line) - 1] = '\0';
1343         }
1344         if (line[0] == 'T' && line[1] == ':') {
1345             if (device_count && (vendor_id || product_id)) {
1346                 /* New device.  Add the previously discovered device.  */
1347                 ret = func(opaque, bus_num, addr, 0, class_id, vendor_id,
1348                            product_id, product_name, speed);
1349                 if (ret) {
1350                     goto the_end;
1351                 }
1352             }
1353             if (get_tag_value(buf, sizeof(buf), line, "Bus=", " ") < 0) {
1354                 goto fail;
1355             }
1356             bus_num = atoi(buf);
1357             if (get_tag_value(buf, sizeof(buf), line, "Dev#=", " ") < 0) {
1358                 goto fail;
1359             }
1360             addr = atoi(buf);
1361             if (get_tag_value(buf, sizeof(buf), line, "Spd=", " ") < 0) {
1362                 goto fail;
1363             }
1364             if (!strcmp(buf, "480")) {
1365                 speed = USB_SPEED_HIGH;
1366             } else if (!strcmp(buf, "1.5")) {
1367                 speed = USB_SPEED_LOW;
1368             } else {
1369                 speed = USB_SPEED_FULL;
1370             }
1371             product_name[0] = '\0';
1372             class_id = 0xff;
1373             device_count++;
1374             product_id = 0;
1375             vendor_id = 0;
1376         } else if (line[0] == 'P' && line[1] == ':') {
1377             if (get_tag_value(buf, sizeof(buf), line, "Vendor=", " ") < 0) {
1378                 goto fail;
1379             }
1380             vendor_id = strtoul(buf, NULL, 16);
1381             if (get_tag_value(buf, sizeof(buf), line, "ProdID=", " ") < 0) {
1382                 goto fail;
1383             }
1384             product_id = strtoul(buf, NULL, 16);
1385         } else if (line[0] == 'S' && line[1] == ':') {
1386             if (get_tag_value(buf, sizeof(buf), line, "Product=", "") < 0) {
1387                 goto fail;
1388             }
1389             pstrcpy(product_name, sizeof(product_name), buf);
1390         } else if (line[0] == 'D' && line[1] == ':') {
1391             if (get_tag_value(buf, sizeof(buf), line, "Cls=", " (") < 0) {
1392                 goto fail;
1393             }
1394             class_id = strtoul(buf, NULL, 16);
1395         }
1396     fail: ;
1397     }
1398     if (device_count && (vendor_id || product_id)) {
1399         /* Add the last device.  */
1400         ret = func(opaque, bus_num, addr, 0, class_id, vendor_id,
1401                    product_id, product_name, speed);
1402     }
1403  the_end:
1404     if (f) {
1405         fclose(f);
1406     }
1407     return ret;
1408 }
1409
1410 /*
1411  * Read sys file-system device file
1412  *
1413  * @line address of buffer to put file contents in
1414  * @line_size size of line
1415  * @device_file path to device file (printf format string)
1416  * @device_name device being opened (inserted into device_file)
1417  *
1418  * @return 0 failed, 1 succeeded ('line' contains data)
1419  */
1420 static int usb_host_read_file(char *line, size_t line_size,
1421                               const char *device_file, const char *device_name)
1422 {
1423     FILE *f;
1424     int ret = 0;
1425     char filename[PATH_MAX];
1426
1427     snprintf(filename, PATH_MAX, USBSYSBUS_PATH "/devices/%s/%s", device_name,
1428              device_file);
1429     f = fopen(filename, "r");
1430     if (f) {
1431         ret = fgets(line, line_size, f) != NULL;
1432         fclose(f);
1433     }
1434
1435     return ret;
1436 }
1437
1438 /*
1439  * Use /sys/bus/usb/devices/ directory to determine host's USB
1440  * devices.
1441  *
1442  * This code is based on Robert Schiele's original patches posted to
1443  * the Novell bug-tracker https://bugzilla.novell.com/show_bug.cgi?id=241950
1444  */
1445 static int usb_host_scan_sys(void *opaque, USBScanFunc *func)
1446 {
1447     DIR *dir = NULL;
1448     char line[1024];
1449     int bus_num, addr, speed, class_id, product_id, vendor_id;
1450     int ret = 0;
1451     char port[MAX_PORTLEN];
1452     char product_name[512];
1453     struct dirent *de;
1454
1455     dir = opendir(USBSYSBUS_PATH "/devices");
1456     if (!dir) {
1457         perror("husb: cannot open devices directory");
1458         goto the_end;
1459     }
1460
1461     while ((de = readdir(dir))) {
1462         if (de->d_name[0] != '.' && !strchr(de->d_name, ':')) {
1463             if (sscanf(de->d_name, "%d-%7[0-9.]", &bus_num, port) < 2) {
1464                 continue;
1465             }
1466
1467             if (!usb_host_read_file(line, sizeof(line), "devnum", de->d_name)) {
1468                 goto the_end;
1469             }
1470             if (sscanf(line, "%d", &addr) != 1) {
1471                 goto the_end;
1472             }
1473             if (!usb_host_read_file(line, sizeof(line), "bDeviceClass",
1474                                     de->d_name)) {
1475                 goto the_end;
1476             }
1477             if (sscanf(line, "%x", &class_id) != 1) {
1478                 goto the_end;
1479             }
1480
1481             if (!usb_host_read_file(line, sizeof(line), "idVendor",
1482                                     de->d_name)) {
1483                 goto the_end;
1484             }
1485             if (sscanf(line, "%x", &vendor_id) != 1) {
1486                 goto the_end;
1487             }
1488             if (!usb_host_read_file(line, sizeof(line), "idProduct",
1489                                     de->d_name)) {
1490                 goto the_end;
1491             }
1492             if (sscanf(line, "%x", &product_id) != 1) {
1493                 goto the_end;
1494             }
1495             if (!usb_host_read_file(line, sizeof(line), "product",
1496                                     de->d_name)) {
1497                 *product_name = 0;
1498             } else {
1499                 if (strlen(line) > 0) {
1500                     line[strlen(line) - 1] = '\0';
1501                 }
1502                 pstrcpy(product_name, sizeof(product_name), line);
1503             }
1504
1505             if (!usb_host_read_file(line, sizeof(line), "speed", de->d_name)) {
1506                 goto the_end;
1507             }
1508             if (!strcmp(line, "480\n")) {
1509                 speed = USB_SPEED_HIGH;
1510             } else if (!strcmp(line, "1.5\n")) {
1511                 speed = USB_SPEED_LOW;
1512             } else {
1513                 speed = USB_SPEED_FULL;
1514             }
1515
1516             ret = func(opaque, bus_num, addr, port, class_id, vendor_id,
1517                        product_id, product_name, speed);
1518             if (ret) {
1519                 goto the_end;
1520             }
1521         }
1522     }
1523  the_end:
1524     if (dir) {
1525         closedir(dir);
1526     }
1527     return ret;
1528 }
1529
1530 /*
1531  * Determine how to access the host's USB devices and call the
1532  * specific support function.
1533  */
1534 static int usb_host_scan(void *opaque, USBScanFunc *func)
1535 {
1536     Monitor *mon = cur_mon;
1537     FILE *f = NULL;
1538     DIR *dir = NULL;
1539     int ret = 0;
1540     const char *fs_type[] = {"unknown", "proc", "dev", "sys"};
1541     char devpath[PATH_MAX];
1542
1543     /* only check the host once */
1544     if (!usb_fs_type) {
1545         dir = opendir(USBSYSBUS_PATH "/devices");
1546         if (dir) {
1547             /* devices found in /dev/bus/usb/ (yes - not a mistake!) */
1548             strcpy(devpath, USBDEVBUS_PATH);
1549             usb_fs_type = USB_FS_SYS;
1550             closedir(dir);
1551             DPRINTF(USBDBG_DEVOPENED, USBSYSBUS_PATH);
1552             goto found_devices;
1553         }
1554         f = fopen(USBPROCBUS_PATH "/devices", "r");
1555         if (f) {
1556             /* devices found in /proc/bus/usb/ */
1557             strcpy(devpath, USBPROCBUS_PATH);
1558             usb_fs_type = USB_FS_PROC;
1559             fclose(f);
1560             DPRINTF(USBDBG_DEVOPENED, USBPROCBUS_PATH);
1561             goto found_devices;
1562         }
1563         /* try additional methods if an access method hasn't been found yet */
1564         f = fopen(USBDEVBUS_PATH "/devices", "r");
1565         if (f) {
1566             /* devices found in /dev/bus/usb/ */
1567             strcpy(devpath, USBDEVBUS_PATH);
1568             usb_fs_type = USB_FS_DEV;
1569             fclose(f);
1570             DPRINTF(USBDBG_DEVOPENED, USBDEVBUS_PATH);
1571             goto found_devices;
1572         }
1573     found_devices:
1574         if (!usb_fs_type) {
1575             if (mon) {
1576                 monitor_printf(mon, "husb: unable to access USB devices\n");
1577             }
1578             return -ENOENT;
1579         }
1580
1581         /* the module setting (used later for opening devices) */
1582         usb_host_device_path = qemu_mallocz(strlen(devpath)+1);
1583         strcpy(usb_host_device_path, devpath);
1584         if (mon) {
1585             monitor_printf(mon, "husb: using %s file-system with %s\n",
1586                            fs_type[usb_fs_type], usb_host_device_path);
1587         }
1588     }
1589
1590     switch (usb_fs_type) {
1591     case USB_FS_PROC:
1592     case USB_FS_DEV:
1593         ret = usb_host_scan_dev(opaque, func);
1594         break;
1595     case USB_FS_SYS:
1596         ret = usb_host_scan_sys(opaque, func);
1597         break;
1598     default:
1599         ret = -EINVAL;
1600         break;
1601     }
1602     return ret;
1603 }
1604
1605 static QEMUTimer *usb_auto_timer;
1606
1607 static int usb_host_auto_scan(void *opaque, int bus_num, int addr, char *port,
1608                               int class_id, int vendor_id, int product_id,
1609                               const char *product_name, int speed)
1610 {
1611     struct USBAutoFilter *f;
1612     struct USBHostDevice *s;
1613
1614     /* Ignore hubs */
1615     if (class_id == 9)
1616         return 0;
1617
1618     QTAILQ_FOREACH(s, &hostdevs, next) {
1619         f = &s->match;
1620
1621         if (f->bus_num > 0 && f->bus_num != bus_num) {
1622             continue;
1623         }
1624         if (f->addr > 0 && f->addr != addr) {
1625             continue;
1626         }
1627         if (f->port != NULL && (port == NULL || strcmp(f->port, port) != 0)) {
1628             continue;
1629         }
1630
1631         if (f->vendor_id > 0 && f->vendor_id != vendor_id) {
1632             continue;
1633         }
1634
1635         if (f->product_id > 0 && f->product_id != product_id) {
1636             continue;
1637         }
1638         /* We got a match */
1639
1640         /* Already attached ? */
1641         if (s->fd != -1) {
1642             return 0;
1643         }
1644         DPRINTF("husb: auto open: bus_num %d addr %d\n", bus_num, addr);
1645
1646         usb_host_open(s, bus_num, addr, port, product_name);
1647     }
1648
1649     return 0;
1650 }
1651
1652 static void usb_host_auto_check(void *unused)
1653 {
1654     struct USBHostDevice *s;
1655     int unconnected = 0;
1656
1657     usb_host_scan(NULL, usb_host_auto_scan);
1658
1659     QTAILQ_FOREACH(s, &hostdevs, next) {
1660         if (s->fd == -1) {
1661             unconnected++;
1662         }
1663     }
1664
1665     if (unconnected == 0) {
1666         /* nothing to watch */
1667         if (usb_auto_timer) {
1668             qemu_del_timer(usb_auto_timer);
1669         }
1670         return;
1671     }
1672
1673     if (!usb_auto_timer) {
1674         usb_auto_timer = qemu_new_timer_ms(rt_clock, usb_host_auto_check, NULL);
1675         if (!usb_auto_timer) {
1676             return;
1677         }
1678     }
1679     qemu_mod_timer(usb_auto_timer, qemu_get_clock_ms(rt_clock) + 2000);
1680 }
1681
1682 /*
1683  * Autoconnect filter
1684  * Format:
1685  *    auto:bus:dev[:vid:pid]
1686  *    auto:bus.dev[:vid:pid]
1687  *
1688  *    bus  - bus number    (dec, * means any)
1689  *    dev  - device number (dec, * means any)
1690  *    vid  - vendor id     (hex, * means any)
1691  *    pid  - product id    (hex, * means any)
1692  *
1693  *    See 'lsusb' output.
1694  */
1695 static int parse_filter(const char *spec, struct USBAutoFilter *f)
1696 {
1697     enum { BUS, DEV, VID, PID, DONE };
1698     const char *p = spec;
1699     int i;
1700
1701     f->bus_num    = 0;
1702     f->addr       = 0;
1703     f->vendor_id  = 0;
1704     f->product_id = 0;
1705
1706     for (i = BUS; i < DONE; i++) {
1707         p = strpbrk(p, ":.");
1708         if (!p) {
1709             break;
1710         }
1711         p++;
1712
1713         if (*p == '*') {
1714             continue;
1715         }
1716         switch(i) {
1717         case BUS: f->bus_num = strtol(p, NULL, 10);    break;
1718         case DEV: f->addr    = strtol(p, NULL, 10);    break;
1719         case VID: f->vendor_id  = strtol(p, NULL, 16); break;
1720         case PID: f->product_id = strtol(p, NULL, 16); break;
1721         }
1722     }
1723
1724     if (i < DEV) {
1725         fprintf(stderr, "husb: invalid auto filter spec %s\n", spec);
1726         return -1;
1727     }
1728
1729     return 0;
1730 }
1731
1732 /**********************/
1733 /* USB host device info */
1734
1735 struct usb_class_info {
1736     int class;
1737     const char *class_name;
1738 };
1739
1740 static const struct usb_class_info usb_class_info[] = {
1741     { USB_CLASS_AUDIO, "Audio"},
1742     { USB_CLASS_COMM, "Communication"},
1743     { USB_CLASS_HID, "HID"},
1744     { USB_CLASS_HUB, "Hub" },
1745     { USB_CLASS_PHYSICAL, "Physical" },
1746     { USB_CLASS_PRINTER, "Printer" },
1747     { USB_CLASS_MASS_STORAGE, "Storage" },
1748     { USB_CLASS_CDC_DATA, "Data" },
1749     { USB_CLASS_APP_SPEC, "Application Specific" },
1750     { USB_CLASS_VENDOR_SPEC, "Vendor Specific" },
1751     { USB_CLASS_STILL_IMAGE, "Still Image" },
1752     { USB_CLASS_CSCID, "Smart Card" },
1753     { USB_CLASS_CONTENT_SEC, "Content Security" },
1754     { -1, NULL }
1755 };
1756
1757 static const char *usb_class_str(uint8_t class)
1758 {
1759     const struct usb_class_info *p;
1760     for(p = usb_class_info; p->class != -1; p++) {
1761         if (p->class == class) {
1762             break;
1763         }
1764     }
1765     return p->class_name;
1766 }
1767
1768 static void usb_info_device(Monitor *mon, int bus_num, int addr, char *port,
1769                             int class_id, int vendor_id, int product_id,
1770                             const char *product_name,
1771                             int speed)
1772 {
1773     const char *class_str, *speed_str;
1774
1775     switch(speed) {
1776     case USB_SPEED_LOW:
1777         speed_str = "1.5";
1778         break;
1779     case USB_SPEED_FULL:
1780         speed_str = "12";
1781         break;
1782     case USB_SPEED_HIGH:
1783         speed_str = "480";
1784         break;
1785     default:
1786         speed_str = "?";
1787         break;
1788     }
1789
1790     monitor_printf(mon, "  Bus %d, Addr %d, Port %s, Speed %s Mb/s\n",
1791                    bus_num, addr, port, speed_str);
1792     class_str = usb_class_str(class_id);
1793     if (class_str) {
1794         monitor_printf(mon, "    %s:", class_str);
1795     } else {
1796         monitor_printf(mon, "    Class %02x:", class_id);
1797     }
1798     monitor_printf(mon, " USB device %04x:%04x", vendor_id, product_id);
1799     if (product_name[0] != '\0') {
1800         monitor_printf(mon, ", %s", product_name);
1801     }
1802     monitor_printf(mon, "\n");
1803 }
1804
1805 static int usb_host_info_device(void *opaque, int bus_num, int addr,
1806                                 char *path, int class_id,
1807                                 int vendor_id, int product_id,
1808                                 const char *product_name,
1809                                 int speed)
1810 {
1811     Monitor *mon = opaque;
1812
1813     usb_info_device(mon, bus_num, addr, path, class_id, vendor_id, product_id,
1814                     product_name, speed);
1815     return 0;
1816 }
1817
1818 static void dec2str(int val, char *str, size_t size)
1819 {
1820     if (val == 0) {
1821         snprintf(str, size, "*");
1822     } else {
1823         snprintf(str, size, "%d", val);
1824     }
1825 }
1826
1827 static void hex2str(int val, char *str, size_t size)
1828 {
1829     if (val == 0) {
1830         snprintf(str, size, "*");
1831     } else {
1832         snprintf(str, size, "%04x", val);
1833     }
1834 }
1835
1836 void usb_host_info(Monitor *mon)
1837 {
1838     struct USBAutoFilter *f;
1839     struct USBHostDevice *s;
1840
1841     usb_host_scan(mon, usb_host_info_device);
1842
1843     if (QTAILQ_EMPTY(&hostdevs)) {
1844         return;
1845     }
1846
1847     monitor_printf(mon, "  Auto filters:\n");
1848     QTAILQ_FOREACH(s, &hostdevs, next) {
1849         char bus[10], addr[10], vid[10], pid[10];
1850         f = &s->match;
1851         dec2str(f->bus_num, bus, sizeof(bus));
1852         dec2str(f->addr, addr, sizeof(addr));
1853         hex2str(f->vendor_id, vid, sizeof(vid));
1854         hex2str(f->product_id, pid, sizeof(pid));
1855         monitor_printf(mon, "    Bus %s, Addr %s, Port %s, ID %s:%s\n",
1856                        bus, addr, f->port ? f->port : "*", vid, pid);
1857     }
1858 }
This page took 0.131654 seconds and 4 git commands to generate.