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
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
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 USBDBG_DEVOPENED "husb: opened %s/devices\n"
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"
78 static char *usb_host_device_path
;
85 static int usb_fs_type
;
87 /* endpoint association data */
88 #define ISO_FRAME_DESC_PER_URB 32
89 #define INVALID_EP_TYPE 255
91 /* devio.c limits single requests to 16k */
92 #define MAX_USBFS_BUFFER_SIZE 16384
94 typedef struct AsyncURB AsyncURB
;
107 struct USBAutoFilter
{
115 typedef struct USBHostDevice
{
125 uint32_t iso_urb_count
;
128 struct endp_data ep_in
[MAX_ENDPOINTS
];
129 struct endp_data ep_out
[MAX_ENDPOINTS
];
130 QLIST_HEAD(, AsyncURB
) aurbs
;
132 /* Host side address */
135 char port
[MAX_PORTLEN
];
136 struct USBAutoFilter match
;
139 QTAILQ_ENTRY(USBHostDevice
) next
;
142 static QTAILQ_HEAD(, USBHostDevice
) hostdevs
= QTAILQ_HEAD_INITIALIZER(hostdevs
);
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
);
151 static struct endp_data
*get_endp(USBHostDevice
*s
, int pid
, int ep
)
153 struct endp_data
*eps
= pid
== USB_TOKEN_IN
? s
->ep_in
: s
->ep_out
;
154 assert(pid
== USB_TOKEN_IN
|| pid
== USB_TOKEN_OUT
);
155 assert(ep
> 0 && ep
<= MAX_ENDPOINTS
);
159 static int is_isoc(USBHostDevice
*s
, int pid
, int ep
)
161 return get_endp(s
, pid
, ep
)->type
== USBDEVFS_URB_TYPE_ISO
;
164 static int is_valid(USBHostDevice
*s
, int pid
, int ep
)
166 return get_endp(s
, pid
, ep
)->type
!= INVALID_EP_TYPE
;
169 static int is_halted(USBHostDevice
*s
, int pid
, int ep
)
171 return get_endp(s
, pid
, ep
)->halted
;
174 static void clear_halt(USBHostDevice
*s
, int pid
, int ep
)
176 trace_usb_host_ep_clear_halt(s
->bus_num
, s
->addr
, ep
);
177 get_endp(s
, pid
, ep
)->halted
= 0;
180 static void set_halt(USBHostDevice
*s
, int pid
, int ep
)
183 trace_usb_host_ep_set_halt(s
->bus_num
, s
->addr
, ep
);
184 get_endp(s
, pid
, ep
)->halted
= 1;
188 static int is_iso_started(USBHostDevice
*s
, int pid
, int ep
)
190 return get_endp(s
, pid
, ep
)->iso_started
;
193 static void clear_iso_started(USBHostDevice
*s
, int pid
, int ep
)
195 trace_usb_host_ep_stop_iso(s
->bus_num
, s
->addr
, ep
);
196 get_endp(s
, pid
, ep
)->iso_started
= 0;
199 static void set_iso_started(USBHostDevice
*s
, int pid
, int ep
)
201 struct endp_data
*e
= get_endp(s
, pid
, ep
);
203 trace_usb_host_ep_start_iso(s
->bus_num
, s
->addr
, ep
);
204 if (!e
->iso_started
) {
210 static int change_iso_inflight(USBHostDevice
*s
, int pid
, int ep
, int value
)
212 struct endp_data
*e
= get_endp(s
, pid
, ep
);
214 e
->inflight
+= value
;
218 static void set_iso_urb(USBHostDevice
*s
, int pid
, int ep
, AsyncURB
*iso_urb
)
220 get_endp(s
, pid
, ep
)->iso_urb
= iso_urb
;
223 static AsyncURB
*get_iso_urb(USBHostDevice
*s
, int pid
, int ep
)
225 return get_endp(s
, pid
, ep
)->iso_urb
;
228 static void set_iso_urb_idx(USBHostDevice
*s
, int pid
, int ep
, int i
)
230 get_endp(s
, pid
, ep
)->iso_urb_idx
= i
;
233 static int get_iso_urb_idx(USBHostDevice
*s
, int pid
, int ep
)
235 return get_endp(s
, pid
, ep
)->iso_urb_idx
;
238 static void set_iso_buffer_used(USBHostDevice
*s
, int pid
, int ep
, int i
)
240 get_endp(s
, pid
, ep
)->iso_buffer_used
= i
;
243 static int get_iso_buffer_used(USBHostDevice
*s
, int pid
, int ep
)
245 return get_endp(s
, pid
, ep
)->iso_buffer_used
;
248 static void set_max_packet_size(USBHostDevice
*s
, int pid
, int ep
,
251 int raw
= descriptor
[4] + (descriptor
[5] << 8);
252 int size
, microframes
;
255 switch ((raw
>> 11) & 3) {
256 case 1: microframes
= 2; break;
257 case 2: microframes
= 3; break;
258 default: microframes
= 1; break;
260 get_endp(s
, pid
, ep
)->max_packet_size
= size
* microframes
;
263 static int get_max_packet_size(USBHostDevice
*s
, int pid
, int ep
)
265 return get_endp(s
, pid
, ep
)->max_packet_size
;
270 * We always allocate iso packet descriptors even for bulk transfers
271 * to simplify allocation and casts.
275 struct usbdevfs_urb urb
;
276 struct usbdevfs_iso_packet_desc isocpd
[ISO_FRAME_DESC_PER_URB
];
278 QLIST_ENTRY(AsyncURB
) next
;
280 /* For regular async urbs */
282 int more
; /* large transfer, more urbs follow */
284 /* For buffered iso handling */
285 int iso_frame_idx
; /* -1 means in flight */
288 static AsyncURB
*async_alloc(USBHostDevice
*s
)
290 AsyncURB
*aurb
= g_malloc0(sizeof(AsyncURB
));
292 QLIST_INSERT_HEAD(&s
->aurbs
, aurb
, next
);
296 static void async_free(AsyncURB
*aurb
)
298 QLIST_REMOVE(aurb
, next
);
302 static void do_disconnect(USBHostDevice
*s
)
305 usb_host_auto_check(NULL
);
308 static void async_complete(void *opaque
)
310 USBHostDevice
*s
= opaque
;
317 int r
= ioctl(s
->fd
, USBDEVFS_REAPURBNDELAY
, &aurb
);
319 if (errno
== EAGAIN
) {
321 fprintf(stderr
, "husb: %d iso urbs finished at once\n", urbs
);
325 if (errno
== ENODEV
) {
327 trace_usb_host_disconnect(s
->bus_num
, s
->addr
);
333 perror("USBDEVFS_REAPURBNDELAY");
337 DPRINTF("husb: async completed. aurb %p status %d alen %d\n",
338 aurb
, aurb
->urb
.status
, aurb
->urb
.actual_length
);
340 /* If this is a buffered iso urb mark it as complete and don't do
341 anything else (it is handled further in usb_host_handle_iso_data) */
342 if (aurb
->iso_frame_idx
== -1) {
344 int pid
= (aurb
->urb
.endpoint
& USB_DIR_IN
) ?
345 USB_TOKEN_IN
: USB_TOKEN_OUT
;
346 int ep
= aurb
->urb
.endpoint
& 0xf;
347 if (aurb
->urb
.status
== -EPIPE
) {
348 set_halt(s
, pid
, ep
);
350 aurb
->iso_frame_idx
= 0;
352 inflight
= change_iso_inflight(s
, pid
, ep
, -1);
353 if (inflight
== 0 && is_iso_started(s
, pid
, ep
)) {
354 fprintf(stderr
, "husb: out of buffers for iso stream\n");
360 trace_usb_host_urb_complete(s
->bus_num
, s
->addr
, aurb
, aurb
->urb
.status
,
361 aurb
->urb
.actual_length
, aurb
->more
);
364 switch (aurb
->urb
.status
) {
366 p
->result
+= aurb
->urb
.actual_length
;
370 set_halt(s
, p
->pid
, p
->devep
);
371 p
->result
= USB_RET_STALL
;
375 p
->result
= USB_RET_NAK
;
379 if (aurb
->urb
.type
== USBDEVFS_URB_TYPE_CONTROL
) {
380 trace_usb_host_req_complete(s
->bus_num
, s
->addr
, p
->result
);
381 usb_generic_async_ctrl_complete(&s
->dev
, p
);
382 } else if (!aurb
->more
) {
383 trace_usb_host_req_complete(s
->bus_num
, s
->addr
, p
->result
);
384 usb_packet_complete(&s
->dev
, p
);
392 static void usb_host_async_cancel(USBDevice
*dev
, USBPacket
*p
)
394 USBHostDevice
*s
= DO_UPCAST(USBHostDevice
, dev
, dev
);
397 QLIST_FOREACH(aurb
, &s
->aurbs
, next
) {
398 if (p
!= aurb
->packet
) {
402 DPRINTF("husb: async cancel: packet %p, aurb %p\n", p
, aurb
);
404 /* Mark it as dead (see async_complete above) */
407 int r
= ioctl(s
->fd
, USBDEVFS_DISCARDURB
, aurb
);
409 DPRINTF("husb: async. discard urb failed errno %d\n", errno
);
414 static int usb_host_claim_port(USBHostDevice
*s
)
416 #ifdef USBDEVFS_CLAIM_PORT
417 char *h
, hub_name
[64], line
[1024];
418 int hub_addr
, portnr
, ret
;
420 snprintf(hub_name
, sizeof(hub_name
), "%d-%s",
421 s
->match
.bus_num
, s
->match
.port
);
423 /* try strip off last ".$portnr" to get hub */
424 h
= strrchr(hub_name
, '.');
429 /* no dot in there -> it is the root hub */
430 snprintf(hub_name
, sizeof(hub_name
), "usb%d",
432 portnr
= atoi(s
->match
.port
);
435 if (!usb_host_read_file(line
, sizeof(line
), "devnum",
439 if (sscanf(line
, "%d", &hub_addr
) != 1) {
443 if (!usb_host_device_path
) {
446 snprintf(line
, sizeof(line
), "%s/%03d/%03d",
447 usb_host_device_path
, s
->match
.bus_num
, hub_addr
);
448 s
->hub_fd
= open(line
, O_RDWR
| O_NONBLOCK
);
453 ret
= ioctl(s
->hub_fd
, USBDEVFS_CLAIM_PORT
, &portnr
);
460 trace_usb_host_claim_port(s
->match
.bus_num
, hub_addr
, portnr
);
467 static int usb_host_disconnect_ifaces(USBHostDevice
*dev
, int nb_interfaces
)
469 /* earlier Linux 2.4 do not support that */
470 #ifdef USBDEVFS_DISCONNECT
471 struct usbdevfs_ioctl ctrl
;
474 for (interface
= 0; interface
< nb_interfaces
; interface
++) {
475 ctrl
.ioctl_code
= USBDEVFS_DISCONNECT
;
476 ctrl
.ifno
= interface
;
478 ret
= ioctl(dev
->fd
, USBDEVFS_IOCTL
, &ctrl
);
479 if (ret
< 0 && errno
!= ENODATA
) {
480 perror("USBDEVFS_DISCONNECT");
488 static int usb_linux_get_num_interfaces(USBHostDevice
*s
)
490 char device_name
[64], line
[1024];
491 int num_interfaces
= 0;
493 if (usb_fs_type
!= USB_FS_SYS
) {
497 sprintf(device_name
, "%d-%s", s
->bus_num
, s
->port
);
498 if (!usb_host_read_file(line
, sizeof(line
), "bNumInterfaces",
502 if (sscanf(line
, "%d", &num_interfaces
) != 1) {
505 return num_interfaces
;
508 static int usb_host_claim_interfaces(USBHostDevice
*dev
, int configuration
)
510 const char *op
= NULL
;
511 int dev_descr_len
, config_descr_len
;
512 int interface
, nb_interfaces
;
515 if (configuration
== 0) { /* address state - ignore */
516 dev
->ninterfaces
= 0;
517 dev
->configuration
= 0;
521 DPRINTF("husb: claiming interfaces. config %d\n", configuration
);
524 dev_descr_len
= dev
->descr
[0];
525 if (dev_descr_len
> dev
->descr_len
) {
526 fprintf(stderr
, "husb: update iface failed. descr too short\n");
531 while (i
< dev
->descr_len
) {
532 DPRINTF("husb: i is %d, descr_len is %d, dl %d, dt %d\n",
534 dev
->descr
[i
], dev
->descr
[i
+1]);
536 if (dev
->descr
[i
+1] != USB_DT_CONFIG
) {
540 config_descr_len
= dev
->descr
[i
];
542 DPRINTF("husb: config #%d need %d\n", dev
->descr
[i
+ 5], configuration
);
544 if (configuration
== dev
->descr
[i
+ 5]) {
545 configuration
= dev
->descr
[i
+ 5];
549 i
+= config_descr_len
;
552 if (i
>= dev
->descr_len
) {
554 "husb: update iface failed. no matching configuration\n");
557 nb_interfaces
= dev
->descr
[i
+ 4];
559 if (usb_host_disconnect_ifaces(dev
, nb_interfaces
) < 0) {
563 /* XXX: only grab if all interfaces are free */
564 for (interface
= 0; interface
< nb_interfaces
; interface
++) {
565 op
= "USBDEVFS_CLAIMINTERFACE";
566 ret
= ioctl(dev
->fd
, USBDEVFS_CLAIMINTERFACE
, &interface
);
572 trace_usb_host_claim_interfaces(dev
->bus_num
, dev
->addr
,
573 nb_interfaces
, configuration
);
575 dev
->ninterfaces
= nb_interfaces
;
576 dev
->configuration
= configuration
;
580 if (errno
== ENODEV
) {
587 static int usb_host_release_interfaces(USBHostDevice
*s
)
591 trace_usb_host_release_interfaces(s
->bus_num
, s
->addr
);
593 for (i
= 0; i
< s
->ninterfaces
; i
++) {
594 ret
= ioctl(s
->fd
, USBDEVFS_RELEASEINTERFACE
, &i
);
596 perror("USBDEVFS_RELEASEINTERFACE");
603 static void usb_host_handle_reset(USBDevice
*dev
)
605 USBHostDevice
*s
= DO_UPCAST(USBHostDevice
, dev
, dev
);
607 trace_usb_host_reset(s
->bus_num
, s
->addr
);
609 ioctl(s
->fd
, USBDEVFS_RESET
);
611 usb_host_claim_interfaces(s
, 0);
612 usb_linux_update_endp_table(s
);
615 static void usb_host_handle_destroy(USBDevice
*dev
)
617 USBHostDevice
*s
= (USBHostDevice
*)dev
;
620 if (s
->hub_fd
!= -1) {
623 QTAILQ_REMOVE(&hostdevs
, s
, next
);
624 qemu_remove_exit_notifier(&s
->exit
);
627 /* iso data is special, we need to keep enough urbs in flight to make sure
628 that the controller never runs out of them, otherwise the device will
629 likely suffer a buffer underrun / overrun. */
630 static AsyncURB
*usb_host_alloc_iso(USBHostDevice
*s
, int pid
, uint8_t ep
)
633 int i
, j
, len
= get_max_packet_size(s
, pid
, ep
);
635 aurb
= g_malloc0(s
->iso_urb_count
* sizeof(*aurb
));
636 for (i
= 0; i
< s
->iso_urb_count
; i
++) {
637 aurb
[i
].urb
.endpoint
= ep
;
638 aurb
[i
].urb
.buffer_length
= ISO_FRAME_DESC_PER_URB
* len
;
639 aurb
[i
].urb
.buffer
= g_malloc(aurb
[i
].urb
.buffer_length
);
640 aurb
[i
].urb
.type
= USBDEVFS_URB_TYPE_ISO
;
641 aurb
[i
].urb
.flags
= USBDEVFS_URB_ISO_ASAP
;
642 aurb
[i
].urb
.number_of_packets
= ISO_FRAME_DESC_PER_URB
;
643 for (j
= 0 ; j
< ISO_FRAME_DESC_PER_URB
; j
++)
644 aurb
[i
].urb
.iso_frame_desc
[j
].length
= len
;
645 if (pid
== USB_TOKEN_IN
) {
646 aurb
[i
].urb
.endpoint
|= 0x80;
647 /* Mark as fully consumed (idle) */
648 aurb
[i
].iso_frame_idx
= ISO_FRAME_DESC_PER_URB
;
651 set_iso_urb(s
, pid
, ep
, aurb
);
656 static void usb_host_stop_n_free_iso(USBHostDevice
*s
, int pid
, uint8_t ep
)
659 int i
, ret
, killed
= 0, free
= 1;
661 aurb
= get_iso_urb(s
, pid
, ep
);
666 for (i
= 0; i
< s
->iso_urb_count
; i
++) {
668 if (aurb
[i
].iso_frame_idx
== -1) {
669 ret
= ioctl(s
->fd
, USBDEVFS_DISCARDURB
, &aurb
[i
]);
671 perror("USBDEVFS_DISCARDURB");
679 /* Make sure any urbs we've killed are reaped before we free them */
684 for (i
= 0; i
< s
->iso_urb_count
; i
++) {
685 g_free(aurb
[i
].urb
.buffer
);
691 printf("husb: leaking iso urbs because of discard failure\n");
692 set_iso_urb(s
, pid
, ep
, NULL
);
693 set_iso_urb_idx(s
, pid
, ep
, 0);
694 clear_iso_started(s
, pid
, ep
);
697 static int urb_status_to_usb_ret(int status
)
701 return USB_RET_STALL
;
707 static int usb_host_handle_iso_data(USBHostDevice
*s
, USBPacket
*p
, int in
)
710 int i
, j
, ret
, max_packet_size
, offset
, len
= 0;
713 max_packet_size
= get_max_packet_size(s
, p
->pid
, p
->devep
);
714 if (max_packet_size
== 0)
717 aurb
= get_iso_urb(s
, p
->pid
, p
->devep
);
719 aurb
= usb_host_alloc_iso(s
, p
->pid
, p
->devep
);
722 i
= get_iso_urb_idx(s
, p
->pid
, p
->devep
);
723 j
= aurb
[i
].iso_frame_idx
;
724 if (j
>= 0 && j
< ISO_FRAME_DESC_PER_URB
) {
726 /* Check urb status */
727 if (aurb
[i
].urb
.status
) {
728 len
= urb_status_to_usb_ret(aurb
[i
].urb
.status
);
729 /* Move to the next urb */
730 aurb
[i
].iso_frame_idx
= ISO_FRAME_DESC_PER_URB
- 1;
731 /* Check frame status */
732 } else if (aurb
[i
].urb
.iso_frame_desc
[j
].status
) {
733 len
= urb_status_to_usb_ret(
734 aurb
[i
].urb
.iso_frame_desc
[j
].status
);
735 /* Check the frame fits */
736 } else if (aurb
[i
].urb
.iso_frame_desc
[j
].actual_length
738 printf("husb: received iso data is larger then packet\n");
740 /* All good copy data over */
742 len
= aurb
[i
].urb
.iso_frame_desc
[j
].actual_length
;
743 buf
= aurb
[i
].urb
.buffer
+
744 j
* aurb
[i
].urb
.iso_frame_desc
[0].length
;
745 usb_packet_copy(p
, buf
, len
);
749 offset
= (j
== 0) ? 0 : get_iso_buffer_used(s
, p
->pid
, p
->devep
);
751 /* Check the frame fits */
752 if (len
> max_packet_size
) {
753 printf("husb: send iso data is larger then max packet size\n");
757 /* All good copy data over */
758 usb_packet_copy(p
, aurb
[i
].urb
.buffer
+ offset
, len
);
759 aurb
[i
].urb
.iso_frame_desc
[j
].length
= len
;
761 set_iso_buffer_used(s
, p
->pid
, p
->devep
, offset
);
763 /* Start the stream once we have buffered enough data */
764 if (!is_iso_started(s
, p
->pid
, p
->devep
) && i
== 1 && j
== 8) {
765 set_iso_started(s
, p
->pid
, p
->devep
);
768 aurb
[i
].iso_frame_idx
++;
769 if (aurb
[i
].iso_frame_idx
== ISO_FRAME_DESC_PER_URB
) {
770 i
= (i
+ 1) % s
->iso_urb_count
;
771 set_iso_urb_idx(s
, p
->pid
, p
->devep
, i
);
775 set_iso_started(s
, p
->pid
, p
->devep
);
777 DPRINTF("hubs: iso out error no free buffer, dropping packet\n");
781 if (is_iso_started(s
, p
->pid
, p
->devep
)) {
782 /* (Re)-submit all fully consumed / filled urbs */
783 for (i
= 0; i
< s
->iso_urb_count
; i
++) {
784 if (aurb
[i
].iso_frame_idx
== ISO_FRAME_DESC_PER_URB
) {
785 ret
= ioctl(s
->fd
, USBDEVFS_SUBMITURB
, &aurb
[i
]);
787 perror("USBDEVFS_SUBMITURB");
788 if (!in
|| len
== 0) {
800 aurb
[i
].iso_frame_idx
= -1;
801 change_iso_inflight(s
, p
->pid
, p
->devep
, 1);
809 static int usb_host_handle_data(USBDevice
*dev
, USBPacket
*p
)
811 USBHostDevice
*s
= DO_UPCAST(USBHostDevice
, dev
, dev
);
812 struct usbdevfs_urb
*urb
;
814 int ret
, rem
, prem
, v
;
818 trace_usb_host_req_data(s
->bus_num
, s
->addr
,
819 p
->pid
== USB_TOKEN_IN
,
820 p
->devep
, p
->iov
.size
);
822 if (!is_valid(s
, p
->pid
, p
->devep
)) {
823 trace_usb_host_req_complete(s
->bus_num
, s
->addr
, USB_RET_NAK
);
827 if (p
->pid
== USB_TOKEN_IN
) {
828 ep
= p
->devep
| 0x80;
833 if (is_halted(s
, p
->pid
, p
->devep
)) {
834 unsigned int arg
= ep
;
835 ret
= ioctl(s
->fd
, USBDEVFS_CLEAR_HALT
, &arg
);
837 perror("USBDEVFS_CLEAR_HALT");
838 trace_usb_host_req_complete(s
->bus_num
, s
->addr
, USB_RET_NAK
);
841 clear_halt(s
, p
->pid
, p
->devep
);
844 if (is_isoc(s
, p
->pid
, p
->devep
)) {
845 return usb_host_handle_iso_data(s
, p
, p
->pid
== USB_TOKEN_IN
);
849 prem
= p
->iov
.iov
[v
].iov_len
;
850 pbuf
= p
->iov
.iov
[v
].iov_base
;
855 assert(v
< p
->iov
.niov
);
856 prem
= p
->iov
.iov
[v
].iov_len
;
857 pbuf
= p
->iov
.iov
[v
].iov_base
;
860 aurb
= async_alloc(s
);
865 urb
->type
= USBDEVFS_URB_TYPE_BULK
;
866 urb
->usercontext
= s
;
868 urb
->buffer_length
= prem
;
870 if (urb
->buffer_length
> MAX_USBFS_BUFFER_SIZE
) {
871 urb
->buffer_length
= MAX_USBFS_BUFFER_SIZE
;
873 pbuf
+= urb
->buffer_length
;
874 prem
-= urb
->buffer_length
;
875 rem
-= urb
->buffer_length
;
880 trace_usb_host_urb_submit(s
->bus_num
, s
->addr
, aurb
,
881 urb
->buffer_length
, aurb
->more
);
882 ret
= ioctl(s
->fd
, USBDEVFS_SUBMITURB
, urb
);
884 DPRINTF("husb: data submit: ep 0x%x, len %u, more %d, packet %p, aurb %p\n",
885 urb
->endpoint
, urb
->buffer_length
, aurb
->more
, p
, aurb
);
888 perror("USBDEVFS_SUBMITURB");
893 trace_usb_host_req_complete(s
->bus_num
, s
->addr
, USB_RET_NAK
);
897 trace_usb_host_req_complete(s
->bus_num
, s
->addr
, USB_RET_STALL
);
898 return USB_RET_STALL
;
903 return USB_RET_ASYNC
;
906 static int ctrl_error(void)
908 if (errno
== ETIMEDOUT
) {
911 return USB_RET_STALL
;
915 static int usb_host_set_address(USBHostDevice
*s
, int addr
)
917 trace_usb_host_set_address(s
->bus_num
, s
->addr
, addr
);
922 static int usb_host_set_config(USBHostDevice
*s
, int config
)
926 trace_usb_host_set_config(s
->bus_num
, s
->addr
, config
);
928 usb_host_release_interfaces(s
);
931 ret
= ioctl(s
->fd
, USBDEVFS_SETCONFIGURATION
, &config
);
933 DPRINTF("husb: ctrl set config %d ret %d errno %d\n", config
, ret
, errno
);
935 if (ret
< 0 && errno
== EBUSY
&& first
) {
936 /* happens if usb device is in use by host drivers */
937 int count
= usb_linux_get_num_interfaces(s
);
939 DPRINTF("husb: busy -> disconnecting %d interfaces\n", count
);
940 usb_host_disconnect_ifaces(s
, count
);
949 usb_host_claim_interfaces(s
, config
);
950 usb_linux_update_endp_table(s
);
954 static int usb_host_set_interface(USBHostDevice
*s
, int iface
, int alt
)
956 struct usbdevfs_setinterface si
;
959 trace_usb_host_set_interface(s
->bus_num
, s
->addr
, iface
, alt
);
961 for (i
= 1; i
<= MAX_ENDPOINTS
; i
++) {
962 if (is_isoc(s
, USB_TOKEN_IN
, i
)) {
963 usb_host_stop_n_free_iso(s
, USB_TOKEN_IN
, i
);
965 if (is_isoc(s
, USB_TOKEN_OUT
, i
)) {
966 usb_host_stop_n_free_iso(s
, USB_TOKEN_OUT
, i
);
970 si
.interface
= iface
;
972 ret
= ioctl(s
->fd
, USBDEVFS_SETINTERFACE
, &si
);
974 DPRINTF("husb: ctrl set iface %d altset %d ret %d errno %d\n",
975 iface
, alt
, ret
, errno
);
980 usb_linux_update_endp_table(s
);
984 static int usb_host_handle_control(USBDevice
*dev
, USBPacket
*p
,
985 int request
, int value
, int index
, int length
, uint8_t *data
)
987 USBHostDevice
*s
= DO_UPCAST(USBHostDevice
, dev
, dev
);
988 struct usbdevfs_urb
*urb
;
993 * Process certain standard device requests.
994 * These are infrequent and are processed synchronously.
997 /* Note request is (bRequestType << 8) | bRequest */
998 trace_usb_host_req_control(s
->bus_num
, s
->addr
, request
, value
, index
);
1001 case DeviceOutRequest
| USB_REQ_SET_ADDRESS
:
1002 return usb_host_set_address(s
, value
);
1004 case DeviceOutRequest
| USB_REQ_SET_CONFIGURATION
:
1005 return usb_host_set_config(s
, value
& 0xff);
1007 case InterfaceOutRequest
| USB_REQ_SET_INTERFACE
:
1008 return usb_host_set_interface(s
, index
, value
);
1011 /* The rest are asynchronous */
1013 if (length
> sizeof(dev
->data_buf
)) {
1014 fprintf(stderr
, "husb: ctrl buffer too small (%d > %zu)\n",
1015 length
, sizeof(dev
->data_buf
));
1016 return USB_RET_STALL
;
1019 aurb
= async_alloc(s
);
1023 * Setup ctrl transfer.
1025 * s->ctrl is laid out such that data buffer immediately follows
1026 * 'req' struct which is exactly what usbdevfs expects.
1030 urb
->type
= USBDEVFS_URB_TYPE_CONTROL
;
1031 urb
->endpoint
= p
->devep
;
1033 urb
->buffer
= &dev
->setup_buf
;
1034 urb
->buffer_length
= length
+ 8;
1036 urb
->usercontext
= s
;
1038 trace_usb_host_urb_submit(s
->bus_num
, s
->addr
, aurb
,
1039 urb
->buffer_length
, aurb
->more
);
1040 ret
= ioctl(s
->fd
, USBDEVFS_SUBMITURB
, urb
);
1042 DPRINTF("husb: submit ctrl. len %u aurb %p\n", urb
->buffer_length
, aurb
);
1045 DPRINTF("husb: submit failed. errno %d\n", errno
);
1053 return USB_RET_STALL
;
1057 return USB_RET_ASYNC
;
1060 static uint8_t usb_linux_get_alt_setting(USBHostDevice
*s
,
1061 uint8_t configuration
, uint8_t interface
)
1063 uint8_t alt_setting
;
1064 struct usb_ctrltransfer ct
;
1067 if (usb_fs_type
== USB_FS_SYS
) {
1068 char device_name
[64], line
[1024];
1071 sprintf(device_name
, "%d-%s:%d.%d", s
->bus_num
, s
->port
,
1072 (int)configuration
, (int)interface
);
1074 if (!usb_host_read_file(line
, sizeof(line
), "bAlternateSetting",
1078 if (sscanf(line
, "%d", &alt_setting
) != 1) {
1085 ct
.bRequestType
= USB_DIR_IN
| USB_RECIP_INTERFACE
;
1086 ct
.bRequest
= USB_REQ_GET_INTERFACE
;
1088 ct
.wIndex
= interface
;
1090 ct
.data
= &alt_setting
;
1092 ret
= ioctl(s
->fd
, USBDEVFS_CONTROL
, &ct
);
1094 /* Assume alt 0 on error */
1101 /* returns 1 on problem encountered or 0 for success */
1102 static int usb_linux_update_endp_table(USBHostDevice
*s
)
1104 uint8_t *descriptors
;
1105 uint8_t devep
, type
, alt_interface
;
1106 int interface
, length
, i
, ep
, pid
;
1107 struct endp_data
*epd
;
1109 for (i
= 0; i
< MAX_ENDPOINTS
; i
++) {
1110 s
->ep_in
[i
].type
= INVALID_EP_TYPE
;
1111 s
->ep_out
[i
].type
= INVALID_EP_TYPE
;
1114 if (s
->configuration
== 0) {
1115 /* not configured yet -- leave all endpoints disabled */
1119 /* get the desired configuration, interface, and endpoint descriptors
1120 * from device description */
1121 descriptors
= &s
->descr
[18];
1122 length
= s
->descr_len
- 18;
1125 if (descriptors
[i
+ 1] != USB_DT_CONFIG
||
1126 descriptors
[i
+ 5] != s
->configuration
) {
1127 fprintf(stderr
, "invalid descriptor data - configuration %d\n",
1131 i
+= descriptors
[i
];
1133 while (i
< length
) {
1134 if (descriptors
[i
+ 1] != USB_DT_INTERFACE
||
1135 (descriptors
[i
+ 1] == USB_DT_INTERFACE
&&
1136 descriptors
[i
+ 4] == 0)) {
1137 i
+= descriptors
[i
];
1141 interface
= descriptors
[i
+ 2];
1142 alt_interface
= usb_linux_get_alt_setting(s
, s
->configuration
,
1145 /* the current interface descriptor is the active interface
1146 * and has endpoints */
1147 if (descriptors
[i
+ 3] != alt_interface
) {
1148 i
+= descriptors
[i
];
1152 /* advance to the endpoints */
1153 while (i
< length
&& descriptors
[i
+1] != USB_DT_ENDPOINT
) {
1154 i
+= descriptors
[i
];
1160 while (i
< length
) {
1161 if (descriptors
[i
+ 1] != USB_DT_ENDPOINT
) {
1165 devep
= descriptors
[i
+ 2];
1166 pid
= (devep
& USB_DIR_IN
) ? USB_TOKEN_IN
: USB_TOKEN_OUT
;
1169 fprintf(stderr
, "usb-linux: invalid ep descriptor, ep == 0\n");
1173 switch (descriptors
[i
+ 3] & 0x3) {
1175 type
= USBDEVFS_URB_TYPE_CONTROL
;
1178 type
= USBDEVFS_URB_TYPE_ISO
;
1179 set_max_packet_size(s
, pid
, ep
, descriptors
+ i
);
1182 type
= USBDEVFS_URB_TYPE_BULK
;
1185 type
= USBDEVFS_URB_TYPE_INTERRUPT
;
1188 DPRINTF("usb_host: malformed endpoint type\n");
1189 type
= USBDEVFS_URB_TYPE_BULK
;
1191 epd
= get_endp(s
, pid
, ep
);
1192 assert(epd
->type
== INVALID_EP_TYPE
);
1196 i
+= descriptors
[i
];
1203 * Check if we can safely redirect a usb2 device to a usb1 virtual controller,
1204 * this function assumes this is safe, if:
1205 * 1) There are no isoc endpoints
1206 * 2) There are no interrupt endpoints with a max_packet_size > 64
1207 * Note bulk endpoints with a max_packet_size > 64 in theory also are not
1208 * usb1 compatible, but in practice this seems to work fine.
1210 static int usb_linux_full_speed_compat(USBHostDevice
*dev
)
1215 * usb_linux_update_endp_table only registers info about ep in the current
1216 * interface altsettings, so we need to parse the descriptors again.
1218 for (i
= 0; (i
+ 5) < dev
->descr_len
; i
+= dev
->descr
[i
]) {
1219 if (dev
->descr
[i
+ 1] == USB_DT_ENDPOINT
) {
1220 switch (dev
->descr
[i
+ 3] & 0x3) {
1221 case 0x00: /* CONTROL */
1223 case 0x01: /* ISO */
1225 case 0x02: /* BULK */
1227 case 0x03: /* INTERRUPT */
1228 packet_size
= dev
->descr
[i
+ 4] + (dev
->descr
[i
+ 5] << 8);
1229 if (packet_size
> 64)
1238 static int usb_host_open(USBHostDevice
*dev
, int bus_num
,
1239 int addr
, const char *port
,
1240 const char *prod_name
, int speed
)
1245 trace_usb_host_open_started(bus_num
, addr
);
1247 if (dev
->fd
!= -1) {
1251 if (!usb_host_device_path
) {
1252 perror("husb: USB Host Device Path not set");
1255 snprintf(buf
, sizeof(buf
), "%s/%03d/%03d", usb_host_device_path
,
1257 fd
= open(buf
, O_RDWR
| O_NONBLOCK
);
1262 DPRINTF("husb: opened %s\n", buf
);
1264 dev
->bus_num
= bus_num
;
1266 strcpy(dev
->port
, port
);
1269 /* read the device description */
1270 dev
->descr_len
= read(fd
, dev
->descr
, sizeof(dev
->descr
));
1271 if (dev
->descr_len
<= 0) {
1272 perror("husb: reading device data failed");
1279 printf("=== begin dumping device descriptor data ===\n");
1280 for (x
= 0; x
< dev
->descr_len
; x
++) {
1281 printf("%02x ", dev
->descr
[x
]);
1283 printf("\n=== end dumping device descriptor data ===\n");
1288 /* start unconfigured -- we'll wait for the guest to set a configuration */
1289 if (!usb_host_claim_interfaces(dev
, 0)) {
1293 ret
= usb_linux_update_endp_table(dev
);
1299 struct usbdevfs_connectinfo ci
;
1301 ret
= ioctl(fd
, USBDEVFS_CONNECTINFO
, &ci
);
1303 perror("usb_host_device_open: USBDEVFS_CONNECTINFO");
1308 speed
= USB_SPEED_LOW
;
1310 speed
= USB_SPEED_HIGH
;
1313 dev
->dev
.speed
= speed
;
1314 dev
->dev
.speedmask
= (1 << speed
);
1315 if (dev
->dev
.speed
== USB_SPEED_HIGH
&& usb_linux_full_speed_compat(dev
)) {
1316 dev
->dev
.speedmask
|= USB_SPEED_MASK_FULL
;
1319 trace_usb_host_open_success(bus_num
, addr
);
1321 if (!prod_name
|| prod_name
[0] == '\0') {
1322 snprintf(dev
->dev
.product_desc
, sizeof(dev
->dev
.product_desc
),
1323 "host:%d.%d", bus_num
, addr
);
1325 pstrcpy(dev
->dev
.product_desc
, sizeof(dev
->dev
.product_desc
),
1329 ret
= usb_device_attach(&dev
->dev
);
1334 /* USB devio uses 'write' flag to check for async completions */
1335 qemu_set_fd_handler(dev
->fd
, NULL
, async_complete
, dev
);
1340 trace_usb_host_open_failure(bus_num
, addr
);
1341 if (dev
->fd
!= -1) {
1348 static int usb_host_close(USBHostDevice
*dev
)
1352 if (dev
->fd
== -1 || !dev
->dev
.attached
) {
1356 trace_usb_host_close(dev
->bus_num
, dev
->addr
);
1358 qemu_set_fd_handler(dev
->fd
, NULL
, NULL
, NULL
);
1360 for (i
= 1; i
<= MAX_ENDPOINTS
; i
++) {
1361 if (is_isoc(dev
, USB_TOKEN_IN
, i
)) {
1362 usb_host_stop_n_free_iso(dev
, USB_TOKEN_IN
, i
);
1364 if (is_isoc(dev
, USB_TOKEN_OUT
, i
)) {
1365 usb_host_stop_n_free_iso(dev
, USB_TOKEN_OUT
, i
);
1368 async_complete(dev
);
1370 usb_device_detach(&dev
->dev
);
1371 ioctl(dev
->fd
, USBDEVFS_RESET
);
1377 static void usb_host_exit_notifier(struct Notifier
*n
, void *data
)
1379 USBHostDevice
*s
= container_of(n
, USBHostDevice
, exit
);
1382 ioctl(s
->fd
, USBDEVFS_RESET
);
1386 static int usb_host_initfn(USBDevice
*dev
)
1388 USBHostDevice
*s
= DO_UPCAST(USBHostDevice
, dev
, dev
);
1390 dev
->auto_attach
= 0;
1394 QTAILQ_INSERT_TAIL(&hostdevs
, s
, next
);
1395 s
->exit
.notify
= usb_host_exit_notifier
;
1396 qemu_add_exit_notifier(&s
->exit
);
1397 usb_host_auto_check(NULL
);
1399 if (s
->match
.bus_num
!= 0 && s
->match
.port
!= NULL
) {
1400 usb_host_claim_port(s
);
1405 static const VMStateDescription vmstate_usb_host
= {
1410 static struct USBDeviceInfo usb_host_dev_info
= {
1411 .product_desc
= "USB Host Device",
1412 .qdev
.name
= "usb-host",
1413 .qdev
.size
= sizeof(USBHostDevice
),
1414 .qdev
.vmsd
= &vmstate_usb_host
,
1415 .init
= usb_host_initfn
,
1416 .handle_packet
= usb_generic_handle_packet
,
1417 .cancel_packet
= usb_host_async_cancel
,
1418 .handle_data
= usb_host_handle_data
,
1419 .handle_control
= usb_host_handle_control
,
1420 .handle_reset
= usb_host_handle_reset
,
1421 .handle_destroy
= usb_host_handle_destroy
,
1422 .usbdevice_name
= "host",
1423 .usbdevice_init
= usb_host_device_open
,
1424 .qdev
.props
= (Property
[]) {
1425 DEFINE_PROP_UINT32("hostbus", USBHostDevice
, match
.bus_num
, 0),
1426 DEFINE_PROP_UINT32("hostaddr", USBHostDevice
, match
.addr
, 0),
1427 DEFINE_PROP_STRING("hostport", USBHostDevice
, match
.port
),
1428 DEFINE_PROP_HEX32("vendorid", USBHostDevice
, match
.vendor_id
, 0),
1429 DEFINE_PROP_HEX32("productid", USBHostDevice
, match
.product_id
, 0),
1430 DEFINE_PROP_UINT32("isobufs", USBHostDevice
, iso_urb_count
, 4),
1431 DEFINE_PROP_END_OF_LIST(),
1435 static void usb_host_register_devices(void)
1437 usb_qdev_register(&usb_host_dev_info
);
1439 device_init(usb_host_register_devices
)
1441 USBDevice
*usb_host_device_open(const char *devname
)
1443 struct USBAutoFilter filter
;
1447 dev
= usb_create(NULL
/* FIXME */, "usb-host");
1449 if (strstr(devname
, "auto:")) {
1450 if (parse_filter(devname
, &filter
) < 0) {
1454 if ((p
= strchr(devname
, '.'))) {
1455 filter
.bus_num
= strtoul(devname
, NULL
, 0);
1456 filter
.addr
= strtoul(p
+ 1, NULL
, 0);
1457 filter
.vendor_id
= 0;
1458 filter
.product_id
= 0;
1459 } else if ((p
= strchr(devname
, ':'))) {
1462 filter
.vendor_id
= strtoul(devname
, NULL
, 16);
1463 filter
.product_id
= strtoul(p
+ 1, NULL
, 16);
1469 qdev_prop_set_uint32(&dev
->qdev
, "hostbus", filter
.bus_num
);
1470 qdev_prop_set_uint32(&dev
->qdev
, "hostaddr", filter
.addr
);
1471 qdev_prop_set_uint32(&dev
->qdev
, "vendorid", filter
.vendor_id
);
1472 qdev_prop_set_uint32(&dev
->qdev
, "productid", filter
.product_id
);
1473 qdev_init_nofail(&dev
->qdev
);
1477 qdev_free(&dev
->qdev
);
1481 int usb_host_device_close(const char *devname
)
1484 char product_name
[PRODUCT_NAME_SZ
];
1488 if (strstr(devname
, "auto:")) {
1489 return usb_host_auto_del(devname
);
1491 if (usb_host_find_device(&bus_num
, &addr
, product_name
,
1492 sizeof(product_name
), devname
) < 0) {
1495 s
= hostdev_find(bus_num
, addr
);
1497 usb_device_delete_addr(s
->bus_num
, s
->dev
.addr
);
1505 static int get_tag_value(char *buf
, int buf_size
,
1506 const char *str
, const char *tag
,
1507 const char *stopchars
)
1511 p
= strstr(str
, tag
);
1516 while (qemu_isspace(*p
)) {
1520 while (*p
!= '\0' && !strchr(stopchars
, *p
)) {
1521 if ((q
- buf
) < (buf_size
- 1)) {
1531 * Use /proc/bus/usb/devices or /dev/bus/usb/devices file to determine
1532 * host's USB devices. This is legacy support since many distributions
1533 * are moving to /sys/bus/usb
1535 static int usb_host_scan_dev(void *opaque
, USBScanFunc
*func
)
1540 int bus_num
, addr
, speed
, device_count
;
1541 int class_id
, product_id
, vendor_id
, port
;
1542 char product_name
[512];
1545 if (!usb_host_device_path
) {
1546 perror("husb: USB Host Device Path not set");
1549 snprintf(line
, sizeof(line
), "%s/devices", usb_host_device_path
);
1550 f
= fopen(line
, "r");
1552 perror("husb: cannot open devices file");
1557 bus_num
= addr
= class_id
= product_id
= vendor_id
= port
= 0;
1558 speed
= -1; /* Can't get the speed from /[proc|dev]/bus/usb/devices */
1560 if (fgets(line
, sizeof(line
), f
) == NULL
) {
1563 if (strlen(line
) > 0) {
1564 line
[strlen(line
) - 1] = '\0';
1566 if (line
[0] == 'T' && line
[1] == ':') {
1567 if (device_count
&& (vendor_id
|| product_id
)) {
1568 /* New device. Add the previously discovered device. */
1569 ret
= func(opaque
, bus_num
, addr
, 0, class_id
, vendor_id
,
1570 product_id
, product_name
, speed
);
1575 if (get_tag_value(buf
, sizeof(buf
), line
, "Bus=", " ") < 0) {
1578 bus_num
= atoi(buf
);
1579 if (get_tag_value(buf
, sizeof(buf
), line
, "Port=", " ") < 0) {
1583 if (get_tag_value(buf
, sizeof(buf
), line
, "Dev#=", " ") < 0) {
1587 if (get_tag_value(buf
, sizeof(buf
), line
, "Spd=", " ") < 0) {
1590 if (!strcmp(buf
, "5000")) {
1591 speed
= USB_SPEED_SUPER
;
1592 } else if (!strcmp(buf
, "480")) {
1593 speed
= USB_SPEED_HIGH
;
1594 } else if (!strcmp(buf
, "1.5")) {
1595 speed
= USB_SPEED_LOW
;
1597 speed
= USB_SPEED_FULL
;
1599 product_name
[0] = '\0';
1604 } else if (line
[0] == 'P' && line
[1] == ':') {
1605 if (get_tag_value(buf
, sizeof(buf
), line
, "Vendor=", " ") < 0) {
1608 vendor_id
= strtoul(buf
, NULL
, 16);
1609 if (get_tag_value(buf
, sizeof(buf
), line
, "ProdID=", " ") < 0) {
1612 product_id
= strtoul(buf
, NULL
, 16);
1613 } else if (line
[0] == 'S' && line
[1] == ':') {
1614 if (get_tag_value(buf
, sizeof(buf
), line
, "Product=", "") < 0) {
1617 pstrcpy(product_name
, sizeof(product_name
), buf
);
1618 } else if (line
[0] == 'D' && line
[1] == ':') {
1619 if (get_tag_value(buf
, sizeof(buf
), line
, "Cls=", " (") < 0) {
1622 class_id
= strtoul(buf
, NULL
, 16);
1626 if (device_count
&& (vendor_id
|| product_id
)) {
1627 /* Add the last device. */
1629 snprintf(buf
, sizeof(buf
), "%d", port
);
1631 snprintf(buf
, sizeof(buf
), "?");
1633 ret
= func(opaque
, bus_num
, addr
, buf
, class_id
, vendor_id
,
1634 product_id
, product_name
, speed
);
1644 * Read sys file-system device file
1646 * @line address of buffer to put file contents in
1647 * @line_size size of line
1648 * @device_file path to device file (printf format string)
1649 * @device_name device being opened (inserted into device_file)
1651 * @return 0 failed, 1 succeeded ('line' contains data)
1653 static int usb_host_read_file(char *line
, size_t line_size
,
1654 const char *device_file
, const char *device_name
)
1658 char filename
[PATH_MAX
];
1660 snprintf(filename
, PATH_MAX
, USBSYSBUS_PATH
"/devices/%s/%s", device_name
,
1662 f
= fopen(filename
, "r");
1664 ret
= fgets(line
, line_size
, f
) != NULL
;
1672 * Use /sys/bus/usb/devices/ directory to determine host's USB
1675 * This code is based on Robert Schiele's original patches posted to
1676 * the Novell bug-tracker https://bugzilla.novell.com/show_bug.cgi?id=241950
1678 static int usb_host_scan_sys(void *opaque
, USBScanFunc
*func
)
1682 int bus_num
, addr
, speed
, class_id
, product_id
, vendor_id
;
1684 char port
[MAX_PORTLEN
];
1685 char product_name
[512];
1688 dir
= opendir(USBSYSBUS_PATH
"/devices");
1690 perror("husb: cannot open devices directory");
1694 while ((de
= readdir(dir
))) {
1695 if (de
->d_name
[0] != '.' && !strchr(de
->d_name
, ':')) {
1696 if (sscanf(de
->d_name
, "%d-%7[0-9.]", &bus_num
, port
) < 2) {
1700 if (!usb_host_read_file(line
, sizeof(line
), "devnum", de
->d_name
)) {
1703 if (sscanf(line
, "%d", &addr
) != 1) {
1706 if (!usb_host_read_file(line
, sizeof(line
), "bDeviceClass",
1710 if (sscanf(line
, "%x", &class_id
) != 1) {
1714 if (!usb_host_read_file(line
, sizeof(line
), "idVendor",
1718 if (sscanf(line
, "%x", &vendor_id
) != 1) {
1721 if (!usb_host_read_file(line
, sizeof(line
), "idProduct",
1725 if (sscanf(line
, "%x", &product_id
) != 1) {
1728 if (!usb_host_read_file(line
, sizeof(line
), "product",
1732 if (strlen(line
) > 0) {
1733 line
[strlen(line
) - 1] = '\0';
1735 pstrcpy(product_name
, sizeof(product_name
), line
);
1738 if (!usb_host_read_file(line
, sizeof(line
), "speed", de
->d_name
)) {
1741 if (!strcmp(line
, "5000\n")) {
1742 speed
= USB_SPEED_SUPER
;
1743 } else if (!strcmp(line
, "480\n")) {
1744 speed
= USB_SPEED_HIGH
;
1745 } else if (!strcmp(line
, "1.5\n")) {
1746 speed
= USB_SPEED_LOW
;
1748 speed
= USB_SPEED_FULL
;
1751 ret
= func(opaque
, bus_num
, addr
, port
, class_id
, vendor_id
,
1752 product_id
, product_name
, speed
);
1766 * Determine how to access the host's USB devices and call the
1767 * specific support function.
1769 static int usb_host_scan(void *opaque
, USBScanFunc
*func
)
1771 Monitor
*mon
= cur_mon
;
1775 const char *fs_type
[] = {"unknown", "proc", "dev", "sys"};
1776 char devpath
[PATH_MAX
];
1778 /* only check the host once */
1780 dir
= opendir(USBSYSBUS_PATH
"/devices");
1782 /* devices found in /dev/bus/usb/ (yes - not a mistake!) */
1783 strcpy(devpath
, USBDEVBUS_PATH
);
1784 usb_fs_type
= USB_FS_SYS
;
1786 DPRINTF(USBDBG_DEVOPENED
, USBSYSBUS_PATH
);
1789 f
= fopen(USBPROCBUS_PATH
"/devices", "r");
1791 /* devices found in /proc/bus/usb/ */
1792 strcpy(devpath
, USBPROCBUS_PATH
);
1793 usb_fs_type
= USB_FS_PROC
;
1795 DPRINTF(USBDBG_DEVOPENED
, USBPROCBUS_PATH
);
1798 /* try additional methods if an access method hasn't been found yet */
1799 f
= fopen(USBDEVBUS_PATH
"/devices", "r");
1801 /* devices found in /dev/bus/usb/ */
1802 strcpy(devpath
, USBDEVBUS_PATH
);
1803 usb_fs_type
= USB_FS_DEV
;
1805 DPRINTF(USBDBG_DEVOPENED
, USBDEVBUS_PATH
);
1811 monitor_printf(mon
, "husb: unable to access USB devices\n");
1816 /* the module setting (used later for opening devices) */
1817 usb_host_device_path
= g_malloc0(strlen(devpath
)+1);
1818 strcpy(usb_host_device_path
, devpath
);
1820 monitor_printf(mon
, "husb: using %s file-system with %s\n",
1821 fs_type
[usb_fs_type
], usb_host_device_path
);
1825 switch (usb_fs_type
) {
1828 ret
= usb_host_scan_dev(opaque
, func
);
1831 ret
= usb_host_scan_sys(opaque
, func
);
1840 static QEMUTimer
*usb_auto_timer
;
1842 static int usb_host_auto_scan(void *opaque
, int bus_num
,
1843 int addr
, const char *port
,
1844 int class_id
, int vendor_id
, int product_id
,
1845 const char *product_name
, int speed
)
1847 struct USBAutoFilter
*f
;
1848 struct USBHostDevice
*s
;
1854 QTAILQ_FOREACH(s
, &hostdevs
, next
) {
1857 if (f
->bus_num
> 0 && f
->bus_num
!= bus_num
) {
1860 if (f
->addr
> 0 && f
->addr
!= addr
) {
1863 if (f
->port
!= NULL
&& (port
== NULL
|| strcmp(f
->port
, port
) != 0)) {
1867 if (f
->vendor_id
> 0 && f
->vendor_id
!= vendor_id
) {
1871 if (f
->product_id
> 0 && f
->product_id
!= product_id
) {
1874 /* We got a match */
1876 if (s
->errcount
>= 3) {
1880 /* Already attached ? */
1884 DPRINTF("husb: auto open: bus_num %d addr %d\n", bus_num
, addr
);
1886 if (usb_host_open(s
, bus_num
, addr
, port
, product_name
, speed
) < 0) {
1895 static void usb_host_auto_check(void *unused
)
1897 struct USBHostDevice
*s
;
1898 int unconnected
= 0;
1900 usb_host_scan(NULL
, usb_host_auto_scan
);
1902 QTAILQ_FOREACH(s
, &hostdevs
, next
) {
1912 if (unconnected
== 0) {
1913 /* nothing to watch */
1914 if (usb_auto_timer
) {
1915 qemu_del_timer(usb_auto_timer
);
1916 trace_usb_host_auto_scan_disabled();
1921 if (!usb_auto_timer
) {
1922 usb_auto_timer
= qemu_new_timer_ms(rt_clock
, usb_host_auto_check
, NULL
);
1923 if (!usb_auto_timer
) {
1926 trace_usb_host_auto_scan_enabled();
1928 qemu_mod_timer(usb_auto_timer
, qemu_get_clock_ms(rt_clock
) + 2000);
1932 * Autoconnect filter
1934 * auto:bus:dev[:vid:pid]
1935 * auto:bus.dev[:vid:pid]
1937 * bus - bus number (dec, * means any)
1938 * dev - device number (dec, * means any)
1939 * vid - vendor id (hex, * means any)
1940 * pid - product id (hex, * means any)
1942 * See 'lsusb' output.
1944 static int parse_filter(const char *spec
, struct USBAutoFilter
*f
)
1946 enum { BUS
, DEV
, VID
, PID
, DONE
};
1947 const char *p
= spec
;
1955 for (i
= BUS
; i
< DONE
; i
++) {
1956 p
= strpbrk(p
, ":.");
1966 case BUS
: f
->bus_num
= strtol(p
, NULL
, 10); break;
1967 case DEV
: f
->addr
= strtol(p
, NULL
, 10); break;
1968 case VID
: f
->vendor_id
= strtol(p
, NULL
, 16); break;
1969 case PID
: f
->product_id
= strtol(p
, NULL
, 16); break;
1974 fprintf(stderr
, "husb: invalid auto filter spec %s\n", spec
);
1981 /**********************/
1982 /* USB host device info */
1984 struct usb_class_info
{
1986 const char *class_name
;
1989 static const struct usb_class_info usb_class_info
[] = {
1990 { USB_CLASS_AUDIO
, "Audio"},
1991 { USB_CLASS_COMM
, "Communication"},
1992 { USB_CLASS_HID
, "HID"},
1993 { USB_CLASS_HUB
, "Hub" },
1994 { USB_CLASS_PHYSICAL
, "Physical" },
1995 { USB_CLASS_PRINTER
, "Printer" },
1996 { USB_CLASS_MASS_STORAGE
, "Storage" },
1997 { USB_CLASS_CDC_DATA
, "Data" },
1998 { USB_CLASS_APP_SPEC
, "Application Specific" },
1999 { USB_CLASS_VENDOR_SPEC
, "Vendor Specific" },
2000 { USB_CLASS_STILL_IMAGE
, "Still Image" },
2001 { USB_CLASS_CSCID
, "Smart Card" },
2002 { USB_CLASS_CONTENT_SEC
, "Content Security" },
2006 static const char *usb_class_str(uint8_t class)
2008 const struct usb_class_info
*p
;
2009 for(p
= usb_class_info
; p
->class != -1; p
++) {
2010 if (p
->class == class) {
2014 return p
->class_name
;
2017 static void usb_info_device(Monitor
*mon
, int bus_num
,
2018 int addr
, const char *port
,
2019 int class_id
, int vendor_id
, int product_id
,
2020 const char *product_name
,
2023 const char *class_str
, *speed_str
;
2029 case USB_SPEED_FULL
:
2032 case USB_SPEED_HIGH
:
2035 case USB_SPEED_SUPER
:
2043 monitor_printf(mon
, " Bus %d, Addr %d, Port %s, Speed %s Mb/s\n",
2044 bus_num
, addr
, port
, speed_str
);
2045 class_str
= usb_class_str(class_id
);
2047 monitor_printf(mon
, " %s:", class_str
);
2049 monitor_printf(mon
, " Class %02x:", class_id
);
2051 monitor_printf(mon
, " USB device %04x:%04x", vendor_id
, product_id
);
2052 if (product_name
[0] != '\0') {
2053 monitor_printf(mon
, ", %s", product_name
);
2055 monitor_printf(mon
, "\n");
2058 static int usb_host_info_device(void *opaque
, int bus_num
, int addr
,
2059 const char *path
, int class_id
,
2060 int vendor_id
, int product_id
,
2061 const char *product_name
,
2064 Monitor
*mon
= opaque
;
2066 usb_info_device(mon
, bus_num
, addr
, path
, class_id
, vendor_id
, product_id
,
2067 product_name
, speed
);
2071 static void dec2str(int val
, char *str
, size_t size
)
2074 snprintf(str
, size
, "*");
2076 snprintf(str
, size
, "%d", val
);
2080 static void hex2str(int val
, char *str
, size_t size
)
2083 snprintf(str
, size
, "*");
2085 snprintf(str
, size
, "%04x", val
);
2089 void usb_host_info(Monitor
*mon
)
2091 struct USBAutoFilter
*f
;
2092 struct USBHostDevice
*s
;
2094 usb_host_scan(mon
, usb_host_info_device
);
2096 if (QTAILQ_EMPTY(&hostdevs
)) {
2100 monitor_printf(mon
, " Auto filters:\n");
2101 QTAILQ_FOREACH(s
, &hostdevs
, next
) {
2102 char bus
[10], addr
[10], vid
[10], pid
[10];
2104 dec2str(f
->bus_num
, bus
, sizeof(bus
));
2105 dec2str(f
->addr
, addr
, sizeof(addr
));
2106 hex2str(f
->vendor_id
, vid
, sizeof(vid
));
2107 hex2str(f
->product_id
, pid
, sizeof(pid
));
2108 monitor_printf(mon
, " Bus %s, Addr %s, Port %s, ID %s:%s\n",
2109 bus
, addr
, f
->port
? f
->port
: "*", vid
, pid
);