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