From 76bc38b68884b432cf5a28531eb783e9d4530d7b Mon Sep 17 00:00:00 2001 From: Hans de Goede Date: Sun, 4 Mar 2012 11:57:47 +0100 Subject: [PATCH 25/35] usb-ehci: always call ehci_queues_rip_unused for period queues RH-Author: Hans de Goede Message-id: <1330862278-22314-11-git-send-email-hdegoede@redhat.com> Patchwork-id: 37923 O-Subject: [PATCH 10/21] usb-ehci: always call ehci_queues_rip_unused for period queues Bugzilla: 758104 RH-Acked-by: Hans de Goede RH-Acked-by: Gerd Hoffmann RH-Acked-by: Alon Levy RH-Acked-by: Markus Armbruster 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 Upstream commit: 7bce354e148b0ae0ceae7582574810adc6fab4e4 Upstream: http://patchwork.ozlabs.org/patch/144354/ (waiting for next usb pull request) --- hw/usb-ehci.c | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) Signed-off-by: Michal Novotny --- hw/usb-ehci.c | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/hw/usb-ehci.c b/hw/usb-ehci.c index 84df063..cd75965 100644 --- a/hw/usb-ehci.c +++ b/hw/usb-ehci.c @@ -2150,6 +2150,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); break; default: -- 1.7.7.6