From mdharm@multivac.one-eyed-alien.net Mon Jun  6 17:23:48 2005
Date: Mon, 6 Jun 2005 17:19:29 -0700
From: Matthew Dharm <mdharm-usb@one-eyed-alien.net>
To: Greg KH <greg@kroah.com>, USB Storage List <usb-storage@lists.one-eyed-alien.net>
Subject: USB Storage: endpoint toggles and reset delays
Message-ID: <20050607001929.GB8689@one-eyed-alien.net>

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 |   19 +++++++++----------
 1 files changed, 9 insertions(+), 10 deletions(-)

--- gregkh-2.6.orig/drivers/usb/storage/transport.c	2005-06-06 12:09:05.000000000 -0700
+++ gregkh-2.6/drivers/usb/storage/transport.c	2005-06-09 22:46:14.000000000 -0700
@@ -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;
 	}