~ahs3/+junk/cq-qemu

« back to all changes in this revision

Viewing changes to usb-linux.c

  • Committer: Al Stone
  • Date: 2012-02-09 01:17:20 UTC
  • Revision ID: albert.stone@canonical.com-20120209011720-tztl7ik3qayz80p4
first commit to bzr for qemu

Show diffs side-by-side

added added

removed removed

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