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