aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/storage/transport.c
diff options
context:
space:
mode:
authorMatthew Dharm <mdharm-usb@one-eyed-alien.net>2005-06-06 20:19:29 -0400
committerGreg Kroah-Hartman <gregkh@suse.de>2005-06-27 17:44:02 -0400
commit5203ad441310a4c2abd4fb79015a6bdadc2a5a4f (patch)
tree21ad49e478dfb028f7f42495d940d09883d3a60a /drivers/usb/storage/transport.c
parent01205a0e60bb5a66d768b881fb8355981b912510 (diff)
[PATCH] USB Storage: endpoint toggles and reset delays
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>
Diffstat (limited to 'drivers/usb/storage/transport.c')
-rw-r--r--drivers/usb/storage/transport.c19
1 files changed, 9 insertions, 10 deletions
diff --git a/drivers/usb/storage/transport.c b/drivers/usb/storage/transport.c
index 9743e289cd3b..419afb2216b9 100644
--- a/drivers/usb/storage/transport.c
+++ b/drivers/usb/storage/transport.c
@@ -266,8 +266,9 @@ int usb_stor_clear_halt(struct us_data *us, unsigned int pipe)
266 NULL, 0, 3*HZ); 266 NULL, 0, 3*HZ);
267 267
268 /* reset the endpoint toggle */ 268 /* reset the endpoint toggle */
269 usb_settoggle(us->pusb_dev, usb_pipeendpoint(pipe), 269 if (result >= 0)
270 usb_pipeout(pipe), 0); 270 usb_settoggle(us->pusb_dev, usb_pipeendpoint(pipe),
271 usb_pipeout(pipe), 0);
271 272
272 US_DEBUGP("%s: result = %d\n", __FUNCTION__, result); 273 US_DEBUGP("%s: result = %d\n", __FUNCTION__, result);
273 return result; 274 return result;
@@ -1124,7 +1125,7 @@ int usb_stor_Bulk_transport(struct scsi_cmnd *srb, struct us_data *us)
1124 * It's handy that every transport mechanism uses the control endpoint for 1125 * It's handy that every transport mechanism uses the control endpoint for
1125 * resets. 1126 * resets.
1126 * 1127 *
1127 * Basically, we send a reset with a 20-second timeout, so we don't get 1128 * Basically, we send a reset with a 5-second timeout, so we don't get
1128 * jammed attempting to do the reset. 1129 * jammed attempting to do the reset.
1129 */ 1130 */
1130static int usb_stor_reset_common(struct us_data *us, 1131static int usb_stor_reset_common(struct us_data *us,
@@ -1145,13 +1146,9 @@ static int usb_stor_reset_common(struct us_data *us,
1145 clear_bit(US_FLIDX_ABORTING, &us->flags); 1146 clear_bit(US_FLIDX_ABORTING, &us->flags);
1146 scsi_unlock(us_to_host(us)); 1147 scsi_unlock(us_to_host(us));
1147 1148
1148 /* A 20-second timeout may seem rather long, but a LaCie
1149 * StudioDrive USB2 device takes 16+ seconds to get going
1150 * following a powerup or USB attach event.
1151 */
1152 result = usb_stor_control_msg(us, us->send_ctrl_pipe, 1149 result = usb_stor_control_msg(us, us->send_ctrl_pipe,
1153 request, requesttype, value, index, data, size, 1150 request, requesttype, value, index, data, size,
1154 20*HZ); 1151 5*HZ);
1155 if (result < 0) { 1152 if (result < 0) {
1156 US_DEBUGP("Soft reset failed: %d\n", result); 1153 US_DEBUGP("Soft reset failed: %d\n", result);
1157 goto Done; 1154 goto Done;
@@ -1173,8 +1170,10 @@ static int usb_stor_reset_common(struct us_data *us,
1173 US_DEBUGP("Soft reset: clearing bulk-out endpoint halt\n"); 1170 US_DEBUGP("Soft reset: clearing bulk-out endpoint halt\n");
1174 result2 = usb_stor_clear_halt(us, us->send_bulk_pipe); 1171 result2 = usb_stor_clear_halt(us, us->send_bulk_pipe);
1175 1172
1176 /* return a result code based on the result of the control message */ 1173 /* return a result code based on the result of the clear-halts */
1177 if (result < 0 || result2 < 0) { 1174 if (result >= 0)
1175 result = result2;
1176 if (result < 0) {
1178 US_DEBUGP("Soft reset failed\n"); 1177 US_DEBUGP("Soft reset failed\n");
1179 goto Done; 1178 goto Done;
1180 } 1179 }