diff options
author | Olav Kongas <ok@artecdesign.ee> | 2005-10-17 17:30:43 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2005-10-17 17:45:49 -0400 |
commit | e9b765decfb49ddc105d303d491e1bee9769436f (patch) | |
tree | 16fdd136b112a86c4313436e83a51549346db40c /drivers/usb | |
parent | 2cc78eb52bc1ae89f0a4fa5a00eb998dffde4a9f (diff) |
[PATCH] isp116x-hcd: fix handling of short transfers
Increased use of scatter-gather by usb-storage driver after 2.6.13 has
exposed a buggy codepath in isp116x-hcd, which was probably never
visited before: bug happened only for those urbs, for which
URB_SHORT_NOT_OK was set AND short transfer occurred.
The fix attached was tested in 2 ways: (a) it fixed failing
initialization of a flash drive with an embedded hub; (b) the fix was
tested with 'usbtest' against a modified g_zero driver (on top of
net2280), which generated short bulk IN transfers of various lengths
including multiples and non-multiples of max_packet_length.
Signed-off-by: Olav Kongas <ok@artecdesign.ee>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'drivers/usb')
-rw-r--r-- | drivers/usb/host/isp116x-hcd.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/drivers/usb/host/isp116x-hcd.c b/drivers/usb/host/isp116x-hcd.c index 41bbae83fc7..e142056b0d2 100644 --- a/drivers/usb/host/isp116x-hcd.c +++ b/drivers/usb/host/isp116x-hcd.c | |||
@@ -326,7 +326,8 @@ static void postproc_atl_queue(struct isp116x *isp116x) | |||
326 | usb_settoggle(udev, ep->epnum, | 326 | usb_settoggle(udev, ep->epnum, |
327 | ep->nextpid == | 327 | ep->nextpid == |
328 | USB_PID_OUT, | 328 | USB_PID_OUT, |
329 | PTD_GET_TOGGLE(ptd) ^ 1); | 329 | PTD_GET_TOGGLE(ptd)); |
330 | urb->actual_length += PTD_GET_COUNT(ptd); | ||
330 | urb->status = cc_to_error[TD_DATAUNDERRUN]; | 331 | urb->status = cc_to_error[TD_DATAUNDERRUN]; |
331 | spin_unlock(&urb->lock); | 332 | spin_unlock(&urb->lock); |
332 | continue; | 333 | continue; |