Statistics
| Branch: | Revision:

root / hw / usb / host-linux.c @ 9c17d615

History | View | Annotate | Download (57.4 kB)

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/monitor.h"
36
#include "sysemu/sysemu.h"
37
#include "trace.h"
38

    
39
#include <dirent.h>
40
#include <sys/ioctl.h>
41

    
42
#include <linux/usbdevice_fs.h>
43
#include <linux/version.h>
44
#include "hw/usb.h"
45
#include "hw/usb/desc.h"
46

    
47
/* We redefine it to avoid version problems */
48
struct usb_ctrltransfer {
49
    uint8_t  bRequestType;
50
    uint8_t  bRequest;
51
    uint16_t wValue;
52
    uint16_t wIndex;
53
    uint16_t wLength;
54
    uint32_t timeout;
55
    void *data;
56
};
57

    
58
typedef int USBScanFunc(void *opaque, int bus_num, int addr, const char *port,
59
                        int class_id, int vendor_id, int product_id,
60
                        const char *product_name, int speed);
61

    
62
//#define DEBUG
63

    
64
#ifdef DEBUG
65
#define DPRINTF printf
66
#else
67
#define DPRINTF(...)
68
#endif
69

    
70
#define PRODUCT_NAME_SZ 32
71
#define MAX_PORTLEN 16
72

    
73
/* endpoint association data */
74
#define ISO_FRAME_DESC_PER_URB 32
75

    
76
/* devio.c limits single requests to 16k */
77
#define MAX_USBFS_BUFFER_SIZE 16384
78

    
79
typedef struct AsyncURB AsyncURB;
80

    
81
struct endp_data {
82
    uint8_t halted;
83
    uint8_t iso_started;
84
    AsyncURB *iso_urb;
85
    int iso_urb_idx;
86
    int iso_buffer_used;
87
    int inflight;
88
};
89

    
90
struct USBAutoFilter {
91
    uint32_t bus_num;
92
    uint32_t addr;
93
    char     *port;
94
    uint32_t vendor_id;
95
    uint32_t product_id;
96
};
97

    
98
enum USBHostDeviceOptions {
99
    USB_HOST_OPT_PIPELINE,
100
};
101

    
102
typedef struct USBHostDevice {
103
    USBDevice dev;
104
    int       fd;
105
    int       hub_fd;
106
    int       hub_port;
107

    
108
    uint8_t   descr[8192];
109
    int       descr_len;
110
    int       closing;
111
    uint32_t  iso_urb_count;
112
    uint32_t  options;
113
    Notifier  exit;
114
    QEMUBH    *bh;
115

    
116
    struct endp_data ep_in[USB_MAX_ENDPOINTS];
117
    struct endp_data ep_out[USB_MAX_ENDPOINTS];
118
    QLIST_HEAD(, AsyncURB) aurbs;
119

    
120
    /* Host side address */
121
    int bus_num;
122
    int addr;
123
    char port[MAX_PORTLEN];
124
    struct USBAutoFilter match;
125
    int32_t bootindex;
126
    int seen, errcount;
127

    
128
    QTAILQ_ENTRY(USBHostDevice) next;
129
} USBHostDevice;
130

    
131
static QTAILQ_HEAD(, USBHostDevice) hostdevs = QTAILQ_HEAD_INITIALIZER(hostdevs);
132

    
133
static int usb_host_close(USBHostDevice *dev);
134
static int parse_filter(const char *spec, struct USBAutoFilter *f);
135
static void usb_host_auto_check(void *unused);
136
static int usb_host_read_file(char *line, size_t line_size,
137
                            const char *device_file, const char *device_name);
138
static void usb_linux_update_endp_table(USBHostDevice *s);
139

    
140
static int usb_host_usbfs_type(USBHostDevice *s, USBPacket *p)
141
{
142
    static const int usbfs[] = {
143
        [USB_ENDPOINT_XFER_CONTROL] = USBDEVFS_URB_TYPE_CONTROL,
144
        [USB_ENDPOINT_XFER_ISOC]    = USBDEVFS_URB_TYPE_ISO,
145
        [USB_ENDPOINT_XFER_BULK]    = USBDEVFS_URB_TYPE_BULK,
146
        [USB_ENDPOINT_XFER_INT]     = USBDEVFS_URB_TYPE_INTERRUPT,
147
    };
148
    uint8_t type = p->ep->type;
149
    assert(type < ARRAY_SIZE(usbfs));
150
    return usbfs[type];
151
}
152

    
153
static int usb_host_do_reset(USBHostDevice *dev)
154
{
155
    struct timeval s, e;
156
    uint32_t usecs;
157
    int ret;
158

    
159
    gettimeofday(&s, NULL);
160
    ret = ioctl(dev->fd, USBDEVFS_RESET);
161
    gettimeofday(&e, NULL);
162
    usecs = (e.tv_sec  - s.tv_sec) * 1000000;
163
    usecs += e.tv_usec - s.tv_usec;
164
    if (usecs > 1000000) {
165
        /* more than a second, something is fishy, broken usb device? */
166
        fprintf(stderr, "husb: device %d:%d reset took %d.%06d seconds\n",
167
                dev->bus_num, dev->addr, usecs / 1000000, usecs % 1000000);
168
    }
169
    return ret;
170
}
171

    
172
static struct endp_data *get_endp(USBHostDevice *s, int pid, int ep)
173
{
174
    struct endp_data *eps = pid == USB_TOKEN_IN ? s->ep_in : s->ep_out;
175
    assert(pid == USB_TOKEN_IN || pid == USB_TOKEN_OUT);
176
    assert(ep > 0 && ep <= USB_MAX_ENDPOINTS);
177
    return eps + ep - 1;
178
}
179

    
180
static int is_isoc(USBHostDevice *s, int pid, int ep)
181
{
182
    return usb_ep_get_type(&s->dev, pid, ep) == USB_ENDPOINT_XFER_ISOC;
183
}
184

    
185
static int is_valid(USBHostDevice *s, int pid, int ep)
186
{
187
    return usb_ep_get_type(&s->dev, pid, ep) != USB_ENDPOINT_XFER_INVALID;
188
}
189

    
190
static int is_halted(USBHostDevice *s, int pid, int ep)
191
{
192
    return get_endp(s, pid, ep)->halted;
193
}
194

    
195
static void clear_halt(USBHostDevice *s, int pid, int ep)
196
{
197
    trace_usb_host_ep_clear_halt(s->bus_num, s->addr, ep);
198
    get_endp(s, pid, ep)->halted = 0;
199
}
200

    
201
static void set_halt(USBHostDevice *s, int pid, int ep)
202
{
203
    if (ep != 0) {
204
        trace_usb_host_ep_set_halt(s->bus_num, s->addr, ep);
205
        get_endp(s, pid, ep)->halted = 1;
206
    }
207
}
208

    
209
static int is_iso_started(USBHostDevice *s, int pid, int ep)
210
{
211
    return get_endp(s, pid, ep)->iso_started;
212
}
213

    
214
static void clear_iso_started(USBHostDevice *s, int pid, int ep)
215
{
216
    trace_usb_host_iso_stop(s->bus_num, s->addr, ep);
217
    get_endp(s, pid, ep)->iso_started = 0;
218
}
219

    
220
static void set_iso_started(USBHostDevice *s, int pid, int ep)
221
{
222
    struct endp_data *e = get_endp(s, pid, ep);
223

    
224
    trace_usb_host_iso_start(s->bus_num, s->addr, ep);
225
    if (!e->iso_started) {
226
        e->iso_started = 1;
227
        e->inflight = 0;
228
    }
229
}
230

    
231
static int change_iso_inflight(USBHostDevice *s, int pid, int ep, int value)
232
{
233
    struct endp_data *e = get_endp(s, pid, ep);
234

    
235
    e->inflight += value;
236
    return e->inflight;
237
}
238

    
239
static void set_iso_urb(USBHostDevice *s, int pid, int ep, AsyncURB *iso_urb)
240
{
241
    get_endp(s, pid, ep)->iso_urb = iso_urb;
242
}
243

    
244
static AsyncURB *get_iso_urb(USBHostDevice *s, int pid, int ep)
245
{
246
    return get_endp(s, pid, ep)->iso_urb;
247
}
248

    
249
static void set_iso_urb_idx(USBHostDevice *s, int pid, int ep, int i)
250
{
251
    get_endp(s, pid, ep)->iso_urb_idx = i;
252
}
253

    
254
static int get_iso_urb_idx(USBHostDevice *s, int pid, int ep)
255
{
256
    return get_endp(s, pid, ep)->iso_urb_idx;
257
}
258

    
259
static void set_iso_buffer_used(USBHostDevice *s, int pid, int ep, int i)
260
{
261
    get_endp(s, pid, ep)->iso_buffer_used = i;
262
}
263

    
264
static int get_iso_buffer_used(USBHostDevice *s, int pid, int ep)
265
{
266
    return get_endp(s, pid, ep)->iso_buffer_used;
267
}
268

    
269
/*
270
 * Async URB state.
271
 * We always allocate iso packet descriptors even for bulk transfers
272
 * to simplify allocation and casts.
273
 */
274
struct AsyncURB
275
{
276
    struct usbdevfs_urb urb;
277
    struct usbdevfs_iso_packet_desc isocpd[ISO_FRAME_DESC_PER_URB];
278
    USBHostDevice *hdev;
279
    QLIST_ENTRY(AsyncURB) next;
280

    
281
    /* For regular async urbs */
282
    USBPacket     *packet;
283
    int more; /* large transfer, more urbs follow */
284

    
285
    /* For buffered iso handling */
286
    int iso_frame_idx; /* -1 means in flight */
287
};
288

    
289
static AsyncURB *async_alloc(USBHostDevice *s)
290
{
291
    AsyncURB *aurb = g_malloc0(sizeof(AsyncURB));
292
    aurb->hdev = s;
293
    QLIST_INSERT_HEAD(&s->aurbs, aurb, next);
294
    return aurb;
295
}
296

    
297
static void async_free(AsyncURB *aurb)
298
{
299
    QLIST_REMOVE(aurb, next);
300
    g_free(aurb);
301
}
302

    
303
static void do_disconnect(USBHostDevice *s)
304
{
305
    usb_host_close(s);
306
    usb_host_auto_check(NULL);
307
}
308

    
309
static void async_complete(void *opaque)
310
{
311
    USBHostDevice *s = opaque;
312
    AsyncURB *aurb;
313
    int urbs = 0;
314

    
315
    while (1) {
316
        USBPacket *p;
317

    
318
        int r = ioctl(s->fd, USBDEVFS_REAPURBNDELAY, &aurb);
319
        if (r < 0) {
320
            if (errno == EAGAIN) {
321
                if (urbs > 2) {
322
                    /* indicates possible latency issues */
323
                    trace_usb_host_iso_many_urbs(s->bus_num, s->addr, urbs);
324
                }
325
                return;
326
            }
327
            if (errno == ENODEV) {
328
                if (!s->closing) {
329
                    trace_usb_host_disconnect(s->bus_num, s->addr);
330
                    do_disconnect(s);
331
                }
332
                return;
333
            }
334

    
335
            perror("USBDEVFS_REAPURBNDELAY");
336
            return;
337
        }
338

    
339
        DPRINTF("husb: async completed. aurb %p status %d alen %d\n",
340
                aurb, aurb->urb.status, aurb->urb.actual_length);
341

    
342
        /* If this is a buffered iso urb mark it as complete and don't do
343
           anything else (it is handled further in usb_host_handle_iso_data) */
344
        if (aurb->iso_frame_idx == -1) {
345
            int inflight;
346
            int pid = (aurb->urb.endpoint & USB_DIR_IN) ?
347
                USB_TOKEN_IN : USB_TOKEN_OUT;
348
            int ep = aurb->urb.endpoint & 0xf;
349
            if (aurb->urb.status == -EPIPE) {
350
                set_halt(s, pid, ep);
351
            }
352
            aurb->iso_frame_idx = 0;
353
            urbs++;
354
            inflight = change_iso_inflight(s, pid, ep, -1);
355
            if (inflight == 0 && is_iso_started(s, pid, ep)) {
356
                /* can be latency issues, or simply end of stream */
357
                trace_usb_host_iso_out_of_bufs(s->bus_num, s->addr, ep);
358
            }
359
            continue;
360
        }
361

    
362
        p = aurb->packet;
363
        trace_usb_host_urb_complete(s->bus_num, s->addr, aurb, aurb->urb.status,
364
                                    aurb->urb.actual_length, aurb->more);
365

    
366
        if (p) {
367
            switch (aurb->urb.status) {
368
            case 0:
369
                p->actual_length += aurb->urb.actual_length;
370
                if (!aurb->more) {
371
                    /* Clear previous ASYNC status */
372
                    p->status = USB_RET_SUCCESS;
373
                }
374
                break;
375

    
376
            case -EPIPE:
377
                set_halt(s, p->pid, p->ep->nr);
378
                p->status = USB_RET_STALL;
379
                break;
380

    
381
            case -EOVERFLOW:
382
                p->status = USB_RET_BABBLE;
383
                break;
384

    
385
            default:
386
                p->status = USB_RET_IOERROR;
387
                break;
388
            }
389

    
390
            if (aurb->urb.type == USBDEVFS_URB_TYPE_CONTROL) {
391
                trace_usb_host_req_complete(s->bus_num, s->addr, p,
392
                                            p->status, aurb->urb.actual_length);
393
                usb_generic_async_ctrl_complete(&s->dev, p);
394
            } else if (!aurb->more) {
395
                trace_usb_host_req_complete(s->bus_num, s->addr, p,
396
                                            p->status, aurb->urb.actual_length);
397
                usb_packet_complete(&s->dev, p);
398
            }
399
        }
400

    
401
        async_free(aurb);
402
    }
403
}
404

    
405
static void usb_host_async_cancel(USBDevice *dev, USBPacket *p)
406
{
407
    USBHostDevice *s = DO_UPCAST(USBHostDevice, dev, dev);
408
    AsyncURB *aurb;
409

    
410
    trace_usb_host_req_canceled(s->bus_num, s->addr, p);
411

    
412
    QLIST_FOREACH(aurb, &s->aurbs, next) {
413
        if (p != aurb->packet) {
414
            continue;
415
        }
416

    
417
        trace_usb_host_urb_canceled(s->bus_num, s->addr, aurb);
418

    
419
        /* Mark it as dead (see async_complete above) */
420
        aurb->packet = NULL;
421

    
422
        int r = ioctl(s->fd, USBDEVFS_DISCARDURB, aurb);
423
        if (r < 0) {
424
            DPRINTF("husb: async. discard urb failed errno %d\n", errno);
425
        }
426
    }
427
}
428

    
429
static int usb_host_open_device(int bus, int addr)
430
{
431
    const char *usbfs = NULL;
432
    char filename[32];
433
    struct stat st;
434
    int fd, rc;
435

    
436
    rc = stat("/dev/bus/usb", &st);
437
    if (rc == 0 && S_ISDIR(st.st_mode)) {
438
        /* udev-created device nodes available */
439
        usbfs = "/dev/bus/usb";
440
    } else {
441
        /* fallback: usbfs mounted below /proc */
442
        usbfs = "/proc/bus/usb";
443
    }
444

    
445
    snprintf(filename, sizeof(filename), "%s/%03d/%03d",
446
             usbfs, bus, addr);
447
    fd = open(filename, O_RDWR | O_NONBLOCK);
448
    if (fd < 0) {
449
        fprintf(stderr, "husb: open %s: %s\n", filename, strerror(errno));
450
    }
451
    return fd;
452
}
453

    
454
static int usb_host_claim_port(USBHostDevice *s)
455
{
456
#ifdef USBDEVFS_CLAIM_PORT
457
    char *h, hub_name[64], line[1024];
458
    int hub_addr, ret;
459

    
460
    snprintf(hub_name, sizeof(hub_name), "%d-%s",
461
             s->match.bus_num, s->match.port);
462

    
463
    /* try strip off last ".$portnr" to get hub */
464
    h = strrchr(hub_name, '.');
465
    if (h != NULL) {
466
        s->hub_port = atoi(h+1);
467
        *h = '\0';
468
    } else {
469
        /* no dot in there -> it is the root hub */
470
        snprintf(hub_name, sizeof(hub_name), "usb%d",
471
                 s->match.bus_num);
472
        s->hub_port = atoi(s->match.port);
473
    }
474

    
475
    if (!usb_host_read_file(line, sizeof(line), "devnum",
476
                            hub_name)) {
477
        return -1;
478
    }
479
    if (sscanf(line, "%d", &hub_addr) != 1) {
480
        return -1;
481
    }
482

    
483
    s->hub_fd = usb_host_open_device(s->match.bus_num, hub_addr);
484
    if (s->hub_fd < 0) {
485
        return -1;
486
    }
487

    
488
    ret = ioctl(s->hub_fd, USBDEVFS_CLAIM_PORT, &s->hub_port);
489
    if (ret < 0) {
490
        close(s->hub_fd);
491
        s->hub_fd = -1;
492
        return -1;
493
    }
494

    
495
    trace_usb_host_claim_port(s->match.bus_num, hub_addr, s->hub_port);
496
    return 0;
497
#else
498
    return -1;
499
#endif
500
}
501

    
502
static void usb_host_release_port(USBHostDevice *s)
503
{
504
    if (s->hub_fd == -1) {
505
        return;
506
    }
507
#ifdef USBDEVFS_RELEASE_PORT
508
    ioctl(s->hub_fd, USBDEVFS_RELEASE_PORT, &s->hub_port);
509
#endif
510
    close(s->hub_fd);
511
    s->hub_fd = -1;
512
}
513

    
514
static int usb_host_disconnect_ifaces(USBHostDevice *dev, int nb_interfaces)
515
{
516
    /* earlier Linux 2.4 do not support that */
517
#ifdef USBDEVFS_DISCONNECT
518
    struct usbdevfs_ioctl ctrl;
519
    int ret, interface;
520

    
521
    for (interface = 0; interface < nb_interfaces; interface++) {
522
        ctrl.ioctl_code = USBDEVFS_DISCONNECT;
523
        ctrl.ifno = interface;
524
        ctrl.data = 0;
525
        ret = ioctl(dev->fd, USBDEVFS_IOCTL, &ctrl);
526
        if (ret < 0 && errno != ENODATA) {
527
            perror("USBDEVFS_DISCONNECT");
528
            return -1;
529
        }
530
    }
531
#endif
532
    return 0;
533
}
534

    
535
static int usb_linux_get_num_interfaces(USBHostDevice *s)
536
{
537
    char device_name[64], line[1024];
538
    int num_interfaces = 0;
539

    
540
    sprintf(device_name, "%d-%s", s->bus_num, s->port);
541
    if (!usb_host_read_file(line, sizeof(line), "bNumInterfaces",
542
                            device_name)) {
543
        return -1;
544
    }
545
    if (sscanf(line, "%d", &num_interfaces) != 1) {
546
        return -1;
547
    }
548
    return num_interfaces;
549
}
550

    
551
static int usb_host_claim_interfaces(USBHostDevice *dev, int configuration)
552
{
553
    const char *op = NULL;
554
    int dev_descr_len, config_descr_len;
555
    int interface, nb_interfaces;
556
    int ret, i;
557

    
558
    for (i = 0; i < USB_MAX_INTERFACES; i++) {
559
        dev->dev.altsetting[i] = 0;
560
    }
561

    
562
    if (configuration == 0) { /* address state - ignore */
563
        dev->dev.ninterfaces   = 0;
564
        dev->dev.configuration = 0;
565
        return 1;
566
    }
567

    
568
    DPRINTF("husb: claiming interfaces. config %d\n", configuration);
569

    
570
    i = 0;
571
    dev_descr_len = dev->descr[0];
572
    if (dev_descr_len > dev->descr_len) {
573
        fprintf(stderr, "husb: update iface failed. descr too short\n");
574
        return 0;
575
    }
576

    
577
    i += dev_descr_len;
578
    while (i < dev->descr_len) {
579
        DPRINTF("husb: i is %d, descr_len is %d, dl %d, dt %d\n",
580
                i, dev->descr_len,
581
               dev->descr[i], dev->descr[i+1]);
582

    
583
        if (dev->descr[i+1] != USB_DT_CONFIG) {
584
            i += dev->descr[i];
585
            continue;
586
        }
587
        config_descr_len = dev->descr[i];
588

    
589
        DPRINTF("husb: config #%d need %d\n", dev->descr[i + 5], configuration);
590

    
591
        if (configuration == dev->descr[i + 5]) {
592
            configuration = dev->descr[i + 5];
593
            break;
594
        }
595

    
596
        i += config_descr_len;
597
    }
598

    
599
    if (i >= dev->descr_len) {
600
        fprintf(stderr,
601
                "husb: update iface failed. no matching configuration\n");
602
        return 0;
603
    }
604
    nb_interfaces = dev->descr[i + 4];
605

    
606
    if (usb_host_disconnect_ifaces(dev, nb_interfaces) < 0) {
607
        goto fail;
608
    }
609

    
610
    /* XXX: only grab if all interfaces are free */
611
    for (interface = 0; interface < nb_interfaces; interface++) {
612
        op = "USBDEVFS_CLAIMINTERFACE";
613
        ret = ioctl(dev->fd, USBDEVFS_CLAIMINTERFACE, &interface);
614
        if (ret < 0) {
615
            goto fail;
616
        }
617
    }
618

    
619
    trace_usb_host_claim_interfaces(dev->bus_num, dev->addr,
620
                                    nb_interfaces, configuration);
621

    
622
    dev->dev.ninterfaces   = nb_interfaces;
623
    dev->dev.configuration = configuration;
624
    return 1;
625

    
626
fail:
627
    if (errno == ENODEV) {
628
        do_disconnect(dev);
629
    }
630
    perror(op);
631
    return 0;
632
}
633

    
634
static int usb_host_release_interfaces(USBHostDevice *s)
635
{
636
    int ret, i;
637

    
638
    trace_usb_host_release_interfaces(s->bus_num, s->addr);
639

    
640
    for (i = 0; i < s->dev.ninterfaces; i++) {
641
        ret = ioctl(s->fd, USBDEVFS_RELEASEINTERFACE, &i);
642
        if (ret < 0) {
643
            perror("USBDEVFS_RELEASEINTERFACE");
644
            return 0;
645
        }
646
    }
647
    return 1;
648
}
649

    
650
static void usb_host_handle_reset(USBDevice *dev)
651
{
652
    USBHostDevice *s = DO_UPCAST(USBHostDevice, dev, dev);
653

    
654
    trace_usb_host_reset(s->bus_num, s->addr);
655

    
656
    usb_host_do_reset(s);;
657

    
658
    usb_host_claim_interfaces(s, 0);
659
    usb_linux_update_endp_table(s);
660
}
661

    
662
static void usb_host_handle_destroy(USBDevice *dev)
663
{
664
    USBHostDevice *s = (USBHostDevice *)dev;
665

    
666
    usb_host_release_port(s);
667
    usb_host_close(s);
668
    QTAILQ_REMOVE(&hostdevs, s, next);
669
    qemu_remove_exit_notifier(&s->exit);
670
}
671

    
672
/* iso data is special, we need to keep enough urbs in flight to make sure
673
   that the controller never runs out of them, otherwise the device will
674
   likely suffer a buffer underrun / overrun. */
675
static AsyncURB *usb_host_alloc_iso(USBHostDevice *s, int pid, uint8_t ep)
676
{
677
    AsyncURB *aurb;
678
    int i, j, len = usb_ep_get_max_packet_size(&s->dev, pid, ep);
679

    
680
    aurb = g_malloc0(s->iso_urb_count * sizeof(*aurb));
681
    for (i = 0; i < s->iso_urb_count; i++) {
682
        aurb[i].urb.endpoint      = ep;
683
        aurb[i].urb.buffer_length = ISO_FRAME_DESC_PER_URB * len;
684
        aurb[i].urb.buffer        = g_malloc(aurb[i].urb.buffer_length);
685
        aurb[i].urb.type          = USBDEVFS_URB_TYPE_ISO;
686
        aurb[i].urb.flags         = USBDEVFS_URB_ISO_ASAP;
687
        aurb[i].urb.number_of_packets = ISO_FRAME_DESC_PER_URB;
688
        for (j = 0 ; j < ISO_FRAME_DESC_PER_URB; j++)
689
            aurb[i].urb.iso_frame_desc[j].length = len;
690
        if (pid == USB_TOKEN_IN) {
691
            aurb[i].urb.endpoint |= 0x80;
692
            /* Mark as fully consumed (idle) */
693
            aurb[i].iso_frame_idx = ISO_FRAME_DESC_PER_URB;
694
        }
695
    }
696
    set_iso_urb(s, pid, ep, aurb);
697

    
698
    return aurb;
699
}
700

    
701
static void usb_host_stop_n_free_iso(USBHostDevice *s, int pid, uint8_t ep)
702
{
703
    AsyncURB *aurb;
704
    int i, ret, killed = 0, free = 1;
705

    
706
    aurb = get_iso_urb(s, pid, ep);
707
    if (!aurb) {
708
        return;
709
    }
710

    
711
    for (i = 0; i < s->iso_urb_count; i++) {
712
        /* in flight? */
713
        if (aurb[i].iso_frame_idx == -1) {
714
            ret = ioctl(s->fd, USBDEVFS_DISCARDURB, &aurb[i]);
715
            if (ret < 0) {
716
                perror("USBDEVFS_DISCARDURB");
717
                free = 0;
718
                continue;
719
            }
720
            killed++;
721
        }
722
    }
723

    
724
    /* Make sure any urbs we've killed are reaped before we free them */
725
    if (killed) {
726
        async_complete(s);
727
    }
728

    
729
    for (i = 0; i < s->iso_urb_count; i++) {
730
        g_free(aurb[i].urb.buffer);
731
    }
732

    
733
    if (free)
734
        g_free(aurb);
735
    else
736
        printf("husb: leaking iso urbs because of discard failure\n");
737
    set_iso_urb(s, pid, ep, NULL);
738
    set_iso_urb_idx(s, pid, ep, 0);
739
    clear_iso_started(s, pid, ep);
740
}
741

    
742
static void urb_status_to_usb_ret(int status, USBPacket *p)
743
{
744
    switch (status) {
745
    case -EPIPE:
746
        p->status = USB_RET_STALL;
747
        break;
748
    case -EOVERFLOW:
749
        p->status = USB_RET_BABBLE;
750
        break;
751
    default:
752
        p->status = USB_RET_IOERROR;
753
    }
754
}
755

    
756
static void usb_host_handle_iso_data(USBHostDevice *s, USBPacket *p, int in)
757
{
758
    AsyncURB *aurb;
759
    int i, j, max_packet_size, offset, len;
760
    uint8_t *buf;
761

    
762
    max_packet_size = p->ep->max_packet_size;
763
    if (max_packet_size == 0) {
764
        p->status = USB_RET_NAK;
765
        return;
766
    }
767

    
768
    aurb = get_iso_urb(s, p->pid, p->ep->nr);
769
    if (!aurb) {
770
        aurb = usb_host_alloc_iso(s, p->pid, p->ep->nr);
771
    }
772

    
773
    i = get_iso_urb_idx(s, p->pid, p->ep->nr);
774
    j = aurb[i].iso_frame_idx;
775
    if (j >= 0 && j < ISO_FRAME_DESC_PER_URB) {
776
        if (in) {
777
            /* Check urb status  */
778
            if (aurb[i].urb.status) {
779
                urb_status_to_usb_ret(aurb[i].urb.status, p);
780
                /* Move to the next urb */
781
                aurb[i].iso_frame_idx = ISO_FRAME_DESC_PER_URB - 1;
782
            /* Check frame status */
783
            } else if (aurb[i].urb.iso_frame_desc[j].status) {
784
                urb_status_to_usb_ret(aurb[i].urb.iso_frame_desc[j].status, p);
785
            /* Check the frame fits */
786
            } else if (aurb[i].urb.iso_frame_desc[j].actual_length
787
                       > p->iov.size) {
788
                printf("husb: received iso data is larger then packet\n");
789
                p->status = USB_RET_BABBLE;
790
            /* All good copy data over */
791
            } else {
792
                len = aurb[i].urb.iso_frame_desc[j].actual_length;
793
                buf  = aurb[i].urb.buffer +
794
                    j * aurb[i].urb.iso_frame_desc[0].length;
795
                usb_packet_copy(p, buf, len);
796
            }
797
        } else {
798
            len = p->iov.size;
799
            offset = (j == 0) ? 0 : get_iso_buffer_used(s, p->pid, p->ep->nr);
800

    
801
            /* Check the frame fits */
802
            if (len > max_packet_size) {
803
                printf("husb: send iso data is larger then max packet size\n");
804
                p->status = USB_RET_NAK;
805
                return;
806
            }
807

    
808
            /* All good copy data over */
809
            usb_packet_copy(p, aurb[i].urb.buffer + offset, len);
810
            aurb[i].urb.iso_frame_desc[j].length = len;
811
            offset += len;
812
            set_iso_buffer_used(s, p->pid, p->ep->nr, offset);
813

    
814
            /* Start the stream once we have buffered enough data */
815
            if (!is_iso_started(s, p->pid, p->ep->nr) && i == 1 && j == 8) {
816
                set_iso_started(s, p->pid, p->ep->nr);
817
            }
818
        }
819
        aurb[i].iso_frame_idx++;
820
        if (aurb[i].iso_frame_idx == ISO_FRAME_DESC_PER_URB) {
821
            i = (i + 1) % s->iso_urb_count;
822
            set_iso_urb_idx(s, p->pid, p->ep->nr, i);
823
        }
824
    } else {
825
        if (in) {
826
            set_iso_started(s, p->pid, p->ep->nr);
827
        } else {
828
            DPRINTF("hubs: iso out error no free buffer, dropping packet\n");
829
        }
830
    }
831

    
832
    if (is_iso_started(s, p->pid, p->ep->nr)) {
833
        /* (Re)-submit all fully consumed / filled urbs */
834
        for (i = 0; i < s->iso_urb_count; i++) {
835
            if (aurb[i].iso_frame_idx == ISO_FRAME_DESC_PER_URB) {
836
                if (ioctl(s->fd, USBDEVFS_SUBMITURB, &aurb[i]) < 0) {
837
                    perror("USBDEVFS_SUBMITURB");
838
                    if (!in || p->status == USB_RET_SUCCESS) {
839
                        switch(errno) {
840
                        case ETIMEDOUT:
841
                            p->status = USB_RET_NAK;
842
                            break;
843
                        case EPIPE:
844
                        default:
845
                            p->status = USB_RET_STALL;
846
                        }
847
                    }
848
                    break;
849
                }
850
                aurb[i].iso_frame_idx = -1;
851
                change_iso_inflight(s, p->pid, p->ep->nr, 1);
852
            }
853
        }
854
    }
855
}
856

    
857
static void usb_host_handle_data(USBDevice *dev, USBPacket *p)
858
{
859
    USBHostDevice *s = DO_UPCAST(USBHostDevice, dev, dev);
860
    struct usbdevfs_urb *urb;
861
    AsyncURB *aurb;
862
    int ret, rem, prem, v;
863
    uint8_t *pbuf;
864
    uint8_t ep;
865

    
866
    trace_usb_host_req_data(s->bus_num, s->addr, p,
867
                            p->pid == USB_TOKEN_IN,
868
                            p->ep->nr, p->iov.size);
869

    
870
    if (!is_valid(s, p->pid, p->ep->nr)) {
871
        p->status = USB_RET_NAK;
872
        trace_usb_host_req_complete(s->bus_num, s->addr, p,
873
                                    p->status, p->actual_length);
874
        return;
875
    }
876

    
877
    if (p->pid == USB_TOKEN_IN) {
878
        ep = p->ep->nr | 0x80;
879
    } else {
880
        ep = p->ep->nr;
881
    }
882

    
883
    if (is_halted(s, p->pid, p->ep->nr)) {
884
        unsigned int arg = ep;
885
        ret = ioctl(s->fd, USBDEVFS_CLEAR_HALT, &arg);
886
        if (ret < 0) {
887
            perror("USBDEVFS_CLEAR_HALT");
888
            p->status = USB_RET_NAK;
889
            trace_usb_host_req_complete(s->bus_num, s->addr, p,
890
                                        p->status, p->actual_length);
891
            return;
892
        }
893
        clear_halt(s, p->pid, p->ep->nr);
894
    }
895

    
896
    if (is_isoc(s, p->pid, p->ep->nr)) {
897
        usb_host_handle_iso_data(s, p, p->pid == USB_TOKEN_IN);
898
        return;
899
    }
900

    
901
    v = 0;
902
    prem = 0;
903
    pbuf = NULL;
904
    rem = p->iov.size;
905
    do {
906
        if (prem == 0 && rem > 0) {
907
            assert(v < p->iov.niov);
908
            prem = p->iov.iov[v].iov_len;
909
            pbuf = p->iov.iov[v].iov_base;
910
            assert(prem <= rem);
911
            v++;
912
        }
913
        aurb = async_alloc(s);
914
        aurb->packet = p;
915

    
916
        urb = &aurb->urb;
917
        urb->endpoint      = ep;
918
        urb->type          = usb_host_usbfs_type(s, p);
919
        urb->usercontext   = s;
920
        urb->buffer        = pbuf;
921
        urb->buffer_length = prem;
922

    
923
        if (urb->buffer_length > MAX_USBFS_BUFFER_SIZE) {
924
            urb->buffer_length = MAX_USBFS_BUFFER_SIZE;
925
        }
926
        pbuf += urb->buffer_length;
927
        prem -= urb->buffer_length;
928
        rem  -= urb->buffer_length;
929
        if (rem) {
930
            aurb->more         = 1;
931
        }
932

    
933
        trace_usb_host_urb_submit(s->bus_num, s->addr, aurb,
934
                                  urb->buffer_length, aurb->more);
935
        ret = ioctl(s->fd, USBDEVFS_SUBMITURB, urb);
936

    
937
        DPRINTF("husb: data submit: ep 0x%x, len %u, more %d, packet %p, aurb %p\n",
938
                urb->endpoint, urb->buffer_length, aurb->more, p, aurb);
939

    
940
        if (ret < 0) {
941
            perror("USBDEVFS_SUBMITURB");
942
            async_free(aurb);
943

    
944
            switch(errno) {
945
            case ETIMEDOUT:
946
                p->status = USB_RET_NAK;
947
                trace_usb_host_req_complete(s->bus_num, s->addr, p,
948
                                            p->status, p->actual_length);
949
                break;
950
            case EPIPE:
951
            default:
952
                p->status = USB_RET_STALL;
953
                trace_usb_host_req_complete(s->bus_num, s->addr, p,
954
                                            p->status, p->actual_length);
955
            }
956
            return;
957
        }
958
    } while (rem > 0);
959

    
960
    p->status = USB_RET_ASYNC;
961
}
962

    
963
static int ctrl_error(void)
964
{
965
    if (errno == ETIMEDOUT) {
966
        return USB_RET_NAK;
967
    } else {
968
        return USB_RET_STALL;
969
    }
970
}
971

    
972
static void usb_host_set_address(USBHostDevice *s, int addr)
973
{
974
    trace_usb_host_set_address(s->bus_num, s->addr, addr);
975
    s->dev.addr = addr;
976
}
977

    
978
static void usb_host_set_config(USBHostDevice *s, int config, USBPacket *p)
979
{
980
    int ret, first = 1;
981

    
982
    trace_usb_host_set_config(s->bus_num, s->addr, config);
983

    
984
    usb_host_release_interfaces(s);
985

    
986
again:
987
    ret = ioctl(s->fd, USBDEVFS_SETCONFIGURATION, &config);
988

    
989
    DPRINTF("husb: ctrl set config %d ret %d errno %d\n", config, ret, errno);
990

    
991
    if (ret < 0 && errno == EBUSY && first) {
992
        /* happens if usb device is in use by host drivers */
993
        int count = usb_linux_get_num_interfaces(s);
994
        if (count > 0) {
995
            DPRINTF("husb: busy -> disconnecting %d interfaces\n", count);
996
            usb_host_disconnect_ifaces(s, count);
997
            first = 0;
998
            goto again;
999
        }
1000
    }
1001

    
1002
    if (ret < 0) {
1003
        p->status = ctrl_error();
1004
        return;
1005
    }
1006
    usb_host_claim_interfaces(s, config);
1007
    usb_linux_update_endp_table(s);
1008
}
1009

    
1010
static void usb_host_set_interface(USBHostDevice *s, int iface, int alt,
1011
                                   USBPacket *p)
1012
{
1013
    struct usbdevfs_setinterface si;
1014
    int i, ret;
1015

    
1016
    trace_usb_host_set_interface(s->bus_num, s->addr, iface, alt);
1017

    
1018
    for (i = 1; i <= USB_MAX_ENDPOINTS; i++) {
1019
        if (is_isoc(s, USB_TOKEN_IN, i)) {
1020
            usb_host_stop_n_free_iso(s, USB_TOKEN_IN, i);
1021
        }
1022
        if (is_isoc(s, USB_TOKEN_OUT, i)) {
1023
            usb_host_stop_n_free_iso(s, USB_TOKEN_OUT, i);
1024
        }
1025
    }
1026

    
1027
    if (iface >= USB_MAX_INTERFACES) {
1028
        p->status = USB_RET_STALL;
1029
        return;
1030
    }
1031

    
1032
    si.interface  = iface;
1033
    si.altsetting = alt;
1034
    ret = ioctl(s->fd, USBDEVFS_SETINTERFACE, &si);
1035

    
1036
    DPRINTF("husb: ctrl set iface %d altset %d ret %d errno %d\n",
1037
            iface, alt, ret, errno);
1038

    
1039
    if (ret < 0) {
1040
        p->status = ctrl_error();
1041
        return;
1042
    }
1043

    
1044
    s->dev.altsetting[iface] = alt;
1045
    usb_linux_update_endp_table(s);
1046
}
1047

    
1048
static void usb_host_handle_control(USBDevice *dev, USBPacket *p,
1049
               int request, int value, int index, int length, uint8_t *data)
1050
{
1051
    USBHostDevice *s = DO_UPCAST(USBHostDevice, dev, dev);
1052
    struct usbdevfs_urb *urb;
1053
    AsyncURB *aurb;
1054
    int ret;
1055

    
1056
    /*
1057
     * Process certain standard device requests.
1058
     * These are infrequent and are processed synchronously.
1059
     */
1060

    
1061
    /* Note request is (bRequestType << 8) | bRequest */
1062
    trace_usb_host_req_control(s->bus_num, s->addr, p, request, value, index);
1063

    
1064
    switch (request) {
1065
    case DeviceOutRequest | USB_REQ_SET_ADDRESS:
1066
        usb_host_set_address(s, value);
1067
        trace_usb_host_req_emulated(s->bus_num, s->addr, p, p->status);
1068
        return;
1069

    
1070
    case DeviceOutRequest | USB_REQ_SET_CONFIGURATION:
1071
        usb_host_set_config(s, value & 0xff, p);
1072
        trace_usb_host_req_emulated(s->bus_num, s->addr, p, p->status);
1073
        return;
1074

    
1075
    case InterfaceOutRequest | USB_REQ_SET_INTERFACE:
1076
        usb_host_set_interface(s, index, value, p);
1077
        trace_usb_host_req_emulated(s->bus_num, s->addr, p, p->status);
1078
        return;
1079

    
1080
    case EndpointOutRequest | USB_REQ_CLEAR_FEATURE:
1081
        if (value == 0) { /* clear halt */
1082
            int pid = (index & USB_DIR_IN) ? USB_TOKEN_IN : USB_TOKEN_OUT;
1083
            ioctl(s->fd, USBDEVFS_CLEAR_HALT, &index);
1084
            clear_halt(s, pid, index & 0x0f);
1085
            trace_usb_host_req_emulated(s->bus_num, s->addr, p, 0);
1086
            return;
1087
        }
1088
    }
1089

    
1090
    /* The rest are asynchronous */
1091
    if (length > sizeof(dev->data_buf)) {
1092
        fprintf(stderr, "husb: ctrl buffer too small (%d > %zu)\n",
1093
                length, sizeof(dev->data_buf));
1094
        p->status = USB_RET_STALL;
1095
        return;
1096
    }
1097

    
1098
    aurb = async_alloc(s);
1099
    aurb->packet = p;
1100

    
1101
    /*
1102
     * Setup ctrl transfer.
1103
     *
1104
     * s->ctrl is laid out such that data buffer immediately follows
1105
     * 'req' struct which is exactly what usbdevfs expects.
1106
     */
1107
    urb = &aurb->urb;
1108

    
1109
    urb->type     = USBDEVFS_URB_TYPE_CONTROL;
1110
    urb->endpoint = p->ep->nr;
1111

    
1112
    urb->buffer        = &dev->setup_buf;
1113
    urb->buffer_length = length + 8;
1114

    
1115
    urb->usercontext = s;
1116

    
1117
    trace_usb_host_urb_submit(s->bus_num, s->addr, aurb,
1118
                              urb->buffer_length, aurb->more);
1119
    ret = ioctl(s->fd, USBDEVFS_SUBMITURB, urb);
1120

    
1121
    DPRINTF("husb: submit ctrl. len %u aurb %p\n", urb->buffer_length, aurb);
1122

    
1123
    if (ret < 0) {
1124
        DPRINTF("husb: submit failed. errno %d\n", errno);
1125
        async_free(aurb);
1126

    
1127
        switch(errno) {
1128
        case ETIMEDOUT:
1129
            p->status = USB_RET_NAK;
1130
            break;
1131
        case EPIPE:
1132
        default:
1133
            p->status = USB_RET_STALL;
1134
            break;
1135
        }
1136
        return;
1137
    }
1138

    
1139
    p->status = USB_RET_ASYNC;
1140
}
1141

    
1142
static void usb_linux_update_endp_table(USBHostDevice *s)
1143
{
1144
    static const char *tname[] = {
1145
        [USB_ENDPOINT_XFER_CONTROL] = "control",
1146
        [USB_ENDPOINT_XFER_ISOC]    = "isoc",
1147
        [USB_ENDPOINT_XFER_BULK]    = "bulk",
1148
        [USB_ENDPOINT_XFER_INT]     = "int",
1149
    };
1150
    uint8_t devep, type;
1151
    uint16_t mps, v, p;
1152
    int ep, pid;
1153
    unsigned int i, configuration = -1, interface = -1, altsetting = -1;
1154
    struct endp_data *epd;
1155
    USBDescriptor *d;
1156
    bool active = false;
1157

    
1158
    usb_ep_reset(&s->dev);
1159

    
1160
    for (i = 0;; i += d->bLength) {
1161
        if (i+2 >= s->descr_len) {
1162
            break;
1163
        }
1164
        d = (void *)(s->descr + i);
1165
        if (d->bLength < 2) {
1166
            trace_usb_host_parse_error(s->bus_num, s->addr,
1167
                                       "descriptor too short");
1168
            return;
1169
        }
1170
        if (i + d->bLength > s->descr_len) {
1171
            trace_usb_host_parse_error(s->bus_num, s->addr,
1172
                                       "descriptor too long");
1173
            return;
1174
        }
1175
        switch (d->bDescriptorType) {
1176
        case 0:
1177
            trace_usb_host_parse_error(s->bus_num, s->addr,
1178
                                       "invalid descriptor type");
1179
            return;
1180
        case USB_DT_DEVICE:
1181
            if (d->bLength < 0x12) {
1182
                trace_usb_host_parse_error(s->bus_num, s->addr,
1183
                                           "device descriptor too short");
1184
                return;
1185
            }
1186
            v = (d->u.device.idVendor_hi << 8) | d->u.device.idVendor_lo;
1187
            p = (d->u.device.idProduct_hi << 8) | d->u.device.idProduct_lo;
1188
            trace_usb_host_parse_device(s->bus_num, s->addr, v, p);
1189
            break;
1190
        case USB_DT_CONFIG:
1191
            if (d->bLength < 0x09) {
1192
                trace_usb_host_parse_error(s->bus_num, s->addr,
1193
                                           "config descriptor too short");
1194
                return;
1195
            }
1196
            configuration = d->u.config.bConfigurationValue;
1197
            active = (configuration == s->dev.configuration);
1198
            trace_usb_host_parse_config(s->bus_num, s->addr,
1199
                                        configuration, active);
1200
            break;
1201
        case USB_DT_INTERFACE:
1202
            if (d->bLength < 0x09) {
1203
                trace_usb_host_parse_error(s->bus_num, s->addr,
1204
                                           "interface descriptor too short");
1205
                return;
1206
            }
1207
            interface = d->u.interface.bInterfaceNumber;
1208
            altsetting = d->u.interface.bAlternateSetting;
1209
            active = (configuration == s->dev.configuration) &&
1210
                (altsetting == s->dev.altsetting[interface]);
1211
            trace_usb_host_parse_interface(s->bus_num, s->addr,
1212
                                           interface, altsetting, active);
1213
            break;
1214
        case USB_DT_ENDPOINT:
1215
            if (d->bLength < 0x07) {
1216
                trace_usb_host_parse_error(s->bus_num, s->addr,
1217
                                           "endpoint descriptor too short");
1218
                return;
1219
            }
1220
            devep = d->u.endpoint.bEndpointAddress;
1221
            pid = (devep & USB_DIR_IN) ? USB_TOKEN_IN : USB_TOKEN_OUT;
1222
            ep = devep & 0xf;
1223
            if (ep == 0) {
1224
                trace_usb_host_parse_error(s->bus_num, s->addr,
1225
                                           "invalid endpoint address");
1226
                return;
1227
            }
1228

    
1229
            type = d->u.endpoint.bmAttributes & 0x3;
1230
            mps = d->u.endpoint.wMaxPacketSize_lo |
1231
                (d->u.endpoint.wMaxPacketSize_hi << 8);
1232
            trace_usb_host_parse_endpoint(s->bus_num, s->addr, ep,
1233
                                          (devep & USB_DIR_IN) ? "in" : "out",
1234
                                          tname[type], active);
1235

    
1236
            if (active) {
1237
                usb_ep_set_max_packet_size(&s->dev, pid, ep, mps);
1238
                assert(usb_ep_get_type(&s->dev, pid, ep) ==
1239
                       USB_ENDPOINT_XFER_INVALID);
1240
                usb_ep_set_type(&s->dev, pid, ep, type);
1241
                usb_ep_set_ifnum(&s->dev, pid, ep, interface);
1242
                if ((s->options & (1 << USB_HOST_OPT_PIPELINE)) &&
1243
                    (type == USB_ENDPOINT_XFER_BULK) &&
1244
                    (pid == USB_TOKEN_OUT)) {
1245
                    usb_ep_set_pipeline(&s->dev, pid, ep, true);
1246
                }
1247

    
1248
                epd = get_endp(s, pid, ep);
1249
                epd->halted = 0;
1250
            }
1251

    
1252
            break;
1253
        default:
1254
            trace_usb_host_parse_unknown(s->bus_num, s->addr,
1255
                                         d->bLength, d->bDescriptorType);
1256
            break;
1257
        }
1258
    }
1259
}
1260

    
1261
/*
1262
 * Check if we can safely redirect a usb2 device to a usb1 virtual controller,
1263
 * this function assumes this is safe, if:
1264
 * 1) There are no isoc endpoints
1265
 * 2) There are no interrupt endpoints with a max_packet_size > 64
1266
 * Note bulk endpoints with a max_packet_size > 64 in theory also are not
1267
 * usb1 compatible, but in practice this seems to work fine.
1268
 */
1269
static int usb_linux_full_speed_compat(USBHostDevice *dev)
1270
{
1271
    int i, packet_size;
1272

    
1273
    /*
1274
     * usb_linux_update_endp_table only registers info about ep in the current
1275
     * interface altsettings, so we need to parse the descriptors again.
1276
     */
1277
    for (i = 0; (i + 5) < dev->descr_len; i += dev->descr[i]) {
1278
        if (dev->descr[i + 1] == USB_DT_ENDPOINT) {
1279
            switch (dev->descr[i + 3] & 0x3) {
1280
            case 0x00: /* CONTROL */
1281
                break;
1282
            case 0x01: /* ISO */
1283
                return 0;
1284
            case 0x02: /* BULK */
1285
                break;
1286
            case 0x03: /* INTERRUPT */
1287
                packet_size = dev->descr[i + 4] + (dev->descr[i + 5] << 8);
1288
                if (packet_size > 64)
1289
                    return 0;
1290
                break;
1291
            }
1292
        }
1293
    }
1294
    return 1;
1295
}
1296

    
1297
static int usb_host_open(USBHostDevice *dev, int bus_num,
1298
                         int addr, const char *port,
1299
                         const char *prod_name, int speed)
1300
{
1301
    int fd = -1, ret;
1302

    
1303
    trace_usb_host_open_started(bus_num, addr);
1304

    
1305
    if (dev->fd != -1) {
1306
        goto fail;
1307
    }
1308

    
1309
    fd = usb_host_open_device(bus_num, addr);
1310
    if (fd < 0) {
1311
        goto fail;
1312
    }
1313
    DPRINTF("husb: opened %s\n", buf);
1314

    
1315
    dev->bus_num = bus_num;
1316
    dev->addr = addr;
1317
    strcpy(dev->port, port);
1318
    dev->fd = fd;
1319

    
1320
    /* read the device description */
1321
    dev->descr_len = read(fd, dev->descr, sizeof(dev->descr));
1322
    if (dev->descr_len <= 0) {
1323
        perror("husb: reading device data failed");
1324
        goto fail;
1325
    }
1326

    
1327
#ifdef DEBUG
1328
    {
1329
        int x;
1330
        printf("=== begin dumping device descriptor data ===\n");
1331
        for (x = 0; x < dev->descr_len; x++) {
1332
            printf("%02x ", dev->descr[x]);
1333
        }
1334
        printf("\n=== end dumping device descriptor data ===\n");
1335
    }
1336
#endif
1337

    
1338

    
1339
    /* start unconfigured -- we'll wait for the guest to set a configuration */
1340
    if (!usb_host_claim_interfaces(dev, 0)) {
1341
        goto fail;
1342
    }
1343

    
1344
    usb_ep_init(&dev->dev);
1345
    usb_linux_update_endp_table(dev);
1346

    
1347
    if (speed == -1) {
1348
        struct usbdevfs_connectinfo ci;
1349

    
1350
        ret = ioctl(fd, USBDEVFS_CONNECTINFO, &ci);
1351
        if (ret < 0) {
1352
            perror("usb_host_device_open: USBDEVFS_CONNECTINFO");
1353
            goto fail;
1354
        }
1355

    
1356
        if (ci.slow) {
1357
            speed = USB_SPEED_LOW;
1358
        } else {
1359
            speed = USB_SPEED_HIGH;
1360
        }
1361
    }
1362
    dev->dev.speed = speed;
1363
    dev->dev.speedmask = (1 << speed);
1364
    if (dev->dev.speed == USB_SPEED_HIGH && usb_linux_full_speed_compat(dev)) {
1365
        dev->dev.speedmask |= USB_SPEED_MASK_FULL;
1366
    }
1367

    
1368
    trace_usb_host_open_success(bus_num, addr);
1369

    
1370
    if (!prod_name || prod_name[0] == '\0') {
1371
        snprintf(dev->dev.product_desc, sizeof(dev->dev.product_desc),
1372
                 "host:%d.%d", bus_num, addr);
1373
    } else {
1374
        pstrcpy(dev->dev.product_desc, sizeof(dev->dev.product_desc),
1375
                prod_name);
1376
    }
1377

    
1378
    ret = usb_device_attach(&dev->dev);
1379
    if (ret) {
1380
        goto fail;
1381
    }
1382

    
1383
    /* USB devio uses 'write' flag to check for async completions */
1384
    qemu_set_fd_handler(dev->fd, NULL, async_complete, dev);
1385

    
1386
    return 0;
1387

    
1388
fail:
1389
    trace_usb_host_open_failure(bus_num, addr);
1390
    if (dev->fd != -1) {
1391
        close(dev->fd);
1392
        dev->fd = -1;
1393
    }
1394
    return -1;
1395
}
1396

    
1397
static int usb_host_close(USBHostDevice *dev)
1398
{
1399
    int i;
1400

    
1401
    if (dev->fd == -1) {
1402
        return -1;
1403
    }
1404

    
1405
    trace_usb_host_close(dev->bus_num, dev->addr);
1406

    
1407
    qemu_set_fd_handler(dev->fd, NULL, NULL, NULL);
1408
    dev->closing = 1;
1409
    for (i = 1; i <= USB_MAX_ENDPOINTS; i++) {
1410
        if (is_isoc(dev, USB_TOKEN_IN, i)) {
1411
            usb_host_stop_n_free_iso(dev, USB_TOKEN_IN, i);
1412
        }
1413
        if (is_isoc(dev, USB_TOKEN_OUT, i)) {
1414
            usb_host_stop_n_free_iso(dev, USB_TOKEN_OUT, i);
1415
        }
1416
    }
1417
    async_complete(dev);
1418
    dev->closing = 0;
1419
    if (dev->dev.attached) {
1420
        usb_device_detach(&dev->dev);
1421
    }
1422
    usb_host_do_reset(dev);
1423
    close(dev->fd);
1424
    dev->fd = -1;
1425
    return 0;
1426
}
1427

    
1428
static void usb_host_exit_notifier(struct Notifier *n, void *data)
1429
{
1430
    USBHostDevice *s = container_of(n, USBHostDevice, exit);
1431

    
1432
    usb_host_release_port(s);
1433
    if (s->fd != -1) {
1434
        usb_host_do_reset(s);;
1435
    }
1436
}
1437

    
1438
/*
1439
 * This is *NOT* about restoring state.  We have absolutely no idea
1440
 * what state the host device is in at the moment and whenever it is
1441
 * still present in the first place.  Attemping to contine where we
1442
 * left off is impossible.
1443
 *
1444
 * What we are going to to to here is emulate a surprise removal of
1445
 * the usb device passed through, then kick host scan so the device
1446
 * will get re-attached (and re-initialized by the guest) in case it
1447
 * is still present.
1448
 *
1449
 * As the device removal will change the state of other devices (usb
1450
 * host controller, most likely interrupt controller too) we have to
1451
 * wait with it until *all* vmstate is loaded.  Thus post_load just
1452
 * kicks a bottom half which then does the actual work.
1453
 */
1454
static void usb_host_post_load_bh(void *opaque)
1455
{
1456
    USBHostDevice *dev = opaque;
1457

    
1458
    if (dev->fd != -1) {
1459
        usb_host_close(dev);
1460
    }
1461
    if (dev->dev.attached) {
1462
        usb_device_detach(&dev->dev);
1463
    }
1464
    usb_host_auto_check(NULL);
1465
}
1466

    
1467
static int usb_host_post_load(void *opaque, int version_id)
1468
{
1469
    USBHostDevice *dev = opaque;
1470

    
1471
    qemu_bh_schedule(dev->bh);
1472
    return 0;
1473
}
1474

    
1475
static int usb_host_initfn(USBDevice *dev)
1476
{
1477
    USBHostDevice *s = DO_UPCAST(USBHostDevice, dev, dev);
1478

    
1479
    dev->flags |= (1 << USB_DEV_FLAG_IS_HOST);
1480
    dev->auto_attach = 0;
1481
    s->fd = -1;
1482
    s->hub_fd = -1;
1483

    
1484
    QTAILQ_INSERT_TAIL(&hostdevs, s, next);
1485
    s->exit.notify = usb_host_exit_notifier;
1486
    qemu_add_exit_notifier(&s->exit);
1487
    s->bh = qemu_bh_new(usb_host_post_load_bh, s);
1488
    usb_host_auto_check(NULL);
1489

    
1490
    if (s->match.bus_num != 0 && s->match.port != NULL) {
1491
        usb_host_claim_port(s);
1492
    }
1493
    add_boot_device_path(s->bootindex, &dev->qdev, NULL);
1494
    return 0;
1495
}
1496

    
1497
static const VMStateDescription vmstate_usb_host = {
1498
    .name = "usb-host",
1499
    .version_id = 1,
1500
    .minimum_version_id = 1,
1501
    .post_load = usb_host_post_load,
1502
    .fields = (VMStateField[]) {
1503
        VMSTATE_USB_DEVICE(dev, USBHostDevice),
1504
        VMSTATE_END_OF_LIST()
1505
    }
1506
};
1507

    
1508
static Property usb_host_dev_properties[] = {
1509
    DEFINE_PROP_UINT32("hostbus",  USBHostDevice, match.bus_num,    0),
1510
    DEFINE_PROP_UINT32("hostaddr", USBHostDevice, match.addr,       0),
1511
    DEFINE_PROP_STRING("hostport", USBHostDevice, match.port),
1512
    DEFINE_PROP_HEX32("vendorid",  USBHostDevice, match.vendor_id,  0),
1513
    DEFINE_PROP_HEX32("productid", USBHostDevice, match.product_id, 0),
1514
    DEFINE_PROP_UINT32("isobufs",  USBHostDevice, iso_urb_count,    4),
1515
    DEFINE_PROP_INT32("bootindex", USBHostDevice, bootindex,        -1),
1516
    DEFINE_PROP_BIT("pipeline",    USBHostDevice, options,
1517
                    USB_HOST_OPT_PIPELINE, true),
1518
    DEFINE_PROP_END_OF_LIST(),
1519
};
1520

    
1521
static void usb_host_class_initfn(ObjectClass *klass, void *data)
1522
{
1523
    DeviceClass *dc = DEVICE_CLASS(klass);
1524
    USBDeviceClass *uc = USB_DEVICE_CLASS(klass);
1525

    
1526
    uc->init           = usb_host_initfn;
1527
    uc->product_desc   = "USB Host Device";
1528
    uc->cancel_packet  = usb_host_async_cancel;
1529
    uc->handle_data    = usb_host_handle_data;
1530
    uc->handle_control = usb_host_handle_control;
1531
    uc->handle_reset   = usb_host_handle_reset;
1532
    uc->handle_destroy = usb_host_handle_destroy;
1533
    dc->vmsd = &vmstate_usb_host;
1534
    dc->props = usb_host_dev_properties;
1535
}
1536

    
1537
static TypeInfo usb_host_dev_info = {
1538
    .name          = "usb-host",
1539
    .parent        = TYPE_USB_DEVICE,
1540
    .instance_size = sizeof(USBHostDevice),
1541
    .class_init    = usb_host_class_initfn,
1542
};
1543

    
1544
static void usb_host_register_types(void)
1545
{
1546
    type_register_static(&usb_host_dev_info);
1547
    usb_legacy_register("usb-host", "host", usb_host_device_open);
1548
}
1549

    
1550
type_init(usb_host_register_types)
1551

    
1552
USBDevice *usb_host_device_open(USBBus *bus, const char *devname)
1553
{
1554
    struct USBAutoFilter filter;
1555
    USBDevice *dev;
1556
    char *p;
1557

    
1558
    dev = usb_create(bus, "usb-host");
1559

    
1560
    if (strstr(devname, "auto:")) {
1561
        if (parse_filter(devname, &filter) < 0) {
1562
            goto fail;
1563
        }
1564
    } else {
1565
        if ((p = strchr(devname, '.'))) {
1566
            filter.bus_num    = strtoul(devname, NULL, 0);
1567
            filter.addr       = strtoul(p + 1, NULL, 0);
1568
            filter.vendor_id  = 0;
1569
            filter.product_id = 0;
1570
        } else if ((p = strchr(devname, ':'))) {
1571
            filter.bus_num    = 0;
1572
            filter.addr       = 0;
1573
            filter.vendor_id  = strtoul(devname, NULL, 16);
1574
            filter.product_id = strtoul(p + 1, NULL, 16);
1575
        } else {
1576
            goto fail;
1577
        }
1578
    }
1579

    
1580
    qdev_prop_set_uint32(&dev->qdev, "hostbus",   filter.bus_num);
1581
    qdev_prop_set_uint32(&dev->qdev, "hostaddr",  filter.addr);
1582
    qdev_prop_set_uint32(&dev->qdev, "vendorid",  filter.vendor_id);
1583
    qdev_prop_set_uint32(&dev->qdev, "productid", filter.product_id);
1584
    qdev_init_nofail(&dev->qdev);
1585
    return dev;
1586

    
1587
fail:
1588
    qdev_free(&dev->qdev);
1589
    return NULL;
1590
}
1591

    
1592
int usb_host_device_close(const char *devname)
1593
{
1594
#if 0
1595
    char product_name[PRODUCT_NAME_SZ];
1596
    int bus_num, addr;
1597
    USBHostDevice *s;
1598

1599
    if (strstr(devname, "auto:")) {
1600
        return usb_host_auto_del(devname);
1601
    }
1602
    if (usb_host_find_device(&bus_num, &addr, product_name,
1603
                                    sizeof(product_name), devname) < 0) {
1604
        return -1;
1605
    }
1606
    s = hostdev_find(bus_num, addr);
1607
    if (s) {
1608
        usb_device_delete_addr(s->bus_num, s->dev.addr);
1609
        return 0;
1610
    }
1611
#endif
1612

    
1613
    return -1;
1614
}
1615

    
1616
/*
1617
 * Read sys file-system device file
1618
 *
1619
 * @line address of buffer to put file contents in
1620
 * @line_size size of line
1621
 * @device_file path to device file (printf format string)
1622
 * @device_name device being opened (inserted into device_file)
1623
 *
1624
 * @return 0 failed, 1 succeeded ('line' contains data)
1625
 */
1626
static int usb_host_read_file(char *line, size_t line_size,
1627
                              const char *device_file, const char *device_name)
1628
{
1629
    FILE *f;
1630
    int ret = 0;
1631
    char filename[PATH_MAX];
1632

    
1633
    snprintf(filename, PATH_MAX, "/sys/bus/usb/devices/%s/%s", device_name,
1634
             device_file);
1635
    f = fopen(filename, "r");
1636
    if (f) {
1637
        ret = fgets(line, line_size, f) != NULL;
1638
        fclose(f);
1639
    }
1640

    
1641
    return ret;
1642
}
1643

    
1644
/*
1645
 * Use /sys/bus/usb/devices/ directory to determine host's USB
1646
 * devices.
1647
 *
1648
 * This code is based on Robert Schiele's original patches posted to
1649
 * the Novell bug-tracker https://bugzilla.novell.com/show_bug.cgi?id=241950
1650
 */
1651
static int usb_host_scan(void *opaque, USBScanFunc *func)
1652
{
1653
    DIR *dir = NULL;
1654
    char line[1024];
1655
    int bus_num, addr, speed, class_id, product_id, vendor_id;
1656
    int ret = 0;
1657
    char port[MAX_PORTLEN];
1658
    char product_name[512];
1659
    struct dirent *de;
1660

    
1661
    dir = opendir("/sys/bus/usb/devices");
1662
    if (!dir) {
1663
        perror("husb: opendir /sys/bus/usb/devices");
1664
        fprintf(stderr, "husb: please make sure sysfs is mounted at /sys\n");
1665
        goto the_end;
1666
    }
1667

    
1668
    while ((de = readdir(dir))) {
1669
        if (de->d_name[0] != '.' && !strchr(de->d_name, ':')) {
1670
            if (sscanf(de->d_name, "%d-%7[0-9.]", &bus_num, port) < 2) {
1671
                continue;
1672
            }
1673

    
1674
            if (!usb_host_read_file(line, sizeof(line), "devnum", de->d_name)) {
1675
                goto the_end;
1676
            }
1677
            if (sscanf(line, "%d", &addr) != 1) {
1678
                goto the_end;
1679
            }
1680
            if (!usb_host_read_file(line, sizeof(line), "bDeviceClass",
1681
                                    de->d_name)) {
1682
                goto the_end;
1683
            }
1684
            if (sscanf(line, "%x", &class_id) != 1) {
1685
                goto the_end;
1686
            }
1687

    
1688
            if (!usb_host_read_file(line, sizeof(line), "idVendor",
1689
                                    de->d_name)) {
1690
                goto the_end;
1691
            }
1692
            if (sscanf(line, "%x", &vendor_id) != 1) {
1693
                goto the_end;
1694
            }
1695
            if (!usb_host_read_file(line, sizeof(line), "idProduct",
1696
                                    de->d_name)) {
1697
                goto the_end;
1698
            }
1699
            if (sscanf(line, "%x", &product_id) != 1) {
1700
                goto the_end;
1701
            }
1702
            if (!usb_host_read_file(line, sizeof(line), "product",
1703
                                    de->d_name)) {
1704
                *product_name = 0;
1705
            } else {
1706
                if (strlen(line) > 0) {
1707
                    line[strlen(line) - 1] = '\0';
1708
                }
1709
                pstrcpy(product_name, sizeof(product_name), line);
1710
            }
1711

    
1712
            if (!usb_host_read_file(line, sizeof(line), "speed", de->d_name)) {
1713
                goto the_end;
1714
            }
1715
            if (!strcmp(line, "5000\n")) {
1716
                speed = USB_SPEED_SUPER;
1717
            } else if (!strcmp(line, "480\n")) {
1718
                speed = USB_SPEED_HIGH;
1719
            } else if (!strcmp(line, "1.5\n")) {
1720
                speed = USB_SPEED_LOW;
1721
            } else {
1722
                speed = USB_SPEED_FULL;
1723
            }
1724

    
1725
            ret = func(opaque, bus_num, addr, port, class_id, vendor_id,
1726
                       product_id, product_name, speed);
1727
            if (ret) {
1728
                goto the_end;
1729
            }
1730
        }
1731
    }
1732
 the_end:
1733
    if (dir) {
1734
        closedir(dir);
1735
    }
1736
    return ret;
1737
}
1738

    
1739
static QEMUTimer *usb_auto_timer;
1740
static VMChangeStateEntry *usb_vmstate;
1741

    
1742
static int usb_host_auto_scan(void *opaque, int bus_num,
1743
                              int addr, const char *port,
1744
                              int class_id, int vendor_id, int product_id,
1745
                              const char *product_name, int speed)
1746
{
1747
    struct USBAutoFilter *f;
1748
    struct USBHostDevice *s;
1749

    
1750
    /* Ignore hubs */
1751
    if (class_id == 9)
1752
        return 0;
1753

    
1754
    QTAILQ_FOREACH(s, &hostdevs, next) {
1755
        f = &s->match;
1756

    
1757
        if (f->bus_num > 0 && f->bus_num != bus_num) {
1758
            continue;
1759
        }
1760
        if (f->addr > 0 && f->addr != addr) {
1761
            continue;
1762
        }
1763
        if (f->port != NULL && (port == NULL || strcmp(f->port, port) != 0)) {
1764
            continue;
1765
        }
1766

    
1767
        if (f->vendor_id > 0 && f->vendor_id != vendor_id) {
1768
            continue;
1769
        }
1770

    
1771
        if (f->product_id > 0 && f->product_id != product_id) {
1772
            continue;
1773
        }
1774
        /* We got a match */
1775
        s->seen++;
1776
        if (s->errcount >= 3) {
1777
            return 0;
1778
        }
1779

    
1780
        /* Already attached ? */
1781
        if (s->fd != -1) {
1782
            return 0;
1783
        }
1784
        DPRINTF("husb: auto open: bus_num %d addr %d\n", bus_num, addr);
1785

    
1786
        if (usb_host_open(s, bus_num, addr, port, product_name, speed) < 0) {
1787
            s->errcount++;
1788
        }
1789
        break;
1790
    }
1791

    
1792
    return 0;
1793
}
1794

    
1795
static void usb_host_vm_state(void *unused, int running, RunState state)
1796
{
1797
    if (running) {
1798
        usb_host_auto_check(unused);
1799
    }
1800
}
1801

    
1802
static void usb_host_auto_check(void *unused)
1803
{
1804
    struct USBHostDevice *s;
1805
    int unconnected = 0;
1806

    
1807
    if (runstate_is_running()) {
1808
        usb_host_scan(NULL, usb_host_auto_scan);
1809

    
1810
        QTAILQ_FOREACH(s, &hostdevs, next) {
1811
            if (s->fd == -1) {
1812
                unconnected++;
1813
            }
1814
            if (s->seen == 0) {
1815
                s->errcount = 0;
1816
            }
1817
            s->seen = 0;
1818
        }
1819

    
1820
        if (unconnected == 0) {
1821
            /* nothing to watch */
1822
            if (usb_auto_timer) {
1823
                qemu_del_timer(usb_auto_timer);
1824
                trace_usb_host_auto_scan_disabled();
1825
            }
1826
            return;
1827
        }
1828
    }
1829

    
1830
    if (!usb_vmstate) {
1831
        usb_vmstate = qemu_add_vm_change_state_handler(usb_host_vm_state, NULL);
1832
    }
1833
    if (!usb_auto_timer) {
1834
        usb_auto_timer = qemu_new_timer_ms(rt_clock, usb_host_auto_check, NULL);
1835
        if (!usb_auto_timer) {
1836
            return;
1837
        }
1838
        trace_usb_host_auto_scan_enabled();
1839
    }
1840
    qemu_mod_timer(usb_auto_timer, qemu_get_clock_ms(rt_clock) + 2000);
1841
}
1842

    
1843
/*
1844
 * Autoconnect filter
1845
 * Format:
1846
 *    auto:bus:dev[:vid:pid]
1847
 *    auto:bus.dev[:vid:pid]
1848
 *
1849
 *    bus  - bus number    (dec, * means any)
1850
 *    dev  - device number (dec, * means any)
1851
 *    vid  - vendor id     (hex, * means any)
1852
 *    pid  - product id    (hex, * means any)
1853
 *
1854
 *    See 'lsusb' output.
1855
 */
1856
static int parse_filter(const char *spec, struct USBAutoFilter *f)
1857
{
1858
    enum { BUS, DEV, VID, PID, DONE };
1859
    const char *p = spec;
1860
    int i;
1861

    
1862
    f->bus_num    = 0;
1863
    f->addr       = 0;
1864
    f->vendor_id  = 0;
1865
    f->product_id = 0;
1866

    
1867
    for (i = BUS; i < DONE; i++) {
1868
        p = strpbrk(p, ":.");
1869
        if (!p) {
1870
            break;
1871
        }
1872
        p++;
1873

    
1874
        if (*p == '*') {
1875
            continue;
1876
        }
1877
        switch(i) {
1878
        case BUS: f->bus_num = strtol(p, NULL, 10);    break;
1879
        case DEV: f->addr    = strtol(p, NULL, 10);    break;
1880
        case VID: f->vendor_id  = strtol(p, NULL, 16); break;
1881
        case PID: f->product_id = strtol(p, NULL, 16); break;
1882
        }
1883
    }
1884

    
1885
    if (i < DEV) {
1886
        fprintf(stderr, "husb: invalid auto filter spec %s\n", spec);
1887
        return -1;
1888
    }
1889

    
1890
    return 0;
1891
}
1892

    
1893
/**********************/
1894
/* USB host device info */
1895

    
1896
struct usb_class_info {
1897
    int class;
1898
    const char *class_name;
1899
};
1900

    
1901
static const struct usb_class_info usb_class_info[] = {
1902
    { USB_CLASS_AUDIO, "Audio"},
1903
    { USB_CLASS_COMM, "Communication"},
1904
    { USB_CLASS_HID, "HID"},
1905
    { USB_CLASS_HUB, "Hub" },
1906
    { USB_CLASS_PHYSICAL, "Physical" },
1907
    { USB_CLASS_PRINTER, "Printer" },
1908
    { USB_CLASS_MASS_STORAGE, "Storage" },
1909
    { USB_CLASS_CDC_DATA, "Data" },
1910
    { USB_CLASS_APP_SPEC, "Application Specific" },
1911
    { USB_CLASS_VENDOR_SPEC, "Vendor Specific" },
1912
    { USB_CLASS_STILL_IMAGE, "Still Image" },
1913
    { USB_CLASS_CSCID, "Smart Card" },
1914
    { USB_CLASS_CONTENT_SEC, "Content Security" },
1915
    { -1, NULL }
1916
};
1917

    
1918
static const char *usb_class_str(uint8_t class)
1919
{
1920
    const struct usb_class_info *p;
1921
    for(p = usb_class_info; p->class != -1; p++) {
1922
        if (p->class == class) {
1923
            break;
1924
        }
1925
    }
1926
    return p->class_name;
1927
}
1928

    
1929
static void usb_info_device(Monitor *mon, int bus_num,
1930
                            int addr, const char *port,
1931
                            int class_id, int vendor_id, int product_id,
1932
                            const char *product_name,
1933
                            int speed)
1934
{
1935
    const char *class_str, *speed_str;
1936

    
1937
    switch(speed) {
1938
    case USB_SPEED_LOW:
1939
        speed_str = "1.5";
1940
        break;
1941
    case USB_SPEED_FULL:
1942
        speed_str = "12";
1943
        break;
1944
    case USB_SPEED_HIGH:
1945
        speed_str = "480";
1946
        break;
1947
    case USB_SPEED_SUPER:
1948
        speed_str = "5000";
1949
        break;
1950
    default:
1951
        speed_str = "?";
1952
        break;
1953
    }
1954

    
1955
    monitor_printf(mon, "  Bus %d, Addr %d, Port %s, Speed %s Mb/s\n",
1956
                   bus_num, addr, port, speed_str);
1957
    class_str = usb_class_str(class_id);
1958
    if (class_str) {
1959
        monitor_printf(mon, "    %s:", class_str);
1960
    } else {
1961
        monitor_printf(mon, "    Class %02x:", class_id);
1962
    }
1963
    monitor_printf(mon, " USB device %04x:%04x", vendor_id, product_id);
1964
    if (product_name[0] != '\0') {
1965
        monitor_printf(mon, ", %s", product_name);
1966
    }
1967
    monitor_printf(mon, "\n");
1968
}
1969

    
1970
static int usb_host_info_device(void *opaque, int bus_num, int addr,
1971
                                const char *path, int class_id,
1972
                                int vendor_id, int product_id,
1973
                                const char *product_name,
1974
                                int speed)
1975
{
1976
    Monitor *mon = opaque;
1977

    
1978
    usb_info_device(mon, bus_num, addr, path, class_id, vendor_id, product_id,
1979
                    product_name, speed);
1980
    return 0;
1981
}
1982

    
1983
static void dec2str(int val, char *str, size_t size)
1984
{
1985
    if (val == 0) {
1986
        snprintf(str, size, "*");
1987
    } else {
1988
        snprintf(str, size, "%d", val);
1989
    }
1990
}
1991

    
1992
static void hex2str(int val, char *str, size_t size)
1993
{
1994
    if (val == 0) {
1995
        snprintf(str, size, "*");
1996
    } else {
1997
        snprintf(str, size, "%04x", val);
1998
    }
1999
}
2000

    
2001
void usb_host_info(Monitor *mon)
2002
{
2003
    struct USBAutoFilter *f;
2004
    struct USBHostDevice *s;
2005

    
2006
    usb_host_scan(mon, usb_host_info_device);
2007

    
2008
    if (QTAILQ_EMPTY(&hostdevs)) {
2009
        return;
2010
    }
2011

    
2012
    monitor_printf(mon, "  Auto filters:\n");
2013
    QTAILQ_FOREACH(s, &hostdevs, next) {
2014
        char bus[10], addr[10], vid[10], pid[10];
2015
        f = &s->match;
2016
        dec2str(f->bus_num, bus, sizeof(bus));
2017
        dec2str(f->addr, addr, sizeof(addr));
2018
        hex2str(f->vendor_id, vid, sizeof(vid));
2019
        hex2str(f->product_id, pid, sizeof(pid));
2020
        monitor_printf(mon, "    Bus %s, Addr %s, Port %s, ID %s:%s\n",
2021
                       bus, addr, f->port ? f->port : "*", vid, pid);
2022
    }
2023
}