Revision b4ea8664 hw/usb/hcd-ehci.c

b/hw/usb/hcd-ehci.c
381 381
    uint32_t qhaddr;       /* address QH read from                 */
382 382
    uint32_t qtdaddr;      /* address QTD read from                */
383 383
    USBDevice *dev;
384
    QTAILQ_HEAD(, EHCIPacket) packets;
384
    QTAILQ_HEAD(pkts_head, EHCIPacket) packets;
385 385
};
386 386

  
387 387
typedef QTAILQ_HEAD(EHCIQueueHead, EHCIQueue) EHCIQueueHead;
......
488 488

  
489 489
static int ehci_state_executing(EHCIQueue *q);
490 490
static int ehci_state_writeback(EHCIQueue *q);
491
static int ehci_fill_queue(EHCIPacket *p);
491 492

  
492 493
static const char *nr2str(const char **n, size_t len, uint32_t nr)
493 494
{
......
1994 1995
{
1995 1996
    EHCIqtd qtd;
1996 1997
    EHCIPacket *p;
1997
    int again = 0;
1998
    int again = 1;
1998 1999

  
1999 2000
    get_dwords(q->ehci, NLPTR_GET(q->qtdaddr), (uint32_t *) &qtd,
2000 2001
               sizeof(EHCIqtd) >> 2);
......
2022 2023
            p = NULL;
2023 2024
        }
2024 2025
        ehci_set_state(q->ehci, q->async, EST_HORIZONTALQH);
2025
        again = 1;
2026 2026
    } else if (p != NULL) {
2027 2027
        switch (p->async) {
2028 2028
        case EHCI_ASYNC_NONE:
......
2031 2031
            ehci_set_state(q->ehci, q->async, EST_EXECUTE);
2032 2032
            break;
2033 2033
        case EHCI_ASYNC_INFLIGHT:
2034
            /* Check if the guest has added new tds to the queue */
2035
            again = (ehci_fill_queue(QTAILQ_LAST(&q->packets, pkts_head)) ==
2036
                     USB_RET_PROCERR) ? -1 : 1;
2034 2037
            /* Unfinished async handled packet, go horizontal */
2035 2038
            ehci_set_state(q->ehci, q->async, EST_HORIZONTALQH);
2036 2039
            break;
......
2042 2045
            ehci_set_state(q->ehci, q->async, EST_EXECUTING);
2043 2046
            break;
2044 2047
        }
2045
        again = 1;
2046 2048
    } else {
2047 2049
        p = ehci_alloc_packet(q);
2048 2050
        p->qtdaddr = q->qtdaddr;
2049 2051
        p->qtd = qtd;
2050 2052
        ehci_set_state(q->ehci, q->async, EST_EXECUTE);
2051
        again = 1;
2052 2053
    }
2053 2054

  
2054 2055
    return again;

Also available in: Unified diff