This patch does two things to help reset recovery. It started life as as496 and was rediffed by me.
First, the patch checks the result of a CLEAR_HALT request and doesn't reset
the
endpoint's data toggle unless the request succeeded.
Second, it reduces the timeout for a device reset from 20 seconds to 5
seconds.
If all goes well, then I've finally figured quilt out and this patch should
apply cleanly.
Greg, please apply.
Matt
Signed-off-by: Alan Stern <[EMAIL PROTECTED]>
Signed-off-by: Matthew Dharm <[EMAIL PROTECTED]>
===== drivers/usb/storage/transport.c 1.166 vs edited =====
--- 1.166/drivers/usb/storage/transport.c 2005-03-14 00:33:16 -05:00
+++ edited/drivers/usb/storage/transport.c 2005-03-30 16:33:19 -05:00
@@ -266,8 +266,9 @@
NULL, 0, 3*HZ);
/* reset the endpoint toggle */
- usb_settoggle(us->pusb_dev, usb_pipeendpoint(pipe),
- usb_pipeout(pipe), 0);
+ if (result >= 0)
+ usb_settoggle(us->pusb_dev, usb_pipeendpoint(pipe),
+ usb_pipeout(pipe), 0);
US_DEBUGP("%s: result = %d\n", __FUNCTION__, result);
return result;
@@ -1124,7 +1125,7 @@
* It's handy that every transport mechanism uses the control endpoint for
* resets.
*
- * Basically, we send a reset with a 20-second timeout, so we don't get
+ * Basically, we send a reset with a 5-second timeout, so we don't get
* jammed attempting to do the reset.
*/
static int usb_stor_reset_common(struct us_data *us,
@@ -1145,13 +1146,9 @@
clear_bit(US_FLIDX_ABORTING, &us->flags);
scsi_unlock(us_to_host(us));
- /* A 20-second timeout may seem rather long, but a LaCie
- * StudioDrive USB2 device takes 16+ seconds to get going
- * following a powerup or USB attach event.
- */
result = usb_stor_control_msg(us, us->send_ctrl_pipe,
request, requesttype, value, index, data, size,
- 20*HZ);
+ 5*HZ);
if (result < 0) {
US_DEBUGP("Soft reset failed: %d\n", result);
goto Done;
@@ -1173,8 +1170,10 @@
US_DEBUGP("Soft reset: clearing bulk-out endpoint halt\n");
result2 = usb_stor_clear_halt(us, us->send_bulk_pipe);
- /* return a result code based on the result of the control message */
- if (result < 0 || result2 < 0) {
+ /* return a result code based on the result of the clear-halts */
+ if (result >= 0)
+ result = result2;
+ if (result < 0) {
US_DEBUGP("Soft reset failed\n");
goto Done;
}
--
Matthew Dharm Home: [EMAIL PROTECTED]
Maintainer, Linux USB Mass Storage Driver
NYET! The evil stops here!
-- Pitr
User Friendly, 6/22/1998
pgpntZ1izrN5M.pgp
Description: PGP signature
