Statistics
| Branch: | Revision:

root / hw / usb-uhci.c @ df0db221

History | View | Annotate | Download (30.6 kB)

1
/*
2
 * USB UHCI controller emulation
3
 *
4
 * Copyright (c) 2005 Fabrice Bellard
5
 *
6
 * Copyright (c) 2008 Max Krasnyansky
7
 *     Magor rewrite of the UHCI data structures parser and frame processor
8
 *     Support for fully async operation and multiple outstanding transactions
9
 *
10
 * Permission is hereby granted, free of charge, to any person obtaining a copy
11
 * of this software and associated documentation files (the "Software"), to deal
12
 * in the Software without restriction, including without limitation the rights
13
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
14
 * copies of the Software, and to permit persons to whom the Software is
15
 * furnished to do so, subject to the following conditions:
16
 *
17
 * The above copyright notice and this permission notice shall be included in
18
 * all copies or substantial portions of the Software.
19
 *
20
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
23
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
25
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
26
 * THE SOFTWARE.
27
 */
28
#include "hw.h"
29
#include "usb.h"
30
#include "pci.h"
31
#include "qemu-timer.h"
32
#include "usb-uhci.h"
33

    
34
//#define DEBUG
35
//#define DEBUG_DUMP_DATA
36

    
37
#define UHCI_CMD_FGR      (1 << 4)
38
#define UHCI_CMD_EGSM     (1 << 3)
39
#define UHCI_CMD_GRESET   (1 << 2)
40
#define UHCI_CMD_HCRESET  (1 << 1)
41
#define UHCI_CMD_RS       (1 << 0)
42

    
43
#define UHCI_STS_HCHALTED (1 << 5)
44
#define UHCI_STS_HCPERR   (1 << 4)
45
#define UHCI_STS_HSERR    (1 << 3)
46
#define UHCI_STS_RD       (1 << 2)
47
#define UHCI_STS_USBERR   (1 << 1)
48
#define UHCI_STS_USBINT   (1 << 0)
49

    
50
#define TD_CTRL_SPD     (1 << 29)
51
#define TD_CTRL_ERROR_SHIFT  27
52
#define TD_CTRL_IOS     (1 << 25)
53
#define TD_CTRL_IOC     (1 << 24)
54
#define TD_CTRL_ACTIVE  (1 << 23)
55
#define TD_CTRL_STALL   (1 << 22)
56
#define TD_CTRL_BABBLE  (1 << 20)
57
#define TD_CTRL_NAK     (1 << 19)
58
#define TD_CTRL_TIMEOUT (1 << 18)
59

    
60
#define UHCI_PORT_RESET (1 << 9)
61
#define UHCI_PORT_LSDA  (1 << 8)
62
#define UHCI_PORT_ENC   (1 << 3)
63
#define UHCI_PORT_EN    (1 << 2)
64
#define UHCI_PORT_CSC   (1 << 1)
65
#define UHCI_PORT_CCS   (1 << 0)
66

    
67
#define FRAME_TIMER_FREQ 1000
68

    
69
#define FRAME_MAX_LOOPS  100
70

    
71
#define NB_PORTS 2
72

    
73
#ifdef DEBUG
74
#define DPRINTF printf
75

    
76
static const char *pid2str(int pid)
77
{
78
    switch (pid) {
79
    case USB_TOKEN_SETUP: return "SETUP";
80
    case USB_TOKEN_IN:    return "IN";
81
    case USB_TOKEN_OUT:   return "OUT";
82
    }
83
    return "?";
84
}
85

    
86
#else
87
#define DPRINTF(...)
88
#endif
89

    
90
#ifdef DEBUG_DUMP_DATA
91
static void dump_data(const uint8_t *data, int len)
92
{
93
    int i;
94

    
95
    printf("uhci: data: ");
96
    for(i = 0; i < len; i++)
97
        printf(" %02x", data[i]);
98
    printf("\n");
99
}
100
#else
101
static void dump_data(const uint8_t *data, int len) {}
102
#endif
103

    
104
/* 
105
 * Pending async transaction.
106
 * 'packet' must be the first field because completion
107
 * handler does "(UHCIAsync *) pkt" cast.
108
 */
109
typedef struct UHCIAsync {
110
    USBPacket packet;
111
    struct UHCIAsync *next;
112
    uint32_t  td;
113
    uint32_t  token;
114
    int8_t    valid;
115
    uint8_t   isoc;
116
    uint8_t   done;
117
    uint8_t   buffer[2048];
118
} UHCIAsync;
119

    
120
typedef struct UHCIPort {
121
    USBPort port;
122
    uint16_t ctrl;
123
} UHCIPort;
124

    
125
typedef struct UHCIState {
126
    PCIDevice dev;
127
    USBBus bus;
128
    uint16_t cmd; /* cmd register */
129
    uint16_t status;
130
    uint16_t intr; /* interrupt enable register */
131
    uint16_t frnum; /* frame number */
132
    uint32_t fl_base_addr; /* frame list base address */
133
    uint8_t sof_timing;
134
    uint8_t status2; /* bit 0 and 1 are used to generate UHCI_STS_USBINT */
135
    int64_t expire_time;
136
    QEMUTimer *frame_timer;
137
    UHCIPort ports[NB_PORTS];
138

    
139
    /* Interrupts that should be raised at the end of the current frame.  */
140
    uint32_t pending_int_mask;
141

    
142
    /* Active packets */
143
    UHCIAsync *async_pending;
144
    UHCIAsync *async_pool;
145
    uint8_t num_ports_vmstate;
146
} UHCIState;
147

    
148
typedef struct UHCI_TD {
149
    uint32_t link;
150
    uint32_t ctrl; /* see TD_CTRL_xxx */
151
    uint32_t token;
152
    uint32_t buffer;
153
} UHCI_TD;
154

    
155
typedef struct UHCI_QH {
156
    uint32_t link;
157
    uint32_t el_link;
158
} UHCI_QH;
159

    
160
static UHCIAsync *uhci_async_alloc(UHCIState *s)
161
{
162
    UHCIAsync *async = qemu_malloc(sizeof(UHCIAsync));
163

    
164
    memset(&async->packet, 0, sizeof(async->packet));
165
    async->valid = 0;
166
    async->td    = 0;
167
    async->token = 0;
168
    async->done  = 0;
169
    async->isoc  = 0;
170
    async->next  = NULL;
171

    
172
    return async;
173
}
174

    
175
static void uhci_async_free(UHCIState *s, UHCIAsync *async)
176
{
177
    qemu_free(async);
178
}
179

    
180
static void uhci_async_link(UHCIState *s, UHCIAsync *async)
181
{
182
    async->next = s->async_pending;
183
    s->async_pending = async;
184
}
185

    
186
static void uhci_async_unlink(UHCIState *s, UHCIAsync *async)
187
{
188
    UHCIAsync *curr = s->async_pending;
189
    UHCIAsync **prev = &s->async_pending;
190

    
191
    while (curr) {
192
        if (curr == async) {
193
            *prev = curr->next;
194
            return;
195
        }
196

    
197
        prev = &curr->next;
198
        curr = curr->next;
199
    }
200
}
201

    
202
static void uhci_async_cancel(UHCIState *s, UHCIAsync *async)
203
{
204
    DPRINTF("uhci: cancel td 0x%x token 0x%x done %u\n",
205
           async->td, async->token, async->done);
206

    
207
    if (!async->done)
208
        usb_cancel_packet(&async->packet);
209
    uhci_async_free(s, async);
210
}
211

    
212
/*
213
 * Mark all outstanding async packets as invalid.
214
 * This is used for canceling them when TDs are removed by the HCD.
215
 */
216
static UHCIAsync *uhci_async_validate_begin(UHCIState *s)
217
{
218
    UHCIAsync *async = s->async_pending;
219

    
220
    while (async) {
221
        async->valid--;
222
        async = async->next;
223
    }
224
    return NULL;
225
}
226

    
227
/*
228
 * Cancel async packets that are no longer valid
229
 */
230
static void uhci_async_validate_end(UHCIState *s)
231
{
232
    UHCIAsync *curr = s->async_pending;
233
    UHCIAsync **prev = &s->async_pending;
234
    UHCIAsync *next;
235

    
236
    while (curr) {
237
        if (curr->valid > 0) {
238
            prev = &curr->next;
239
            curr = curr->next;
240
            continue;
241
        }
242

    
243
        next = curr->next;
244

    
245
        /* Unlink */
246
        *prev = next;
247

    
248
        uhci_async_cancel(s, curr);
249

    
250
        curr = next;
251
    }
252
}
253

    
254
static void uhci_async_cancel_all(UHCIState *s)
255
{
256
    UHCIAsync *curr = s->async_pending;
257
    UHCIAsync *next;
258

    
259
    while (curr) {
260
        next = curr->next;
261

    
262
        uhci_async_cancel(s, curr);
263

    
264
        curr = next;
265
    }
266

    
267
    s->async_pending = NULL;
268
}
269

    
270
static UHCIAsync *uhci_async_find_td(UHCIState *s, uint32_t addr, uint32_t token)
271
{
272
    UHCIAsync *async = s->async_pending;
273
    UHCIAsync *match = NULL;
274
    int count = 0;
275

    
276
    /*
277
     * We're looking for the best match here. ie both td addr and token.
278
     * Otherwise we return last good match. ie just token.
279
     * It's ok to match just token because it identifies the transaction
280
     * rather well, token includes: device addr, endpoint, size, etc.
281
     *
282
     * Also since we queue async transactions in reverse order by returning
283
     * last good match we restores the order.
284
     *
285
     * It's expected that we wont have a ton of outstanding transactions.
286
     * If we ever do we'd want to optimize this algorithm.
287
     */
288

    
289
    while (async) {
290
        if (async->token == token) {
291
            /* Good match */
292
            match = async;
293

    
294
            if (async->td == addr) {
295
                /* Best match */
296
                break;
297
            }
298
        }
299

    
300
        async = async->next;
301
        count++;
302
    }
303

    
304
    if (count > 64)
305
        fprintf(stderr, "uhci: warning lots of async transactions\n");
306

    
307
    return match;
308
}
309

    
310
static void uhci_attach(USBPort *port1, USBDevice *dev);
311

    
312
static void uhci_update_irq(UHCIState *s)
313
{
314
    int level;
315
    if (((s->status2 & 1) && (s->intr & (1 << 2))) ||
316
        ((s->status2 & 2) && (s->intr & (1 << 3))) ||
317
        ((s->status & UHCI_STS_USBERR) && (s->intr & (1 << 0))) ||
318
        ((s->status & UHCI_STS_RD) && (s->intr & (1 << 1))) ||
319
        (s->status & UHCI_STS_HSERR) ||
320
        (s->status & UHCI_STS_HCPERR)) {
321
        level = 1;
322
    } else {
323
        level = 0;
324
    }
325
    qemu_set_irq(s->dev.irq[3], level);
326
}
327

    
328
static void uhci_reset(void *opaque)
329
{
330
    UHCIState *s = opaque;
331
    uint8_t *pci_conf;
332
    int i;
333
    UHCIPort *port;
334

    
335
    DPRINTF("uhci: full reset\n");
336

    
337
    pci_conf = s->dev.config;
338

    
339
    pci_conf[0x6a] = 0x01; /* usb clock */
340
    pci_conf[0x6b] = 0x00;
341
    s->cmd = 0;
342
    s->status = 0;
343
    s->status2 = 0;
344
    s->intr = 0;
345
    s->fl_base_addr = 0;
346
    s->sof_timing = 64;
347

    
348
    for(i = 0; i < NB_PORTS; i++) {
349
        port = &s->ports[i];
350
        port->ctrl = 0x0080;
351
        if (port->port.dev)
352
            uhci_attach(&port->port, port->port.dev);
353
    }
354

    
355
    uhci_async_cancel_all(s);
356
}
357

    
358
static void uhci_pre_save(void *opaque)
359
{
360
    UHCIState *s = opaque;
361

    
362
    uhci_async_cancel_all(s);
363
}
364

    
365
static const VMStateDescription vmstate_uhci_port = {
366
    .name = "uhci port",
367
    .version_id = 1,
368
    .minimum_version_id = 1,
369
    .minimum_version_id_old = 1,
370
    .fields      = (VMStateField []) {
371
        VMSTATE_UINT16(ctrl, UHCIPort),
372
        VMSTATE_END_OF_LIST()
373
    }
374
};
375

    
376
static const VMStateDescription vmstate_uhci = {
377
    .name = "uhci",
378
    .version_id = 2,
379
    .minimum_version_id = 1,
380
    .minimum_version_id_old = 1,
381
    .pre_save = uhci_pre_save,
382
    .fields      = (VMStateField []) {
383
        VMSTATE_PCI_DEVICE(dev, UHCIState),
384
        VMSTATE_UINT8_EQUAL(num_ports_vmstate, UHCIState),
385
        VMSTATE_STRUCT_ARRAY(ports, UHCIState, NB_PORTS, 1,
386
                             vmstate_uhci_port, UHCIPort),
387
        VMSTATE_UINT16(cmd, UHCIState),
388
        VMSTATE_UINT16(status, UHCIState),
389
        VMSTATE_UINT16(intr, UHCIState),
390
        VMSTATE_UINT16(frnum, UHCIState),
391
        VMSTATE_UINT32(fl_base_addr, UHCIState),
392
        VMSTATE_UINT8(sof_timing, UHCIState),
393
        VMSTATE_UINT8(status2, UHCIState),
394
        VMSTATE_TIMER(frame_timer, UHCIState),
395
        VMSTATE_INT64_V(expire_time, UHCIState, 2),
396
        VMSTATE_END_OF_LIST()
397
    }
398
};
399

    
400
static void uhci_ioport_writeb(void *opaque, uint32_t addr, uint32_t val)
401
{
402
    UHCIState *s = opaque;
403

    
404
    addr &= 0x1f;
405
    switch(addr) {
406
    case 0x0c:
407
        s->sof_timing = val;
408
        break;
409
    }
410
}
411

    
412
static uint32_t uhci_ioport_readb(void *opaque, uint32_t addr)
413
{
414
    UHCIState *s = opaque;
415
    uint32_t val;
416

    
417
    addr &= 0x1f;
418
    switch(addr) {
419
    case 0x0c:
420
        val = s->sof_timing;
421
        break;
422
    default:
423
        val = 0xff;
424
        break;
425
    }
426
    return val;
427
}
428

    
429
static void uhci_ioport_writew(void *opaque, uint32_t addr, uint32_t val)
430
{
431
    UHCIState *s = opaque;
432

    
433
    addr &= 0x1f;
434
    DPRINTF("uhci: writew port=0x%04x val=0x%04x\n", addr, val);
435

    
436
    switch(addr) {
437
    case 0x00:
438
        if ((val & UHCI_CMD_RS) && !(s->cmd & UHCI_CMD_RS)) {
439
            /* start frame processing */
440
            qemu_mod_timer(s->frame_timer, qemu_get_clock(vm_clock));
441
            s->status &= ~UHCI_STS_HCHALTED;
442
        } else if (!(val & UHCI_CMD_RS)) {
443
            s->status |= UHCI_STS_HCHALTED;
444
        }
445
        if (val & UHCI_CMD_GRESET) {
446
            UHCIPort *port;
447
            USBDevice *dev;
448
            int i;
449

    
450
            /* send reset on the USB bus */
451
            for(i = 0; i < NB_PORTS; i++) {
452
                port = &s->ports[i];
453
                dev = port->port.dev;
454
                if (dev) {
455
                    usb_send_msg(dev, USB_MSG_RESET);
456
                }
457
            }
458
            uhci_reset(s);
459
            return;
460
        }
461
        if (val & UHCI_CMD_HCRESET) {
462
            uhci_reset(s);
463
            return;
464
        }
465
        s->cmd = val;
466
        break;
467
    case 0x02:
468
        s->status &= ~val;
469
        /* XXX: the chip spec is not coherent, so we add a hidden
470
           register to distinguish between IOC and SPD */
471
        if (val & UHCI_STS_USBINT)
472
            s->status2 = 0;
473
        uhci_update_irq(s);
474
        break;
475
    case 0x04:
476
        s->intr = val;
477
        uhci_update_irq(s);
478
        break;
479
    case 0x06:
480
        if (s->status & UHCI_STS_HCHALTED)
481
            s->frnum = val & 0x7ff;
482
        break;
483
    case 0x10 ... 0x1f:
484
        {
485
            UHCIPort *port;
486
            USBDevice *dev;
487
            int n;
488

    
489
            n = (addr >> 1) & 7;
490
            if (n >= NB_PORTS)
491
                return;
492
            port = &s->ports[n];
493
            dev = port->port.dev;
494
            if (dev) {
495
                /* port reset */
496
                if ( (val & UHCI_PORT_RESET) &&
497
                     !(port->ctrl & UHCI_PORT_RESET) ) {
498
                    usb_send_msg(dev, USB_MSG_RESET);
499
                }
500
            }
501
            port->ctrl = (port->ctrl & 0x01fb) | (val & ~0x01fb);
502
            /* some bits are reset when a '1' is written to them */
503
            port->ctrl &= ~(val & 0x000a);
504
        }
505
        break;
506
    }
507
}
508

    
509
static uint32_t uhci_ioport_readw(void *opaque, uint32_t addr)
510
{
511
    UHCIState *s = opaque;
512
    uint32_t val;
513

    
514
    addr &= 0x1f;
515
    switch(addr) {
516
    case 0x00:
517
        val = s->cmd;
518
        break;
519
    case 0x02:
520
        val = s->status;
521
        break;
522
    case 0x04:
523
        val = s->intr;
524
        break;
525
    case 0x06:
526
        val = s->frnum;
527
        break;
528
    case 0x10 ... 0x1f:
529
        {
530
            UHCIPort *port;
531
            int n;
532
            n = (addr >> 1) & 7;
533
            if (n >= NB_PORTS)
534
                goto read_default;
535
            port = &s->ports[n];
536
            val = port->ctrl;
537
        }
538
        break;
539
    default:
540
    read_default:
541
        val = 0xff7f; /* disabled port */
542
        break;
543
    }
544

    
545
    DPRINTF("uhci: readw port=0x%04x val=0x%04x\n", addr, val);
546

    
547
    return val;
548
}
549

    
550
static void uhci_ioport_writel(void *opaque, uint32_t addr, uint32_t val)
551
{
552
    UHCIState *s = opaque;
553

    
554
    addr &= 0x1f;
555
    DPRINTF("uhci: writel port=0x%04x val=0x%08x\n", addr, val);
556

    
557
    switch(addr) {
558
    case 0x08:
559
        s->fl_base_addr = val & ~0xfff;
560
        break;
561
    }
562
}
563

    
564
static uint32_t uhci_ioport_readl(void *opaque, uint32_t addr)
565
{
566
    UHCIState *s = opaque;
567
    uint32_t val;
568

    
569
    addr &= 0x1f;
570
    switch(addr) {
571
    case 0x08:
572
        val = s->fl_base_addr;
573
        break;
574
    default:
575
        val = 0xffffffff;
576
        break;
577
    }
578
    return val;
579
}
580

    
581
/* signal resume if controller suspended */
582
static void uhci_resume (void *opaque)
583
{
584
    UHCIState *s = (UHCIState *)opaque;
585

    
586
    if (!s)
587
        return;
588

    
589
    if (s->cmd & UHCI_CMD_EGSM) {
590
        s->cmd |= UHCI_CMD_FGR;
591
        s->status |= UHCI_STS_RD;
592
        uhci_update_irq(s);
593
    }
594
}
595

    
596
static void uhci_attach(USBPort *port1, USBDevice *dev)
597
{
598
    UHCIState *s = port1->opaque;
599
    UHCIPort *port = &s->ports[port1->index];
600

    
601
    if (dev) {
602
        if (port->port.dev) {
603
            usb_attach(port1, NULL);
604
        }
605
        /* set connect status */
606
        port->ctrl |= UHCI_PORT_CCS | UHCI_PORT_CSC;
607

    
608
        /* update speed */
609
        if (dev->speed == USB_SPEED_LOW)
610
            port->ctrl |= UHCI_PORT_LSDA;
611
        else
612
            port->ctrl &= ~UHCI_PORT_LSDA;
613

    
614
        uhci_resume(s);
615

    
616
        port->port.dev = dev;
617
        /* send the attach message */
618
        usb_send_msg(dev, USB_MSG_ATTACH);
619
    } else {
620
        /* set connect status */
621
        if (port->ctrl & UHCI_PORT_CCS) {
622
            port->ctrl &= ~UHCI_PORT_CCS;
623
            port->ctrl |= UHCI_PORT_CSC;
624
        }
625
        /* disable port */
626
        if (port->ctrl & UHCI_PORT_EN) {
627
            port->ctrl &= ~UHCI_PORT_EN;
628
            port->ctrl |= UHCI_PORT_ENC;
629
        }
630

    
631
        uhci_resume(s);
632

    
633
        dev = port->port.dev;
634
        if (dev) {
635
            /* send the detach message */
636
            usb_send_msg(dev, USB_MSG_DETACH);
637
        }
638
        port->port.dev = NULL;
639
    }
640
}
641

    
642
static int uhci_broadcast_packet(UHCIState *s, USBPacket *p)
643
{
644
    int i, ret;
645

    
646
    DPRINTF("uhci: packet enter. pid %s addr 0x%02x ep %d len %d\n",
647
           pid2str(p->pid), p->devaddr, p->devep, p->len);
648
    if (p->pid == USB_TOKEN_OUT || p->pid == USB_TOKEN_SETUP)
649
        dump_data(p->data, p->len);
650

    
651
    ret = USB_RET_NODEV;
652
    for (i = 0; i < NB_PORTS && ret == USB_RET_NODEV; i++) {
653
        UHCIPort *port = &s->ports[i];
654
        USBDevice *dev = port->port.dev;
655

    
656
        if (dev && (port->ctrl & UHCI_PORT_EN))
657
            ret = dev->info->handle_packet(dev, p);
658
    }
659

    
660
    DPRINTF("uhci: packet exit. ret %d len %d\n", ret, p->len);
661
    if (p->pid == USB_TOKEN_IN && ret > 0)
662
        dump_data(p->data, ret);
663

    
664
    return ret;
665
}
666

    
667
static void uhci_async_complete(USBPacket * packet, void *opaque);
668
static void uhci_process_frame(UHCIState *s);
669

    
670
/* return -1 if fatal error (frame must be stopped)
671
          0 if TD successful
672
          1 if TD unsuccessful or inactive
673
*/
674
static int uhci_complete_td(UHCIState *s, UHCI_TD *td, UHCIAsync *async, uint32_t *int_mask)
675
{
676
    int len = 0, max_len, err, ret;
677
    uint8_t pid;
678

    
679
    max_len = ((td->token >> 21) + 1) & 0x7ff;
680
    pid = td->token & 0xff;
681

    
682
    ret = async->packet.len;
683

    
684
    if (td->ctrl & TD_CTRL_IOS)
685
        td->ctrl &= ~TD_CTRL_ACTIVE;
686

    
687
    if (ret < 0)
688
        goto out;
689

    
690
    len = async->packet.len;
691
    td->ctrl = (td->ctrl & ~0x7ff) | ((len - 1) & 0x7ff);
692

    
693
    /* The NAK bit may have been set by a previous frame, so clear it
694
       here.  The docs are somewhat unclear, but win2k relies on this
695
       behavior.  */
696
    td->ctrl &= ~(TD_CTRL_ACTIVE | TD_CTRL_NAK);
697
    if (td->ctrl & TD_CTRL_IOC)
698
        *int_mask |= 0x01;
699

    
700
    if (pid == USB_TOKEN_IN) {
701
        if (len > max_len) {
702
            ret = USB_RET_BABBLE;
703
            goto out;
704
        }
705

    
706
        if (len > 0) {
707
            /* write the data back */
708
            cpu_physical_memory_write(td->buffer, async->buffer, len);
709
        }
710

    
711
        if ((td->ctrl & TD_CTRL_SPD) && len < max_len) {
712
            *int_mask |= 0x02;
713
            /* short packet: do not update QH */
714
            DPRINTF("uhci: short packet. td 0x%x token 0x%x\n", async->td, async->token);
715
            return 1;
716
        }
717
    }
718

    
719
    /* success */
720
    return 0;
721

    
722
out:
723
    switch(ret) {
724
    case USB_RET_STALL:
725
        td->ctrl |= TD_CTRL_STALL;
726
        td->ctrl &= ~TD_CTRL_ACTIVE;
727
        return 1;
728

    
729
    case USB_RET_BABBLE:
730
        td->ctrl |= TD_CTRL_BABBLE | TD_CTRL_STALL;
731
        td->ctrl &= ~TD_CTRL_ACTIVE;
732
        /* frame interrupted */
733
        return -1;
734

    
735
    case USB_RET_NAK:
736
        td->ctrl |= TD_CTRL_NAK;
737
        if (pid == USB_TOKEN_SETUP)
738
            break;
739
        return 1;
740

    
741
    case USB_RET_NODEV:
742
    default:
743
        break;
744
    }
745

    
746
    /* Retry the TD if error count is not zero */
747

    
748
    td->ctrl |= TD_CTRL_TIMEOUT;
749
    err = (td->ctrl >> TD_CTRL_ERROR_SHIFT) & 3;
750
    if (err != 0) {
751
        err--;
752
        if (err == 0) {
753
            td->ctrl &= ~TD_CTRL_ACTIVE;
754
            s->status |= UHCI_STS_USBERR;
755
            if (td->ctrl & TD_CTRL_IOC)
756
                *int_mask |= 0x01;
757
            uhci_update_irq(s);
758
        }
759
    }
760
    td->ctrl = (td->ctrl & ~(3 << TD_CTRL_ERROR_SHIFT)) |
761
        (err << TD_CTRL_ERROR_SHIFT);
762
    return 1;
763
}
764

    
765
static int uhci_handle_td(UHCIState *s, uint32_t addr, UHCI_TD *td, uint32_t *int_mask)
766
{
767
    UHCIAsync *async;
768
    int len = 0, max_len;
769
    uint8_t pid, isoc;
770
    uint32_t token;
771

    
772
    /* Is active ? */
773
    if (!(td->ctrl & TD_CTRL_ACTIVE))
774
        return 1;
775

    
776
    /* token field is not unique for isochronous requests,
777
     * so use the destination buffer 
778
     */
779
    if (td->ctrl & TD_CTRL_IOS) {
780
        token = td->buffer;
781
        isoc = 1;
782
    } else {
783
        token = td->token;
784
        isoc = 0;
785
    }
786

    
787
    async = uhci_async_find_td(s, addr, token);
788
    if (async) {
789
        /* Already submitted */
790
        async->valid = 32;
791

    
792
        if (!async->done)
793
            return 1;
794

    
795
        uhci_async_unlink(s, async);
796
        goto done;
797
    }
798

    
799
    /* Allocate new packet */
800
    async = uhci_async_alloc(s);
801
    if (!async)
802
        return 1;
803

    
804
    /* valid needs to be large enough to handle 10 frame delay
805
     * for initial isochronous requests
806
     */
807
    async->valid = 32;
808
    async->td    = addr;
809
    async->token = token;
810
    async->isoc  = isoc;
811

    
812
    max_len = ((td->token >> 21) + 1) & 0x7ff;
813
    pid = td->token & 0xff;
814

    
815
    async->packet.pid     = pid;
816
    async->packet.devaddr = (td->token >> 8) & 0x7f;
817
    async->packet.devep   = (td->token >> 15) & 0xf;
818
    async->packet.data    = async->buffer;
819
    async->packet.len     = max_len;
820
    async->packet.complete_cb     = uhci_async_complete;
821
    async->packet.complete_opaque = s;
822

    
823
    switch(pid) {
824
    case USB_TOKEN_OUT:
825
    case USB_TOKEN_SETUP:
826
        cpu_physical_memory_read(td->buffer, async->buffer, max_len);
827
        len = uhci_broadcast_packet(s, &async->packet);
828
        if (len >= 0)
829
            len = max_len;
830
        break;
831

    
832
    case USB_TOKEN_IN:
833
        len = uhci_broadcast_packet(s, &async->packet);
834
        break;
835

    
836
    default:
837
        /* invalid pid : frame interrupted */
838
        uhci_async_free(s, async);
839
        s->status |= UHCI_STS_HCPERR;
840
        uhci_update_irq(s);
841
        return -1;
842
    }
843
 
844
    if (len == USB_RET_ASYNC) {
845
        uhci_async_link(s, async);
846
        return 2;
847
    }
848

    
849
    async->packet.len = len;
850

    
851
done:
852
    len = uhci_complete_td(s, td, async, int_mask);
853
    uhci_async_free(s, async);
854
    return len;
855
}
856

    
857
static void uhci_async_complete(USBPacket *packet, void *opaque)
858
{
859
    UHCIState *s = opaque;
860
    UHCIAsync *async = (UHCIAsync *) packet;
861

    
862
    DPRINTF("uhci: async complete. td 0x%x token 0x%x\n", async->td, async->token);
863

    
864
    if (async->isoc) {
865
        UHCI_TD td;
866
        uint32_t link = async->td;
867
        uint32_t int_mask = 0, val;
868

    
869
        cpu_physical_memory_read(link & ~0xf, (uint8_t *) &td, sizeof(td));
870
        le32_to_cpus(&td.link);
871
        le32_to_cpus(&td.ctrl);
872
        le32_to_cpus(&td.token);
873
        le32_to_cpus(&td.buffer);
874

    
875
        uhci_async_unlink(s, async);
876
        uhci_complete_td(s, &td, async, &int_mask);
877
        s->pending_int_mask |= int_mask;
878

    
879
        /* update the status bits of the TD */
880
        val = cpu_to_le32(td.ctrl);
881
        cpu_physical_memory_write((link & ~0xf) + 4,
882
                                  (const uint8_t *)&val, sizeof(val));
883
        uhci_async_free(s, async);
884
    } else {
885
        async->done = 1;
886
        uhci_process_frame(s);
887
    }
888
}
889

    
890
static int is_valid(uint32_t link)
891
{
892
    return (link & 1) == 0;
893
}
894

    
895
static int is_qh(uint32_t link)
896
{
897
    return (link & 2) != 0;
898
}
899

    
900
static int depth_first(uint32_t link)
901
{
902
    return (link & 4) != 0;
903
}
904

    
905
/* QH DB used for detecting QH loops */
906
#define UHCI_MAX_QUEUES 128
907
typedef struct {
908
    uint32_t addr[UHCI_MAX_QUEUES];
909
    int      count;
910
} QhDb;
911

    
912
static void qhdb_reset(QhDb *db)
913
{
914
    db->count = 0;
915
}
916

    
917
/* Add QH to DB. Returns 1 if already present or DB is full. */
918
static int qhdb_insert(QhDb *db, uint32_t addr)
919
{
920
    int i;
921
    for (i = 0; i < db->count; i++)
922
        if (db->addr[i] == addr)
923
            return 1;
924

    
925
    if (db->count >= UHCI_MAX_QUEUES)
926
        return 1;
927

    
928
    db->addr[db->count++] = addr;
929
    return 0;
930
}
931

    
932
static void uhci_process_frame(UHCIState *s)
933
{
934
    uint32_t frame_addr, link, old_td_ctrl, val, int_mask;
935
    uint32_t curr_qh;
936
    int cnt, ret;
937
    UHCI_TD td;
938
    UHCI_QH qh;
939
    QhDb qhdb;
940

    
941
    frame_addr = s->fl_base_addr + ((s->frnum & 0x3ff) << 2);
942

    
943
    DPRINTF("uhci: processing frame %d addr 0x%x\n" , s->frnum, frame_addr);
944

    
945
    cpu_physical_memory_read(frame_addr, (uint8_t *)&link, 4);
946
    le32_to_cpus(&link);
947

    
948
    int_mask = 0;
949
    curr_qh  = 0;
950

    
951
    qhdb_reset(&qhdb);
952

    
953
    for (cnt = FRAME_MAX_LOOPS; is_valid(link) && cnt; cnt--) {
954
        if (is_qh(link)) {
955
            /* QH */
956

    
957
            if (qhdb_insert(&qhdb, link)) {
958
                /*
959
                 * We're going in circles. Which is not a bug because
960
                 * HCD is allowed to do that as part of the BW management. 
961
                 * In our case though it makes no sense to spin here. Sync transations 
962
                 * are already done, and async completion handler will re-process 
963
                 * the frame when something is ready.
964
                 */
965
                DPRINTF("uhci: detected loop. qh 0x%x\n", link);
966
                break;
967
            }
968

    
969
            cpu_physical_memory_read(link & ~0xf, (uint8_t *) &qh, sizeof(qh));
970
            le32_to_cpus(&qh.link);
971
            le32_to_cpus(&qh.el_link);
972

    
973
            DPRINTF("uhci: QH 0x%x load. link 0x%x elink 0x%x\n",
974
                    link, qh.link, qh.el_link);
975

    
976
            if (!is_valid(qh.el_link)) {
977
                /* QH w/o elements */
978
                curr_qh = 0;
979
                link = qh.link;
980
            } else {
981
                /* QH with elements */
982
                    curr_qh = link;
983
                    link = qh.el_link;
984
            }
985
            continue;
986
        }
987

    
988
        /* TD */
989
        cpu_physical_memory_read(link & ~0xf, (uint8_t *) &td, sizeof(td));
990
        le32_to_cpus(&td.link);
991
        le32_to_cpus(&td.ctrl);
992
        le32_to_cpus(&td.token);
993
        le32_to_cpus(&td.buffer);
994

    
995
        DPRINTF("uhci: TD 0x%x load. link 0x%x ctrl 0x%x token 0x%x qh 0x%x\n", 
996
                link, td.link, td.ctrl, td.token, curr_qh);
997

    
998
        old_td_ctrl = td.ctrl;
999
        ret = uhci_handle_td(s, link, &td, &int_mask);
1000
        if (old_td_ctrl != td.ctrl) {
1001
            /* update the status bits of the TD */
1002
            val = cpu_to_le32(td.ctrl);
1003
            cpu_physical_memory_write((link & ~0xf) + 4,
1004
                                      (const uint8_t *)&val, sizeof(val));
1005
        }
1006

    
1007
        if (ret < 0) {
1008
            /* interrupted frame */
1009
            break;
1010
        }
1011

    
1012
        if (ret == 2 || ret == 1) {
1013
            DPRINTF("uhci: TD 0x%x %s. link 0x%x ctrl 0x%x token 0x%x qh 0x%x\n",
1014
                    link, ret == 2 ? "pend" : "skip",
1015
                    td.link, td.ctrl, td.token, curr_qh);
1016

    
1017
            link = curr_qh ? qh.link : td.link;
1018
            continue;
1019
        }
1020

    
1021
        /* completed TD */
1022

    
1023
        DPRINTF("uhci: TD 0x%x done. link 0x%x ctrl 0x%x token 0x%x qh 0x%x\n", 
1024
                link, td.link, td.ctrl, td.token, curr_qh);
1025

    
1026
        link = td.link;
1027

    
1028
        if (curr_qh) {
1029
            /* update QH element link */
1030
            qh.el_link = link;
1031
            val = cpu_to_le32(qh.el_link);
1032
            cpu_physical_memory_write((curr_qh & ~0xf) + 4,
1033
                                          (const uint8_t *)&val, sizeof(val));
1034

    
1035
            if (!depth_first(link)) {
1036
               /* done with this QH */
1037

    
1038
               DPRINTF("uhci: QH 0x%x done. link 0x%x elink 0x%x\n",
1039
                       curr_qh, qh.link, qh.el_link);
1040

    
1041
               curr_qh = 0;
1042
               link    = qh.link;
1043
            }
1044
        }
1045

    
1046
        /* go to the next entry */
1047
    }
1048

    
1049
    s->pending_int_mask |= int_mask;
1050
}
1051

    
1052
static void uhci_frame_timer(void *opaque)
1053
{
1054
    UHCIState *s = opaque;
1055

    
1056
    /* prepare the timer for the next frame */
1057
    s->expire_time += (get_ticks_per_sec() / FRAME_TIMER_FREQ);
1058

    
1059
    if (!(s->cmd & UHCI_CMD_RS)) {
1060
        /* Full stop */
1061
        qemu_del_timer(s->frame_timer);
1062
        /* set hchalted bit in status - UHCI11D 2.1.2 */
1063
        s->status |= UHCI_STS_HCHALTED;
1064

    
1065
        DPRINTF("uhci: halted\n");
1066
        return;
1067
    }
1068

    
1069
    /* Complete the previous frame */
1070
    if (s->pending_int_mask) {
1071
        s->status2 |= s->pending_int_mask;
1072
        s->status  |= UHCI_STS_USBINT;
1073
        uhci_update_irq(s);
1074
    }
1075
    s->pending_int_mask = 0;
1076

    
1077
    /* Start new frame */
1078
    s->frnum = (s->frnum + 1) & 0x7ff;
1079

    
1080
    DPRINTF("uhci: new frame #%u\n" , s->frnum);
1081

    
1082
    uhci_async_validate_begin(s);
1083

    
1084
    uhci_process_frame(s);
1085

    
1086
    uhci_async_validate_end(s);
1087

    
1088
    qemu_mod_timer(s->frame_timer, s->expire_time);
1089
}
1090

    
1091
static void uhci_map(PCIDevice *pci_dev, int region_num,
1092
                    pcibus_t addr, pcibus_t size, int type)
1093
{
1094
    UHCIState *s = (UHCIState *)pci_dev;
1095

    
1096
    register_ioport_write(addr, 32, 2, uhci_ioport_writew, s);
1097
    register_ioport_read(addr, 32, 2, uhci_ioport_readw, s);
1098
    register_ioport_write(addr, 32, 4, uhci_ioport_writel, s);
1099
    register_ioport_read(addr, 32, 4, uhci_ioport_readl, s);
1100
    register_ioport_write(addr, 32, 1, uhci_ioport_writeb, s);
1101
    register_ioport_read(addr, 32, 1, uhci_ioport_readb, s);
1102
}
1103

    
1104
static int usb_uhci_common_initfn(UHCIState *s)
1105
{
1106
    uint8_t *pci_conf = s->dev.config;
1107
    int i;
1108

    
1109
    pci_conf[PCI_REVISION_ID] = 0x01; // revision number
1110
    pci_conf[PCI_CLASS_PROG] = 0x00;
1111
    pci_config_set_class(pci_conf, PCI_CLASS_SERIAL_USB);
1112
    /* TODO: reset value should be 0. */
1113
    pci_conf[PCI_INTERRUPT_PIN] = 4; // interrupt pin 3
1114
    pci_conf[0x60] = 0x10; // release number
1115

    
1116
    usb_bus_new(&s->bus, &s->dev.qdev);
1117
    for(i = 0; i < NB_PORTS; i++) {
1118
        usb_register_port(&s->bus, &s->ports[i].port, s, i, uhci_attach);
1119
    }
1120
    s->frame_timer = qemu_new_timer(vm_clock, uhci_frame_timer, s);
1121
    s->expire_time = qemu_get_clock(vm_clock) +
1122
        (get_ticks_per_sec() / FRAME_TIMER_FREQ);
1123
    s->num_ports_vmstate = NB_PORTS;
1124

    
1125
    qemu_register_reset(uhci_reset, s);
1126

    
1127
    /* Use region 4 for consistency with real hardware.  BSD guests seem
1128
       to rely on this.  */
1129
    pci_register_bar(&s->dev, 4, 0x20,
1130
                           PCI_BASE_ADDRESS_SPACE_IO, uhci_map);
1131

    
1132
    return 0;
1133
}
1134

    
1135
static int usb_uhci_piix3_initfn(PCIDevice *dev)
1136
{
1137
    UHCIState *s = DO_UPCAST(UHCIState, dev, dev);
1138
    uint8_t *pci_conf = s->dev.config;
1139

    
1140
    pci_config_set_vendor_id(pci_conf, PCI_VENDOR_ID_INTEL);
1141
    pci_config_set_device_id(pci_conf, PCI_DEVICE_ID_INTEL_82371SB_2);
1142
    return usb_uhci_common_initfn(s);
1143
}
1144

    
1145
static int usb_uhci_piix4_initfn(PCIDevice *dev)
1146
{
1147
    UHCIState *s = DO_UPCAST(UHCIState, dev, dev);
1148
    uint8_t *pci_conf = s->dev.config;
1149

    
1150
    pci_config_set_vendor_id(pci_conf, PCI_VENDOR_ID_INTEL);
1151
    pci_config_set_device_id(pci_conf, PCI_DEVICE_ID_INTEL_82371AB_2);
1152
    return usb_uhci_common_initfn(s);
1153
}
1154

    
1155
static int usb_uhci_vt82c686b_initfn(PCIDevice *dev)
1156
{
1157
    UHCIState *s = DO_UPCAST(UHCIState, dev, dev);
1158
    uint8_t *pci_conf = s->dev.config;
1159

    
1160
    pci_config_set_vendor_id(pci_conf, PCI_VENDOR_ID_VIA);
1161
    pci_config_set_device_id(pci_conf, PCI_DEVICE_ID_VIA_UHCI);
1162

    
1163
    /* USB misc control 1/2 */
1164
    pci_set_long(pci_conf + 0x40,0x00001000);
1165
    /* PM capability */
1166
    pci_set_long(pci_conf + 0x80,0x00020001);
1167
    /* USB legacy support  */
1168
    pci_set_long(pci_conf + 0xc0,0x00002000);
1169

    
1170
    return usb_uhci_common_initfn(s);
1171
}
1172

    
1173
static PCIDeviceInfo uhci_info[] = {
1174
    {
1175
        .qdev.name    = "piix3-usb-uhci",
1176
        .qdev.size    = sizeof(UHCIState),
1177
        .qdev.vmsd    = &vmstate_uhci,
1178
        .init         = usb_uhci_piix3_initfn,
1179
    },{
1180
        .qdev.name    = "piix4-usb-uhci",
1181
        .qdev.size    = sizeof(UHCIState),
1182
        .qdev.vmsd    = &vmstate_uhci,
1183
        .init         = usb_uhci_piix4_initfn,
1184
    },{
1185
        .qdev.name    = "vt82c686b-usb-uhci",
1186
        .qdev.size    = sizeof(UHCIState),
1187
        .qdev.vmsd    = &vmstate_uhci,
1188
        .init         = usb_uhci_vt82c686b_initfn,
1189
    },{
1190
        /* end of list */
1191
    }
1192
};
1193

    
1194
static void uhci_register(void)
1195
{
1196
    pci_qdev_register_many(uhci_info);
1197
}
1198
device_init(uhci_register);
1199

    
1200
void usb_uhci_piix3_init(PCIBus *bus, int devfn)
1201
{
1202
    pci_create_simple(bus, devfn, "piix3-usb-uhci");
1203
}
1204

    
1205
void usb_uhci_piix4_init(PCIBus *bus, int devfn)
1206
{
1207
    pci_create_simple(bus, devfn, "piix4-usb-uhci");
1208
}
1209

    
1210
void usb_uhci_vt82c686b_init(PCIBus *bus, int devfn)
1211
{
1212
    pci_create_simple(bus, devfn, "vt82c686b-usb-uhci");
1213
}