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