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