aboutsummaryrefslogtreecommitdiff
path: root/drivers/usb/storage/transport.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2009-10-15 15:05:33 -0700
committerLinus Torvalds <torvalds@linux-foundation.org>2009-10-15 15:05:33 -0700
commit59c0b586aebdfff2c79d61139a2f5ea3b6d62675 (patch)
tree2accc49ecfc9673aaeba03fc91e56611c61d4aa0 /drivers/usb/storage/transport.c
parentb25eaebc6c5072164fef6f288a3e93241cc78bb7 (diff)
parent4238ef54690ea502a22aab41c377f23588c387d0 (diff)
Merge git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb-2.6: USB: gadget: Fix EEM driver comments and VID/PID usb-storage: Workaround devices with bogus sense size USB: ehci: Fix IST boundary checking interval math. USB: option: Support for AIRPLUS MCD650 Datacard USB: whci-hcd: always do an update after processing a halted qTD USB: whci-hcd: handle early deletion of endpoints USB: wusb: don't use the stack to read security descriptor USB: rename Documentation/ABI/.../sysfs-class-usb_host
Diffstat (limited to 'drivers/usb/storage/transport.c')
-rw-r--r--drivers/usb/storage/transport.c17
1 files changed, 16 insertions, 1 deletions
diff --git a/drivers/usb/storage/transport.c b/drivers/usb/storage/transport.c
index 3a4fb023af7..589f6b4404f 100644
--- a/drivers/usb/storage/transport.c
+++ b/drivers/usb/storage/transport.c
@@ -696,7 +696,7 @@ void usb_stor_invoke_transport(struct scsi_cmnd *srb, struct us_data *us)
/* device supports and needs bigger sense buffer */
if (us->fflags & US_FL_SANE_SENSE)
sense_size = ~0;
-
+Retry_Sense:
US_DEBUGP("Issuing auto-REQUEST_SENSE\n");
scsi_eh_prep_cmnd(srb, &ses, NULL, 0, sense_size);
@@ -720,6 +720,21 @@ void usb_stor_invoke_transport(struct scsi_cmnd *srb, struct us_data *us)
srb->result = DID_ABORT << 16;
goto Handle_Errors;
}
+
+ /* Some devices claim to support larger sense but fail when
+ * trying to request it. When a transport failure happens
+ * using US_FS_SANE_SENSE, we always retry with a standard
+ * (small) sense request. This fixes some USB GSM modems
+ */
+ if (temp_result == USB_STOR_TRANSPORT_FAILED &&
+ (us->fflags & US_FL_SANE_SENSE) &&
+ sense_size != US_SENSE_SIZE) {
+ US_DEBUGP("-- auto-sense failure, retry small sense\n");
+ sense_size = US_SENSE_SIZE;
+ goto Retry_Sense;
+ }
+
+ /* Other failures */
if (temp_result != USB_STOR_TRANSPORT_GOOD) {
US_DEBUGP("-- auto-sense failure\n");