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