2 * Linux host USB redirector
4 * Copyright (c) 2005 Fabrice Bellard
6 * Copyright (c) 2008 Max Krasnyansky
7 * Support for host device auto connect & disconnect
8 * Major rewrite to support fully async operation
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
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:
21 * The above copyright notice and this permission notice shall be included in
22 * all copies or substantial portions of the Software.
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
33 #include "qemu-common.h"
34 #include "qemu-timer.h"
40 #include <sys/ioctl.h>
42 #include <linux/usbdevice_fs.h>
43 #include <linux/version.h>
46 /* We redefine it to avoid version problems */
47 struct usb_ctrltransfer {
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);
64 #define DPRINTF printf
69 #define PRODUCT_NAME_SZ 32
70 #define MAX_ENDPOINTS 15
71 #define MAX_PORTLEN 16
73 /* endpoint association data */
74 #define ISO_FRAME_DESC_PER_URB 32
75 #define INVALID_EP_TYPE 255
77 /* devio.c limits single requests to 16k */
78 #define MAX_USBFS_BUFFER_SIZE 16384
80 typedef struct AsyncURB AsyncURB;
93 struct USBAutoFilter {
101 typedef struct USBHostDevice {
112 uint32_t iso_urb_count;
115 struct endp_data ep_in[MAX_ENDPOINTS];
116 struct endp_data ep_out[MAX_ENDPOINTS];
117 QLIST_HEAD(, AsyncURB) aurbs;
119 /* Host side address */
122 char port[MAX_PORTLEN];
123 struct USBAutoFilter match;
126 QTAILQ_ENTRY(USBHostDevice) next;
129 static QTAILQ_HEAD(, USBHostDevice) hostdevs = QTAILQ_HEAD_INITIALIZER(hostdevs);
131 static int usb_host_close(USBHostDevice *dev);
132 static int parse_filter(const char *spec, struct USBAutoFilter *f);
133 static void usb_host_auto_check(void *unused);
134 static int usb_host_read_file(char *line, size_t line_size,
135 const char *device_file, const char *device_name);
136 static int usb_linux_update_endp_table(USBHostDevice *s);
138 static int usb_host_do_reset(USBHostDevice *dev)
144 gettimeofday(&s, NULL);
145 ret = ioctl(dev->fd, USBDEVFS_RESET);
146 gettimeofday(&e, NULL);
147 usecs = (e.tv_sec - s.tv_sec) * 1000000;
148 usecs += e.tv_usec - s.tv_usec;
149 if (usecs > 1000000) {
150 /* more than a second, something is fishy, broken usb device? */
151 fprintf(stderr, "husb: device %d:%d reset took %d.%06d seconds\n",
152 dev->bus_num, dev->addr, usecs / 1000000, usecs % 1000000);
157 static struct endp_data *get_endp(USBHostDevice *s, int pid, int ep)
159 struct endp_data *eps = pid == USB_TOKEN_IN ? s->ep_in : s->ep_out;
160 assert(pid == USB_TOKEN_IN || pid == USB_TOKEN_OUT);
161 assert(ep > 0 && ep <= MAX_ENDPOINTS);
165 static int is_isoc(USBHostDevice *s, int pid, int ep)
167 return get_endp(s, pid, ep)->type == USBDEVFS_URB_TYPE_ISO;
170 static int is_valid(USBHostDevice *s, int pid, int ep)
172 return get_endp(s, pid, ep)->type != INVALID_EP_TYPE;
175 static int is_halted(USBHostDevice *s, int pid, int ep)
177 return get_endp(s, pid, ep)->halted;
180 static void clear_halt(USBHostDevice *s, int pid, int ep)
182 trace_usb_host_ep_clear_halt(s->bus_num, s->addr, ep);
183 get_endp(s, pid, ep)->halted = 0;
186 static void set_halt(USBHostDevice *s, int pid, int ep)
189 trace_usb_host_ep_set_halt(s->bus_num, s->addr, ep);
190 get_endp(s, pid, ep)->halted = 1;
194 static int is_iso_started(USBHostDevice *s, int pid, int ep)
196 return get_endp(s, pid, ep)->iso_started;
199 static void clear_iso_started(USBHostDevice *s, int pid, int ep)
201 trace_usb_host_ep_stop_iso(s->bus_num, s->addr, ep);
202 get_endp(s, pid, ep)->iso_started = 0;
205 static void set_iso_started(USBHostDevice *s, int pid, int ep)
207 struct endp_data *e = get_endp(s, pid, ep);
209 trace_usb_host_ep_start_iso(s->bus_num, s->addr, ep);
210 if (!e->iso_started) {
216 static int change_iso_inflight(USBHostDevice *s, int pid, int ep, int value)
218 struct endp_data *e = get_endp(s, pid, ep);
220 e->inflight += value;
224 static void set_iso_urb(USBHostDevice *s, int pid, int ep, AsyncURB *iso_urb)
226 get_endp(s, pid, ep)->iso_urb = iso_urb;
229 static AsyncURB *get_iso_urb(USBHostDevice *s, int pid, int ep)
231 return get_endp(s, pid, ep)->iso_urb;
234 static void set_iso_urb_idx(USBHostDevice *s, int pid, int ep, int i)
236 get_endp(s, pid, ep)->iso_urb_idx = i;
239 static int get_iso_urb_idx(USBHostDevice *s, int pid, int ep)
241 return get_endp(s, pid, ep)->iso_urb_idx;
244 static void set_iso_buffer_used(USBHostDevice *s, int pid, int ep, int i)
246 get_endp(s, pid, ep)->iso_buffer_used = i;
249 static int get_iso_buffer_used(USBHostDevice *s, int pid, int ep)
251 return get_endp(s, pid, ep)->iso_buffer_used;
254 static void set_max_packet_size(USBHostDevice *s, int pid, int ep,
257 int raw = descriptor[4] + (descriptor[5] << 8);
258 int size, microframes;
261 switch ((raw >> 11) & 3) {
262 case 1: microframes = 2; break;
263 case 2: microframes = 3; break;
264 default: microframes = 1; break;
266 get_endp(s, pid, ep)->max_packet_size = size * microframes;
269 static int get_max_packet_size(USBHostDevice *s, int pid, int ep)
271 return get_endp(s, pid, ep)->max_packet_size;
276 * We always allocate iso packet descriptors even for bulk transfers
277 * to simplify allocation and casts.
281 struct usbdevfs_urb urb;
282 struct usbdevfs_iso_packet_desc isocpd[ISO_FRAME_DESC_PER_URB];
284 QLIST_ENTRY(AsyncURB) next;
286 /* For regular async urbs */
288 int more; /* large transfer, more urbs follow */
290 /* For buffered iso handling */
291 int iso_frame_idx; /* -1 means in flight */
294 static AsyncURB *async_alloc(USBHostDevice *s)
296 AsyncURB *aurb = g_malloc0(sizeof(AsyncURB));
298 QLIST_INSERT_HEAD(&s->aurbs, aurb, next);
302 static void async_free(AsyncURB *aurb)
304 QLIST_REMOVE(aurb, next);
308 static void do_disconnect(USBHostDevice *s)
311 usb_host_auto_check(NULL);
314 static void async_complete(void *opaque)
316 USBHostDevice *s = opaque;
323 int r = ioctl(s->fd, USBDEVFS_REAPURBNDELAY, &aurb);
325 if (errno == EAGAIN) {
327 fprintf(stderr, "husb: %d iso urbs finished at once\n", urbs);
331 if (errno == ENODEV) {
333 trace_usb_host_disconnect(s->bus_num, s->addr);
339 perror("USBDEVFS_REAPURBNDELAY");
343 DPRINTF("husb: async completed. aurb %p status %d alen %d\n",
344 aurb, aurb->urb.status, aurb->urb.actual_length);
346 /* If this is a buffered iso urb mark it as complete and don't do
347 anything else (it is handled further in usb_host_handle_iso_data) */
348 if (aurb->iso_frame_idx == -1) {
350 int pid = (aurb->urb.endpoint & USB_DIR_IN) ?
351 USB_TOKEN_IN : USB_TOKEN_OUT;
352 int ep = aurb->urb.endpoint & 0xf;
353 if (aurb->urb.status == -EPIPE) {
354 set_halt(s, pid, ep);
356 aurb->iso_frame_idx = 0;
358 inflight = change_iso_inflight(s, pid, ep, -1);
359 if (inflight == 0 && is_iso_started(s, pid, ep)) {
360 fprintf(stderr, "husb: out of buffers for iso stream\n");
366 trace_usb_host_urb_complete(s->bus_num, s->addr, aurb, aurb->urb.status,
367 aurb->urb.actual_length, aurb->more);
370 switch (aurb->urb.status) {
372 p->result += aurb->urb.actual_length;
376 set_halt(s, p->pid, p->devep);
377 p->result = USB_RET_STALL;
381 p->result = USB_RET_NAK;
385 if (aurb->urb.type == USBDEVFS_URB_TYPE_CONTROL) {
386 trace_usb_host_req_complete(s->bus_num, s->addr, p->result);
387 usb_generic_async_ctrl_complete(&s->dev, p);
388 } else if (!aurb->more) {
389 trace_usb_host_req_complete(s->bus_num, s->addr, p->result);
390 usb_packet_complete(&s->dev, p);
398 static void usb_host_async_cancel(USBDevice *dev, USBPacket *p)
400 USBHostDevice *s = DO_UPCAST(USBHostDevice, dev, dev);
403 QLIST_FOREACH(aurb, &s->aurbs, next) {
404 if (p != aurb->packet) {
408 DPRINTF("husb: async cancel: packet %p, aurb %p\n", p, aurb);
410 /* Mark it as dead (see async_complete above) */
413 int r = ioctl(s->fd, USBDEVFS_DISCARDURB, aurb);
415 DPRINTF("husb: async. discard urb failed errno %d\n", errno);
420 static int usb_host_open_device(int bus, int addr)
422 const char *usbfs = NULL;
427 rc = stat("/dev/bus/usb", &st);
428 if (rc == 0 && S_ISDIR(st.st_mode)) {
429 /* udev-created device nodes available */
430 usbfs = "/dev/bus/usb";
432 /* fallback: usbfs mounted below /proc */
433 usbfs = "/proc/bus/usb";
436 snprintf(filename, sizeof(filename), "%s/%03d/%03d",
438 fd = open(filename, O_RDWR | O_NONBLOCK);
440 fprintf(stderr, "husb: open %s: %s\n", filename, strerror(errno));
445 static int usb_host_claim_port(USBHostDevice *s)
447 #ifdef USBDEVFS_CLAIM_PORT
448 char *h, hub_name[64], line[1024];
451 snprintf(hub_name, sizeof(hub_name), "%d-%s",
452 s->match.bus_num, s->match.port);
454 /* try strip off last ".$portnr" to get hub */
455 h = strrchr(hub_name, '.');
457 s->hub_port = atoi(h+1);
460 /* no dot in there -> it is the root hub */
461 snprintf(hub_name, sizeof(hub_name), "usb%d",
463 s->hub_port = atoi(s->match.port);
466 if (!usb_host_read_file(line, sizeof(line), "devnum",
470 if (sscanf(line, "%d", &hub_addr) != 1) {
474 s->hub_fd = usb_host_open_device(s->match.bus_num, hub_addr);
479 ret = ioctl(s->hub_fd, USBDEVFS_CLAIM_PORT, &s->hub_port);
486 trace_usb_host_claim_port(s->match.bus_num, hub_addr, s->hub_port);
493 static void usb_host_release_port(USBHostDevice *s)
495 if (s->hub_fd == -1) {
498 #ifdef USBDEVFS_RELEASE_PORT
499 ioctl(s->hub_fd, USBDEVFS_RELEASE_PORT, &s->hub_port);
505 static int usb_host_disconnect_ifaces(USBHostDevice *dev, int nb_interfaces)
507 /* earlier Linux 2.4 do not support that */
508 #ifdef USBDEVFS_DISCONNECT
509 struct usbdevfs_ioctl ctrl;
512 for (interface = 0; interface < nb_interfaces; interface++) {
513 ctrl.ioctl_code = USBDEVFS_DISCONNECT;
514 ctrl.ifno = interface;
516 ret = ioctl(dev->fd, USBDEVFS_IOCTL, &ctrl);
517 if (ret < 0 && errno != ENODATA) {
518 perror("USBDEVFS_DISCONNECT");
526 static int usb_linux_get_num_interfaces(USBHostDevice *s)
528 char device_name[64], line[1024];
529 int num_interfaces = 0;
531 sprintf(device_name, "%d-%s", s->bus_num, s->port);
532 if (!usb_host_read_file(line, sizeof(line), "bNumInterfaces",
536 if (sscanf(line, "%d", &num_interfaces) != 1) {
539 return num_interfaces;
542 static int usb_host_claim_interfaces(USBHostDevice *dev, int configuration)
544 const char *op = NULL;
545 int dev_descr_len, config_descr_len;
546 int interface, nb_interfaces;
549 if (configuration == 0) { /* address state - ignore */
550 dev->ninterfaces = 0;
551 dev->configuration = 0;
555 DPRINTF("husb: claiming interfaces. config %d\n", configuration);
558 dev_descr_len = dev->descr[0];
559 if (dev_descr_len > dev->descr_len) {
560 fprintf(stderr, "husb: update iface failed. descr too short\n");
565 while (i < dev->descr_len) {
566 DPRINTF("husb: i is %d, descr_len is %d, dl %d, dt %d\n",
568 dev->descr[i], dev->descr[i+1]);
570 if (dev->descr[i+1] != USB_DT_CONFIG) {
574 config_descr_len = dev->descr[i];
576 DPRINTF("husb: config #%d need %d\n", dev->descr[i + 5], configuration);
578 if (configuration == dev->descr[i + 5]) {
579 configuration = dev->descr[i + 5];
583 i += config_descr_len;
586 if (i >= dev->descr_len) {
588 "husb: update iface failed. no matching configuration\n");
591 nb_interfaces = dev->descr[i + 4];
593 if (usb_host_disconnect_ifaces(dev, nb_interfaces) < 0) {
597 /* XXX: only grab if all interfaces are free */
598 for (interface = 0; interface < nb_interfaces; interface++) {
599 op = "USBDEVFS_CLAIMINTERFACE";
600 ret = ioctl(dev->fd, USBDEVFS_CLAIMINTERFACE, &interface);
606 trace_usb_host_claim_interfaces(dev->bus_num, dev->addr,
607 nb_interfaces, configuration);
609 dev->ninterfaces = nb_interfaces;
610 dev->configuration = configuration;
614 if (errno == ENODEV) {
621 static int usb_host_release_interfaces(USBHostDevice *s)
625 trace_usb_host_release_interfaces(s->bus_num, s->addr);
627 for (i = 0; i < s->ninterfaces; i++) {
628 ret = ioctl(s->fd, USBDEVFS_RELEASEINTERFACE, &i);
630 perror("USBDEVFS_RELEASEINTERFACE");
637 static void usb_host_handle_reset(USBDevice *dev)
639 USBHostDevice *s = DO_UPCAST(USBHostDevice, dev, dev);
641 trace_usb_host_reset(s->bus_num, s->addr);
643 usb_host_do_reset(s);;
645 usb_host_claim_interfaces(s, 0);
646 usb_linux_update_endp_table(s);
649 static void usb_host_handle_destroy(USBDevice *dev)
651 USBHostDevice *s = (USBHostDevice *)dev;
653 usb_host_release_port(s);
655 QTAILQ_REMOVE(&hostdevs, s, next);
656 qemu_remove_exit_notifier(&s->exit);
659 /* iso data is special, we need to keep enough urbs in flight to make sure
660 that the controller never runs out of them, otherwise the device will
661 likely suffer a buffer underrun / overrun. */
662 static AsyncURB *usb_host_alloc_iso(USBHostDevice *s, int pid, uint8_t ep)
665 int i, j, len = get_max_packet_size(s, pid, ep);
667 aurb = g_malloc0(s->iso_urb_count * sizeof(*aurb));
668 for (i = 0; i < s->iso_urb_count; i++) {
669 aurb[i].urb.endpoint = ep;
670 aurb[i].urb.buffer_length = ISO_FRAME_DESC_PER_URB * len;
671 aurb[i].urb.buffer = g_malloc(aurb[i].urb.buffer_length);
672 aurb[i].urb.type = USBDEVFS_URB_TYPE_ISO;
673 aurb[i].urb.flags = USBDEVFS_URB_ISO_ASAP;
674 aurb[i].urb.number_of_packets = ISO_FRAME_DESC_PER_URB;
675 for (j = 0 ; j < ISO_FRAME_DESC_PER_URB; j++)
676 aurb[i].urb.iso_frame_desc[j].length = len;
677 if (pid == USB_TOKEN_IN) {
678 aurb[i].urb.endpoint |= 0x80;
679 /* Mark as fully consumed (idle) */
680 aurb[i].iso_frame_idx = ISO_FRAME_DESC_PER_URB;
683 set_iso_urb(s, pid, ep, aurb);
688 static void usb_host_stop_n_free_iso(USBHostDevice *s, int pid, uint8_t ep)
691 int i, ret, killed = 0, free = 1;
693 aurb = get_iso_urb(s, pid, ep);
698 for (i = 0; i < s->iso_urb_count; i++) {
700 if (aurb[i].iso_frame_idx == -1) {
701 ret = ioctl(s->fd, USBDEVFS_DISCARDURB, &aurb[i]);
703 perror("USBDEVFS_DISCARDURB");
711 /* Make sure any urbs we've killed are reaped before we free them */
716 for (i = 0; i < s->iso_urb_count; i++) {
717 g_free(aurb[i].urb.buffer);
723 printf("husb: leaking iso urbs because of discard failure\n");
724 set_iso_urb(s, pid, ep, NULL);
725 set_iso_urb_idx(s, pid, ep, 0);
726 clear_iso_started(s, pid, ep);
729 static int urb_status_to_usb_ret(int status)
733 return USB_RET_STALL;
739 static int usb_host_handle_iso_data(USBHostDevice *s, USBPacket *p, int in)
742 int i, j, ret, max_packet_size, offset, len = 0;
745 max_packet_size = get_max_packet_size(s, p->pid, p->devep);
746 if (max_packet_size == 0)
749 aurb = get_iso_urb(s, p->pid, p->devep);
751 aurb = usb_host_alloc_iso(s, p->pid, p->devep);
754 i = get_iso_urb_idx(s, p->pid, p->devep);
755 j = aurb[i].iso_frame_idx;
756 if (j >= 0 && j < ISO_FRAME_DESC_PER_URB) {
758 /* Check urb status */
759 if (aurb[i].urb.status) {
760 len = urb_status_to_usb_ret(aurb[i].urb.status);
761 /* Move to the next urb */
762 aurb[i].iso_frame_idx = ISO_FRAME_DESC_PER_URB - 1;
763 /* Check frame status */
764 } else if (aurb[i].urb.iso_frame_desc[j].status) {
765 len = urb_status_to_usb_ret(
766 aurb[i].urb.iso_frame_desc[j].status);
767 /* Check the frame fits */
768 } else if (aurb[i].urb.iso_frame_desc[j].actual_length
770 printf("husb: received iso data is larger then packet\n");
772 /* All good copy data over */
774 len = aurb[i].urb.iso_frame_desc[j].actual_length;
775 buf = aurb[i].urb.buffer +
776 j * aurb[i].urb.iso_frame_desc[0].length;
777 usb_packet_copy(p, buf, len);
781 offset = (j == 0) ? 0 : get_iso_buffer_used(s, p->pid, p->devep);
783 /* Check the frame fits */
784 if (len > max_packet_size) {
785 printf("husb: send iso data is larger then max packet size\n");
789 /* All good copy data over */
790 usb_packet_copy(p, aurb[i].urb.buffer + offset, len);
791 aurb[i].urb.iso_frame_desc[j].length = len;
793 set_iso_buffer_used(s, p->pid, p->devep, offset);
795 /* Start the stream once we have buffered enough data */
796 if (!is_iso_started(s, p->pid, p->devep) && i == 1 && j == 8) {
797 set_iso_started(s, p->pid, p->devep);
800 aurb[i].iso_frame_idx++;
801 if (aurb[i].iso_frame_idx == ISO_FRAME_DESC_PER_URB) {
802 i = (i + 1) % s->iso_urb_count;
803 set_iso_urb_idx(s, p->pid, p->devep, i);
807 set_iso_started(s, p->pid, p->devep);
809 DPRINTF("hubs: iso out error no free buffer, dropping packet\n");
813 if (is_iso_started(s, p->pid, p->devep)) {
814 /* (Re)-submit all fully consumed / filled urbs */
815 for (i = 0; i < s->iso_urb_count; i++) {
816 if (aurb[i].iso_frame_idx == ISO_FRAME_DESC_PER_URB) {
817 ret = ioctl(s->fd, USBDEVFS_SUBMITURB, &aurb[i]);
819 perror("USBDEVFS_SUBMITURB");
820 if (!in || len == 0) {
832 aurb[i].iso_frame_idx = -1;
833 change_iso_inflight(s, p->pid, p->devep, 1);
841 static int usb_host_handle_data(USBDevice *dev, USBPacket *p)
843 USBHostDevice *s = DO_UPCAST(USBHostDevice, dev, dev);
844 struct usbdevfs_urb *urb;
846 int ret, rem, prem, v;
850 trace_usb_host_req_data(s->bus_num, s->addr,
851 p->pid == USB_TOKEN_IN,
852 p->devep, p->iov.size);
854 if (!is_valid(s, p->pid, p->devep)) {
855 trace_usb_host_req_complete(s->bus_num, s->addr, USB_RET_NAK);
859 if (p->pid == USB_TOKEN_IN) {
860 ep = p->devep | 0x80;
865 if (is_halted(s, p->pid, p->devep)) {
866 unsigned int arg = ep;
867 ret = ioctl(s->fd, USBDEVFS_CLEAR_HALT, &arg);
869 perror("USBDEVFS_CLEAR_HALT");
870 trace_usb_host_req_complete(s->bus_num, s->addr, USB_RET_NAK);
873 clear_halt(s, p->pid, p->devep);
876 if (is_isoc(s, p->pid, p->devep)) {
877 return usb_host_handle_iso_data(s, p, p->pid == USB_TOKEN_IN);
881 prem = p->iov.iov[v].iov_len;
882 pbuf = p->iov.iov[v].iov_base;
887 assert(v < p->iov.niov);
888 prem = p->iov.iov[v].iov_len;
889 pbuf = p->iov.iov[v].iov_base;
892 aurb = async_alloc(s);
897 urb->type = USBDEVFS_URB_TYPE_BULK;
898 urb->usercontext = s;
900 urb->buffer_length = prem;
902 if (urb->buffer_length > MAX_USBFS_BUFFER_SIZE) {
903 urb->buffer_length = MAX_USBFS_BUFFER_SIZE;
905 pbuf += urb->buffer_length;
906 prem -= urb->buffer_length;
907 rem -= urb->buffer_length;
912 trace_usb_host_urb_submit(s->bus_num, s->addr, aurb,
913 urb->buffer_length, aurb->more);
914 ret = ioctl(s->fd, USBDEVFS_SUBMITURB, urb);
916 DPRINTF("husb: data submit: ep 0x%x, len %u, more %d, packet %p, aurb %p\n",
917 urb->endpoint, urb->buffer_length, aurb->more, p, aurb);
920 perror("USBDEVFS_SUBMITURB");
925 trace_usb_host_req_complete(s->bus_num, s->addr, USB_RET_NAK);
929 trace_usb_host_req_complete(s->bus_num, s->addr, USB_RET_STALL);
930 return USB_RET_STALL;
935 return USB_RET_ASYNC;
938 static int ctrl_error(void)
940 if (errno == ETIMEDOUT) {
943 return USB_RET_STALL;
947 static int usb_host_set_address(USBHostDevice *s, int addr)
949 trace_usb_host_set_address(s->bus_num, s->addr, addr);
954 static int usb_host_set_config(USBHostDevice *s, int config)
958 trace_usb_host_set_config(s->bus_num, s->addr, config);
960 usb_host_release_interfaces(s);
963 ret = ioctl(s->fd, USBDEVFS_SETCONFIGURATION, &config);
965 DPRINTF("husb: ctrl set config %d ret %d errno %d\n", config, ret, errno);
967 if (ret < 0 && errno == EBUSY && first) {
968 /* happens if usb device is in use by host drivers */
969 int count = usb_linux_get_num_interfaces(s);
971 DPRINTF("husb: busy -> disconnecting %d interfaces\n", count);
972 usb_host_disconnect_ifaces(s, count);
981 usb_host_claim_interfaces(s, config);
982 usb_linux_update_endp_table(s);
986 static int usb_host_set_interface(USBHostDevice *s, int iface, int alt)
988 struct usbdevfs_setinterface si;
991 trace_usb_host_set_interface(s->bus_num, s->addr, iface, alt);
993 for (i = 1; i <= MAX_ENDPOINTS; i++) {
994 if (is_isoc(s, USB_TOKEN_IN, i)) {
995 usb_host_stop_n_free_iso(s, USB_TOKEN_IN, i);
997 if (is_isoc(s, USB_TOKEN_OUT, i)) {
998 usb_host_stop_n_free_iso(s, USB_TOKEN_OUT, i);
1002 si.interface = iface;
1003 si.altsetting = alt;
1004 ret = ioctl(s->fd, USBDEVFS_SETINTERFACE, &si);
1006 DPRINTF("husb: ctrl set iface %d altset %d ret %d errno %d\n",
1007 iface, alt, ret, errno);
1010 return ctrl_error();
1012 usb_linux_update_endp_table(s);
1016 static int usb_host_handle_control(USBDevice *dev, USBPacket *p,
1017 int request, int value, int index, int length, uint8_t *data)
1019 USBHostDevice *s = DO_UPCAST(USBHostDevice, dev, dev);
1020 struct usbdevfs_urb *urb;
1025 * Process certain standard device requests.
1026 * These are infrequent and are processed synchronously.
1029 /* Note request is (bRequestType << 8) | bRequest */
1030 trace_usb_host_req_control(s->bus_num, s->addr, request, value, index);
1033 case DeviceOutRequest | USB_REQ_SET_ADDRESS:
1034 return usb_host_set_address(s, value);
1036 case DeviceOutRequest | USB_REQ_SET_CONFIGURATION:
1037 return usb_host_set_config(s, value & 0xff);
1039 case InterfaceOutRequest | USB_REQ_SET_INTERFACE:
1040 return usb_host_set_interface(s, index, value);
1043 /* The rest are asynchronous */
1045 if (length > sizeof(dev->data_buf)) {
1046 fprintf(stderr, "husb: ctrl buffer too small (%d > %zu)\n",
1047 length, sizeof(dev->data_buf));
1048 return USB_RET_STALL;
1051 aurb = async_alloc(s);
1055 * Setup ctrl transfer.
1057 * s->ctrl is laid out such that data buffer immediately follows
1058 * 'req' struct which is exactly what usbdevfs expects.
1062 urb->type = USBDEVFS_URB_TYPE_CONTROL;
1063 urb->endpoint = p->devep;
1065 urb->buffer = &dev->setup_buf;
1066 urb->buffer_length = length + 8;
1068 urb->usercontext = s;
1070 trace_usb_host_urb_submit(s->bus_num, s->addr, aurb,
1071 urb->buffer_length, aurb->more);
1072 ret = ioctl(s->fd, USBDEVFS_SUBMITURB, urb);
1074 DPRINTF("husb: submit ctrl. len %u aurb %p\n", urb->buffer_length, aurb);
1077 DPRINTF("husb: submit failed. errno %d\n", errno);
1085 return USB_RET_STALL;
1089 return USB_RET_ASYNC;
1092 static uint8_t usb_linux_get_alt_setting(USBHostDevice *s,
1093 uint8_t configuration, uint8_t interface)
1095 char device_name[64], line[1024];
1098 sprintf(device_name, "%d-%s:%d.%d", s->bus_num, s->port,
1099 (int)configuration, (int)interface);
1101 if (!usb_host_read_file(line, sizeof(line), "bAlternateSetting",
1103 /* Assume alt 0 on error */
1106 if (sscanf(line, "%d", &alt_setting) != 1) {
1107 /* Assume alt 0 on error */
1113 /* returns 1 on problem encountered or 0 for success */
1114 static int usb_linux_update_endp_table(USBHostDevice *s)
1116 uint8_t *descriptors;
1117 uint8_t devep, type, alt_interface;
1118 int interface, length, i, ep, pid;
1119 struct endp_data *epd;
1121 for (i = 0; i < MAX_ENDPOINTS; i++) {
1122 s->ep_in[i].type = INVALID_EP_TYPE;
1123 s->ep_out[i].type = INVALID_EP_TYPE;
1126 if (s->configuration == 0) {
1127 /* not configured yet -- leave all endpoints disabled */
1131 /* get the desired configuration, interface, and endpoint descriptors
1132 * from device description */
1133 descriptors = &s->descr[18];
1134 length = s->descr_len - 18;
1137 while (i < length) {
1138 if (descriptors[i + 1] != USB_DT_CONFIG) {
1139 fprintf(stderr, "invalid descriptor data\n");
1141 } else if (descriptors[i + 5] != s->configuration) {
1142 DPRINTF("not requested configuration %d\n", s->configuration);
1143 i += (descriptors[i + 3] << 8) + descriptors[i + 2];
1147 i += descriptors[i];
1149 if (descriptors[i + 1] != USB_DT_INTERFACE ||
1150 (descriptors[i + 1] == USB_DT_INTERFACE &&
1151 descriptors[i + 4] == 0)) {
1152 i += descriptors[i];
1156 interface = descriptors[i + 2];
1157 alt_interface = usb_linux_get_alt_setting(s, s->configuration,
1160 /* the current interface descriptor is the active interface
1161 * and has endpoints */
1162 if (descriptors[i + 3] != alt_interface) {
1163 i += descriptors[i];
1167 /* advance to the endpoints */
1168 while (i < length && descriptors[i +1] != USB_DT_ENDPOINT) {
1169 i += descriptors[i];
1175 while (i < length) {
1176 if (descriptors[i + 1] != USB_DT_ENDPOINT) {
1180 devep = descriptors[i + 2];
1181 pid = (devep & USB_DIR_IN) ? USB_TOKEN_IN : USB_TOKEN_OUT;
1184 fprintf(stderr, "usb-linux: invalid ep descriptor, ep == 0\n");
1188 switch (descriptors[i + 3] & 0x3) {
1190 type = USBDEVFS_URB_TYPE_CONTROL;
1193 type = USBDEVFS_URB_TYPE_ISO;
1194 set_max_packet_size(s, pid, ep, descriptors + i);
1197 type = USBDEVFS_URB_TYPE_BULK;
1200 type = USBDEVFS_URB_TYPE_INTERRUPT;
1203 DPRINTF("usb_host: malformed endpoint type\n");
1204 type = USBDEVFS_URB_TYPE_BULK;
1206 epd = get_endp(s, pid, ep);
1207 assert(epd->type == INVALID_EP_TYPE);
1211 i += descriptors[i];
1218 * Check if we can safely redirect a usb2 device to a usb1 virtual controller,
1219 * this function assumes this is safe, if:
1220 * 1) There are no isoc endpoints
1221 * 2) There are no interrupt endpoints with a max_packet_size > 64
1222 * Note bulk endpoints with a max_packet_size > 64 in theory also are not
1223 * usb1 compatible, but in practice this seems to work fine.
1225 static int usb_linux_full_speed_compat(USBHostDevice *dev)
1230 * usb_linux_update_endp_table only registers info about ep in the current
1231 * interface altsettings, so we need to parse the descriptors again.
1233 for (i = 0; (i + 5) < dev->descr_len; i += dev->descr[i]) {
1234 if (dev->descr[i + 1] == USB_DT_ENDPOINT) {
1235 switch (dev->descr[i + 3] & 0x3) {
1236 case 0x00: /* CONTROL */
1238 case 0x01: /* ISO */
1240 case 0x02: /* BULK */
1242 case 0x03: /* INTERRUPT */
1243 packet_size = dev->descr[i + 4] + (dev->descr[i + 5] << 8);
1244 if (packet_size > 64)
1253 static int usb_host_open(USBHostDevice *dev, int bus_num,
1254 int addr, const char *port,
1255 const char *prod_name, int speed)
1259 trace_usb_host_open_started(bus_num, addr);
1261 if (dev->fd != -1) {
1265 fd = usb_host_open_device(bus_num, addr);
1269 DPRINTF("husb: opened %s\n", buf);
1271 dev->bus_num = bus_num;
1273 strcpy(dev->port, port);
1276 /* read the device description */
1277 dev->descr_len = read(fd, dev->descr, sizeof(dev->descr));
1278 if (dev->descr_len <= 0) {
1279 perror("husb: reading device data failed");
1286 printf("=== begin dumping device descriptor data ===\n");
1287 for (x = 0; x < dev->descr_len; x++) {
1288 printf("%02x ", dev->descr[x]);
1290 printf("\n=== end dumping device descriptor data ===\n");
1295 /* start unconfigured -- we'll wait for the guest to set a configuration */
1296 if (!usb_host_claim_interfaces(dev, 0)) {
1300 ret = usb_linux_update_endp_table(dev);
1306 struct usbdevfs_connectinfo ci;
1308 ret = ioctl(fd, USBDEVFS_CONNECTINFO, &ci);
1310 perror("usb_host_device_open: USBDEVFS_CONNECTINFO");
1315 speed = USB_SPEED_LOW;
1317 speed = USB_SPEED_HIGH;
1320 dev->dev.speed = speed;
1321 dev->dev.speedmask = (1 << speed);
1322 if (dev->dev.speed == USB_SPEED_HIGH && usb_linux_full_speed_compat(dev)) {
1323 dev->dev.speedmask |= USB_SPEED_MASK_FULL;
1326 trace_usb_host_open_success(bus_num, addr);
1328 if (!prod_name || prod_name[0] == '\0') {
1329 snprintf(dev->dev.product_desc, sizeof(dev->dev.product_desc),
1330 "host:%d.%d", bus_num, addr);
1332 pstrcpy(dev->dev.product_desc, sizeof(dev->dev.product_desc),
1336 ret = usb_device_attach(&dev->dev);
1341 /* USB devio uses 'write' flag to check for async completions */
1342 qemu_set_fd_handler(dev->fd, NULL, async_complete, dev);
1347 trace_usb_host_open_failure(bus_num, addr);
1348 if (dev->fd != -1) {
1355 static int usb_host_close(USBHostDevice *dev)
1359 if (dev->fd == -1) {
1363 trace_usb_host_close(dev->bus_num, dev->addr);
1365 qemu_set_fd_handler(dev->fd, NULL, NULL, NULL);
1367 for (i = 1; i <= MAX_ENDPOINTS; i++) {
1368 if (is_isoc(dev, USB_TOKEN_IN, i)) {
1369 usb_host_stop_n_free_iso(dev, USB_TOKEN_IN, i);
1371 if (is_isoc(dev, USB_TOKEN_OUT, i)) {
1372 usb_host_stop_n_free_iso(dev, USB_TOKEN_OUT, i);
1375 async_complete(dev);
1377 if (dev->dev.attached) {
1378 usb_device_detach(&dev->dev);
1380 usb_host_do_reset(dev);
1386 static void usb_host_exit_notifier(struct Notifier *n, void *data)
1388 USBHostDevice *s = container_of(n, USBHostDevice, exit);
1390 usb_host_release_port(s);
1392 usb_host_do_reset(s);;
1396 static int usb_host_initfn(USBDevice *dev)
1398 USBHostDevice *s = DO_UPCAST(USBHostDevice, dev, dev);
1400 dev->auto_attach = 0;
1404 QTAILQ_INSERT_TAIL(&hostdevs, s, next);
1405 s->exit.notify = usb_host_exit_notifier;
1406 qemu_add_exit_notifier(&s->exit);
1407 usb_host_auto_check(NULL);
1409 if (s->match.bus_num != 0 && s->match.port != NULL) {
1410 usb_host_claim_port(s);
1415 static const VMStateDescription vmstate_usb_host = {
1420 static struct USBDeviceInfo usb_host_dev_info = {
1421 .product_desc = "USB Host Device",
1422 .qdev.name = "usb-host",
1423 .qdev.size = sizeof(USBHostDevice),
1424 .qdev.vmsd = &vmstate_usb_host,
1425 .init = usb_host_initfn,
1426 .handle_packet = usb_generic_handle_packet,
1427 .cancel_packet = usb_host_async_cancel,
1428 .handle_data = usb_host_handle_data,
1429 .handle_control = usb_host_handle_control,
1430 .handle_reset = usb_host_handle_reset,
1431 .handle_destroy = usb_host_handle_destroy,
1432 .usbdevice_name = "host",
1433 .usbdevice_init = usb_host_device_open,
1434 .qdev.props = (Property[]) {
1435 DEFINE_PROP_UINT32("hostbus", USBHostDevice, match.bus_num, 0),
1436 DEFINE_PROP_UINT32("hostaddr", USBHostDevice, match.addr, 0),
1437 DEFINE_PROP_STRING("hostport", USBHostDevice, match.port),
1438 DEFINE_PROP_HEX32("vendorid", USBHostDevice, match.vendor_id, 0),
1439 DEFINE_PROP_HEX32("productid", USBHostDevice, match.product_id, 0),
1440 DEFINE_PROP_UINT32("isobufs", USBHostDevice, iso_urb_count, 4),
1441 DEFINE_PROP_END_OF_LIST(),
1445 static void usb_host_register_devices(void)
1447 usb_qdev_register(&usb_host_dev_info);
1449 device_init(usb_host_register_devices)
1451 USBDevice *usb_host_device_open(const char *devname)
1453 struct USBAutoFilter filter;
1457 dev = usb_create(NULL /* FIXME */, "usb-host");
1459 if (strstr(devname, "auto:")) {
1460 if (parse_filter(devname, &filter) < 0) {
1464 if ((p = strchr(devname, '.'))) {
1465 filter.bus_num = strtoul(devname, NULL, 0);
1466 filter.addr = strtoul(p + 1, NULL, 0);
1467 filter.vendor_id = 0;
1468 filter.product_id = 0;
1469 } else if ((p = strchr(devname, ':'))) {
1472 filter.vendor_id = strtoul(devname, NULL, 16);
1473 filter.product_id = strtoul(p + 1, NULL, 16);
1479 qdev_prop_set_uint32(&dev->qdev, "hostbus", filter.bus_num);
1480 qdev_prop_set_uint32(&dev->qdev, "hostaddr", filter.addr);
1481 qdev_prop_set_uint32(&dev->qdev, "vendorid", filter.vendor_id);
1482 qdev_prop_set_uint32(&dev->qdev, "productid", filter.product_id);
1483 qdev_init_nofail(&dev->qdev);
1487 qdev_free(&dev->qdev);
1491 int usb_host_device_close(const char *devname)
1494 char product_name[PRODUCT_NAME_SZ];
1498 if (strstr(devname, "auto:")) {
1499 return usb_host_auto_del(devname);
1501 if (usb_host_find_device(&bus_num, &addr, product_name,
1502 sizeof(product_name), devname) < 0) {
1505 s = hostdev_find(bus_num, addr);
1507 usb_device_delete_addr(s->bus_num, s->dev.addr);
1516 * Read sys file-system device file
1518 * @line address of buffer to put file contents in
1519 * @line_size size of line
1520 * @device_file path to device file (printf format string)
1521 * @device_name device being opened (inserted into device_file)
1523 * @return 0 failed, 1 succeeded ('line' contains data)
1525 static int usb_host_read_file(char *line, size_t line_size,
1526 const char *device_file, const char *device_name)
1530 char filename[PATH_MAX];
1532 snprintf(filename, PATH_MAX, "/sys/bus/usb/devices/%s/%s", device_name,
1534 f = fopen(filename, "r");
1536 ret = fgets(line, line_size, f) != NULL;
1544 * Use /sys/bus/usb/devices/ directory to determine host's USB
1547 * This code is based on Robert Schiele's original patches posted to
1548 * the Novell bug-tracker https://bugzilla.novell.com/show_bug.cgi?id=241950
1550 static int usb_host_scan(void *opaque, USBScanFunc *func)
1554 int bus_num, addr, speed, class_id, product_id, vendor_id;
1556 char port[MAX_PORTLEN];
1557 char product_name[512];
1560 dir = opendir("/sys/bus/usb/devices");
1562 perror("husb: opendir /sys/bus/usb/devices");
1563 fprintf(stderr, "husb: please make sure sysfs is mounted at /sys\n");
1567 while ((de = readdir(dir))) {
1568 if (de->d_name[0] != '.' && !strchr(de->d_name, ':')) {
1569 if (sscanf(de->d_name, "%d-%7[0-9.]", &bus_num, port) < 2) {
1573 if (!usb_host_read_file(line, sizeof(line), "devnum", de->d_name)) {
1576 if (sscanf(line, "%d", &addr) != 1) {
1579 if (!usb_host_read_file(line, sizeof(line), "bDeviceClass",
1583 if (sscanf(line, "%x", &class_id) != 1) {
1587 if (!usb_host_read_file(line, sizeof(line), "idVendor",
1591 if (sscanf(line, "%x", &vendor_id) != 1) {
1594 if (!usb_host_read_file(line, sizeof(line), "idProduct",
1598 if (sscanf(line, "%x", &product_id) != 1) {
1601 if (!usb_host_read_file(line, sizeof(line), "product",
1605 if (strlen(line) > 0) {
1606 line[strlen(line) - 1] = '\0';
1608 pstrcpy(product_name, sizeof(product_name), line);
1611 if (!usb_host_read_file(line, sizeof(line), "speed", de->d_name)) {
1614 if (!strcmp(line, "5000\n")) {
1615 speed = USB_SPEED_SUPER;
1616 } else if (!strcmp(line, "480\n")) {
1617 speed = USB_SPEED_HIGH;
1618 } else if (!strcmp(line, "1.5\n")) {
1619 speed = USB_SPEED_LOW;
1621 speed = USB_SPEED_FULL;
1624 ret = func(opaque, bus_num, addr, port, class_id, vendor_id,
1625 product_id, product_name, speed);
1638 static QEMUTimer *usb_auto_timer;
1640 static int usb_host_auto_scan(void *opaque, int bus_num,
1641 int addr, const char *port,
1642 int class_id, int vendor_id, int product_id,
1643 const char *product_name, int speed)
1645 struct USBAutoFilter *f;
1646 struct USBHostDevice *s;
1652 QTAILQ_FOREACH(s, &hostdevs, next) {
1655 if (f->bus_num > 0 && f->bus_num != bus_num) {
1658 if (f->addr > 0 && f->addr != addr) {
1661 if (f->port != NULL && (port == NULL || strcmp(f->port, port) != 0)) {
1665 if (f->vendor_id > 0 && f->vendor_id != vendor_id) {
1669 if (f->product_id > 0 && f->product_id != product_id) {
1672 /* We got a match */
1674 if (s->errcount >= 3) {
1678 /* Already attached ? */
1682 DPRINTF("husb: auto open: bus_num %d addr %d\n", bus_num, addr);
1684 if (usb_host_open(s, bus_num, addr, port, product_name, speed) < 0) {
1693 static void usb_host_auto_check(void *unused)
1695 struct USBHostDevice *s;
1696 int unconnected = 0;
1698 usb_host_scan(NULL, usb_host_auto_scan);
1700 QTAILQ_FOREACH(s, &hostdevs, next) {
1710 if (unconnected == 0) {
1711 /* nothing to watch */
1712 if (usb_auto_timer) {
1713 qemu_del_timer(usb_auto_timer);
1714 trace_usb_host_auto_scan_disabled();
1719 if (!usb_auto_timer) {
1720 usb_auto_timer = qemu_new_timer_ms(rt_clock, usb_host_auto_check, NULL);
1721 if (!usb_auto_timer) {
1724 trace_usb_host_auto_scan_enabled();
1726 qemu_mod_timer(usb_auto_timer, qemu_get_clock_ms(rt_clock) + 2000);
1730 * Autoconnect filter
1732 * auto:bus:dev[:vid:pid]
1733 * auto:bus.dev[:vid:pid]
1735 * bus - bus number (dec, * means any)
1736 * dev - device number (dec, * means any)
1737 * vid - vendor id (hex, * means any)
1738 * pid - product id (hex, * means any)
1740 * See 'lsusb' output.
1742 static int parse_filter(const char *spec, struct USBAutoFilter *f)
1744 enum { BUS, DEV, VID, PID, DONE };
1745 const char *p = spec;
1753 for (i = BUS; i < DONE; i++) {
1754 p = strpbrk(p, ":.");
1764 case BUS: f->bus_num = strtol(p, NULL, 10); break;
1765 case DEV: f->addr = strtol(p, NULL, 10); break;
1766 case VID: f->vendor_id = strtol(p, NULL, 16); break;
1767 case PID: f->product_id = strtol(p, NULL, 16); break;
1772 fprintf(stderr, "husb: invalid auto filter spec %s\n", spec);
1779 /**********************/
1780 /* USB host device info */
1782 struct usb_class_info {
1784 const char *class_name;
1787 static const struct usb_class_info usb_class_info[] = {
1788 { USB_CLASS_AUDIO, "Audio"},
1789 { USB_CLASS_COMM, "Communication"},
1790 { USB_CLASS_HID, "HID"},
1791 { USB_CLASS_HUB, "Hub" },
1792 { USB_CLASS_PHYSICAL, "Physical" },
1793 { USB_CLASS_PRINTER, "Printer" },
1794 { USB_CLASS_MASS_STORAGE, "Storage" },
1795 { USB_CLASS_CDC_DATA, "Data" },
1796 { USB_CLASS_APP_SPEC, "Application Specific" },
1797 { USB_CLASS_VENDOR_SPEC, "Vendor Specific" },
1798 { USB_CLASS_STILL_IMAGE, "Still Image" },
1799 { USB_CLASS_CSCID, "Smart Card" },
1800 { USB_CLASS_CONTENT_SEC, "Content Security" },
1804 static const char *usb_class_str(uint8_t class)
1806 const struct usb_class_info *p;
1807 for(p = usb_class_info; p->class != -1; p++) {
1808 if (p->class == class) {
1812 return p->class_name;
1815 static void usb_info_device(Monitor *mon, int bus_num,
1816 int addr, const char *port,
1817 int class_id, int vendor_id, int product_id,
1818 const char *product_name,
1821 const char *class_str, *speed_str;
1827 case USB_SPEED_FULL:
1830 case USB_SPEED_HIGH:
1833 case USB_SPEED_SUPER:
1841 monitor_printf(mon, " Bus %d, Addr %d, Port %s, Speed %s Mb/s\n",
1842 bus_num, addr, port, speed_str);
1843 class_str = usb_class_str(class_id);
1845 monitor_printf(mon, " %s:", class_str);
1847 monitor_printf(mon, " Class %02x:", class_id);
1849 monitor_printf(mon, " USB device %04x:%04x", vendor_id, product_id);
1850 if (product_name[0] != '\0') {
1851 monitor_printf(mon, ", %s", product_name);
1853 monitor_printf(mon, "\n");
1856 static int usb_host_info_device(void *opaque, int bus_num, int addr,
1857 const char *path, int class_id,
1858 int vendor_id, int product_id,
1859 const char *product_name,
1862 Monitor *mon = opaque;
1864 usb_info_device(mon, bus_num, addr, path, class_id, vendor_id, product_id,
1865 product_name, speed);
1869 static void dec2str(int val, char *str, size_t size)
1872 snprintf(str, size, "*");
1874 snprintf(str, size, "%d", val);
1878 static void hex2str(int val, char *str, size_t size)
1881 snprintf(str, size, "*");
1883 snprintf(str, size, "%04x", val);
1887 void usb_host_info(Monitor *mon)
1889 struct USBAutoFilter *f;
1890 struct USBHostDevice *s;
1892 usb_host_scan(mon, usb_host_info_device);
1894 if (QTAILQ_EMPTY(&hostdevs)) {
1898 monitor_printf(mon, " Auto filters:\n");
1899 QTAILQ_FOREACH(s, &hostdevs, next) {
1900 char bus[10], addr[10], vid[10], pid[10];
1902 dec2str(f->bus_num, bus, sizeof(bus));
1903 dec2str(f->addr, addr, sizeof(addr));
1904 hex2str(f->vendor_id, vid, sizeof(vid));
1905 hex2str(f->product_id, pid, sizeof(pid));
1906 monitor_printf(mon, " Bus %s, Addr %s, Port %s, ID %s:%s\n",
1907 bus, addr, f->port ? f->port : "*", vid, pid);