Statistics
| Branch: | Revision:

root / usb-linux.c @ 6dfcdccb

History | View | Annotate | Download (50.2 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
#include <signal.h>
41

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

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

    
57
typedef int USBScanFunc(void *opaque, int bus_num, int addr, 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 ISO_URB_COUNT 3
90
#define INVALID_EP_TYPE 255
91

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

    
95
typedef struct AsyncURB AsyncURB;
96

    
97
struct endp_data {
98
    uint8_t type;
99
    uint8_t halted;
100
    uint8_t iso_started;
101
    AsyncURB *iso_urb;
102
    int iso_urb_idx;
103
    int iso_buffer_used;
104
    int max_packet_size;
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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
271
static void async_complete(void *opaque)
272
{
273
    USBHostDevice *s = opaque;
274
    AsyncURB *aurb;
275

    
276
    while (1) {
277
        USBPacket *p;
278

    
279
        int r = ioctl(s->fd, USBDEVFS_REAPURBNDELAY, &aurb);
280
        if (r < 0) {
281
            if (errno == EAGAIN) {
282
                return;
283
            }
284
            if (errno == ENODEV && !s->closing) {
285
                printf("husb: device %d.%d disconnected\n",
286
                       s->bus_num, s->addr);
287
                usb_host_close(s);
288
                usb_host_auto_check(NULL);
289
                return;
290
            }
291

    
292
            DPRINTF("husb: async. reap urb failed errno %d\n", errno);
293
            return;
294
        }
295

    
296
        DPRINTF("husb: async completed. aurb %p status %d alen %d\n",
297
                aurb, aurb->urb.status, aurb->urb.actual_length);
298

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

    
309
        p = aurb->packet;
310

    
311
        if (p) {
312
            switch (aurb->urb.status) {
313
            case 0:
314
                p->len += aurb->urb.actual_length;
315
                break;
316

    
317
            case -EPIPE:
318
                set_halt(s, p->devep);
319
                p->len = USB_RET_STALL;
320
                break;
321

    
322
            default:
323
                p->len = USB_RET_NAK;
324
                break;
325
            }
326

    
327
            if (aurb->urb.type == USBDEVFS_URB_TYPE_CONTROL) {
328
                usb_generic_async_ctrl_complete(&s->dev, p);
329
            } else if (!aurb->more) {
330
                usb_packet_complete(&s->dev, p);
331
            }
332
        }
333

    
334
        async_free(aurb);
335
    }
336
}
337

    
338
static void async_cancel(USBPacket *p, void *opaque)
339
{
340
    USBHostDevice *s = opaque;
341
    AsyncURB *aurb;
342

    
343
    QLIST_FOREACH(aurb, &s->aurbs, next) {
344
        if (p != aurb->packet) {
345
            continue;
346
        }
347

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

    
350
        /* Mark it as dead (see async_complete above) */
351
        aurb->packet = NULL;
352

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

    
360
static int usb_host_claim_interfaces(USBHostDevice *dev, int configuration)
361
{
362
    int dev_descr_len, config_descr_len;
363
    int interface, nb_interfaces;
364
    int ret, i;
365

    
366
    if (configuration == 0) /* address state - ignore */
367
        return 1;
368

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

    
371
    i = 0;
372
    dev_descr_len = dev->descr[0];
373
    if (dev_descr_len > dev->descr_len) {
374
        goto fail;
375
    }
376

    
377
    i += dev_descr_len;
378
    while (i < dev->descr_len) {
379
        DPRINTF("husb: i is %d, descr_len is %d, dl %d, dt %d\n",
380
                i, dev->descr_len,
381
               dev->descr[i], dev->descr[i+1]);
382

    
383
        if (dev->descr[i+1] != USB_DT_CONFIG) {
384
            i += dev->descr[i];
385
            continue;
386
        }
387
        config_descr_len = dev->descr[i];
388

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

    
391
        if (configuration < 0 || configuration == dev->descr[i + 5]) {
392
            configuration = dev->descr[i + 5];
393
            break;
394
        }
395

    
396
        i += config_descr_len;
397
    }
398

    
399
    if (i >= dev->descr_len) {
400
        fprintf(stderr,
401
                "husb: update iface failed. no matching configuration\n");
402
        goto fail;
403
    }
404
    nb_interfaces = dev->descr[i + 4];
405

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

    
423
    /* XXX: only grab if all interfaces are free */
424
    for (interface = 0; interface < nb_interfaces; interface++) {
425
        ret = ioctl(dev->fd, USBDEVFS_CLAIMINTERFACE, &interface);
426
        if (ret < 0) {
427
            if (errno == EBUSY) {
428
                printf("husb: update iface. device already grabbed\n");
429
            } else {
430
                perror("husb: failed to claim interface");
431
            }
432
        fail:
433
            return 0;
434
        }
435
    }
436

    
437
    printf("husb: %d interfaces claimed for configuration %d\n",
438
           nb_interfaces, configuration);
439

    
440
    dev->ninterfaces   = nb_interfaces;
441
    dev->configuration = configuration;
442
    return 1;
443
}
444

    
445
static int usb_host_release_interfaces(USBHostDevice *s)
446
{
447
    int ret, i;
448

    
449
    DPRINTF("husb: releasing interfaces\n");
450

    
451
    for (i = 0; i < s->ninterfaces; i++) {
452
        ret = ioctl(s->fd, USBDEVFS_RELEASEINTERFACE, &i);
453
        if (ret < 0) {
454
            perror("husb: failed to release interface");
455
            return 0;
456
        }
457
    }
458

    
459
    return 1;
460
}
461

    
462
static void usb_host_handle_reset(USBDevice *dev)
463
{
464
    USBHostDevice *s = DO_UPCAST(USBHostDevice, dev, dev);
465

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

    
468
    ioctl(s->fd, USBDEVFS_RESET);
469

    
470
    usb_host_claim_interfaces(s, s->configuration);
471
}
472

    
473
static void usb_host_handle_destroy(USBDevice *dev)
474
{
475
    USBHostDevice *s = (USBHostDevice *)dev;
476

    
477
    usb_host_close(s);
478
    QTAILQ_REMOVE(&hostdevs, s, next);
479
    qemu_remove_exit_notifier(&s->exit);
480
}
481

    
482
static int usb_linux_update_endp_table(USBHostDevice *s);
483

    
484
/* iso data is special, we need to keep enough urbs in flight to make sure
485
   that the controller never runs out of them, otherwise the device will
486
   likely suffer a buffer underrun / overrun. */
487
static AsyncURB *usb_host_alloc_iso(USBHostDevice *s, uint8_t ep, int in)
488
{
489
    AsyncURB *aurb;
490
    int i, j, len = get_max_packet_size(s, ep);
491

    
492
    aurb = qemu_mallocz(ISO_URB_COUNT * sizeof(*aurb));
493
    for (i = 0; i < ISO_URB_COUNT; i++) {
494
        aurb[i].urb.endpoint      = ep;
495
        aurb[i].urb.buffer_length = ISO_FRAME_DESC_PER_URB * len;
496
        aurb[i].urb.buffer        = qemu_malloc(aurb[i].urb.buffer_length);
497
        aurb[i].urb.type          = USBDEVFS_URB_TYPE_ISO;
498
        aurb[i].urb.flags         = USBDEVFS_URB_ISO_ASAP;
499
        aurb[i].urb.number_of_packets = ISO_FRAME_DESC_PER_URB;
500
        for (j = 0 ; j < ISO_FRAME_DESC_PER_URB; j++)
501
            aurb[i].urb.iso_frame_desc[j].length = len;
502
        if (in) {
503
            aurb[i].urb.endpoint |= 0x80;
504
            /* Mark as fully consumed (idle) */
505
            aurb[i].iso_frame_idx = ISO_FRAME_DESC_PER_URB;
506
        }
507
    }
508
    set_iso_urb(s, ep, aurb);
509

    
510
    return aurb;
511
}
512

    
513
static void usb_host_stop_n_free_iso(USBHostDevice *s, uint8_t ep)
514
{
515
    AsyncURB *aurb;
516
    int i, ret, killed = 0, free = 1;
517

    
518
    aurb = get_iso_urb(s, ep);
519
    if (!aurb) {
520
        return;
521
    }
522

    
523
    for (i = 0; i < ISO_URB_COUNT; i++) {
524
        /* in flight? */
525
        if (aurb[i].iso_frame_idx == -1) {
526
            ret = ioctl(s->fd, USBDEVFS_DISCARDURB, &aurb[i]);
527
            if (ret < 0) {
528
                printf("husb: discard isoc in urb failed errno %d\n", errno);
529
                free = 0;
530
                continue;
531
            }
532
            killed++;
533
        }
534
    }
535

    
536
    /* Make sure any urbs we've killed are reaped before we free them */
537
    if (killed) {
538
        async_complete(s);
539
    }
540

    
541
    for (i = 0; i < ISO_URB_COUNT; i++) {
542
        qemu_free(aurb[i].urb.buffer);
543
    }
544

    
545
    if (free)
546
        qemu_free(aurb);
547
    else
548
        printf("husb: leaking iso urbs because of discard failure\n");
549
    set_iso_urb(s, ep, NULL);
550
    set_iso_urb_idx(s, ep, 0);
551
    clear_iso_started(s, ep);
552
}
553

    
554
static int urb_status_to_usb_ret(int status)
555
{
556
    switch (status) {
557
    case -EPIPE:
558
        return USB_RET_STALL;
559
    default:
560
        return USB_RET_NAK;
561
    }
562
}
563

    
564
static int usb_host_handle_iso_data(USBHostDevice *s, USBPacket *p, int in)
565
{
566
    AsyncURB *aurb;
567
    int i, j, ret, max_packet_size, offset, len = 0;
568

    
569
    max_packet_size = get_max_packet_size(s, p->devep);
570
    if (max_packet_size == 0)
571
        return USB_RET_NAK;
572

    
573
    aurb = get_iso_urb(s, p->devep);
574
    if (!aurb) {
575
        aurb = usb_host_alloc_iso(s, p->devep, in);
576
    }
577

    
578
    i = get_iso_urb_idx(s, p->devep);
579
    j = aurb[i].iso_frame_idx;
580
    if (j >= 0 && j < ISO_FRAME_DESC_PER_URB) {
581
        if (in) {
582
            /* Check urb status  */
583
            if (aurb[i].urb.status) {
584
                len = urb_status_to_usb_ret(aurb[i].urb.status);
585
                /* Move to the next urb */
586
                aurb[i].iso_frame_idx = ISO_FRAME_DESC_PER_URB - 1;
587
            /* Check frame status */
588
            } else if (aurb[i].urb.iso_frame_desc[j].status) {
589
                len = urb_status_to_usb_ret(
590
                                        aurb[i].urb.iso_frame_desc[j].status);
591
            /* Check the frame fits */
592
            } else if (aurb[i].urb.iso_frame_desc[j].actual_length > p->len) {
593
                printf("husb: received iso data is larger then packet\n");
594
                len = USB_RET_NAK;
595
            /* All good copy data over */
596
            } else {
597
                len = aurb[i].urb.iso_frame_desc[j].actual_length;
598
                memcpy(p->data,
599
                       aurb[i].urb.buffer +
600
                           j * aurb[i].urb.iso_frame_desc[0].length,
601
                       len);
602
            }
603
        } else {
604
            len = p->len;
605
            offset = (j == 0) ? 0 : get_iso_buffer_used(s, p->devep);
606

    
607
            /* Check the frame fits */
608
            if (len > max_packet_size) {
609
                printf("husb: send iso data is larger then max packet size\n");
610
                return USB_RET_NAK;
611
            }
612

    
613
            /* All good copy data over */
614
            memcpy(aurb[i].urb.buffer + offset, p->data, len);
615
            aurb[i].urb.iso_frame_desc[j].length = len;
616
            offset += len;
617
            set_iso_buffer_used(s, p->devep, offset);
618

    
619
            /* Start the stream once we have buffered enough data */
620
            if (!is_iso_started(s, p->devep) && i == 1 && j == 8) {
621
                set_iso_started(s, p->devep);
622
            }
623
        }
624
        aurb[i].iso_frame_idx++;
625
        if (aurb[i].iso_frame_idx == ISO_FRAME_DESC_PER_URB) {
626
            i = (i + 1) % ISO_URB_COUNT;
627
            set_iso_urb_idx(s, p->devep, i);
628
        }
629
    } else {
630
        if (in) {
631
            set_iso_started(s, p->devep);
632
        } else {
633
            DPRINTF("hubs: iso out error no free buffer, dropping packet\n");
634
        }
635
    }
636

    
637
    if (is_iso_started(s, p->devep)) {
638
        /* (Re)-submit all fully consumed / filled urbs */
639
        for (i = 0; i < ISO_URB_COUNT; i++) {
640
            if (aurb[i].iso_frame_idx == ISO_FRAME_DESC_PER_URB) {
641
                ret = ioctl(s->fd, USBDEVFS_SUBMITURB, &aurb[i]);
642
                if (ret < 0) {
643
                    printf("husb error submitting iso urb %d: %d\n", i, errno);
644
                    if (!in || len == 0) {
645
                        switch(errno) {
646
                        case ETIMEDOUT:
647
                            len = USB_RET_NAK;
648
                            break;
649
                        case EPIPE:
650
                        default:
651
                            len = USB_RET_STALL;
652
                        }
653
                    }
654
                    break;
655
                }
656
                aurb[i].iso_frame_idx = -1;
657
            }
658
        }
659
    }
660

    
661
    return len;
662
}
663

    
664
static int usb_host_handle_data(USBDevice *dev, USBPacket *p)
665
{
666
    USBHostDevice *s = DO_UPCAST(USBHostDevice, dev, dev);
667
    struct usbdevfs_urb *urb;
668
    AsyncURB *aurb;
669
    int ret, rem;
670
    uint8_t *pbuf;
671
    uint8_t ep;
672

    
673
    if (!is_valid(s, p->devep)) {
674
        return USB_RET_NAK;
675
    }
676

    
677
    if (p->pid == USB_TOKEN_IN) {
678
        ep = p->devep | 0x80;
679
    } else {
680
        ep = p->devep;
681
    }
682

    
683
    if (is_halted(s, p->devep)) {
684
        ret = ioctl(s->fd, USBDEVFS_CLEAR_HALT, &ep);
685
        if (ret < 0) {
686
            DPRINTF("husb: failed to clear halt. ep 0x%x errno %d\n",
687
                   ep, errno);
688
            return USB_RET_NAK;
689
        }
690
        clear_halt(s, p->devep);
691
    }
692

    
693
    if (is_isoc(s, p->devep)) {
694
        return usb_host_handle_iso_data(s, p, p->pid == USB_TOKEN_IN);
695
    }
696

    
697
    rem = p->len;
698
    pbuf = p->data;
699
    p->len = 0;
700
    while (rem) {
701
        aurb = async_alloc(s);
702
        aurb->packet = p;
703

    
704
        urb = &aurb->urb;
705
        urb->endpoint      = ep;
706
        urb->type          = USBDEVFS_URB_TYPE_BULK;
707
        urb->usercontext   = s;
708
        urb->buffer        = pbuf;
709

    
710
        if (rem > MAX_USBFS_BUFFER_SIZE) {
711
            urb->buffer_length = MAX_USBFS_BUFFER_SIZE;
712
            aurb->more         = 1;
713
        } else {
714
            urb->buffer_length = rem;
715
            aurb->more         = 0;
716
        }
717
        pbuf += urb->buffer_length;
718
        rem  -= urb->buffer_length;
719

    
720
        ret = ioctl(s->fd, USBDEVFS_SUBMITURB, urb);
721

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

    
725
        if (ret < 0) {
726
            DPRINTF("husb: submit failed. errno %d\n", errno);
727
            async_free(aurb);
728

    
729
            switch(errno) {
730
            case ETIMEDOUT:
731
                return USB_RET_NAK;
732
            case EPIPE:
733
            default:
734
                return USB_RET_STALL;
735
            }
736
        }
737
    }
738

    
739
    usb_defer_packet(p, async_cancel, s);
740
    return USB_RET_ASYNC;
741
}
742

    
743
static int ctrl_error(void)
744
{
745
    if (errno == ETIMEDOUT) {
746
        return USB_RET_NAK;
747
    } else {
748
        return USB_RET_STALL;
749
    }
750
}
751

    
752
static int usb_host_set_address(USBHostDevice *s, int addr)
753
{
754
    DPRINTF("husb: ctrl set addr %u\n", addr);
755
    s->dev.addr = addr;
756
    return 0;
757
}
758

    
759
static int usb_host_set_config(USBHostDevice *s, int config)
760
{
761
    usb_host_release_interfaces(s);
762

    
763
    int ret = ioctl(s->fd, USBDEVFS_SETCONFIGURATION, &config);
764

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

    
767
    if (ret < 0) {
768
        return ctrl_error();
769
    }
770
    usb_host_claim_interfaces(s, config);
771
    return 0;
772
}
773

    
774
static int usb_host_set_interface(USBHostDevice *s, int iface, int alt)
775
{
776
    struct usbdevfs_setinterface si;
777
    int i, ret;
778

    
779
    for (i = 1; i <= MAX_ENDPOINTS; i++) {
780
        if (is_isoc(s, i)) {
781
            usb_host_stop_n_free_iso(s, i);
782
        }
783
    }
784

    
785
    si.interface  = iface;
786
    si.altsetting = alt;
787
    ret = ioctl(s->fd, USBDEVFS_SETINTERFACE, &si);
788

    
789
    DPRINTF("husb: ctrl set iface %d altset %d ret %d errno %d\n",
790
            iface, alt, ret, errno);
791

    
792
    if (ret < 0) {
793
        return ctrl_error();
794
    }
795
    usb_linux_update_endp_table(s);
796
    return 0;
797
}
798

    
799
static int usb_host_handle_control(USBDevice *dev, USBPacket *p,
800
               int request, int value, int index, int length, uint8_t *data)
801
{
802
    USBHostDevice *s = DO_UPCAST(USBHostDevice, dev, dev);
803
    struct usbdevfs_urb *urb;
804
    AsyncURB *aurb;
805
    int ret;
806

    
807
    /*
808
     * Process certain standard device requests.
809
     * These are infrequent and are processed synchronously.
810
     */
811

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

    
816
    switch (request) {
817
    case DeviceOutRequest | USB_REQ_SET_ADDRESS:
818
        return usb_host_set_address(s, value);
819

    
820
    case DeviceOutRequest | USB_REQ_SET_CONFIGURATION:
821
        return usb_host_set_config(s, value & 0xff);
822

    
823
    case InterfaceOutRequest | USB_REQ_SET_INTERFACE:
824
        return usb_host_set_interface(s, index, value);
825
    }
826

    
827
    /* The rest are asynchronous */
828

    
829
    if (length > sizeof(dev->data_buf)) {
830
        fprintf(stderr, "husb: ctrl buffer too small (%d > %zu)\n",
831
                length, sizeof(dev->data_buf));
832
        return USB_RET_STALL;
833
    }
834

    
835
    aurb = async_alloc(s);
836
    aurb->packet = p;
837

    
838
    /*
839
     * Setup ctrl transfer.
840
     *
841
     * s->ctrl is laid out such that data buffer immediately follows
842
     * 'req' struct which is exactly what usbdevfs expects.
843
     */
844
    urb = &aurb->urb;
845

    
846
    urb->type     = USBDEVFS_URB_TYPE_CONTROL;
847
    urb->endpoint = p->devep;
848

    
849
    urb->buffer        = &dev->setup_buf;
850
    urb->buffer_length = length + 8;
851

    
852
    urb->usercontext = s;
853

    
854
    ret = ioctl(s->fd, USBDEVFS_SUBMITURB, urb);
855

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

    
858
    if (ret < 0) {
859
        DPRINTF("husb: submit failed. errno %d\n", errno);
860
        async_free(aurb);
861

    
862
        switch(errno) {
863
        case ETIMEDOUT:
864
            return USB_RET_NAK;
865
        case EPIPE:
866
        default:
867
            return USB_RET_STALL;
868
        }
869
    }
870

    
871
    usb_defer_packet(p, async_cancel, s);
872
    return USB_RET_ASYNC;
873
}
874

    
875
static int usb_linux_get_configuration(USBHostDevice *s)
876
{
877
    uint8_t configuration;
878
    struct usb_ctrltransfer ct;
879
    int ret;
880

    
881
    if (usb_fs_type == USB_FS_SYS) {
882
        char device_name[32], line[1024];
883
        int configuration;
884

    
885
        sprintf(device_name, "%d-%s", s->bus_num, s->port);
886

    
887
        if (!usb_host_read_file(line, sizeof(line), "bConfigurationValue",
888
                                device_name)) {
889
            goto usbdevfs;
890
        }
891
        if (sscanf(line, "%d", &configuration) != 1) {
892
            goto usbdevfs;
893
        }
894
        return configuration;
895
    }
896

    
897
usbdevfs:
898
    ct.bRequestType = USB_DIR_IN;
899
    ct.bRequest = USB_REQ_GET_CONFIGURATION;
900
    ct.wValue = 0;
901
    ct.wIndex = 0;
902
    ct.wLength = 1;
903
    ct.data = &configuration;
904
    ct.timeout = 50;
905

    
906
    ret = ioctl(s->fd, USBDEVFS_CONTROL, &ct);
907
    if (ret < 0) {
908
        perror("usb_linux_get_configuration");
909
        return -1;
910
    }
911

    
912
    /* in address state */
913
    if (configuration == 0) {
914
        return -1;
915
    }
916

    
917
    return configuration;
918
}
919

    
920
static uint8_t usb_linux_get_alt_setting(USBHostDevice *s,
921
    uint8_t configuration, uint8_t interface)
922
{
923
    uint8_t alt_setting;
924
    struct usb_ctrltransfer ct;
925
    int ret;
926

    
927
    if (usb_fs_type == USB_FS_SYS) {
928
        char device_name[64], line[1024];
929
        int alt_setting;
930

    
931
        sprintf(device_name, "%d-%s:%d.%d", s->bus_num, s->port,
932
                (int)configuration, (int)interface);
933

    
934
        if (!usb_host_read_file(line, sizeof(line), "bAlternateSetting",
935
                                device_name)) {
936
            goto usbdevfs;
937
        }
938
        if (sscanf(line, "%d", &alt_setting) != 1) {
939
            goto usbdevfs;
940
        }
941
        return alt_setting;
942
    }
943

    
944
usbdevfs:
945
    ct.bRequestType = USB_DIR_IN | USB_RECIP_INTERFACE;
946
    ct.bRequest = USB_REQ_GET_INTERFACE;
947
    ct.wValue = 0;
948
    ct.wIndex = interface;
949
    ct.wLength = 1;
950
    ct.data = &alt_setting;
951
    ct.timeout = 50;
952
    ret = ioctl(s->fd, USBDEVFS_CONTROL, &ct);
953
    if (ret < 0) {
954
        /* Assume alt 0 on error */
955
        return 0;
956
    }
957

    
958
    return alt_setting;
959
}
960

    
961
/* returns 1 on problem encountered or 0 for success */
962
static int usb_linux_update_endp_table(USBHostDevice *s)
963
{
964
    uint8_t *descriptors;
965
    uint8_t devep, type, configuration, alt_interface;
966
    int interface, length, i;
967

    
968
    for (i = 0; i < MAX_ENDPOINTS; i++)
969
        s->endp_table[i].type = INVALID_EP_TYPE;
970

    
971
    i = usb_linux_get_configuration(s);
972
    if (i < 0)
973
        return 1;
974
    configuration = i;
975

    
976
    /* get the desired configuration, interface, and endpoint descriptors
977
     * from device description */
978
    descriptors = &s->descr[18];
979
    length = s->descr_len - 18;
980
    i = 0;
981

    
982
    if (descriptors[i + 1] != USB_DT_CONFIG ||
983
        descriptors[i + 5] != configuration) {
984
        DPRINTF("invalid descriptor data - configuration\n");
985
        return 1;
986
    }
987
    i += descriptors[i];
988

    
989
    while (i < length) {
990
        if (descriptors[i + 1] != USB_DT_INTERFACE ||
991
            (descriptors[i + 1] == USB_DT_INTERFACE &&
992
             descriptors[i + 4] == 0)) {
993
            i += descriptors[i];
994
            continue;
995
        }
996

    
997
        interface = descriptors[i + 2];
998
        alt_interface = usb_linux_get_alt_setting(s, configuration, interface);
999

    
1000
        /* the current interface descriptor is the active interface
1001
         * and has endpoints */
1002
        if (descriptors[i + 3] != alt_interface) {
1003
            i += descriptors[i];
1004
            continue;
1005
        }
1006

    
1007
        /* advance to the endpoints */
1008
        while (i < length && descriptors[i +1] != USB_DT_ENDPOINT) {
1009
            i += descriptors[i];
1010
        }
1011

    
1012
        if (i >= length)
1013
            break;
1014

    
1015
        while (i < length) {
1016
            if (descriptors[i + 1] != USB_DT_ENDPOINT) {
1017
                break;
1018
            }
1019

    
1020
            devep = descriptors[i + 2];
1021
            switch (descriptors[i + 3] & 0x3) {
1022
            case 0x00:
1023
                type = USBDEVFS_URB_TYPE_CONTROL;
1024
                break;
1025
            case 0x01:
1026
                type = USBDEVFS_URB_TYPE_ISO;
1027
                set_max_packet_size(s, (devep & 0xf), descriptors + i);
1028
                break;
1029
            case 0x02:
1030
                type = USBDEVFS_URB_TYPE_BULK;
1031
                break;
1032
            case 0x03:
1033
                type = USBDEVFS_URB_TYPE_INTERRUPT;
1034
                break;
1035
            default:
1036
                DPRINTF("usb_host: malformed endpoint type\n");
1037
                type = USBDEVFS_URB_TYPE_BULK;
1038
            }
1039
            s->endp_table[(devep & 0xf) - 1].type = type;
1040
            s->endp_table[(devep & 0xf) - 1].halted = 0;
1041

    
1042
            i += descriptors[i];
1043
        }
1044
    }
1045
    return 0;
1046
}
1047

    
1048
static int usb_host_open(USBHostDevice *dev, int bus_num,
1049
                         int addr, char *port, const char *prod_name)
1050
{
1051
    int fd = -1, ret;
1052
    struct usbdevfs_connectinfo ci;
1053
    char buf[1024];
1054

    
1055
    if (dev->fd != -1) {
1056
        goto fail;
1057
    }
1058
    printf("husb: open device %d.%d\n", bus_num, addr);
1059

    
1060
    if (!usb_host_device_path) {
1061
        perror("husb: USB Host Device Path not set");
1062
        goto fail;
1063
    }
1064
    snprintf(buf, sizeof(buf), "%s/%03d/%03d", usb_host_device_path,
1065
             bus_num, addr);
1066
    fd = open(buf, O_RDWR | O_NONBLOCK);
1067
    if (fd < 0) {
1068
        perror(buf);
1069
        goto fail;
1070
    }
1071
    DPRINTF("husb: opened %s\n", buf);
1072

    
1073
    dev->bus_num = bus_num;
1074
    dev->addr = addr;
1075
    strcpy(dev->port, port);
1076
    dev->fd = fd;
1077

    
1078
    /* read the device description */
1079
    dev->descr_len = read(fd, dev->descr, sizeof(dev->descr));
1080
    if (dev->descr_len <= 0) {
1081
        perror("husb: reading device data failed");
1082
        goto fail;
1083
    }
1084

    
1085
#ifdef DEBUG
1086
    {
1087
        int x;
1088
        printf("=== begin dumping device descriptor data ===\n");
1089
        for (x = 0; x < dev->descr_len; x++) {
1090
            printf("%02x ", dev->descr[x]);
1091
        }
1092
        printf("\n=== end dumping device descriptor data ===\n");
1093
    }
1094
#endif
1095

    
1096

    
1097
    /*
1098
     * Initial configuration is -1 which makes us claim first
1099
     * available config. We used to start with 1, which does not
1100
     * always work. I've seen devices where first config starts
1101
     * with 2.
1102
     */
1103
    if (!usb_host_claim_interfaces(dev, -1)) {
1104
        goto fail;
1105
    }
1106

    
1107
    ret = ioctl(fd, USBDEVFS_CONNECTINFO, &ci);
1108
    if (ret < 0) {
1109
        perror("usb_host_device_open: USBDEVFS_CONNECTINFO");
1110
        goto fail;
1111
    }
1112

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

    
1115
    ret = usb_linux_update_endp_table(dev);
1116
    if (ret) {
1117
        goto fail;
1118
    }
1119

    
1120
    if (ci.slow) {
1121
        dev->dev.speed = USB_SPEED_LOW;
1122
    } else {
1123
        dev->dev.speed = USB_SPEED_HIGH;
1124
    }
1125

    
1126
    if (!prod_name || prod_name[0] == '\0') {
1127
        snprintf(dev->dev.product_desc, sizeof(dev->dev.product_desc),
1128
                 "host:%d.%d", bus_num, addr);
1129
    } else {
1130
        pstrcpy(dev->dev.product_desc, sizeof(dev->dev.product_desc),
1131
                prod_name);
1132
    }
1133

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

    
1137
    usb_device_attach(&dev->dev);
1138
    return 0;
1139

    
1140
fail:
1141
    dev->fd = -1;
1142
    if (fd != -1) {
1143
        close(fd);
1144
    }
1145
    return -1;
1146
}
1147

    
1148
static int usb_host_close(USBHostDevice *dev)
1149
{
1150
    int i;
1151

    
1152
    if (dev->fd == -1) {
1153
        return -1;
1154
    }
1155

    
1156
    qemu_set_fd_handler(dev->fd, NULL, NULL, NULL);
1157
    dev->closing = 1;
1158
    for (i = 1; i <= MAX_ENDPOINTS; i++) {
1159
        if (is_isoc(dev, i)) {
1160
            usb_host_stop_n_free_iso(dev, i);
1161
        }
1162
    }
1163
    async_complete(dev);
1164
    dev->closing = 0;
1165
    usb_device_detach(&dev->dev);
1166
    ioctl(dev->fd, USBDEVFS_RESET);
1167
    close(dev->fd);
1168
    dev->fd = -1;
1169
    return 0;
1170
}
1171

    
1172
static void usb_host_exit_notifier(struct Notifier* n)
1173
{
1174
    USBHostDevice *s = container_of(n, USBHostDevice, exit);
1175

    
1176
    if (s->fd != -1) {
1177
        ioctl(s->fd, USBDEVFS_RESET);
1178
    }
1179
}
1180

    
1181
static int usb_host_initfn(USBDevice *dev)
1182
{
1183
    USBHostDevice *s = DO_UPCAST(USBHostDevice, dev, dev);
1184

    
1185
    dev->auto_attach = 0;
1186
    s->fd = -1;
1187
    QTAILQ_INSERT_TAIL(&hostdevs, s, next);
1188
    s->exit.notify = usb_host_exit_notifier;
1189
    qemu_add_exit_notifier(&s->exit);
1190
    usb_host_auto_check(NULL);
1191
    return 0;
1192
}
1193

    
1194
static struct USBDeviceInfo usb_host_dev_info = {
1195
    .product_desc   = "USB Host Device",
1196
    .qdev.name      = "usb-host",
1197
    .qdev.size      = sizeof(USBHostDevice),
1198
    .init           = usb_host_initfn,
1199
    .handle_packet  = usb_generic_handle_packet,
1200
    .handle_data    = usb_host_handle_data,
1201
    .handle_control = usb_host_handle_control,
1202
    .handle_reset   = usb_host_handle_reset,
1203
    .handle_destroy = usb_host_handle_destroy,
1204
    .usbdevice_name = "host",
1205
    .usbdevice_init = usb_host_device_open,
1206
    .qdev.props     = (Property[]) {
1207
        DEFINE_PROP_UINT32("hostbus",  USBHostDevice, match.bus_num,    0),
1208
        DEFINE_PROP_UINT32("hostaddr", USBHostDevice, match.addr,       0),
1209
        DEFINE_PROP_STRING("hostport", USBHostDevice, match.port),
1210
        DEFINE_PROP_HEX32("vendorid",  USBHostDevice, match.vendor_id,  0),
1211
        DEFINE_PROP_HEX32("productid", USBHostDevice, match.product_id, 0),
1212
        DEFINE_PROP_END_OF_LIST(),
1213
    },
1214
};
1215

    
1216
static void usb_host_register_devices(void)
1217
{
1218
    usb_qdev_register(&usb_host_dev_info);
1219
}
1220
device_init(usb_host_register_devices)
1221

    
1222
USBDevice *usb_host_device_open(const char *devname)
1223
{
1224
    struct USBAutoFilter filter;
1225
    USBDevice *dev;
1226
    char *p;
1227

    
1228
    dev = usb_create(NULL /* FIXME */, "usb-host");
1229

    
1230
    if (strstr(devname, "auto:")) {
1231
        if (parse_filter(devname, &filter) < 0) {
1232
            goto fail;
1233
        }
1234
    } else {
1235
        if ((p = strchr(devname, '.'))) {
1236
            filter.bus_num    = strtoul(devname, NULL, 0);
1237
            filter.addr       = strtoul(p + 1, NULL, 0);
1238
            filter.vendor_id  = 0;
1239
            filter.product_id = 0;
1240
        } else if ((p = strchr(devname, ':'))) {
1241
            filter.bus_num    = 0;
1242
            filter.addr       = 0;
1243
            filter.vendor_id  = strtoul(devname, NULL, 16);
1244
            filter.product_id = strtoul(p + 1, NULL, 16);
1245
        } else {
1246
            goto fail;
1247
        }
1248
    }
1249

    
1250
    qdev_prop_set_uint32(&dev->qdev, "hostbus",   filter.bus_num);
1251
    qdev_prop_set_uint32(&dev->qdev, "hostaddr",  filter.addr);
1252
    qdev_prop_set_uint32(&dev->qdev, "vendorid",  filter.vendor_id);
1253
    qdev_prop_set_uint32(&dev->qdev, "productid", filter.product_id);
1254
    qdev_init_nofail(&dev->qdev);
1255
    return dev;
1256

    
1257
fail:
1258
    qdev_free(&dev->qdev);
1259
    return NULL;
1260
}
1261

    
1262
int usb_host_device_close(const char *devname)
1263
{
1264
#if 0
1265
    char product_name[PRODUCT_NAME_SZ];
1266
    int bus_num, addr;
1267
    USBHostDevice *s;
1268

1269
    if (strstr(devname, "auto:")) {
1270
        return usb_host_auto_del(devname);
1271
    }
1272
    if (usb_host_find_device(&bus_num, &addr, product_name,
1273
                                    sizeof(product_name), devname) < 0) {
1274
        return -1;
1275
    }
1276
    s = hostdev_find(bus_num, addr);
1277
    if (s) {
1278
        usb_device_delete_addr(s->bus_num, s->dev.addr);
1279
        return 0;
1280
    }
1281
#endif
1282

    
1283
    return -1;
1284
}
1285

    
1286
static int get_tag_value(char *buf, int buf_size,
1287
                         const char *str, const char *tag,
1288
                         const char *stopchars)
1289
{
1290
    const char *p;
1291
    char *q;
1292
    p = strstr(str, tag);
1293
    if (!p) {
1294
        return -1;
1295
    }
1296
    p += strlen(tag);
1297
    while (qemu_isspace(*p)) {
1298
        p++;
1299
    }
1300
    q = buf;
1301
    while (*p != '\0' && !strchr(stopchars, *p)) {
1302
        if ((q - buf) < (buf_size - 1)) {
1303
            *q++ = *p;
1304
        }
1305
        p++;
1306
    }
1307
    *q = '\0';
1308
    return q - buf;
1309
}
1310

    
1311
/*
1312
 * Use /proc/bus/usb/devices or /dev/bus/usb/devices file to determine
1313
 * host's USB devices. This is legacy support since many distributions
1314
 * are moving to /sys/bus/usb
1315
 */
1316
static int usb_host_scan_dev(void *opaque, USBScanFunc *func)
1317
{
1318
    FILE *f = NULL;
1319
    char line[1024];
1320
    char buf[1024];
1321
    int bus_num, addr, speed, device_count, class_id, product_id, vendor_id;
1322
    char product_name[512];
1323
    int ret = 0;
1324

    
1325
    if (!usb_host_device_path) {
1326
        perror("husb: USB Host Device Path not set");
1327
        goto the_end;
1328
    }
1329
    snprintf(line, sizeof(line), "%s/devices", usb_host_device_path);
1330
    f = fopen(line, "r");
1331
    if (!f) {
1332
        perror("husb: cannot open devices file");
1333
        goto the_end;
1334
    }
1335

    
1336
    device_count = 0;
1337
    bus_num = addr = speed = class_id = product_id = vendor_id = 0;
1338
    for(;;) {
1339
        if (fgets(line, sizeof(line), f) == NULL) {
1340
            break;
1341
        }
1342
        if (strlen(line) > 0) {
1343
            line[strlen(line) - 1] = '\0';
1344
        }
1345
        if (line[0] == 'T' && line[1] == ':') {
1346
            if (device_count && (vendor_id || product_id)) {
1347
                /* New device.  Add the previously discovered device.  */
1348
                ret = func(opaque, bus_num, addr, 0, class_id, vendor_id,
1349
                           product_id, product_name, speed);
1350
                if (ret) {
1351
                    goto the_end;
1352
                }
1353
            }
1354
            if (get_tag_value(buf, sizeof(buf), line, "Bus=", " ") < 0) {
1355
                goto fail;
1356
            }
1357
            bus_num = atoi(buf);
1358
            if (get_tag_value(buf, sizeof(buf), line, "Dev#=", " ") < 0) {
1359
                goto fail;
1360
            }
1361
            addr = atoi(buf);
1362
            if (get_tag_value(buf, sizeof(buf), line, "Spd=", " ") < 0) {
1363
                goto fail;
1364
            }
1365
            if (!strcmp(buf, "480")) {
1366
                speed = USB_SPEED_HIGH;
1367
            } else if (!strcmp(buf, "1.5")) {
1368
                speed = USB_SPEED_LOW;
1369
            } else {
1370
                speed = USB_SPEED_FULL;
1371
            }
1372
            product_name[0] = '\0';
1373
            class_id = 0xff;
1374
            device_count++;
1375
            product_id = 0;
1376
            vendor_id = 0;
1377
        } else if (line[0] == 'P' && line[1] == ':') {
1378
            if (get_tag_value(buf, sizeof(buf), line, "Vendor=", " ") < 0) {
1379
                goto fail;
1380
            }
1381
            vendor_id = strtoul(buf, NULL, 16);
1382
            if (get_tag_value(buf, sizeof(buf), line, "ProdID=", " ") < 0) {
1383
                goto fail;
1384
            }
1385
            product_id = strtoul(buf, NULL, 16);
1386
        } else if (line[0] == 'S' && line[1] == ':') {
1387
            if (get_tag_value(buf, sizeof(buf), line, "Product=", "") < 0) {
1388
                goto fail;
1389
            }
1390
            pstrcpy(product_name, sizeof(product_name), buf);
1391
        } else if (line[0] == 'D' && line[1] == ':') {
1392
            if (get_tag_value(buf, sizeof(buf), line, "Cls=", " (") < 0) {
1393
                goto fail;
1394
            }
1395
            class_id = strtoul(buf, NULL, 16);
1396
        }
1397
    fail: ;
1398
    }
1399
    if (device_count && (vendor_id || product_id)) {
1400
        /* Add the last device.  */
1401
        ret = func(opaque, bus_num, addr, 0, class_id, vendor_id,
1402
                   product_id, product_name, speed);
1403
    }
1404
 the_end:
1405
    if (f) {
1406
        fclose(f);
1407
    }
1408
    return ret;
1409
}
1410

    
1411
/*
1412
 * Read sys file-system device file
1413
 *
1414
 * @line address of buffer to put file contents in
1415
 * @line_size size of line
1416
 * @device_file path to device file (printf format string)
1417
 * @device_name device being opened (inserted into device_file)
1418
 *
1419
 * @return 0 failed, 1 succeeded ('line' contains data)
1420
 */
1421
static int usb_host_read_file(char *line, size_t line_size,
1422
                              const char *device_file, const char *device_name)
1423
{
1424
    FILE *f;
1425
    int ret = 0;
1426
    char filename[PATH_MAX];
1427

    
1428
    snprintf(filename, PATH_MAX, USBSYSBUS_PATH "/devices/%s/%s", device_name,
1429
             device_file);
1430
    f = fopen(filename, "r");
1431
    if (f) {
1432
        ret = fgets(line, line_size, f) != NULL;
1433
        fclose(f);
1434
    }
1435

    
1436
    return ret;
1437
}
1438

    
1439
/*
1440
 * Use /sys/bus/usb/devices/ directory to determine host's USB
1441
 * devices.
1442
 *
1443
 * This code is based on Robert Schiele's original patches posted to
1444
 * the Novell bug-tracker https://bugzilla.novell.com/show_bug.cgi?id=241950
1445
 */
1446
static int usb_host_scan_sys(void *opaque, USBScanFunc *func)
1447
{
1448
    DIR *dir = NULL;
1449
    char line[1024];
1450
    int bus_num, addr, speed, class_id, product_id, vendor_id;
1451
    int ret = 0;
1452
    char port[MAX_PORTLEN];
1453
    char product_name[512];
1454
    struct dirent *de;
1455

    
1456
    dir = opendir(USBSYSBUS_PATH "/devices");
1457
    if (!dir) {
1458
        perror("husb: cannot open devices directory");
1459
        goto the_end;
1460
    }
1461

    
1462
    while ((de = readdir(dir))) {
1463
        if (de->d_name[0] != '.' && !strchr(de->d_name, ':')) {
1464
            if (sscanf(de->d_name, "%d-%7[0-9.]", &bus_num, port) < 2) {
1465
                continue;
1466
            }
1467

    
1468
            if (!usb_host_read_file(line, sizeof(line), "devnum", de->d_name)) {
1469
                goto the_end;
1470
            }
1471
            if (sscanf(line, "%d", &addr) != 1) {
1472
                goto the_end;
1473
            }
1474
            if (!usb_host_read_file(line, sizeof(line), "bDeviceClass",
1475
                                    de->d_name)) {
1476
                goto the_end;
1477
            }
1478
            if (sscanf(line, "%x", &class_id) != 1) {
1479
                goto the_end;
1480
            }
1481

    
1482
            if (!usb_host_read_file(line, sizeof(line), "idVendor",
1483
                                    de->d_name)) {
1484
                goto the_end;
1485
            }
1486
            if (sscanf(line, "%x", &vendor_id) != 1) {
1487
                goto the_end;
1488
            }
1489
            if (!usb_host_read_file(line, sizeof(line), "idProduct",
1490
                                    de->d_name)) {
1491
                goto the_end;
1492
            }
1493
            if (sscanf(line, "%x", &product_id) != 1) {
1494
                goto the_end;
1495
            }
1496
            if (!usb_host_read_file(line, sizeof(line), "product",
1497
                                    de->d_name)) {
1498
                *product_name = 0;
1499
            } else {
1500
                if (strlen(line) > 0) {
1501
                    line[strlen(line) - 1] = '\0';
1502
                }
1503
                pstrcpy(product_name, sizeof(product_name), line);
1504
            }
1505

    
1506
            if (!usb_host_read_file(line, sizeof(line), "speed", de->d_name)) {
1507
                goto the_end;
1508
            }
1509
            if (!strcmp(line, "480\n")) {
1510
                speed = USB_SPEED_HIGH;
1511
            } else if (!strcmp(line, "1.5\n")) {
1512
                speed = USB_SPEED_LOW;
1513
            } else {
1514
                speed = USB_SPEED_FULL;
1515
            }
1516

    
1517
            ret = func(opaque, bus_num, addr, port, class_id, vendor_id,
1518
                       product_id, product_name, speed);
1519
            if (ret) {
1520
                goto the_end;
1521
            }
1522
        }
1523
    }
1524
 the_end:
1525
    if (dir) {
1526
        closedir(dir);
1527
    }
1528
    return ret;
1529
}
1530

    
1531
/*
1532
 * Determine how to access the host's USB devices and call the
1533
 * specific support function.
1534
 */
1535
static int usb_host_scan(void *opaque, USBScanFunc *func)
1536
{
1537
    Monitor *mon = cur_mon;
1538
    FILE *f = NULL;
1539
    DIR *dir = NULL;
1540
    int ret = 0;
1541
    const char *fs_type[] = {"unknown", "proc", "dev", "sys"};
1542
    char devpath[PATH_MAX];
1543

    
1544
    /* only check the host once */
1545
    if (!usb_fs_type) {
1546
        dir = opendir(USBSYSBUS_PATH "/devices");
1547
        if (dir) {
1548
            /* devices found in /dev/bus/usb/ (yes - not a mistake!) */
1549
            strcpy(devpath, USBDEVBUS_PATH);
1550
            usb_fs_type = USB_FS_SYS;
1551
            closedir(dir);
1552
            DPRINTF(USBDBG_DEVOPENED, USBSYSBUS_PATH);
1553
            goto found_devices;
1554
        }
1555
        f = fopen(USBPROCBUS_PATH "/devices", "r");
1556
        if (f) {
1557
            /* devices found in /proc/bus/usb/ */
1558
            strcpy(devpath, USBPROCBUS_PATH);
1559
            usb_fs_type = USB_FS_PROC;
1560
            fclose(f);
1561
            DPRINTF(USBDBG_DEVOPENED, USBPROCBUS_PATH);
1562
            goto found_devices;
1563
        }
1564
        /* try additional methods if an access method hasn't been found yet */
1565
        f = fopen(USBDEVBUS_PATH "/devices", "r");
1566
        if (f) {
1567
            /* devices found in /dev/bus/usb/ */
1568
            strcpy(devpath, USBDEVBUS_PATH);
1569
            usb_fs_type = USB_FS_DEV;
1570
            fclose(f);
1571
            DPRINTF(USBDBG_DEVOPENED, USBDEVBUS_PATH);
1572
            goto found_devices;
1573
        }
1574
    found_devices:
1575
        if (!usb_fs_type) {
1576
            if (mon) {
1577
                monitor_printf(mon, "husb: unable to access USB devices\n");
1578
            }
1579
            return -ENOENT;
1580
        }
1581

    
1582
        /* the module setting (used later for opening devices) */
1583
        usb_host_device_path = qemu_mallocz(strlen(devpath)+1);
1584
        strcpy(usb_host_device_path, devpath);
1585
        if (mon) {
1586
            monitor_printf(mon, "husb: using %s file-system with %s\n",
1587
                           fs_type[usb_fs_type], usb_host_device_path);
1588
        }
1589
    }
1590

    
1591
    switch (usb_fs_type) {
1592
    case USB_FS_PROC:
1593
    case USB_FS_DEV:
1594
        ret = usb_host_scan_dev(opaque, func);
1595
        break;
1596
    case USB_FS_SYS:
1597
        ret = usb_host_scan_sys(opaque, func);
1598
        break;
1599
    default:
1600
        ret = -EINVAL;
1601
        break;
1602
    }
1603
    return ret;
1604
}
1605

    
1606
static QEMUTimer *usb_auto_timer;
1607

    
1608
static int usb_host_auto_scan(void *opaque, int bus_num, int addr, char *port,
1609
                              int class_id, int vendor_id, int product_id,
1610
                              const char *product_name, int speed)
1611
{
1612
    struct USBAutoFilter *f;
1613
    struct USBHostDevice *s;
1614

    
1615
    /* Ignore hubs */
1616
    if (class_id == 9)
1617
        return 0;
1618

    
1619
    QTAILQ_FOREACH(s, &hostdevs, next) {
1620
        f = &s->match;
1621

    
1622
        if (f->bus_num > 0 && f->bus_num != bus_num) {
1623
            continue;
1624
        }
1625
        if (f->addr > 0 && f->addr != addr) {
1626
            continue;
1627
        }
1628
        if (f->port != NULL && (port == NULL || strcmp(f->port, port) != 0)) {
1629
            continue;
1630
        }
1631

    
1632
        if (f->vendor_id > 0 && f->vendor_id != vendor_id) {
1633
            continue;
1634
        }
1635

    
1636
        if (f->product_id > 0 && f->product_id != product_id) {
1637
            continue;
1638
        }
1639
        /* We got a match */
1640

    
1641
        /* Already attached ? */
1642
        if (s->fd != -1) {
1643
            return 0;
1644
        }
1645
        DPRINTF("husb: auto open: bus_num %d addr %d\n", bus_num, addr);
1646

    
1647
        usb_host_open(s, bus_num, addr, port, product_name);
1648
    }
1649

    
1650
    return 0;
1651
}
1652

    
1653
static void usb_host_auto_check(void *unused)
1654
{
1655
    struct USBHostDevice *s;
1656
    int unconnected = 0;
1657

    
1658
    usb_host_scan(NULL, usb_host_auto_scan);
1659

    
1660
    QTAILQ_FOREACH(s, &hostdevs, next) {
1661
        if (s->fd == -1) {
1662
            unconnected++;
1663
        }
1664
    }
1665

    
1666
    if (unconnected == 0) {
1667
        /* nothing to watch */
1668
        if (usb_auto_timer) {
1669
            qemu_del_timer(usb_auto_timer);
1670
        }
1671
        return;
1672
    }
1673

    
1674
    if (!usb_auto_timer) {
1675
        usb_auto_timer = qemu_new_timer_ms(rt_clock, usb_host_auto_check, NULL);
1676
        if (!usb_auto_timer) {
1677
            return;
1678
        }
1679
    }
1680
    qemu_mod_timer(usb_auto_timer, qemu_get_clock_ms(rt_clock) + 2000);
1681
}
1682

    
1683
/*
1684
 * Autoconnect filter
1685
 * Format:
1686
 *    auto:bus:dev[:vid:pid]
1687
 *    auto:bus.dev[:vid:pid]
1688
 *
1689
 *    bus  - bus number    (dec, * means any)
1690
 *    dev  - device number (dec, * means any)
1691
 *    vid  - vendor id     (hex, * means any)
1692
 *    pid  - product id    (hex, * means any)
1693
 *
1694
 *    See 'lsusb' output.
1695
 */
1696
static int parse_filter(const char *spec, struct USBAutoFilter *f)
1697
{
1698
    enum { BUS, DEV, VID, PID, DONE };
1699
    const char *p = spec;
1700
    int i;
1701

    
1702
    f->bus_num    = 0;
1703
    f->addr       = 0;
1704
    f->vendor_id  = 0;
1705
    f->product_id = 0;
1706

    
1707
    for (i = BUS; i < DONE; i++) {
1708
        p = strpbrk(p, ":.");
1709
        if (!p) {
1710
            break;
1711
        }
1712
        p++;
1713

    
1714
        if (*p == '*') {
1715
            continue;
1716
        }
1717
        switch(i) {
1718
        case BUS: f->bus_num = strtol(p, NULL, 10);    break;
1719
        case DEV: f->addr    = strtol(p, NULL, 10);    break;
1720
        case VID: f->vendor_id  = strtol(p, NULL, 16); break;
1721
        case PID: f->product_id = strtol(p, NULL, 16); break;
1722
        }
1723
    }
1724

    
1725
    if (i < DEV) {
1726
        fprintf(stderr, "husb: invalid auto filter spec %s\n", spec);
1727
        return -1;
1728
    }
1729

    
1730
    return 0;
1731
}
1732

    
1733
/**********************/
1734
/* USB host device info */
1735

    
1736
struct usb_class_info {
1737
    int class;
1738
    const char *class_name;
1739
};
1740

    
1741
static const struct usb_class_info usb_class_info[] = {
1742
    { USB_CLASS_AUDIO, "Audio"},
1743
    { USB_CLASS_COMM, "Communication"},
1744
    { USB_CLASS_HID, "HID"},
1745
    { USB_CLASS_HUB, "Hub" },
1746
    { USB_CLASS_PHYSICAL, "Physical" },
1747
    { USB_CLASS_PRINTER, "Printer" },
1748
    { USB_CLASS_MASS_STORAGE, "Storage" },
1749
    { USB_CLASS_CDC_DATA, "Data" },
1750
    { USB_CLASS_APP_SPEC, "Application Specific" },
1751
    { USB_CLASS_VENDOR_SPEC, "Vendor Specific" },
1752
    { USB_CLASS_STILL_IMAGE, "Still Image" },
1753
    { USB_CLASS_CSCID, "Smart Card" },
1754
    { USB_CLASS_CONTENT_SEC, "Content Security" },
1755
    { -1, NULL }
1756
};
1757

    
1758
static const char *usb_class_str(uint8_t class)
1759
{
1760
    const struct usb_class_info *p;
1761
    for(p = usb_class_info; p->class != -1; p++) {
1762
        if (p->class == class) {
1763
            break;
1764
        }
1765
    }
1766
    return p->class_name;
1767
}
1768

    
1769
static void usb_info_device(Monitor *mon, int bus_num, int addr, char *port,
1770
                            int class_id, int vendor_id, int product_id,
1771
                            const char *product_name,
1772
                            int speed)
1773
{
1774
    const char *class_str, *speed_str;
1775

    
1776
    switch(speed) {
1777
    case USB_SPEED_LOW:
1778
        speed_str = "1.5";
1779
        break;
1780
    case USB_SPEED_FULL:
1781
        speed_str = "12";
1782
        break;
1783
    case USB_SPEED_HIGH:
1784
        speed_str = "480";
1785
        break;
1786
    default:
1787
        speed_str = "?";
1788
        break;
1789
    }
1790

    
1791
    monitor_printf(mon, "  Bus %d, Addr %d, Port %s, Speed %s Mb/s\n",
1792
                   bus_num, addr, port, speed_str);
1793
    class_str = usb_class_str(class_id);
1794
    if (class_str) {
1795
        monitor_printf(mon, "    %s:", class_str);
1796
    } else {
1797
        monitor_printf(mon, "    Class %02x:", class_id);
1798
    }
1799
    monitor_printf(mon, " USB device %04x:%04x", vendor_id, product_id);
1800
    if (product_name[0] != '\0') {
1801
        monitor_printf(mon, ", %s", product_name);
1802
    }
1803
    monitor_printf(mon, "\n");
1804
}
1805

    
1806
static int usb_host_info_device(void *opaque, int bus_num, int addr,
1807
                                char *path, int class_id,
1808
                                int vendor_id, int product_id,
1809
                                const char *product_name,
1810
                                int speed)
1811
{
1812
    Monitor *mon = opaque;
1813

    
1814
    usb_info_device(mon, bus_num, addr, path, class_id, vendor_id, product_id,
1815
                    product_name, speed);
1816
    return 0;
1817
}
1818

    
1819
static void dec2str(int val, char *str, size_t size)
1820
{
1821
    if (val == 0) {
1822
        snprintf(str, size, "*");
1823
    } else {
1824
        snprintf(str, size, "%d", val);
1825
    }
1826
}
1827

    
1828
static void hex2str(int val, char *str, size_t size)
1829
{
1830
    if (val == 0) {
1831
        snprintf(str, size, "*");
1832
    } else {
1833
        snprintf(str, size, "%04x", val);
1834
    }
1835
}
1836

    
1837
void usb_host_info(Monitor *mon)
1838
{
1839
    struct USBAutoFilter *f;
1840
    struct USBHostDevice *s;
1841

    
1842
    usb_host_scan(mon, usb_host_info_device);
1843

    
1844
    if (QTAILQ_EMPTY(&hostdevs)) {
1845
        return;
1846
    }
1847

    
1848
    monitor_printf(mon, "  Auto filters:\n");
1849
    QTAILQ_FOREACH(s, &hostdevs, next) {
1850
        char bus[10], addr[10], vid[10], pid[10];
1851
        f = &s->match;
1852
        dec2str(f->bus_num, bus, sizeof(bus));
1853
        dec2str(f->addr, addr, sizeof(addr));
1854
        hex2str(f->vendor_id, vid, sizeof(vid));
1855
        hex2str(f->product_id, pid, sizeof(pid));
1856
        monitor_printf(mon, "    Bus %s, Addr %s, Port %s, ID %s:%s\n",
1857
                       bus, addr, f->port ? f->port : "*", vid, pid);
1858
    }
1859
}