[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 07/14] ehci: Better detection for qtd-s linked in ci
From: |
Gerd Hoffmann |
Subject: |
[Qemu-devel] [PATCH 07/14] ehci: Better detection for qtd-s linked in circles |
Date: |
Fri, 16 Nov 2012 14:44:40 +0100 |
From: Hans de Goede <address@hidden>
Windows links interrupt qtd-s in circles, which means that when interrupt
endpoints return USB_RET_ASYNC, combined with the recent
"ehci: Retry to fill the queue while waiting for td completion" patch,
we keep adding the tds to the queue over and over again, as we detect the
circle from fill_queue, but we call it over and over again ...
This patch fixes this by changing the circle detection to also detect
circling into tds already queued up previously.
Signed-off-by: Hans de Goede <address@hidden>
Signed-off-by: Gerd Hoffmann <address@hidden>
---
hw/usb/hcd-ehci.c | 9 ++++++---
1 files changed, 6 insertions(+), 3 deletions(-)
diff --git a/hw/usb/hcd-ehci.c b/hw/usb/hcd-ehci.c
index 5e3b4a8..89b7520 100644
--- a/hw/usb/hcd-ehci.c
+++ b/hw/usb/hcd-ehci.c
@@ -1790,7 +1790,7 @@ static int ehci_fill_queue(EHCIPacket *p)
USBEndpoint *ep = p->packet.ep;
EHCIQueue *q = p->queue;
EHCIqtd qtd = p->qtd;
- uint32_t qtdaddr, start_addr = p->qtdaddr;
+ uint32_t qtdaddr;
for (;;) {
if (NLPTR_TBIT(qtd.next) != 0) {
@@ -1801,8 +1801,10 @@ static int ehci_fill_queue(EHCIPacket *p)
* Detect circular td lists, Windows creates these, counting on the
* active bit going low after execution to make the queue stop.
*/
- if (qtdaddr == start_addr) {
- break;
+ QTAILQ_FOREACH(p, &q->packets, next) {
+ if (p->qtdaddr == qtdaddr) {
+ goto leave;
+ }
}
get_dwords(q->ehci, NLPTR_GET(qtdaddr),
(uint32_t *) &qtd, sizeof(EHCIqtd) >> 2);
@@ -1819,6 +1821,7 @@ static int ehci_fill_queue(EHCIPacket *p)
assert(p->packet.status == USB_RET_ASYNC);
p->async = EHCI_ASYNC_INFLIGHT;
}
+leave:
usb_device_flush_ep_queue(ep->dev, ep);
return 1;
}
--
1.7.1
- [Qemu-devel] [PULL for-1.3 00/14] usb patch queue, Gerd Hoffmann, 2012/11/16
- [Qemu-devel] [PATCH 03/14] usb-host: scan for usb devices when the vm starts, Gerd Hoffmann, 2012/11/16
- [Qemu-devel] [PATCH 01/14] fix live migration, Gerd Hoffmann, 2012/11/16
- [Qemu-devel] [PATCH 06/14] ehci: Fixup q->qtdaddr after cancelling an already completed packet, Gerd Hoffmann, 2012/11/16
- [Qemu-devel] [PATCH 05/14] ehci: Don't access packet after freeing it, Gerd Hoffmann, 2012/11/16
- [Qemu-devel] [PATCH 09/14] ehci: keep the frame timer running in case the guest asked for frame list rollover interrupts, Gerd Hoffmann, 2012/11/16
- [Qemu-devel] [PATCH 07/14] ehci: Better detection for qtd-s linked in circles,
Gerd Hoffmann <=
- [Qemu-devel] [PATCH 12/14] usb-redir: Set default debug level to warning, Gerd Hoffmann, 2012/11/16
- [Qemu-devel] [PATCH 13/14] usb-host: update tracing, Gerd Hoffmann, 2012/11/16
- [Qemu-devel] [PATCH 11/14] usb-redir: Only add actually in flight packets to the in flight queue, Gerd Hoffmann, 2012/11/16
- [Qemu-devel] [PATCH 14/14] usb-host: fix splitted transfers, Gerd Hoffmann, 2012/11/16
- [Qemu-devel] [PATCH 04/14] usb: host-linux: Ignore parsing errors of the device descriptors, Gerd Hoffmann, 2012/11/16
- [Qemu-devel] [PATCH 10/14] ehci: handle dma errors, Gerd Hoffmann, 2012/11/16
- [Qemu-devel] [PATCH 02/14] usb: Fix (another) bug in usb_packet_map() for IOMMU handling, Gerd Hoffmann, 2012/11/16
- [Qemu-devel] [PATCH 08/14] ehci: Don't verify the next pointer for periodic qh-s and qtd-s, Gerd Hoffmann, 2012/11/16