Statistics
| Branch: | Revision:

root / usb-linux.c @ 61c1117f

History | View | Annotate | Download (50.8 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.h"
36
#include "sysemu.h"
37

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

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

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

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

    
60
//#define DEBUG
61

    
62
#ifdef DEBUG
63
#define DPRINTF printf
64
#else
65
#define DPRINTF(...)
66
#endif
67

    
68
#define USBDBG_DEVOPENED "husb: opened %s/devices\n"
69

    
70
#define USBPROCBUS_PATH "/proc/bus/usb"
71
#define PRODUCT_NAME_SZ 32
72
#define MAX_ENDPOINTS 15
73
#define MAX_PORTLEN 16
74
#define USBDEVBUS_PATH "/dev/bus/usb"
75
#define USBSYSBUS_PATH "/sys/bus/usb"
76

    
77
static char *usb_host_device_path;
78

    
79
#define USB_FS_NONE 0
80
#define USB_FS_PROC 1
81
#define USB_FS_DEV 2
82
#define USB_FS_SYS 3
83

    
84
static int usb_fs_type;
85

    
86
/* endpoint association data */
87
#define ISO_FRAME_DESC_PER_URB 32
88
#define ISO_URB_COUNT 3
89
#define INVALID_EP_TYPE 255
90

    
91
/* devio.c limits single requests to 16k */
92
#define MAX_USBFS_BUFFER_SIZE 16384
93

    
94
typedef struct AsyncURB AsyncURB;
95

    
96
struct endp_data {
97
    uint8_t type;
98
    uint8_t halted;
99
    uint8_t iso_started;
100
    AsyncURB *iso_urb;
101
    int iso_urb_idx;
102
    int iso_buffer_used;
103
    int max_packet_size;
104
};
105

    
106
struct USBAutoFilter {
107
    uint32_t bus_num;
108
    uint32_t addr;
109
    char     *port;
110
    uint32_t vendor_id;
111
    uint32_t product_id;
112
};
113

    
114
typedef struct USBHostDevice {
115
    USBDevice dev;
116
    int       fd;
117

    
118
    uint8_t   descr[1024];
119
    int       descr_len;
120
    int       configuration;
121
    int       ninterfaces;
122
    int       closing;
123
    Notifier  exit;
124

    
125
    struct endp_data endp_table[MAX_ENDPOINTS];
126
    QLIST_HEAD(, AsyncURB) aurbs;
127

    
128
    /* Host side address */
129
    int bus_num;
130
    int addr;
131
    char port[MAX_PORTLEN];
132
    struct USBAutoFilter match;
133

    
134
    QTAILQ_ENTRY(USBHostDevice) next;
135
} USBHostDevice;
136

    
137
static QTAILQ_HEAD(, USBHostDevice) hostdevs = QTAILQ_HEAD_INITIALIZER(hostdevs);
138

    
139
static int usb_host_close(USBHostDevice *dev);
140
static int parse_filter(const char *spec, struct USBAutoFilter *f);
141
static void usb_host_auto_check(void *unused);
142
static int usb_host_read_file(char *line, size_t line_size,
143
                            const char *device_file, const char *device_name);
144

    
145
static int is_isoc(USBHostDevice *s, int ep)
146
{
147
    return s->endp_table[ep - 1].type == USBDEVFS_URB_TYPE_ISO;
148
}
149

    
150
static int is_valid(USBHostDevice *s, int ep)
151
{
152
    return s->endp_table[ep - 1].type != INVALID_EP_TYPE;
153
}
154

    
155
static int is_halted(USBHostDevice *s, int ep)
156
{
157
    return s->endp_table[ep - 1].halted;
158
}
159

    
160
static void clear_halt(USBHostDevice *s, int ep)
161
{
162
    s->endp_table[ep - 1].halted = 0;
163
}
164

    
165
static void set_halt(USBHostDevice *s, int ep)
166
{
167
    s->endp_table[ep - 1].halted = 1;
168
}
169

    
170
static int is_iso_started(USBHostDevice *s, int ep)
171
{
172
    return s->endp_table[ep - 1].iso_started;
173
}
174

    
175
static void clear_iso_started(USBHostDevice *s, int ep)
176
{
177
    s->endp_table[ep - 1].iso_started = 0;
178
}
179

    
180
static void set_iso_started(USBHostDevice *s, int ep)
181
{
182
    s->endp_table[ep - 1].iso_started = 1;
183
}
184

    
185
static void set_iso_urb(USBHostDevice *s, int ep, AsyncURB *iso_urb)
186
{
187
    s->endp_table[ep - 1].iso_urb = iso_urb;
188
}
189

    
190
static AsyncURB *get_iso_urb(USBHostDevice *s, int ep)
191
{
192
    return s->endp_table[ep - 1].iso_urb;
193
}
194

    
195
static void set_iso_urb_idx(USBHostDevice *s, int ep, int i)
196
{
197
    s->endp_table[ep - 1].iso_urb_idx = i;
198
}
199

    
200
static int get_iso_urb_idx(USBHostDevice *s, int ep)
201
{
202
    return s->endp_table[ep - 1].iso_urb_idx;
203
}
204

    
205
static void set_iso_buffer_used(USBHostDevice *s, int ep, int i)
206
{
207
    s->endp_table[ep - 1].iso_buffer_used = i;
208
}
209

    
210
static int get_iso_buffer_used(USBHostDevice *s, int ep)
211
{
212
    return s->endp_table[ep - 1].iso_buffer_used;
213
}
214

    
215
static void set_max_packet_size(USBHostDevice *s, int ep, uint8_t *descriptor)
216
{
217
    int raw = descriptor[4] + (descriptor[5] << 8);
218
    int size, microframes;
219

    
220
    size = raw & 0x7ff;
221
    switch ((raw >> 11) & 3) {
222
    case 1:  microframes = 2; break;
223
    case 2:  microframes = 3; break;
224
    default: microframes = 1; break;
225
    }
226
    DPRINTF("husb: max packet size: 0x%x -> %d x %d\n",
227
            raw, microframes, size);
228
    s->endp_table[ep - 1].max_packet_size = size * microframes;
229
}
230

    
231
static int get_max_packet_size(USBHostDevice *s, int ep)
232
{
233
    return s->endp_table[ep - 1].max_packet_size;
234
}
235

    
236
/*
237
 * Async URB state.
238
 * We always allocate iso packet descriptors even for bulk transfers
239
 * to simplify allocation and casts.
240
 */
241
struct AsyncURB
242
{
243
    struct usbdevfs_urb urb;
244
    struct usbdevfs_iso_packet_desc isocpd[ISO_FRAME_DESC_PER_URB];
245
    USBHostDevice *hdev;
246
    QLIST_ENTRY(AsyncURB) next;
247

    
248
    /* For regular async urbs */
249
    USBPacket     *packet;
250
    int more; /* large transfer, more urbs follow */
251

    
252
    /* For buffered iso handling */
253
    int iso_frame_idx; /* -1 means in flight */
254
};
255

    
256
static AsyncURB *async_alloc(USBHostDevice *s)
257
{
258
    AsyncURB *aurb = qemu_mallocz(sizeof(AsyncURB));
259
    aurb->hdev = s;
260
    QLIST_INSERT_HEAD(&s->aurbs, aurb, next);
261
    return aurb;
262
}
263

    
264
static void async_free(AsyncURB *aurb)
265
{
266
    QLIST_REMOVE(aurb, next);
267
    qemu_free(aurb);
268
}
269

    
270
static void do_disconnect(USBHostDevice *s)
271
{
272
    printf("husb: device %d.%d disconnected\n",
273
           s->bus_num, s->addr);
274
    usb_host_close(s);
275
    usb_host_auto_check(NULL);
276
}
277

    
278
static void async_complete(void *opaque)
279
{
280
    USBHostDevice *s = opaque;
281
    AsyncURB *aurb;
282

    
283
    while (1) {
284
        USBPacket *p;
285

    
286
        int r = ioctl(s->fd, USBDEVFS_REAPURBNDELAY, &aurb);
287
        if (r < 0) {
288
            if (errno == EAGAIN) {
289
                return;
290
            }
291
            if (errno == ENODEV && !s->closing) {
292
                do_disconnect(s);
293
                return;
294
            }
295

    
296
            DPRINTF("husb: async. reap urb failed errno %d\n", errno);
297
            return;
298
        }
299

    
300
        DPRINTF("husb: async completed. aurb %p status %d alen %d\n",
301
                aurb, aurb->urb.status, aurb->urb.actual_length);
302

    
303
        /* If this is a buffered iso urb mark it as complete and don't do
304
           anything else (it is handled further in usb_host_handle_iso_data) */
305
        if (aurb->iso_frame_idx == -1) {
306
            if (aurb->urb.status == -EPIPE) {
307
                set_halt(s, aurb->urb.endpoint & 0xf);
308
            }
309
            aurb->iso_frame_idx = 0;
310
            continue;
311
        }
312

    
313
        p = aurb->packet;
314

    
315
        if (p) {
316
            switch (aurb->urb.status) {
317
            case 0:
318
                p->len += aurb->urb.actual_length;
319
                break;
320

    
321
            case -EPIPE:
322
                set_halt(s, p->devep);
323
                p->len = USB_RET_STALL;
324
                break;
325

    
326
            default:
327
                p->len = USB_RET_NAK;
328
                break;
329
            }
330

    
331
            if (aurb->urb.type == USBDEVFS_URB_TYPE_CONTROL) {
332
                usb_generic_async_ctrl_complete(&s->dev, p);
333
            } else if (!aurb->more) {
334
                usb_packet_complete(&s->dev, p);
335
            }
336
        }
337

    
338
        async_free(aurb);
339
    }
340
}
341

    
342
static void usb_host_async_cancel(USBDevice *dev, USBPacket *p)
343
{
344
    USBHostDevice *s = DO_UPCAST(USBHostDevice, dev, dev);
345
    AsyncURB *aurb;
346

    
347
    QLIST_FOREACH(aurb, &s->aurbs, next) {
348
        if (p != aurb->packet) {
349
            continue;
350
        }
351

    
352
        DPRINTF("husb: async cancel: packet %p, aurb %p\n", p, aurb);
353

    
354
        /* Mark it as dead (see async_complete above) */
355
        aurb->packet = NULL;
356

    
357
        int r = ioctl(s->fd, USBDEVFS_DISCARDURB, aurb);
358
        if (r < 0) {
359
            DPRINTF("husb: async. discard urb failed errno %d\n", errno);
360
        }
361
    }
362
}
363

    
364
static int usb_host_claim_interfaces(USBHostDevice *dev, int configuration)
365
{
366
    const char *op = NULL;
367
    int dev_descr_len, config_descr_len;
368
    int interface, nb_interfaces;
369
    int ret, i;
370

    
371
    if (configuration == 0) /* address state - ignore */
372
        return 1;
373

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

    
376
    i = 0;
377
    dev_descr_len = dev->descr[0];
378
    if (dev_descr_len > dev->descr_len) {
379
        fprintf(stderr, "husb: update iface failed. descr too short\n");
380
        return 0;
381
    }
382

    
383
    i += dev_descr_len;
384
    while (i < dev->descr_len) {
385
        DPRINTF("husb: i is %d, descr_len is %d, dl %d, dt %d\n",
386
                i, dev->descr_len,
387
               dev->descr[i], dev->descr[i+1]);
388

    
389
        if (dev->descr[i+1] != USB_DT_CONFIG) {
390
            i += dev->descr[i];
391
            continue;
392
        }
393
        config_descr_len = dev->descr[i];
394

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

    
397
        if (configuration < 0 || configuration == dev->descr[i + 5]) {
398
            configuration = dev->descr[i + 5];
399
            break;
400
        }
401

    
402
        i += config_descr_len;
403
    }
404

    
405
    if (i >= dev->descr_len) {
406
        fprintf(stderr,
407
                "husb: update iface failed. no matching configuration\n");
408
        return 0;
409
    }
410
    nb_interfaces = dev->descr[i + 4];
411

    
412
#ifdef USBDEVFS_DISCONNECT
413
    /* earlier Linux 2.4 do not support that */
414
    {
415
        struct usbdevfs_ioctl ctrl;
416
        for (interface = 0; interface < nb_interfaces; interface++) {
417
            ctrl.ioctl_code = USBDEVFS_DISCONNECT;
418
            ctrl.ifno = interface;
419
            ctrl.data = 0;
420
            op = "USBDEVFS_DISCONNECT";
421
            ret = ioctl(dev->fd, USBDEVFS_IOCTL, &ctrl);
422
            if (ret < 0 && errno != ENODATA) {
423
                goto fail;
424
            }
425
        }
426
    }
427
#endif
428

    
429
    /* XXX: only grab if all interfaces are free */
430
    for (interface = 0; interface < nb_interfaces; interface++) {
431
        op = "USBDEVFS_CLAIMINTERFACE";
432
        ret = ioctl(dev->fd, USBDEVFS_CLAIMINTERFACE, &interface);
433
        if (ret < 0) {
434
            if (errno == EBUSY) {
435
                printf("husb: update iface. device already grabbed\n");
436
            } else {
437
                perror("husb: failed to claim interface");
438
            }
439
            goto fail;
440
        }
441
    }
442

    
443
    printf("husb: %d interfaces claimed for configuration %d\n",
444
           nb_interfaces, configuration);
445

    
446
    dev->ninterfaces   = nb_interfaces;
447
    dev->configuration = configuration;
448
    return 1;
449

    
450
fail:
451
    if (errno == ENODEV) {
452
        do_disconnect(dev);
453
    }
454
    perror(op);
455
    return 0;
456
}
457

    
458
static int usb_host_release_interfaces(USBHostDevice *s)
459
{
460
    int ret, i;
461

    
462
    DPRINTF("husb: releasing interfaces\n");
463

    
464
    for (i = 0; i < s->ninterfaces; i++) {
465
        ret = ioctl(s->fd, USBDEVFS_RELEASEINTERFACE, &i);
466
        if (ret < 0) {
467
            perror("husb: failed to release interface");
468
            return 0;
469
        }
470
    }
471

    
472
    return 1;
473
}
474

    
475
static void usb_host_handle_reset(USBDevice *dev)
476
{
477
    USBHostDevice *s = DO_UPCAST(USBHostDevice, dev, dev);
478

    
479
    DPRINTF("husb: reset device %u.%u\n", s->bus_num, s->addr);
480

    
481
    ioctl(s->fd, USBDEVFS_RESET);
482

    
483
    usb_host_claim_interfaces(s, s->configuration);
484
}
485

    
486
static void usb_host_handle_destroy(USBDevice *dev)
487
{
488
    USBHostDevice *s = (USBHostDevice *)dev;
489

    
490
    usb_host_close(s);
491
    QTAILQ_REMOVE(&hostdevs, s, next);
492
    qemu_remove_exit_notifier(&s->exit);
493
}
494

    
495
static int usb_linux_update_endp_table(USBHostDevice *s);
496

    
497
/* iso data is special, we need to keep enough urbs in flight to make sure
498
   that the controller never runs out of them, otherwise the device will
499
   likely suffer a buffer underrun / overrun. */
500
static AsyncURB *usb_host_alloc_iso(USBHostDevice *s, uint8_t ep, int in)
501
{
502
    AsyncURB *aurb;
503
    int i, j, len = get_max_packet_size(s, ep);
504

    
505
    aurb = qemu_mallocz(ISO_URB_COUNT * sizeof(*aurb));
506
    for (i = 0; i < ISO_URB_COUNT; i++) {
507
        aurb[i].urb.endpoint      = ep;
508
        aurb[i].urb.buffer_length = ISO_FRAME_DESC_PER_URB * len;
509
        aurb[i].urb.buffer        = qemu_malloc(aurb[i].urb.buffer_length);
510
        aurb[i].urb.type          = USBDEVFS_URB_TYPE_ISO;
511
        aurb[i].urb.flags         = USBDEVFS_URB_ISO_ASAP;
512
        aurb[i].urb.number_of_packets = ISO_FRAME_DESC_PER_URB;
513
        for (j = 0 ; j < ISO_FRAME_DESC_PER_URB; j++)
514
            aurb[i].urb.iso_frame_desc[j].length = len;
515
        if (in) {
516
            aurb[i].urb.endpoint |= 0x80;
517
            /* Mark as fully consumed (idle) */
518
            aurb[i].iso_frame_idx = ISO_FRAME_DESC_PER_URB;
519
        }
520
    }
521
    set_iso_urb(s, ep, aurb);
522

    
523
    return aurb;
524
}
525

    
526
static void usb_host_stop_n_free_iso(USBHostDevice *s, uint8_t ep)
527
{
528
    AsyncURB *aurb;
529
    int i, ret, killed = 0, free = 1;
530

    
531
    aurb = get_iso_urb(s, ep);
532
    if (!aurb) {
533
        return;
534
    }
535

    
536
    for (i = 0; i < ISO_URB_COUNT; i++) {
537
        /* in flight? */
538
        if (aurb[i].iso_frame_idx == -1) {
539
            ret = ioctl(s->fd, USBDEVFS_DISCARDURB, &aurb[i]);
540
            if (ret < 0) {
541
                printf("husb: discard isoc in urb failed errno %d\n", errno);
542
                free = 0;
543
                continue;
544
            }
545
            killed++;
546
        }
547
    }
548

    
549
    /* Make sure any urbs we've killed are reaped before we free them */
550
    if (killed) {
551
        async_complete(s);
552
    }
553

    
554
    for (i = 0; i < ISO_URB_COUNT; i++) {
555
        qemu_free(aurb[i].urb.buffer);
556
    }
557

    
558
    if (free)
559
        qemu_free(aurb);
560
    else
561
        printf("husb: leaking iso urbs because of discard failure\n");
562
    set_iso_urb(s, ep, NULL);
563
    set_iso_urb_idx(s, ep, 0);
564
    clear_iso_started(s, ep);
565
}
566

    
567
static int urb_status_to_usb_ret(int status)
568
{
569
    switch (status) {
570
    case -EPIPE:
571
        return USB_RET_STALL;
572
    default:
573
        return USB_RET_NAK;
574
    }
575
}
576

    
577
static int usb_host_handle_iso_data(USBHostDevice *s, USBPacket *p, int in)
578
{
579
    AsyncURB *aurb;
580
    int i, j, ret, max_packet_size, offset, len = 0;
581

    
582
    max_packet_size = get_max_packet_size(s, p->devep);
583
    if (max_packet_size == 0)
584
        return USB_RET_NAK;
585

    
586
    aurb = get_iso_urb(s, p->devep);
587
    if (!aurb) {
588
        aurb = usb_host_alloc_iso(s, p->devep, in);
589
    }
590

    
591
    i = get_iso_urb_idx(s, p->devep);
592
    j = aurb[i].iso_frame_idx;
593
    if (j >= 0 && j < ISO_FRAME_DESC_PER_URB) {
594
        if (in) {
595
            /* Check urb status  */
596
            if (aurb[i].urb.status) {
597
                len = urb_status_to_usb_ret(aurb[i].urb.status);
598
                /* Move to the next urb */
599
                aurb[i].iso_frame_idx = ISO_FRAME_DESC_PER_URB - 1;
600
            /* Check frame status */
601
            } else if (aurb[i].urb.iso_frame_desc[j].status) {
602
                len = urb_status_to_usb_ret(
603
                                        aurb[i].urb.iso_frame_desc[j].status);
604
            /* Check the frame fits */
605
            } else if (aurb[i].urb.iso_frame_desc[j].actual_length > p->len) {
606
                printf("husb: received iso data is larger then packet\n");
607
                len = USB_RET_NAK;
608
            /* All good copy data over */
609
            } else {
610
                len = aurb[i].urb.iso_frame_desc[j].actual_length;
611
                memcpy(p->data,
612
                       aurb[i].urb.buffer +
613
                           j * aurb[i].urb.iso_frame_desc[0].length,
614
                       len);
615
            }
616
        } else {
617
            len = p->len;
618
            offset = (j == 0) ? 0 : get_iso_buffer_used(s, p->devep);
619

    
620
            /* Check the frame fits */
621
            if (len > max_packet_size) {
622
                printf("husb: send iso data is larger then max packet size\n");
623
                return USB_RET_NAK;
624
            }
625

    
626
            /* All good copy data over */
627
            memcpy(aurb[i].urb.buffer + offset, p->data, len);
628
            aurb[i].urb.iso_frame_desc[j].length = len;
629
            offset += len;
630
            set_iso_buffer_used(s, p->devep, offset);
631

    
632
            /* Start the stream once we have buffered enough data */
633
            if (!is_iso_started(s, p->devep) && i == 1 && j == 8) {
634
                set_iso_started(s, p->devep);
635
            }
636
        }
637
        aurb[i].iso_frame_idx++;
638
        if (aurb[i].iso_frame_idx == ISO_FRAME_DESC_PER_URB) {
639
            i = (i + 1) % ISO_URB_COUNT;
640
            set_iso_urb_idx(s, p->devep, i);
641
        }
642
    } else {
643
        if (in) {
644
            set_iso_started(s, p->devep);
645
        } else {
646
            DPRINTF("hubs: iso out error no free buffer, dropping packet\n");
647
        }
648
    }
649

    
650
    if (is_iso_started(s, p->devep)) {
651
        /* (Re)-submit all fully consumed / filled urbs */
652
        for (i = 0; i < ISO_URB_COUNT; i++) {
653
            if (aurb[i].iso_frame_idx == ISO_FRAME_DESC_PER_URB) {
654
                ret = ioctl(s->fd, USBDEVFS_SUBMITURB, &aurb[i]);
655
                if (ret < 0) {
656
                    printf("husb error submitting iso urb %d: %d\n", i, errno);
657
                    if (!in || len == 0) {
658
                        switch(errno) {
659
                        case ETIMEDOUT:
660
                            len = USB_RET_NAK;
661
                            break;
662
                        case EPIPE:
663
                        default:
664
                            len = USB_RET_STALL;
665
                        }
666
                    }
667
                    break;
668
                }
669
                aurb[i].iso_frame_idx = -1;
670
            }
671
        }
672
    }
673

    
674
    return len;
675
}
676

    
677
static int usb_host_handle_data(USBDevice *dev, USBPacket *p)
678
{
679
    USBHostDevice *s = DO_UPCAST(USBHostDevice, dev, dev);
680
    struct usbdevfs_urb *urb;
681
    AsyncURB *aurb;
682
    int ret, rem;
683
    uint8_t *pbuf;
684
    uint8_t ep;
685

    
686
    if (!is_valid(s, p->devep)) {
687
        return USB_RET_NAK;
688
    }
689

    
690
    if (p->pid == USB_TOKEN_IN) {
691
        ep = p->devep | 0x80;
692
    } else {
693
        ep = p->devep;
694
    }
695

    
696
    if (is_halted(s, p->devep)) {
697
        ret = ioctl(s->fd, USBDEVFS_CLEAR_HALT, &ep);
698
        if (ret < 0) {
699
            DPRINTF("husb: failed to clear halt. ep 0x%x errno %d\n",
700
                   ep, errno);
701
            return USB_RET_NAK;
702
        }
703
        clear_halt(s, p->devep);
704
    }
705

    
706
    if (is_isoc(s, p->devep)) {
707
        return usb_host_handle_iso_data(s, p, p->pid == USB_TOKEN_IN);
708
    }
709

    
710
    rem = p->len;
711
    pbuf = p->data;
712
    p->len = 0;
713
    while (rem) {
714
        aurb = async_alloc(s);
715
        aurb->packet = p;
716

    
717
        urb = &aurb->urb;
718
        urb->endpoint      = ep;
719
        urb->type          = USBDEVFS_URB_TYPE_BULK;
720
        urb->usercontext   = s;
721
        urb->buffer        = pbuf;
722

    
723
        if (rem > MAX_USBFS_BUFFER_SIZE) {
724
            urb->buffer_length = MAX_USBFS_BUFFER_SIZE;
725
            aurb->more         = 1;
726
        } else {
727
            urb->buffer_length = rem;
728
            aurb->more         = 0;
729
        }
730
        pbuf += urb->buffer_length;
731
        rem  -= urb->buffer_length;
732

    
733
        ret = ioctl(s->fd, USBDEVFS_SUBMITURB, urb);
734

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

    
738
        if (ret < 0) {
739
            DPRINTF("husb: submit failed. errno %d\n", errno);
740
            async_free(aurb);
741

    
742
            switch(errno) {
743
            case ETIMEDOUT:
744
                return USB_RET_NAK;
745
            case EPIPE:
746
            default:
747
                return USB_RET_STALL;
748
            }
749
        }
750
    }
751

    
752
    return USB_RET_ASYNC;
753
}
754

    
755
static int ctrl_error(void)
756
{
757
    if (errno == ETIMEDOUT) {
758
        return USB_RET_NAK;
759
    } else {
760
        return USB_RET_STALL;
761
    }
762
}
763

    
764
static int usb_host_set_address(USBHostDevice *s, int addr)
765
{
766
    DPRINTF("husb: ctrl set addr %u\n", addr);
767
    s->dev.addr = addr;
768
    return 0;
769
}
770

    
771
static int usb_host_set_config(USBHostDevice *s, int config)
772
{
773
    usb_host_release_interfaces(s);
774

    
775
    int ret = ioctl(s->fd, USBDEVFS_SETCONFIGURATION, &config);
776

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

    
779
    if (ret < 0) {
780
        return ctrl_error();
781
    }
782
    usb_host_claim_interfaces(s, config);
783
    return 0;
784
}
785

    
786
static int usb_host_set_interface(USBHostDevice *s, int iface, int alt)
787
{
788
    struct usbdevfs_setinterface si;
789
    int i, ret;
790

    
791
    for (i = 1; i <= MAX_ENDPOINTS; i++) {
792
        if (is_isoc(s, i)) {
793
            usb_host_stop_n_free_iso(s, i);
794
        }
795
    }
796

    
797
    si.interface  = iface;
798
    si.altsetting = alt;
799
    ret = ioctl(s->fd, USBDEVFS_SETINTERFACE, &si);
800

    
801
    DPRINTF("husb: ctrl set iface %d altset %d ret %d errno %d\n",
802
            iface, alt, ret, errno);
803

    
804
    if (ret < 0) {
805
        return ctrl_error();
806
    }
807
    usb_linux_update_endp_table(s);
808
    return 0;
809
}
810

    
811
static int usb_host_handle_control(USBDevice *dev, USBPacket *p,
812
               int request, int value, int index, int length, uint8_t *data)
813
{
814
    USBHostDevice *s = DO_UPCAST(USBHostDevice, dev, dev);
815
    struct usbdevfs_urb *urb;
816
    AsyncURB *aurb;
817
    int ret;
818

    
819
    /*
820
     * Process certain standard device requests.
821
     * These are infrequent and are processed synchronously.
822
     */
823

    
824
    /* Note request is (bRequestType << 8) | bRequest */
825
    DPRINTF("husb: ctrl type 0x%x req 0x%x val 0x%x index %u len %u\n",
826
            request >> 8, request & 0xff, value, index, length);
827

    
828
    switch (request) {
829
    case DeviceOutRequest | USB_REQ_SET_ADDRESS:
830
        return usb_host_set_address(s, value);
831

    
832
    case DeviceOutRequest | USB_REQ_SET_CONFIGURATION:
833
        return usb_host_set_config(s, value & 0xff);
834

    
835
    case InterfaceOutRequest | USB_REQ_SET_INTERFACE:
836
        return usb_host_set_interface(s, index, value);
837
    }
838

    
839
    /* The rest are asynchronous */
840

    
841
    if (length > sizeof(dev->data_buf)) {
842
        fprintf(stderr, "husb: ctrl buffer too small (%d > %zu)\n",
843
                length, sizeof(dev->data_buf));
844
        return USB_RET_STALL;
845
    }
846

    
847
    aurb = async_alloc(s);
848
    aurb->packet = p;
849

    
850
    /*
851
     * Setup ctrl transfer.
852
     *
853
     * s->ctrl is laid out such that data buffer immediately follows
854
     * 'req' struct which is exactly what usbdevfs expects.
855
     */
856
    urb = &aurb->urb;
857

    
858
    urb->type     = USBDEVFS_URB_TYPE_CONTROL;
859
    urb->endpoint = p->devep;
860

    
861
    urb->buffer        = &dev->setup_buf;
862
    urb->buffer_length = length + 8;
863

    
864
    urb->usercontext = s;
865

    
866
    ret = ioctl(s->fd, USBDEVFS_SUBMITURB, urb);
867

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

    
870
    if (ret < 0) {
871
        DPRINTF("husb: submit failed. errno %d\n", errno);
872
        async_free(aurb);
873

    
874
        switch(errno) {
875
        case ETIMEDOUT:
876
            return USB_RET_NAK;
877
        case EPIPE:
878
        default:
879
            return USB_RET_STALL;
880
        }
881
    }
882

    
883
    return USB_RET_ASYNC;
884
}
885

    
886
static int usb_linux_get_configuration(USBHostDevice *s)
887
{
888
    uint8_t configuration;
889
    struct usb_ctrltransfer ct;
890
    int ret;
891

    
892
    if (usb_fs_type == USB_FS_SYS) {
893
        char device_name[32], line[1024];
894
        int configuration;
895

    
896
        sprintf(device_name, "%d-%s", s->bus_num, s->port);
897

    
898
        if (!usb_host_read_file(line, sizeof(line), "bConfigurationValue",
899
                                device_name)) {
900
            goto usbdevfs;
901
        }
902
        if (sscanf(line, "%d", &configuration) != 1) {
903
            goto usbdevfs;
904
        }
905
        return configuration;
906
    }
907

    
908
usbdevfs:
909
    ct.bRequestType = USB_DIR_IN;
910
    ct.bRequest = USB_REQ_GET_CONFIGURATION;
911
    ct.wValue = 0;
912
    ct.wIndex = 0;
913
    ct.wLength = 1;
914
    ct.data = &configuration;
915
    ct.timeout = 50;
916

    
917
    ret = ioctl(s->fd, USBDEVFS_CONTROL, &ct);
918
    if (ret < 0) {
919
        perror("usb_linux_get_configuration");
920
        return -1;
921
    }
922

    
923
    /* in address state */
924
    if (configuration == 0) {
925
        return -1;
926
    }
927

    
928
    return configuration;
929
}
930

    
931
static uint8_t usb_linux_get_alt_setting(USBHostDevice *s,
932
    uint8_t configuration, uint8_t interface)
933
{
934
    uint8_t alt_setting;
935
    struct usb_ctrltransfer ct;
936
    int ret;
937

    
938
    if (usb_fs_type == USB_FS_SYS) {
939
        char device_name[64], line[1024];
940
        int alt_setting;
941

    
942
        sprintf(device_name, "%d-%s:%d.%d", s->bus_num, s->port,
943
                (int)configuration, (int)interface);
944

    
945
        if (!usb_host_read_file(line, sizeof(line), "bAlternateSetting",
946
                                device_name)) {
947
            goto usbdevfs;
948
        }
949
        if (sscanf(line, "%d", &alt_setting) != 1) {
950
            goto usbdevfs;
951
        }
952
        return alt_setting;
953
    }
954

    
955
usbdevfs:
956
    ct.bRequestType = USB_DIR_IN | USB_RECIP_INTERFACE;
957
    ct.bRequest = USB_REQ_GET_INTERFACE;
958
    ct.wValue = 0;
959
    ct.wIndex = interface;
960
    ct.wLength = 1;
961
    ct.data = &alt_setting;
962
    ct.timeout = 50;
963
    ret = ioctl(s->fd, USBDEVFS_CONTROL, &ct);
964
    if (ret < 0) {
965
        /* Assume alt 0 on error */
966
        return 0;
967
    }
968

    
969
    return alt_setting;
970
}
971

    
972
/* returns 1 on problem encountered or 0 for success */
973
static int usb_linux_update_endp_table(USBHostDevice *s)
974
{
975
    uint8_t *descriptors;
976
    uint8_t devep, type, configuration, alt_interface;
977
    int interface, length, i;
978

    
979
    for (i = 0; i < MAX_ENDPOINTS; i++)
980
        s->endp_table[i].type = INVALID_EP_TYPE;
981

    
982
    i = usb_linux_get_configuration(s);
983
    if (i < 0)
984
        return 1;
985
    configuration = i;
986

    
987
    /* get the desired configuration, interface, and endpoint descriptors
988
     * from device description */
989
    descriptors = &s->descr[18];
990
    length = s->descr_len - 18;
991
    i = 0;
992

    
993
    if (descriptors[i + 1] != USB_DT_CONFIG ||
994
        descriptors[i + 5] != configuration) {
995
        DPRINTF("invalid descriptor data - configuration\n");
996
        return 1;
997
    }
998
    i += descriptors[i];
999

    
1000
    while (i < length) {
1001
        if (descriptors[i + 1] != USB_DT_INTERFACE ||
1002
            (descriptors[i + 1] == USB_DT_INTERFACE &&
1003
             descriptors[i + 4] == 0)) {
1004
            i += descriptors[i];
1005
            continue;
1006
        }
1007

    
1008
        interface = descriptors[i + 2];
1009
        alt_interface = usb_linux_get_alt_setting(s, configuration, interface);
1010

    
1011
        /* the current interface descriptor is the active interface
1012
         * and has endpoints */
1013
        if (descriptors[i + 3] != alt_interface) {
1014
            i += descriptors[i];
1015
            continue;
1016
        }
1017

    
1018
        /* advance to the endpoints */
1019
        while (i < length && descriptors[i +1] != USB_DT_ENDPOINT) {
1020
            i += descriptors[i];
1021
        }
1022

    
1023
        if (i >= length)
1024
            break;
1025

    
1026
        while (i < length) {
1027
            if (descriptors[i + 1] != USB_DT_ENDPOINT) {
1028
                break;
1029
            }
1030

    
1031
            devep = descriptors[i + 2];
1032
            switch (descriptors[i + 3] & 0x3) {
1033
            case 0x00:
1034
                type = USBDEVFS_URB_TYPE_CONTROL;
1035
                break;
1036
            case 0x01:
1037
                type = USBDEVFS_URB_TYPE_ISO;
1038
                set_max_packet_size(s, (devep & 0xf), descriptors + i);
1039
                break;
1040
            case 0x02:
1041
                type = USBDEVFS_URB_TYPE_BULK;
1042
                break;
1043
            case 0x03:
1044
                type = USBDEVFS_URB_TYPE_INTERRUPT;
1045
                break;
1046
            default:
1047
                DPRINTF("usb_host: malformed endpoint type\n");
1048
                type = USBDEVFS_URB_TYPE_BULK;
1049
            }
1050
            s->endp_table[(devep & 0xf) - 1].type = type;
1051
            s->endp_table[(devep & 0xf) - 1].halted = 0;
1052

    
1053
            i += descriptors[i];
1054
        }
1055
    }
1056
    return 0;
1057
}
1058

    
1059
static int usb_host_open(USBHostDevice *dev, int bus_num,
1060
                        int addr, char *port, const char *prod_name, int speed)
1061
{
1062
    int fd = -1, ret;
1063
    char buf[1024];
1064

    
1065
    if (dev->fd != -1) {
1066
        goto fail;
1067
    }
1068
    printf("husb: open device %d.%d\n", bus_num, addr);
1069

    
1070
    if (!usb_host_device_path) {
1071
        perror("husb: USB Host Device Path not set");
1072
        goto fail;
1073
    }
1074
    snprintf(buf, sizeof(buf), "%s/%03d/%03d", usb_host_device_path,
1075
             bus_num, addr);
1076
    fd = open(buf, O_RDWR | O_NONBLOCK);
1077
    if (fd < 0) {
1078
        perror(buf);
1079
        goto fail;
1080
    }
1081
    DPRINTF("husb: opened %s\n", buf);
1082

    
1083
    dev->bus_num = bus_num;
1084
    dev->addr = addr;
1085
    strcpy(dev->port, port);
1086
    dev->fd = fd;
1087

    
1088
    /* read the device description */
1089
    dev->descr_len = read(fd, dev->descr, sizeof(dev->descr));
1090
    if (dev->descr_len <= 0) {
1091
        perror("husb: reading device data failed");
1092
        goto fail;
1093
    }
1094

    
1095
#ifdef DEBUG
1096
    {
1097
        int x;
1098
        printf("=== begin dumping device descriptor data ===\n");
1099
        for (x = 0; x < dev->descr_len; x++) {
1100
            printf("%02x ", dev->descr[x]);
1101
        }
1102
        printf("\n=== end dumping device descriptor data ===\n");
1103
    }
1104
#endif
1105

    
1106

    
1107
    /*
1108
     * Initial configuration is -1 which makes us claim first
1109
     * available config. We used to start with 1, which does not
1110
     * always work. I've seen devices where first config starts
1111
     * with 2.
1112
     */
1113
    if (!usb_host_claim_interfaces(dev, -1)) {
1114
        goto fail;
1115
    }
1116

    
1117
    ret = usb_linux_update_endp_table(dev);
1118
    if (ret) {
1119
        goto fail;
1120
    }
1121

    
1122
    if (speed == -1) {
1123
        struct usbdevfs_connectinfo ci;
1124

    
1125
        ret = ioctl(fd, USBDEVFS_CONNECTINFO, &ci);
1126
        if (ret < 0) {
1127
            perror("usb_host_device_open: USBDEVFS_CONNECTINFO");
1128
            goto fail;
1129
        }
1130

    
1131
        if (ci.slow) {
1132
            speed = USB_SPEED_LOW;
1133
        } else {
1134
            speed = USB_SPEED_HIGH;
1135
        }
1136
    }
1137
    dev->dev.speed = speed;
1138

    
1139
    printf("husb: grabbed usb device %d.%d\n", bus_num, addr);
1140

    
1141
    if (!prod_name || prod_name[0] == '\0') {
1142
        snprintf(dev->dev.product_desc, sizeof(dev->dev.product_desc),
1143
                 "host:%d.%d", bus_num, addr);
1144
    } else {
1145
        pstrcpy(dev->dev.product_desc, sizeof(dev->dev.product_desc),
1146
                prod_name);
1147
    }
1148

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

    
1152
    usb_device_attach(&dev->dev);
1153
    return 0;
1154

    
1155
fail:
1156
    dev->fd = -1;
1157
    if (fd != -1) {
1158
        close(fd);
1159
    }
1160
    return -1;
1161
}
1162

    
1163
static int usb_host_close(USBHostDevice *dev)
1164
{
1165
    int i;
1166

    
1167
    if (dev->fd == -1) {
1168
        return -1;
1169
    }
1170

    
1171
    qemu_set_fd_handler(dev->fd, NULL, NULL, NULL);
1172
    dev->closing = 1;
1173
    for (i = 1; i <= MAX_ENDPOINTS; i++) {
1174
        if (is_isoc(dev, i)) {
1175
            usb_host_stop_n_free_iso(dev, i);
1176
        }
1177
    }
1178
    async_complete(dev);
1179
    dev->closing = 0;
1180
    usb_device_detach(&dev->dev);
1181
    ioctl(dev->fd, USBDEVFS_RESET);
1182
    close(dev->fd);
1183
    dev->fd = -1;
1184
    return 0;
1185
}
1186

    
1187
static void usb_host_exit_notifier(struct Notifier* n)
1188
{
1189
    USBHostDevice *s = container_of(n, USBHostDevice, exit);
1190

    
1191
    if (s->fd != -1) {
1192
        ioctl(s->fd, USBDEVFS_RESET);
1193
    }
1194
}
1195

    
1196
static int usb_host_initfn(USBDevice *dev)
1197
{
1198
    USBHostDevice *s = DO_UPCAST(USBHostDevice, dev, dev);
1199

    
1200
    dev->auto_attach = 0;
1201
    s->fd = -1;
1202
    QTAILQ_INSERT_TAIL(&hostdevs, s, next);
1203
    s->exit.notify = usb_host_exit_notifier;
1204
    qemu_add_exit_notifier(&s->exit);
1205
    usb_host_auto_check(NULL);
1206
    return 0;
1207
}
1208

    
1209
static struct USBDeviceInfo usb_host_dev_info = {
1210
    .product_desc   = "USB Host Device",
1211
    .qdev.name      = "usb-host",
1212
    .qdev.size      = sizeof(USBHostDevice),
1213
    .init           = usb_host_initfn,
1214
    .handle_packet  = usb_generic_handle_packet,
1215
    .cancel_packet  = usb_host_async_cancel,
1216
    .handle_data    = usb_host_handle_data,
1217
    .handle_control = usb_host_handle_control,
1218
    .handle_reset   = usb_host_handle_reset,
1219
    .handle_destroy = usb_host_handle_destroy,
1220
    .usbdevice_name = "host",
1221
    .usbdevice_init = usb_host_device_open,
1222
    .qdev.props     = (Property[]) {
1223
        DEFINE_PROP_UINT32("hostbus",  USBHostDevice, match.bus_num,    0),
1224
        DEFINE_PROP_UINT32("hostaddr", USBHostDevice, match.addr,       0),
1225
        DEFINE_PROP_STRING("hostport", USBHostDevice, match.port),
1226
        DEFINE_PROP_HEX32("vendorid",  USBHostDevice, match.vendor_id,  0),
1227
        DEFINE_PROP_HEX32("productid", USBHostDevice, match.product_id, 0),
1228
        DEFINE_PROP_END_OF_LIST(),
1229
    },
1230
};
1231

    
1232
static void usb_host_register_devices(void)
1233
{
1234
    usb_qdev_register(&usb_host_dev_info);
1235
}
1236
device_init(usb_host_register_devices)
1237

    
1238
USBDevice *usb_host_device_open(const char *devname)
1239
{
1240
    struct USBAutoFilter filter;
1241
    USBDevice *dev;
1242
    char *p;
1243

    
1244
    dev = usb_create(NULL /* FIXME */, "usb-host");
1245

    
1246
    if (strstr(devname, "auto:")) {
1247
        if (parse_filter(devname, &filter) < 0) {
1248
            goto fail;
1249
        }
1250
    } else {
1251
        if ((p = strchr(devname, '.'))) {
1252
            filter.bus_num    = strtoul(devname, NULL, 0);
1253
            filter.addr       = strtoul(p + 1, NULL, 0);
1254
            filter.vendor_id  = 0;
1255
            filter.product_id = 0;
1256
        } else if ((p = strchr(devname, ':'))) {
1257
            filter.bus_num    = 0;
1258
            filter.addr       = 0;
1259
            filter.vendor_id  = strtoul(devname, NULL, 16);
1260
            filter.product_id = strtoul(p + 1, NULL, 16);
1261
        } else {
1262
            goto fail;
1263
        }
1264
    }
1265

    
1266
    qdev_prop_set_uint32(&dev->qdev, "hostbus",   filter.bus_num);
1267
    qdev_prop_set_uint32(&dev->qdev, "hostaddr",  filter.addr);
1268
    qdev_prop_set_uint32(&dev->qdev, "vendorid",  filter.vendor_id);
1269
    qdev_prop_set_uint32(&dev->qdev, "productid", filter.product_id);
1270
    qdev_init_nofail(&dev->qdev);
1271
    return dev;
1272

    
1273
fail:
1274
    qdev_free(&dev->qdev);
1275
    return NULL;
1276
}
1277

    
1278
int usb_host_device_close(const char *devname)
1279
{
1280
#if 0
1281
    char product_name[PRODUCT_NAME_SZ];
1282
    int bus_num, addr;
1283
    USBHostDevice *s;
1284

1285
    if (strstr(devname, "auto:")) {
1286
        return usb_host_auto_del(devname);
1287
    }
1288
    if (usb_host_find_device(&bus_num, &addr, product_name,
1289
                                    sizeof(product_name), devname) < 0) {
1290
        return -1;
1291
    }
1292
    s = hostdev_find(bus_num, addr);
1293
    if (s) {
1294
        usb_device_delete_addr(s->bus_num, s->dev.addr);
1295
        return 0;
1296
    }
1297
#endif
1298

    
1299
    return -1;
1300
}
1301

    
1302
static int get_tag_value(char *buf, int buf_size,
1303
                         const char *str, const char *tag,
1304
                         const char *stopchars)
1305
{
1306
    const char *p;
1307
    char *q;
1308
    p = strstr(str, tag);
1309
    if (!p) {
1310
        return -1;
1311
    }
1312
    p += strlen(tag);
1313
    while (qemu_isspace(*p)) {
1314
        p++;
1315
    }
1316
    q = buf;
1317
    while (*p != '\0' && !strchr(stopchars, *p)) {
1318
        if ((q - buf) < (buf_size - 1)) {
1319
            *q++ = *p;
1320
        }
1321
        p++;
1322
    }
1323
    *q = '\0';
1324
    return q - buf;
1325
}
1326

    
1327
/*
1328
 * Use /proc/bus/usb/devices or /dev/bus/usb/devices file to determine
1329
 * host's USB devices. This is legacy support since many distributions
1330
 * are moving to /sys/bus/usb
1331
 */
1332
static int usb_host_scan_dev(void *opaque, USBScanFunc *func)
1333
{
1334
    FILE *f = NULL;
1335
    char line[1024];
1336
    char buf[1024];
1337
    int bus_num, addr, speed, device_count, class_id, product_id, vendor_id;
1338
    char product_name[512];
1339
    int ret = 0;
1340

    
1341
    if (!usb_host_device_path) {
1342
        perror("husb: USB Host Device Path not set");
1343
        goto the_end;
1344
    }
1345
    snprintf(line, sizeof(line), "%s/devices", usb_host_device_path);
1346
    f = fopen(line, "r");
1347
    if (!f) {
1348
        perror("husb: cannot open devices file");
1349
        goto the_end;
1350
    }
1351

    
1352
    device_count = 0;
1353
    bus_num = addr = class_id = product_id = vendor_id = 0;
1354
    speed = -1; /* Can't get the speed from /[proc|dev]/bus/usb/devices */
1355
    for(;;) {
1356
        if (fgets(line, sizeof(line), f) == NULL) {
1357
            break;
1358
        }
1359
        if (strlen(line) > 0) {
1360
            line[strlen(line) - 1] = '\0';
1361
        }
1362
        if (line[0] == 'T' && line[1] == ':') {
1363
            if (device_count && (vendor_id || product_id)) {
1364
                /* New device.  Add the previously discovered device.  */
1365
                ret = func(opaque, bus_num, addr, 0, class_id, vendor_id,
1366
                           product_id, product_name, speed);
1367
                if (ret) {
1368
                    goto the_end;
1369
                }
1370
            }
1371
            if (get_tag_value(buf, sizeof(buf), line, "Bus=", " ") < 0) {
1372
                goto fail;
1373
            }
1374
            bus_num = atoi(buf);
1375
            if (get_tag_value(buf, sizeof(buf), line, "Dev#=", " ") < 0) {
1376
                goto fail;
1377
            }
1378
            addr = atoi(buf);
1379
            if (get_tag_value(buf, sizeof(buf), line, "Spd=", " ") < 0) {
1380
                goto fail;
1381
            }
1382
            if (!strcmp(buf, "5000")) {
1383
                speed = USB_SPEED_SUPER;
1384
            } else if (!strcmp(buf, "480")) {
1385
                speed = USB_SPEED_HIGH;
1386
            } else if (!strcmp(buf, "1.5")) {
1387
                speed = USB_SPEED_LOW;
1388
            } else {
1389
                speed = USB_SPEED_FULL;
1390
            }
1391
            product_name[0] = '\0';
1392
            class_id = 0xff;
1393
            device_count++;
1394
            product_id = 0;
1395
            vendor_id = 0;
1396
        } else if (line[0] == 'P' && line[1] == ':') {
1397
            if (get_tag_value(buf, sizeof(buf), line, "Vendor=", " ") < 0) {
1398
                goto fail;
1399
            }
1400
            vendor_id = strtoul(buf, NULL, 16);
1401
            if (get_tag_value(buf, sizeof(buf), line, "ProdID=", " ") < 0) {
1402
                goto fail;
1403
            }
1404
            product_id = strtoul(buf, NULL, 16);
1405
        } else if (line[0] == 'S' && line[1] == ':') {
1406
            if (get_tag_value(buf, sizeof(buf), line, "Product=", "") < 0) {
1407
                goto fail;
1408
            }
1409
            pstrcpy(product_name, sizeof(product_name), buf);
1410
        } else if (line[0] == 'D' && line[1] == ':') {
1411
            if (get_tag_value(buf, sizeof(buf), line, "Cls=", " (") < 0) {
1412
                goto fail;
1413
            }
1414
            class_id = strtoul(buf, NULL, 16);
1415
        }
1416
    fail: ;
1417
    }
1418
    if (device_count && (vendor_id || product_id)) {
1419
        /* Add the last device.  */
1420
        ret = func(opaque, bus_num, addr, 0, class_id, vendor_id,
1421
                   product_id, product_name, speed);
1422
    }
1423
 the_end:
1424
    if (f) {
1425
        fclose(f);
1426
    }
1427
    return ret;
1428
}
1429

    
1430
/*
1431
 * Read sys file-system device file
1432
 *
1433
 * @line address of buffer to put file contents in
1434
 * @line_size size of line
1435
 * @device_file path to device file (printf format string)
1436
 * @device_name device being opened (inserted into device_file)
1437
 *
1438
 * @return 0 failed, 1 succeeded ('line' contains data)
1439
 */
1440
static int usb_host_read_file(char *line, size_t line_size,
1441
                              const char *device_file, const char *device_name)
1442
{
1443
    FILE *f;
1444
    int ret = 0;
1445
    char filename[PATH_MAX];
1446

    
1447
    snprintf(filename, PATH_MAX, USBSYSBUS_PATH "/devices/%s/%s", device_name,
1448
             device_file);
1449
    f = fopen(filename, "r");
1450
    if (f) {
1451
        ret = fgets(line, line_size, f) != NULL;
1452
        fclose(f);
1453
    }
1454

    
1455
    return ret;
1456
}
1457

    
1458
/*
1459
 * Use /sys/bus/usb/devices/ directory to determine host's USB
1460
 * devices.
1461
 *
1462
 * This code is based on Robert Schiele's original patches posted to
1463
 * the Novell bug-tracker https://bugzilla.novell.com/show_bug.cgi?id=241950
1464
 */
1465
static int usb_host_scan_sys(void *opaque, USBScanFunc *func)
1466
{
1467
    DIR *dir = NULL;
1468
    char line[1024];
1469
    int bus_num, addr, speed, class_id, product_id, vendor_id;
1470
    int ret = 0;
1471
    char port[MAX_PORTLEN];
1472
    char product_name[512];
1473
    struct dirent *de;
1474

    
1475
    dir = opendir(USBSYSBUS_PATH "/devices");
1476
    if (!dir) {
1477
        perror("husb: cannot open devices directory");
1478
        goto the_end;
1479
    }
1480

    
1481
    while ((de = readdir(dir))) {
1482
        if (de->d_name[0] != '.' && !strchr(de->d_name, ':')) {
1483
            if (sscanf(de->d_name, "%d-%7[0-9.]", &bus_num, port) < 2) {
1484
                continue;
1485
            }
1486

    
1487
            if (!usb_host_read_file(line, sizeof(line), "devnum", de->d_name)) {
1488
                goto the_end;
1489
            }
1490
            if (sscanf(line, "%d", &addr) != 1) {
1491
                goto the_end;
1492
            }
1493
            if (!usb_host_read_file(line, sizeof(line), "bDeviceClass",
1494
                                    de->d_name)) {
1495
                goto the_end;
1496
            }
1497
            if (sscanf(line, "%x", &class_id) != 1) {
1498
                goto the_end;
1499
            }
1500

    
1501
            if (!usb_host_read_file(line, sizeof(line), "idVendor",
1502
                                    de->d_name)) {
1503
                goto the_end;
1504
            }
1505
            if (sscanf(line, "%x", &vendor_id) != 1) {
1506
                goto the_end;
1507
            }
1508
            if (!usb_host_read_file(line, sizeof(line), "idProduct",
1509
                                    de->d_name)) {
1510
                goto the_end;
1511
            }
1512
            if (sscanf(line, "%x", &product_id) != 1) {
1513
                goto the_end;
1514
            }
1515
            if (!usb_host_read_file(line, sizeof(line), "product",
1516
                                    de->d_name)) {
1517
                *product_name = 0;
1518
            } else {
1519
                if (strlen(line) > 0) {
1520
                    line[strlen(line) - 1] = '\0';
1521
                }
1522
                pstrcpy(product_name, sizeof(product_name), line);
1523
            }
1524

    
1525
            if (!usb_host_read_file(line, sizeof(line), "speed", de->d_name)) {
1526
                goto the_end;
1527
            }
1528
            if (!strcmp(line, "5000\n")) {
1529
                speed = USB_SPEED_SUPER;
1530
            } else if (!strcmp(line, "480\n")) {
1531
                speed = USB_SPEED_HIGH;
1532
            } else if (!strcmp(line, "1.5\n")) {
1533
                speed = USB_SPEED_LOW;
1534
            } else {
1535
                speed = USB_SPEED_FULL;
1536
            }
1537

    
1538
            ret = func(opaque, bus_num, addr, port, class_id, vendor_id,
1539
                       product_id, product_name, speed);
1540
            if (ret) {
1541
                goto the_end;
1542
            }
1543
        }
1544
    }
1545
 the_end:
1546
    if (dir) {
1547
        closedir(dir);
1548
    }
1549
    return ret;
1550
}
1551

    
1552
/*
1553
 * Determine how to access the host's USB devices and call the
1554
 * specific support function.
1555
 */
1556
static int usb_host_scan(void *opaque, USBScanFunc *func)
1557
{
1558
    Monitor *mon = cur_mon;
1559
    FILE *f = NULL;
1560
    DIR *dir = NULL;
1561
    int ret = 0;
1562
    const char *fs_type[] = {"unknown", "proc", "dev", "sys"};
1563
    char devpath[PATH_MAX];
1564

    
1565
    /* only check the host once */
1566
    if (!usb_fs_type) {
1567
        dir = opendir(USBSYSBUS_PATH "/devices");
1568
        if (dir) {
1569
            /* devices found in /dev/bus/usb/ (yes - not a mistake!) */
1570
            strcpy(devpath, USBDEVBUS_PATH);
1571
            usb_fs_type = USB_FS_SYS;
1572
            closedir(dir);
1573
            DPRINTF(USBDBG_DEVOPENED, USBSYSBUS_PATH);
1574
            goto found_devices;
1575
        }
1576
        f = fopen(USBPROCBUS_PATH "/devices", "r");
1577
        if (f) {
1578
            /* devices found in /proc/bus/usb/ */
1579
            strcpy(devpath, USBPROCBUS_PATH);
1580
            usb_fs_type = USB_FS_PROC;
1581
            fclose(f);
1582
            DPRINTF(USBDBG_DEVOPENED, USBPROCBUS_PATH);
1583
            goto found_devices;
1584
        }
1585
        /* try additional methods if an access method hasn't been found yet */
1586
        f = fopen(USBDEVBUS_PATH "/devices", "r");
1587
        if (f) {
1588
            /* devices found in /dev/bus/usb/ */
1589
            strcpy(devpath, USBDEVBUS_PATH);
1590
            usb_fs_type = USB_FS_DEV;
1591
            fclose(f);
1592
            DPRINTF(USBDBG_DEVOPENED, USBDEVBUS_PATH);
1593
            goto found_devices;
1594
        }
1595
    found_devices:
1596
        if (!usb_fs_type) {
1597
            if (mon) {
1598
                monitor_printf(mon, "husb: unable to access USB devices\n");
1599
            }
1600
            return -ENOENT;
1601
        }
1602

    
1603
        /* the module setting (used later for opening devices) */
1604
        usb_host_device_path = qemu_mallocz(strlen(devpath)+1);
1605
        strcpy(usb_host_device_path, devpath);
1606
        if (mon) {
1607
            monitor_printf(mon, "husb: using %s file-system with %s\n",
1608
                           fs_type[usb_fs_type], usb_host_device_path);
1609
        }
1610
    }
1611

    
1612
    switch (usb_fs_type) {
1613
    case USB_FS_PROC:
1614
    case USB_FS_DEV:
1615
        ret = usb_host_scan_dev(opaque, func);
1616
        break;
1617
    case USB_FS_SYS:
1618
        ret = usb_host_scan_sys(opaque, func);
1619
        break;
1620
    default:
1621
        ret = -EINVAL;
1622
        break;
1623
    }
1624
    return ret;
1625
}
1626

    
1627
static QEMUTimer *usb_auto_timer;
1628

    
1629
static int usb_host_auto_scan(void *opaque, int bus_num, int addr, char *port,
1630
                              int class_id, int vendor_id, int product_id,
1631
                              const char *product_name, int speed)
1632
{
1633
    struct USBAutoFilter *f;
1634
    struct USBHostDevice *s;
1635

    
1636
    /* Ignore hubs */
1637
    if (class_id == 9)
1638
        return 0;
1639

    
1640
    QTAILQ_FOREACH(s, &hostdevs, next) {
1641
        f = &s->match;
1642

    
1643
        if (f->bus_num > 0 && f->bus_num != bus_num) {
1644
            continue;
1645
        }
1646
        if (f->addr > 0 && f->addr != addr) {
1647
            continue;
1648
        }
1649
        if (f->port != NULL && (port == NULL || strcmp(f->port, port) != 0)) {
1650
            continue;
1651
        }
1652

    
1653
        if (f->vendor_id > 0 && f->vendor_id != vendor_id) {
1654
            continue;
1655
        }
1656

    
1657
        if (f->product_id > 0 && f->product_id != product_id) {
1658
            continue;
1659
        }
1660
        /* We got a match */
1661

    
1662
        /* Already attached ? */
1663
        if (s->fd != -1) {
1664
            return 0;
1665
        }
1666
        DPRINTF("husb: auto open: bus_num %d addr %d\n", bus_num, addr);
1667

    
1668
        usb_host_open(s, bus_num, addr, port, product_name, speed);
1669
    }
1670

    
1671
    return 0;
1672
}
1673

    
1674
static void usb_host_auto_check(void *unused)
1675
{
1676
    struct USBHostDevice *s;
1677
    int unconnected = 0;
1678

    
1679
    usb_host_scan(NULL, usb_host_auto_scan);
1680

    
1681
    QTAILQ_FOREACH(s, &hostdevs, next) {
1682
        if (s->fd == -1) {
1683
            unconnected++;
1684
        }
1685
    }
1686

    
1687
    if (unconnected == 0) {
1688
        /* nothing to watch */
1689
        if (usb_auto_timer) {
1690
            qemu_del_timer(usb_auto_timer);
1691
        }
1692
        return;
1693
    }
1694

    
1695
    if (!usb_auto_timer) {
1696
        usb_auto_timer = qemu_new_timer_ms(rt_clock, usb_host_auto_check, NULL);
1697
        if (!usb_auto_timer) {
1698
            return;
1699
        }
1700
    }
1701
    qemu_mod_timer(usb_auto_timer, qemu_get_clock_ms(rt_clock) + 2000);
1702
}
1703

    
1704
/*
1705
 * Autoconnect filter
1706
 * Format:
1707
 *    auto:bus:dev[:vid:pid]
1708
 *    auto:bus.dev[:vid:pid]
1709
 *
1710
 *    bus  - bus number    (dec, * means any)
1711
 *    dev  - device number (dec, * means any)
1712
 *    vid  - vendor id     (hex, * means any)
1713
 *    pid  - product id    (hex, * means any)
1714
 *
1715
 *    See 'lsusb' output.
1716
 */
1717
static int parse_filter(const char *spec, struct USBAutoFilter *f)
1718
{
1719
    enum { BUS, DEV, VID, PID, DONE };
1720
    const char *p = spec;
1721
    int i;
1722

    
1723
    f->bus_num    = 0;
1724
    f->addr       = 0;
1725
    f->vendor_id  = 0;
1726
    f->product_id = 0;
1727

    
1728
    for (i = BUS; i < DONE; i++) {
1729
        p = strpbrk(p, ":.");
1730
        if (!p) {
1731
            break;
1732
        }
1733
        p++;
1734

    
1735
        if (*p == '*') {
1736
            continue;
1737
        }
1738
        switch(i) {
1739
        case BUS: f->bus_num = strtol(p, NULL, 10);    break;
1740
        case DEV: f->addr    = strtol(p, NULL, 10);    break;
1741
        case VID: f->vendor_id  = strtol(p, NULL, 16); break;
1742
        case PID: f->product_id = strtol(p, NULL, 16); break;
1743
        }
1744
    }
1745

    
1746
    if (i < DEV) {
1747
        fprintf(stderr, "husb: invalid auto filter spec %s\n", spec);
1748
        return -1;
1749
    }
1750

    
1751
    return 0;
1752
}
1753

    
1754
/**********************/
1755
/* USB host device info */
1756

    
1757
struct usb_class_info {
1758
    int class;
1759
    const char *class_name;
1760
};
1761

    
1762
static const struct usb_class_info usb_class_info[] = {
1763
    { USB_CLASS_AUDIO, "Audio"},
1764
    { USB_CLASS_COMM, "Communication"},
1765
    { USB_CLASS_HID, "HID"},
1766
    { USB_CLASS_HUB, "Hub" },
1767
    { USB_CLASS_PHYSICAL, "Physical" },
1768
    { USB_CLASS_PRINTER, "Printer" },
1769
    { USB_CLASS_MASS_STORAGE, "Storage" },
1770
    { USB_CLASS_CDC_DATA, "Data" },
1771
    { USB_CLASS_APP_SPEC, "Application Specific" },
1772
    { USB_CLASS_VENDOR_SPEC, "Vendor Specific" },
1773
    { USB_CLASS_STILL_IMAGE, "Still Image" },
1774
    { USB_CLASS_CSCID, "Smart Card" },
1775
    { USB_CLASS_CONTENT_SEC, "Content Security" },
1776
    { -1, NULL }
1777
};
1778

    
1779
static const char *usb_class_str(uint8_t class)
1780
{
1781
    const struct usb_class_info *p;
1782
    for(p = usb_class_info; p->class != -1; p++) {
1783
        if (p->class == class) {
1784
            break;
1785
        }
1786
    }
1787
    return p->class_name;
1788
}
1789

    
1790
static void usb_info_device(Monitor *mon, int bus_num, int addr, char *port,
1791
                            int class_id, int vendor_id, int product_id,
1792
                            const char *product_name,
1793
                            int speed)
1794
{
1795
    const char *class_str, *speed_str;
1796

    
1797
    switch(speed) {
1798
    case USB_SPEED_LOW:
1799
        speed_str = "1.5";
1800
        break;
1801
    case USB_SPEED_FULL:
1802
        speed_str = "12";
1803
        break;
1804
    case USB_SPEED_HIGH:
1805
        speed_str = "480";
1806
        break;
1807
    case USB_SPEED_SUPER:
1808
        speed_str = "5000";
1809
        break;
1810
    default:
1811
        speed_str = "?";
1812
        break;
1813
    }
1814

    
1815
    monitor_printf(mon, "  Bus %d, Addr %d, Port %s, Speed %s Mb/s\n",
1816
                   bus_num, addr, port, speed_str);
1817
    class_str = usb_class_str(class_id);
1818
    if (class_str) {
1819
        monitor_printf(mon, "    %s:", class_str);
1820
    } else {
1821
        monitor_printf(mon, "    Class %02x:", class_id);
1822
    }
1823
    monitor_printf(mon, " USB device %04x:%04x", vendor_id, product_id);
1824
    if (product_name[0] != '\0') {
1825
        monitor_printf(mon, ", %s", product_name);
1826
    }
1827
    monitor_printf(mon, "\n");
1828
}
1829

    
1830
static int usb_host_info_device(void *opaque, int bus_num, int addr,
1831
                                char *path, int class_id,
1832
                                int vendor_id, int product_id,
1833
                                const char *product_name,
1834
                                int speed)
1835
{
1836
    Monitor *mon = opaque;
1837

    
1838
    usb_info_device(mon, bus_num, addr, path, class_id, vendor_id, product_id,
1839
                    product_name, speed);
1840
    return 0;
1841
}
1842

    
1843
static void dec2str(int val, char *str, size_t size)
1844
{
1845
    if (val == 0) {
1846
        snprintf(str, size, "*");
1847
    } else {
1848
        snprintf(str, size, "%d", val);
1849
    }
1850
}
1851

    
1852
static void hex2str(int val, char *str, size_t size)
1853
{
1854
    if (val == 0) {
1855
        snprintf(str, size, "*");
1856
    } else {
1857
        snprintf(str, size, "%04x", val);
1858
    }
1859
}
1860

    
1861
void usb_host_info(Monitor *mon)
1862
{
1863
    struct USBAutoFilter *f;
1864
    struct USBHostDevice *s;
1865

    
1866
    usb_host_scan(mon, usb_host_info_device);
1867

    
1868
    if (QTAILQ_EMPTY(&hostdevs)) {
1869
        return;
1870
    }
1871

    
1872
    monitor_printf(mon, "  Auto filters:\n");
1873
    QTAILQ_FOREACH(s, &hostdevs, next) {
1874
        char bus[10], addr[10], vid[10], pid[10];
1875
        f = &s->match;
1876
        dec2str(f->bus_num, bus, sizeof(bus));
1877
        dec2str(f->addr, addr, sizeof(addr));
1878
        hex2str(f->vendor_id, vid, sizeof(vid));
1879
        hex2str(f->product_id, pid, sizeof(pid));
1880
        monitor_printf(mon, "    Bus %s, Addr %s, Port %s, ID %s:%s\n",
1881
                       bus, addr, f->port ? f->port : "*", vid, pid);
1882
    }
1883
}