diff options
author | Alan Stern <stern@rowland.harvard.edu> | 2009-05-27 18:21:56 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2009-06-16 00:44:46 -0400 |
commit | b18ffd49e86102a9ed0a1cc83fdafe3891e844e5 (patch) | |
tree | 78b60211d13839baaa92128e1b583dc12139392c /drivers/usb/host/ehci-ixp4xx.c | |
parent | 5effabbe9e6e0089f7afdde35cb51e8c8b4cf6bc (diff) |
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-ixp4xx.c')
-rw-r--r-- | drivers/usb/host/ehci-ixp4xx.c | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/drivers/usb/host/ehci-ixp4xx.c b/drivers/usb/host/ehci-ixp4xx.c index 9c32063a0c2f..a44bb4a94954 100644 --- a/drivers/usb/host/ehci-ixp4xx.c +++ b/drivers/usb/host/ehci-ixp4xx.c | |||
@@ -51,6 +51,7 @@ static const struct hc_driver ixp4xx_ehci_hc_driver = { | |||
51 | .urb_enqueue = ehci_urb_enqueue, | 51 | .urb_enqueue = ehci_urb_enqueue, |
52 | .urb_dequeue = ehci_urb_dequeue, | 52 | .urb_dequeue = ehci_urb_dequeue, |
53 | .endpoint_disable = ehci_endpoint_disable, | 53 | .endpoint_disable = ehci_endpoint_disable, |
54 | .endpoint_reset = ehci_endpoint_reset, | ||
54 | .get_frame_number = ehci_get_frame, | 55 | .get_frame_number = ehci_get_frame, |
55 | .hub_status_data = ehci_hub_status_data, | 56 | .hub_status_data = ehci_hub_status_data, |
56 | .hub_control = ehci_hub_control, | 57 | .hub_control = ehci_hub_control, |