summary refs log tree commit diff
path: root/drivers/usb/host/ehci-orion.c
diff options
context:
space:
mode:
authorAlan Stern <stern@rowland.harvard.edu>2009-05-27 18:21:56 -0400
committerGreg Kroah-Hartman <gregkh@suse.de>2009-06-15 21:44:46 -0700
commitb18ffd49e86102a9ed0a1cc83fdafe3891e844e5 (patch)
tree78b60211d13839baaa92128e1b583dc12139392c /drivers/usb/host/ehci-orion.c
parent5effabbe9e6e0089f7afdde35cb51e8c8b4cf6bc (diff)
downloadlinux-b18ffd49e86102a9ed0a1cc83fdafe3891e844e5.tar.gz
USB: EHCI: update toggle state for linked QHs
This patch (as1245) fixes a bug in ehci-hcd.  When an URB is queued
for an endpoint whose QH is already in the LINKED state, the QH
doesn't get refreshed.  As a result, if usb_clear_halt() was called
during the time that the QH was linked but idle, the data toggle value
in the QH doesn't get reset.

The symptom is that after a clear_halt, data gets lost and transfers
time out.  This problem is starting to show up now because the
"ehci-hcd unlink speedups" patch causes QHs with no queued URBs to
remain linked for a suitable time.

The patch utilizes the new endpoint_reset mechanism to fix the
problem.  When an endpoint is reset, the new method forcibly unlinks
the QH (if necessary) and safely updates the toggle value.  This
allows qh_update() to be simplified and avoids using usb_device's
toggle bits in a rather unintuitive way.

Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
CC: David Brownell <david-b@pacbell.net>
Tested-by: David <david@unsolicited.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

Diffstat (limited to 'drivers/usb/host/ehci-orion.c')
-rw-r--r--drivers/usb/host/ehci-orion.c1
1 files changed, 1 insertions, 0 deletions
diff --git a/drivers/usb/host/ehci-orion.c b/drivers/usb/host/ehci-orion.c
index 17dc15407a07..770dd9aba62a 100644
--- a/drivers/usb/host/ehci-orion.c
+++ b/drivers/usb/host/ehci-orion.c
@@ -149,6 +149,7 @@ static const struct hc_driver ehci_orion_hc_driver = {
 	.urb_enqueue = ehci_urb_enqueue,
 	.urb_dequeue = ehci_urb_dequeue,
 	.endpoint_disable = ehci_endpoint_disable,
+	.endpoint_reset = ehci_endpoint_reset,
 
 	/*
 	 * scheduling support