Statistics
| Branch: | Revision:

root / hw / usb-uhci.c @ c6ee607c

History | View | Annotate | Download (27.6 kB)

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

    
26
//#define DEBUG
27
//#define DEBUG_PACKET
28
//#define DEBUG_ISOCH
29

    
30
#define UHCI_CMD_FGR      (1 << 4)
31
#define UHCI_CMD_EGSM     (1 << 3)
32
#define UHCI_CMD_GRESET   (1 << 2)
33
#define UHCI_CMD_HCRESET  (1 << 1)
34
#define UHCI_CMD_RS       (1 << 0)
35

    
36
#define UHCI_STS_HCHALTED (1 << 5)
37
#define UHCI_STS_HCPERR   (1 << 4)
38
#define UHCI_STS_HSERR    (1 << 3)
39
#define UHCI_STS_RD       (1 << 2)
40
#define UHCI_STS_USBERR   (1 << 1)
41
#define UHCI_STS_USBINT   (1 << 0)
42

    
43
#define TD_CTRL_SPD     (1 << 29)
44
#define TD_CTRL_ERROR_SHIFT  27
45
#define TD_CTRL_IOS     (1 << 25)
46
#define TD_CTRL_IOC     (1 << 24)
47
#define TD_CTRL_ACTIVE  (1 << 23)
48
#define TD_CTRL_STALL   (1 << 22)
49
#define TD_CTRL_BABBLE  (1 << 20)
50
#define TD_CTRL_NAK     (1 << 19)
51
#define TD_CTRL_TIMEOUT (1 << 18)
52

    
53
#define UHCI_PORT_RESET (1 << 9)
54
#define UHCI_PORT_LSDA  (1 << 8)
55
#define UHCI_PORT_ENC   (1 << 3)
56
#define UHCI_PORT_EN    (1 << 2)
57
#define UHCI_PORT_CSC   (1 << 1)
58
#define UHCI_PORT_CCS   (1 << 0)
59

    
60
#define FRAME_TIMER_FREQ 1000
61

    
62
#define FRAME_MAX_LOOPS  100
63

    
64
#define NB_PORTS 2
65

    
66
typedef struct UHCIPort {
67
    USBPort port;
68
    uint16_t ctrl;
69
} UHCIPort;
70

    
71
typedef struct UHCIState {
72
    PCIDevice dev;
73
    uint16_t cmd; /* cmd register */
74
    uint16_t status;
75
    uint16_t intr; /* interrupt enable register */
76
    uint16_t frnum; /* frame number */
77
    uint32_t fl_base_addr; /* frame list base address */
78
    uint8_t sof_timing;
79
    uint8_t status2; /* bit 0 and 1 are used to generate UHCI_STS_USBINT */
80
    QEMUTimer *frame_timer;
81
    UHCIPort ports[NB_PORTS];
82

    
83
    /* Interrupts that should be raised at the end of the current frame.  */
84
    uint32_t pending_int_mask;
85
    /* For simplicity of implementation we only allow a single pending USB
86
       request.  This means all usb traffic on this controller is effectively
87
       suspended until that transfer completes.  When the transfer completes
88
       the next transfer from that queue will be processed.  However
89
       other queues will not be processed until the next frame.  The solution
90
       is to allow multiple pending requests.  */
91
    uint32_t async_qh;
92
    uint32_t async_frame_addr;
93
    USBPacket usb_packet;
94
    uint8_t usb_buf[2048];
95
} UHCIState;
96

    
97
typedef struct UHCI_TD {
98
    uint32_t link;
99
    uint32_t ctrl; /* see TD_CTRL_xxx */
100
    uint32_t token;
101
    uint32_t buffer;
102
} UHCI_TD;
103

    
104
typedef struct UHCI_QH {
105
    uint32_t link;
106
    uint32_t el_link;
107
} UHCI_QH;
108

    
109
static void uhci_attach(USBPort *port1, USBDevice *dev);
110

    
111
static void uhci_update_irq(UHCIState *s)
112
{
113
    int level;
114
    if (((s->status2 & 1) && (s->intr & (1 << 2))) ||
115
        ((s->status2 & 2) && (s->intr & (1 << 3))) ||
116
        ((s->status & UHCI_STS_USBERR) && (s->intr & (1 << 0))) ||
117
        ((s->status & UHCI_STS_RD) && (s->intr & (1 << 1))) ||
118
        (s->status & UHCI_STS_HSERR) ||
119
        (s->status & UHCI_STS_HCPERR)) {
120
        level = 1;
121
    } else {
122
        level = 0;
123
    }
124
    qemu_set_irq(s->dev.irq[3], level);
125
}
126

    
127
static void uhci_reset(UHCIState *s)
128
{
129
    uint8_t *pci_conf;
130
    int i;
131
    UHCIPort *port;
132

    
133
    pci_conf = s->dev.config;
134

    
135
    pci_conf[0x6a] = 0x01; /* usb clock */
136
    pci_conf[0x6b] = 0x00;
137
    s->cmd = 0;
138
    s->status = 0;
139
    s->status2 = 0;
140
    s->intr = 0;
141
    s->fl_base_addr = 0;
142
    s->sof_timing = 64;
143
    for(i = 0; i < NB_PORTS; i++) {
144
        port = &s->ports[i];
145
        port->ctrl = 0x0080;
146
        if (port->port.dev)
147
            uhci_attach(&port->port, port->port.dev);
148
    }
149
}
150

    
151
static void uhci_save(QEMUFile *f, void *opaque)
152
{
153
    UHCIState *s = opaque;
154
    uint8_t num_ports = NB_PORTS;
155
    int i;
156

    
157
    pci_device_save(&s->dev, f);
158

    
159
    qemu_put_8s(f, &num_ports);
160
    for (i = 0; i < num_ports; ++i)
161
        qemu_put_be16s(f, &s->ports[i].ctrl);
162
    qemu_put_be16s(f, &s->cmd);
163
    qemu_put_be16s(f, &s->status);
164
    qemu_put_be16s(f, &s->intr);
165
    qemu_put_be16s(f, &s->frnum);
166
    qemu_put_be32s(f, &s->fl_base_addr);
167
    qemu_put_8s(f, &s->sof_timing);
168
    qemu_put_8s(f, &s->status2);
169
    qemu_put_timer(f, s->frame_timer);
170
}
171

    
172
static int uhci_load(QEMUFile *f, void *opaque, int version_id)
173
{
174
    UHCIState *s = opaque;
175
    uint8_t num_ports;
176
    int i, ret;
177

    
178
    if (version_id > 1)
179
        return -EINVAL;
180

    
181
    ret = pci_device_load(&s->dev, f);
182
    if (ret < 0)
183
        return ret;
184

    
185
    qemu_get_8s(f, &num_ports);
186
    if (num_ports != NB_PORTS)
187
        return -EINVAL;
188

    
189
    for (i = 0; i < num_ports; ++i)
190
        qemu_get_be16s(f, &s->ports[i].ctrl);
191
    qemu_get_be16s(f, &s->cmd);
192
    qemu_get_be16s(f, &s->status);
193
    qemu_get_be16s(f, &s->intr);
194
    qemu_get_be16s(f, &s->frnum);
195
    qemu_get_be32s(f, &s->fl_base_addr);
196
    qemu_get_8s(f, &s->sof_timing);
197
    qemu_get_8s(f, &s->status2);
198
    qemu_get_timer(f, s->frame_timer);
199

    
200
    return 0;
201
}
202

    
203
static void uhci_ioport_writeb(void *opaque, uint32_t addr, uint32_t val)
204
{
205
    UHCIState *s = opaque;
206

    
207
    addr &= 0x1f;
208
    switch(addr) {
209
    case 0x0c:
210
        s->sof_timing = val;
211
        break;
212
    }
213
}
214

    
215
static uint32_t uhci_ioport_readb(void *opaque, uint32_t addr)
216
{
217
    UHCIState *s = opaque;
218
    uint32_t val;
219

    
220
    addr &= 0x1f;
221
    switch(addr) {
222
    case 0x0c:
223
        val = s->sof_timing;
224
        break;
225
    default:
226
        val = 0xff;
227
        break;
228
    }
229
    return val;
230
}
231

    
232
static void uhci_ioport_writew(void *opaque, uint32_t addr, uint32_t val)
233
{
234
    UHCIState *s = opaque;
235

    
236
    addr &= 0x1f;
237
#ifdef DEBUG
238
    printf("uhci writew port=0x%04x val=0x%04x\n", addr, val);
239
#endif
240
    switch(addr) {
241
    case 0x00:
242
        if ((val & UHCI_CMD_RS) && !(s->cmd & UHCI_CMD_RS)) {
243
            /* start frame processing */
244
            qemu_mod_timer(s->frame_timer, qemu_get_clock(vm_clock));
245
            s->status &= ~UHCI_STS_HCHALTED;
246
        } else if (!(val & UHCI_CMD_RS)) {
247
            s->status |= UHCI_STS_HCHALTED;
248
        }
249
        if (val & UHCI_CMD_GRESET) {
250
            UHCIPort *port;
251
            USBDevice *dev;
252
            int i;
253

    
254
            /* send reset on the USB bus */
255
            for(i = 0; i < NB_PORTS; i++) {
256
                port = &s->ports[i];
257
                dev = port->port.dev;
258
                if (dev) {
259
                    usb_send_msg(dev, USB_MSG_RESET);
260
                }
261
            }
262
            uhci_reset(s);
263
            return;
264
        }
265
        if (val & UHCI_CMD_HCRESET) {
266
            uhci_reset(s);
267
            return;
268
        }
269
        s->cmd = val;
270
        break;
271
    case 0x02:
272
        s->status &= ~val;
273
        /* XXX: the chip spec is not coherent, so we add a hidden
274
           register to distinguish between IOC and SPD */
275
        if (val & UHCI_STS_USBINT)
276
            s->status2 = 0;
277
        uhci_update_irq(s);
278
        break;
279
    case 0x04:
280
        s->intr = val;
281
        uhci_update_irq(s);
282
        break;
283
    case 0x06:
284
        if (s->status & UHCI_STS_HCHALTED)
285
            s->frnum = val & 0x7ff;
286
        break;
287
    case 0x10 ... 0x1f:
288
        {
289
            UHCIPort *port;
290
            USBDevice *dev;
291
            int n;
292

    
293
            n = (addr >> 1) & 7;
294
            if (n >= NB_PORTS)
295
                return;
296
            port = &s->ports[n];
297
            dev = port->port.dev;
298
            if (dev) {
299
                /* port reset */
300
                if ( (val & UHCI_PORT_RESET) &&
301
                     !(port->ctrl & UHCI_PORT_RESET) ) {
302
                    usb_send_msg(dev, USB_MSG_RESET);
303
                }
304
            }
305
            port->ctrl = (port->ctrl & 0x01fb) | (val & ~0x01fb);
306
            /* some bits are reset when a '1' is written to them */
307
            port->ctrl &= ~(val & 0x000a);
308
        }
309
        break;
310
    }
311
}
312

    
313
static uint32_t uhci_ioport_readw(void *opaque, uint32_t addr)
314
{
315
    UHCIState *s = opaque;
316
    uint32_t val;
317

    
318
    addr &= 0x1f;
319
    switch(addr) {
320
    case 0x00:
321
        val = s->cmd;
322
        break;
323
    case 0x02:
324
        val = s->status;
325
        break;
326
    case 0x04:
327
        val = s->intr;
328
        break;
329
    case 0x06:
330
        val = s->frnum;
331
        break;
332
    case 0x10 ... 0x1f:
333
        {
334
            UHCIPort *port;
335
            int n;
336
            n = (addr >> 1) & 7;
337
            if (n >= NB_PORTS)
338
                goto read_default;
339
            port = &s->ports[n];
340
            val = port->ctrl;
341
        }
342
        break;
343
    default:
344
    read_default:
345
        val = 0xff7f; /* disabled port */
346
        break;
347
    }
348
#ifdef DEBUG
349
    printf("uhci readw port=0x%04x val=0x%04x\n", addr, val);
350
#endif
351
    return val;
352
}
353

    
354
static void uhci_ioport_writel(void *opaque, uint32_t addr, uint32_t val)
355
{
356
    UHCIState *s = opaque;
357

    
358
    addr &= 0x1f;
359
#ifdef DEBUG
360
    printf("uhci writel port=0x%04x val=0x%08x\n", addr, val);
361
#endif
362
    switch(addr) {
363
    case 0x08:
364
        s->fl_base_addr = val & ~0xfff;
365
        break;
366
    }
367
}
368

    
369
static uint32_t uhci_ioport_readl(void *opaque, uint32_t addr)
370
{
371
    UHCIState *s = opaque;
372
    uint32_t val;
373

    
374
    addr &= 0x1f;
375
    switch(addr) {
376
    case 0x08:
377
        val = s->fl_base_addr;
378
        break;
379
    default:
380
        val = 0xffffffff;
381
        break;
382
    }
383
    return val;
384
}
385

    
386
/* signal resume if controller suspended */
387
static void uhci_resume (void *opaque)
388
{
389
    UHCIState *s = (UHCIState *)opaque;
390

    
391
    if (!s)
392
        return;
393

    
394
    if (s->cmd & UHCI_CMD_EGSM) {
395
        s->cmd |= UHCI_CMD_FGR;
396
        s->status |= UHCI_STS_RD;
397
        uhci_update_irq(s);
398
    }
399
}
400

    
401
static void uhci_attach(USBPort *port1, USBDevice *dev)
402
{
403
    UHCIState *s = port1->opaque;
404
    UHCIPort *port = &s->ports[port1->index];
405

    
406
    if (dev) {
407
        if (port->port.dev) {
408
            usb_attach(port1, NULL);
409
        }
410
        /* set connect status */
411
        port->ctrl |= UHCI_PORT_CCS | UHCI_PORT_CSC;
412

    
413
        /* update speed */
414
        if (dev->speed == USB_SPEED_LOW)
415
            port->ctrl |= UHCI_PORT_LSDA;
416
        else
417
            port->ctrl &= ~UHCI_PORT_LSDA;
418

    
419
        uhci_resume(s);
420

    
421
        port->port.dev = dev;
422
        /* send the attach message */
423
        usb_send_msg(dev, USB_MSG_ATTACH);
424
    } else {
425
        /* set connect status */
426
        if (port->ctrl & UHCI_PORT_CCS) {
427
            port->ctrl &= ~UHCI_PORT_CCS;
428
            port->ctrl |= UHCI_PORT_CSC;
429
        }
430
        /* disable port */
431
        if (port->ctrl & UHCI_PORT_EN) {
432
            port->ctrl &= ~UHCI_PORT_EN;
433
            port->ctrl |= UHCI_PORT_ENC;
434
        }
435

    
436
        uhci_resume(s);
437

    
438
        dev = port->port.dev;
439
        if (dev) {
440
            /* send the detach message */
441
            usb_send_msg(dev, USB_MSG_DETACH);
442
        }
443
        port->port.dev = NULL;
444
    }
445
}
446

    
447
static int uhci_broadcast_packet(UHCIState *s, USBPacket *p)
448
{
449
    UHCIPort *port;
450
    USBDevice *dev;
451
    int i, ret;
452

    
453
#ifdef DEBUG_PACKET
454
    {
455
        const char *pidstr;
456
        switch(p->pid) {
457
        case USB_TOKEN_SETUP: pidstr = "SETUP"; break;
458
        case USB_TOKEN_IN: pidstr = "IN"; break;
459
        case USB_TOKEN_OUT: pidstr = "OUT"; break;
460
        default: pidstr = "?"; break;
461
        }
462
        printf("frame %d: pid=%s addr=0x%02x ep=%d len=%d\n",
463
               s->frnum, pidstr, p->devaddr, p->devep, p->len);
464
        if (p->pid != USB_TOKEN_IN) {
465
            printf("     data_out=");
466
            for(i = 0; i < p->len; i++) {
467
                printf(" %02x", p->data[i]);
468
            }
469
            printf("\n");
470
        }
471
    }
472
#endif
473
    for(i = 0; i < NB_PORTS; i++) {
474
        port = &s->ports[i];
475
        dev = port->port.dev;
476
        if (dev && (port->ctrl & UHCI_PORT_EN)) {
477
            ret = dev->handle_packet(dev, p);
478
            if (ret != USB_RET_NODEV) {
479
#ifdef DEBUG_PACKET
480
                if (ret == USB_RET_ASYNC) {
481
                    printf("usb-uhci: Async packet\n");
482
                } else {
483
                    printf("     ret=%d ", ret);
484
                    if (p->pid == USB_TOKEN_IN && ret > 0) {
485
                        printf("data_in=");
486
                        for(i = 0; i < ret; i++) {
487
                            printf(" %02x", p->data[i]);
488
                        }
489
                    }
490
                    printf("\n");
491
                }
492
#endif
493
                return ret;
494
            }
495
        }
496
    }
497
    return USB_RET_NODEV;
498
}
499

    
500
static void uhci_async_complete_packet(USBPacket * packet, void *opaque);
501

    
502
/* return -1 if fatal error (frame must be stopped)
503
          0 if TD successful
504
          1 if TD unsuccessful or inactive
505
*/
506
static int uhci_handle_td(UHCIState *s, UHCI_TD *td, int *int_mask,
507
                          int completion)
508
{
509
    uint8_t pid;
510
    int len = 0, max_len, err, ret = 0;
511

    
512
    /* ??? This is wrong for async completion.  */
513
    if (td->ctrl & TD_CTRL_IOC) {
514
        *int_mask |= 0x01;
515
    }
516

    
517
    if (!(td->ctrl & TD_CTRL_ACTIVE))
518
        return 1;
519

    
520
    /* TD is active */
521
    max_len = ((td->token >> 21) + 1) & 0x7ff;
522
    pid = td->token & 0xff;
523

    
524
    if (completion && (s->async_qh || s->async_frame_addr)) {
525
        ret = s->usb_packet.len;
526
        if (ret >= 0) {
527
            len = ret;
528
            if (len > max_len) {
529
                len = max_len;
530
                ret = USB_RET_BABBLE;
531
            }
532
            if (len > 0) {
533
                /* write the data back */
534
                cpu_physical_memory_write(td->buffer, s->usb_buf, len);
535
            }
536
        } else {
537
            len = 0;
538
        }
539
        s->async_qh = 0;
540
        s->async_frame_addr = 0;
541
    } else if (!completion) {
542
        s->usb_packet.pid = pid;
543
        s->usb_packet.devaddr = (td->token >> 8) & 0x7f;
544
        s->usb_packet.devep = (td->token >> 15) & 0xf;
545
        s->usb_packet.data = s->usb_buf;
546
        s->usb_packet.len = max_len;
547
        s->usb_packet.complete_cb = uhci_async_complete_packet;
548
        s->usb_packet.complete_opaque = s;
549
        switch(pid) {
550
        case USB_TOKEN_OUT:
551
        case USB_TOKEN_SETUP:
552
            cpu_physical_memory_read(td->buffer, s->usb_buf, max_len);
553
            ret = uhci_broadcast_packet(s, &s->usb_packet);
554
            len = max_len;
555
            break;
556
        case USB_TOKEN_IN:
557
            ret = uhci_broadcast_packet(s, &s->usb_packet);
558
            if (ret >= 0) {
559
                len = ret;
560
                if (len > max_len) {
561
                    len = max_len;
562
                    ret = USB_RET_BABBLE;
563
                }
564
                if (len > 0) {
565
                    /* write the data back */
566
                    cpu_physical_memory_write(td->buffer, s->usb_buf, len);
567
                }
568
            } else {
569
                len = 0;
570
            }
571
            break;
572
        default:
573
            /* invalid pid : frame interrupted */
574
            s->status |= UHCI_STS_HCPERR;
575
            uhci_update_irq(s);
576
            return -1;
577
        }
578
    }
579

    
580
    if (ret == USB_RET_ASYNC) {
581
        return 2;
582
    }
583
    if (td->ctrl & TD_CTRL_IOS)
584
        td->ctrl &= ~TD_CTRL_ACTIVE;
585
    if (ret >= 0) {
586
        td->ctrl = (td->ctrl & ~0x7ff) | ((len - 1) & 0x7ff);
587
        /* The NAK bit may have been set by a previous frame, so clear it
588
           here.  The docs are somewhat unclear, but win2k relies on this
589
           behavior.  */
590
        td->ctrl &= ~(TD_CTRL_ACTIVE | TD_CTRL_NAK);
591
        if (pid == USB_TOKEN_IN &&
592
            (td->ctrl & TD_CTRL_SPD) &&
593
            len < max_len) {
594
            *int_mask |= 0x02;
595
            /* short packet: do not update QH */
596
            return 1;
597
        } else {
598
            /* success */
599
            return 0;
600
        }
601
    } else {
602
        switch(ret) {
603
        default:
604
        case USB_RET_NODEV:
605
        do_timeout:
606
            td->ctrl |= TD_CTRL_TIMEOUT;
607
            err = (td->ctrl >> TD_CTRL_ERROR_SHIFT) & 3;
608
            if (err != 0) {
609
                err--;
610
                if (err == 0) {
611
                    td->ctrl &= ~TD_CTRL_ACTIVE;
612
                    s->status |= UHCI_STS_USBERR;
613
                    uhci_update_irq(s);
614
                }
615
            }
616
            td->ctrl = (td->ctrl & ~(3 << TD_CTRL_ERROR_SHIFT)) |
617
                (err << TD_CTRL_ERROR_SHIFT);
618
            return 1;
619
        case USB_RET_NAK:
620
            td->ctrl |= TD_CTRL_NAK;
621
            if (pid == USB_TOKEN_SETUP)
622
                goto do_timeout;
623
            return 1;
624
        case USB_RET_STALL:
625
            td->ctrl |= TD_CTRL_STALL;
626
            td->ctrl &= ~TD_CTRL_ACTIVE;
627
            return 1;
628
        case USB_RET_BABBLE:
629
            td->ctrl |= TD_CTRL_BABBLE | TD_CTRL_STALL;
630
            td->ctrl &= ~TD_CTRL_ACTIVE;
631
            /* frame interrupted */
632
            return -1;
633
        }
634
    }
635
}
636

    
637
static void uhci_async_complete_packet(USBPacket * packet, void *opaque)
638
{
639
    UHCIState *s = opaque;
640
    UHCI_QH qh;
641
    UHCI_TD td;
642
    uint32_t link;
643
    uint32_t old_td_ctrl;
644
    uint32_t val;
645
    uint32_t frame_addr;
646
    int ret;
647

    
648
    /* Handle async isochronous packet completion */
649
    frame_addr = s->async_frame_addr;
650
    if (frame_addr) {
651
        cpu_physical_memory_read(frame_addr, (uint8_t *)&link, 4);
652
        le32_to_cpus(&link);
653

    
654
        cpu_physical_memory_read(link & ~0xf, (uint8_t *)&td, sizeof(td));
655
        le32_to_cpus(&td.link);
656
        le32_to_cpus(&td.ctrl);
657
        le32_to_cpus(&td.token);
658
        le32_to_cpus(&td.buffer);
659
        old_td_ctrl = td.ctrl;
660
        ret = uhci_handle_td(s, &td, &s->pending_int_mask, 1);
661

    
662
        /* update the status bits of the TD */
663
        if (old_td_ctrl != td.ctrl) {
664
            val = cpu_to_le32(td.ctrl);
665
            cpu_physical_memory_write((link & ~0xf) + 4,
666
                                      (const uint8_t *)&val,
667
                                      sizeof(val));
668
        }
669
        if (ret == 2) {
670
            s->async_frame_addr = frame_addr;
671
        } else if (ret == 0) {
672
            /* update qh element link */
673
            val = cpu_to_le32(td.link);
674
            cpu_physical_memory_write(frame_addr,
675
                                      (const uint8_t *)&val,
676
                                      sizeof(val));
677
        }
678
        return;
679
    }
680

    
681
    link = s->async_qh;
682
    if (!link) {
683
        /* This should never happen. It means a TD somehow got removed
684
           without cancelling the associated async IO request.  */
685
        return;
686
    }
687
    cpu_physical_memory_read(link & ~0xf, (uint8_t *)&qh, sizeof(qh));
688
    le32_to_cpus(&qh.link);
689
    le32_to_cpus(&qh.el_link);
690
    /* Re-process the queue containing the async packet.  */
691
    while (1) {
692
        cpu_physical_memory_read(qh.el_link & ~0xf,
693
                                 (uint8_t *)&td, sizeof(td));
694
        le32_to_cpus(&td.link);
695
        le32_to_cpus(&td.ctrl);
696
        le32_to_cpus(&td.token);
697
        le32_to_cpus(&td.buffer);
698
        old_td_ctrl = td.ctrl;
699
        ret = uhci_handle_td(s, &td, &s->pending_int_mask, 1);
700

    
701
        /* update the status bits of the TD */
702
        if (old_td_ctrl != td.ctrl) {
703
            val = cpu_to_le32(td.ctrl);
704
            cpu_physical_memory_write((qh.el_link & ~0xf) + 4,
705
                                      (const uint8_t *)&val,
706
                                      sizeof(val));
707
        }
708
        if (ret < 0)
709
            break; /* interrupted frame */
710
        if (ret == 2) {
711
            s->async_qh = link;
712
            break;
713
        } else if (ret == 0) {
714
            /* update qh element link */
715
            qh.el_link = td.link;
716
            val = cpu_to_le32(qh.el_link);
717
            cpu_physical_memory_write((link & ~0xf) + 4,
718
                                      (const uint8_t *)&val,
719
                                      sizeof(val));
720
            if (!(qh.el_link & 4))
721
                break;
722
        }
723
        break;
724
    }
725
}
726

    
727
static void uhci_frame_timer(void *opaque)
728
{
729
    UHCIState *s = opaque;
730
    int64_t expire_time;
731
    uint32_t frame_addr, link, old_td_ctrl, val;
732
    int int_mask, cnt, ret;
733
    UHCI_TD td;
734
    UHCI_QH qh;
735
    uint32_t old_async_qh;
736

    
737
    if (!(s->cmd & UHCI_CMD_RS)) {
738
        qemu_del_timer(s->frame_timer);
739
        /* set hchalted bit in status - UHCI11D 2.1.2 */
740
        s->status |= UHCI_STS_HCHALTED;
741
        return;
742
    }
743
    /* Complete the previous frame.  */
744
    s->frnum = (s->frnum + 1) & 0x7ff;
745
    if (s->pending_int_mask) {
746
        s->status2 |= s->pending_int_mask;
747
        s->status |= UHCI_STS_USBINT;
748
        uhci_update_irq(s);
749
    }
750
    old_async_qh = s->async_qh;
751
    frame_addr = s->fl_base_addr + ((s->frnum & 0x3ff) << 2);
752
    cpu_physical_memory_read(frame_addr, (uint8_t *)&link, 4);
753
    le32_to_cpus(&link);
754
    int_mask = 0;
755
    cnt = FRAME_MAX_LOOPS;
756
    while ((link & 1) == 0) {
757
        if (--cnt == 0)
758
            break;
759
        /* valid frame */
760
        if (link & 2) {
761
            /* QH */
762
            if (link == s->async_qh) {
763
                /* We've found a previously issues packet.
764
                   Nothing else to do.  */
765
                old_async_qh = 0;
766
                break;
767
            }
768
            cpu_physical_memory_read(link & ~0xf, (uint8_t *)&qh, sizeof(qh));
769
            le32_to_cpus(&qh.link);
770
            le32_to_cpus(&qh.el_link);
771
        depth_first:
772
            if (qh.el_link & 1) {
773
                /* no element : go to next entry */
774
                link = qh.link;
775
            } else if (qh.el_link & 2) {
776
                /* QH */
777
                link = qh.el_link;
778
            } else if (s->async_qh) {
779
                /* We can only cope with one pending packet.  Keep looking
780
                   for the previously issued packet.  */
781
                link = qh.link;
782
            } else {
783
                /* TD */
784
                if (--cnt == 0)
785
                    break;
786
                cpu_physical_memory_read(qh.el_link & ~0xf,
787
                                         (uint8_t *)&td, sizeof(td));
788
                le32_to_cpus(&td.link);
789
                le32_to_cpus(&td.ctrl);
790
                le32_to_cpus(&td.token);
791
                le32_to_cpus(&td.buffer);
792
                old_td_ctrl = td.ctrl;
793
                ret = uhci_handle_td(s, &td, &int_mask, 0);
794

    
795
                /* update the status bits of the TD */
796
                if (old_td_ctrl != td.ctrl) {
797
                    val = cpu_to_le32(td.ctrl);
798
                    cpu_physical_memory_write((qh.el_link & ~0xf) + 4,
799
                                              (const uint8_t *)&val,
800
                                              sizeof(val));
801
                }
802
                if (ret < 0)
803
                    break; /* interrupted frame */
804
                if (ret == 2) {
805
                    s->async_qh = link;
806
                } else if (ret == 0) {
807
                    /* update qh element link */
808
                    qh.el_link = td.link;
809
                    val = cpu_to_le32(qh.el_link);
810
                    cpu_physical_memory_write((link & ~0xf) + 4,
811
                                              (const uint8_t *)&val,
812
                                              sizeof(val));
813
                    if (qh.el_link & 4) {
814
                        /* depth first */
815
                        goto depth_first;
816
                    }
817
                }
818
                /* go to next entry */
819
                link = qh.link;
820
            }
821
        } else {
822
            /* TD */
823
            cpu_physical_memory_read(link & ~0xf, (uint8_t *)&td, sizeof(td));
824
            le32_to_cpus(&td.link);
825
            le32_to_cpus(&td.ctrl);
826
            le32_to_cpus(&td.token);
827
            le32_to_cpus(&td.buffer);
828

    
829
            /* Handle isochonous transfer.  */
830
            /* FIXME: might be more than one isoc in frame */
831
            old_td_ctrl = td.ctrl;
832
            ret = uhci_handle_td(s, &td, &int_mask, 0);
833

    
834
            /* update the status bits of the TD */
835
            if (old_td_ctrl != td.ctrl) {
836
                val = cpu_to_le32(td.ctrl);
837
                cpu_physical_memory_write((link & ~0xf) + 4,
838
                                          (const uint8_t *)&val,
839
                                          sizeof(val));
840
            }
841
            if (ret < 0)
842
                break; /* interrupted frame */
843
            if (ret == 2) {
844
                s->async_frame_addr = frame_addr;
845
            }
846
            link = td.link;
847
        }
848
    }
849
    s->pending_int_mask = int_mask;
850
    if (old_async_qh) {
851
        /* A previously started transfer has disappeared from the transfer
852
           list.  There's nothing useful we can do with it now, so just
853
           discard the packet and hope it wasn't too important.  */
854
#ifdef DEBUG
855
        printf("Discarding USB packet\n");
856
#endif
857
        usb_cancel_packet(&s->usb_packet);
858
        s->async_qh = 0;
859
    }
860

    
861
    /* prepare the timer for the next frame */
862
    expire_time = qemu_get_clock(vm_clock) +
863
        (ticks_per_sec / FRAME_TIMER_FREQ);
864
    qemu_mod_timer(s->frame_timer, expire_time);
865
}
866

    
867
static void uhci_map(PCIDevice *pci_dev, int region_num,
868
                    uint32_t addr, uint32_t size, int type)
869
{
870
    UHCIState *s = (UHCIState *)pci_dev;
871

    
872
    register_ioport_write(addr, 32, 2, uhci_ioport_writew, s);
873
    register_ioport_read(addr, 32, 2, uhci_ioport_readw, s);
874
    register_ioport_write(addr, 32, 4, uhci_ioport_writel, s);
875
    register_ioport_read(addr, 32, 4, uhci_ioport_readl, s);
876
    register_ioport_write(addr, 32, 1, uhci_ioport_writeb, s);
877
    register_ioport_read(addr, 32, 1, uhci_ioport_readb, s);
878
}
879

    
880
void usb_uhci_piix3_init(PCIBus *bus, int devfn)
881
{
882
    UHCIState *s;
883
    uint8_t *pci_conf;
884
    int i;
885

    
886
    s = (UHCIState *)pci_register_device(bus,
887
                                        "USB-UHCI", sizeof(UHCIState),
888
                                        devfn, NULL, NULL);
889
    pci_conf = s->dev.config;
890
    pci_conf[0x00] = 0x86;
891
    pci_conf[0x01] = 0x80;
892
    pci_conf[0x02] = 0x20;
893
    pci_conf[0x03] = 0x70;
894
    pci_conf[0x08] = 0x01; // revision number
895
    pci_conf[0x09] = 0x00;
896
    pci_conf[0x0a] = 0x03;
897
    pci_conf[0x0b] = 0x0c;
898
    pci_conf[0x0e] = 0x00; // header_type
899
    pci_conf[0x3d] = 4; // interrupt pin 3
900
    pci_conf[0x60] = 0x10; // release number
901

    
902
    for(i = 0; i < NB_PORTS; i++) {
903
        qemu_register_usb_port(&s->ports[i].port, s, i, uhci_attach);
904
    }
905
    s->frame_timer = qemu_new_timer(vm_clock, uhci_frame_timer, s);
906

    
907
    uhci_reset(s);
908

    
909
    /* Use region 4 for consistency with real hardware.  BSD guests seem
910
       to rely on this.  */
911
    pci_register_io_region(&s->dev, 4, 0x20,
912
                           PCI_ADDRESS_SPACE_IO, uhci_map);
913
}
914

    
915
void usb_uhci_piix4_init(PCIBus *bus, int devfn)
916
{
917
    UHCIState *s;
918
    uint8_t *pci_conf;
919
    int i;
920

    
921
    s = (UHCIState *)pci_register_device(bus,
922
                                        "USB-UHCI", sizeof(UHCIState),
923
                                        devfn, NULL, NULL);
924
    pci_conf = s->dev.config;
925
    pci_conf[0x00] = 0x86;
926
    pci_conf[0x01] = 0x80;
927
    pci_conf[0x02] = 0x12;
928
    pci_conf[0x03] = 0x71;
929
    pci_conf[0x08] = 0x01; // revision number
930
    pci_conf[0x09] = 0x00;
931
    pci_conf[0x0a] = 0x03;
932
    pci_conf[0x0b] = 0x0c;
933
    pci_conf[0x0e] = 0x00; // header_type
934
    pci_conf[0x3d] = 4; // interrupt pin 3
935
    pci_conf[0x60] = 0x10; // release number
936

    
937
    for(i = 0; i < NB_PORTS; i++) {
938
        qemu_register_usb_port(&s->ports[i].port, s, i, uhci_attach);
939
    }
940
    s->frame_timer = qemu_new_timer(vm_clock, uhci_frame_timer, s);
941

    
942
    uhci_reset(s);
943

    
944
    /* Use region 4 for consistency with real hardware.  BSD guests seem
945
       to rely on this.  */
946
    pci_register_io_region(&s->dev, 4, 0x20,
947
                           PCI_ADDRESS_SPACE_IO, uhci_map);
948
}