[PATCH] USB Storage: endpoint toggles and reset delays
authorMatthew Dharm <mdharm-usb@one-eyed-alien.net>
Tue, 7 Jun 2005 00:19:29 +0000 (17:19 -0700)
committerGreg Kroah-Hartman <gregkh@suse.de>
Mon, 27 Jun 2005 21:44:02 +0000 (14:44 -0700)
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.

Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
Signed-off-by: Matthew Dharm <mdharm-usb@one-eyed-alien.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/usb/storage/transport.c

index 9743e289cd3b1d68b49aba1298ad79fb2cfe5c3c..419afb2216b94edb42f3efc6019742986926e4ce 100644 (file)
@@ -266,8 +266,9 @@ int usb_stor_clear_halt(struct us_data *us, unsigned int pipe)
                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 @@ int usb_stor_Bulk_transport(struct scsi_cmnd *srb, struct us_data *us)
  * 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 @@ static int usb_stor_reset_common(struct us_data *us,
        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 @@ static int usb_stor_reset_common(struct us_data *us,
        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;
        }