Blame 0129-usb-ehci-always-call-ehci_queues_rip_unused-for-peri.patch

1b1995
From 320063f7165c5a5f9ddd5a09a4663bc1a81f5bd6 Mon Sep 17 00:00:00 2001
1b1995
From: Hans de Goede <hdegoede@redhat.com>
1b1995
Date: Fri, 2 Mar 2012 13:52:44 +0100
1b1995
Subject: [PATCH 129/140] usb-ehci: always call ehci_queues_rip_unused for
1b1995
 period queues
1b1995
1b1995
Before this patch USB 2 devices with interrupt endpoints were not working
1b1995
properly. The problem is that to avoid loops we stop processing as soon
1b1995
as we encounter a queue-head (qh) we've already seen since qhs can be linked
1b1995
in a circular fashion, this is tracked by the seen flag in our qh struct.
1b1995
1b1995
The resetting of the seen flag is done from ehci_queues_rip_unused which
1b1995
before this patch was only called when executing the statemachine for the
1b1995
async schedule.
1b1995
1b1995
But packets for interrupt endpoints are part of the periodic schedule! So what
1b1995
would happen is that when there were no ctrl or bulk packets for a USB 2
1b1995
device with an interrupt endpoint, the async schedule would become non
1b1995
active, then ehci_queues_rip_unused would no longer get called and when
1b1995
processing the qhs for the interrupt endpoints from the periodic schedule
1b1995
their seen bit would still be 1 and they would be skipped.
1b1995
1b1995
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
1b1995
---
1b1995
 hw/usb-ehci.c |    1 +
1b1995
 1 file changed, 1 insertion(+)
1b1995
1b1995
diff --git a/hw/usb-ehci.c b/hw/usb-ehci.c
1b1995
index 980cce3..422afc8 100644
1b1995
--- a/hw/usb-ehci.c
1b1995
+++ b/hw/usb-ehci.c
1b1995
@@ -2195,6 +2195,7 @@ static void ehci_advance_periodic_state(EHCIState *ehci)
1b1995
         ehci_set_fetch_addr(ehci, async,entry);
1b1995
         ehci_set_state(ehci, async, EST_FETCHENTRY);
1b1995
         ehci_advance_state(ehci, async);
1b1995
+        ehci_queues_rip_unused(ehci, async, 0);
1b1995
         break;
1b1995
 
1b1995
     default:
1b1995
-- 
1b1995
1.7.9.3
1b1995