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