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