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