Commit e9b765de authored by Olav Kongas's avatar Olav Kongas Committed by Linus Torvalds

[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: default avatarOlav Kongas <ok@artecdesign.ee>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 2cc78eb5
...@@ -326,7 +326,8 @@ static void postproc_atl_queue(struct isp116x *isp116x) ...@@ -326,7 +326,8 @@ static void postproc_atl_queue(struct isp116x *isp116x)
usb_settoggle(udev, ep->epnum, usb_settoggle(udev, ep->epnum,
ep->nextpid == ep->nextpid ==
USB_PID_OUT, USB_PID_OUT,
PTD_GET_TOGGLE(ptd) ^ 1); PTD_GET_TOGGLE(ptd));
urb->actual_length += PTD_GET_COUNT(ptd);
urb->status = cc_to_error[TD_DATAUNDERRUN]; urb->status = cc_to_error[TD_DATAUNDERRUN];
spin_unlock(&urb->lock); spin_unlock(&urb->lock);
continue; continue;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment