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