mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-29 19:21:31 -04:00
USB: usb-storage: add BAD_SENSE flag
This patch (as1311) fixes a problem in usb-storage: Some devices are pretty broken when it comes to reporting sense data. The information they send back indicates that they have more than 18 bytes of sense data available, but when the system asks for more than 18 they fail or hang. The symptom is that probing fails with multiple resets. The patch adds a new BAD_SENSE flag to indicate that usb-storage should never ask for more than 18 bytes of sense data. The flag can be set in an unusual_devs entry or via the "quirks=" module parameter, and it is set automatically whenever a REQUEST SENSE command for more than 18 bytes fails or times out. An unusual_devs entry is added for the Agfa photo frame, which uses a Prolific chip having this bug. Signed-off-by: Alan Stern <[email protected]> Tested-by: Daniel Kukula <[email protected]> Cc: stable <[email protected]> Signed-off-by: Greg Kroah-Hartman <[email protected]>
This commit is contained in:
parent
8e4ceb38eb
commit
a0bb108112
5 changed files with 28 additions and 5 deletions
|
|
@ -666,10 +666,11 @@ void usb_stor_invoke_transport(struct scsi_cmnd *srb, struct us_data *us)
|
|||
* to wait for at least one CHECK_CONDITION to determine
|
||||
* SANE_SENSE support
|
||||
*/
|
||||
if ((srb->cmnd[0] == ATA_16 || srb->cmnd[0] == ATA_12) &&
|
||||
if (unlikely((srb->cmnd[0] == ATA_16 || srb->cmnd[0] == ATA_12) &&
|
||||
result == USB_STOR_TRANSPORT_GOOD &&
|
||||
!(us->fflags & US_FL_SANE_SENSE) &&
|
||||
!(srb->cmnd[2] & 0x20)) {
|
||||
!(us->fflags & US_FL_BAD_SENSE) &&
|
||||
!(srb->cmnd[2] & 0x20))) {
|
||||
US_DEBUGP("-- SAT supported, increasing auto-sense\n");
|
||||
us->fflags |= US_FL_SANE_SENSE;
|
||||
}
|
||||
|
|
@ -718,6 +719,12 @@ Retry_Sense:
|
|||
if (test_bit(US_FLIDX_TIMED_OUT, &us->dflags)) {
|
||||
US_DEBUGP("-- auto-sense aborted\n");
|
||||
srb->result = DID_ABORT << 16;
|
||||
|
||||
/* If SANE_SENSE caused this problem, disable it */
|
||||
if (sense_size != US_SENSE_SIZE) {
|
||||
us->fflags &= ~US_FL_SANE_SENSE;
|
||||
us->fflags |= US_FL_BAD_SENSE;
|
||||
}
|
||||
goto Handle_Errors;
|
||||
}
|
||||
|
||||
|
|
@ -727,10 +734,11 @@ Retry_Sense:
|
|||
* (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) {
|
||||
sense_size != US_SENSE_SIZE) {
|
||||
US_DEBUGP("-- auto-sense failure, retry small sense\n");
|
||||
sense_size = US_SENSE_SIZE;
|
||||
us->fflags &= ~US_FL_SANE_SENSE;
|
||||
us->fflags |= US_FL_BAD_SENSE;
|
||||
goto Retry_Sense;
|
||||
}
|
||||
|
||||
|
|
@ -754,6 +762,7 @@ Retry_Sense:
|
|||
*/
|
||||
if (srb->sense_buffer[7] > (US_SENSE_SIZE - 8) &&
|
||||
!(us->fflags & US_FL_SANE_SENSE) &&
|
||||
!(us->fflags & US_FL_BAD_SENSE) &&
|
||||
(srb->sense_buffer[0] & 0x7C) == 0x70) {
|
||||
US_DEBUGP("-- SANE_SENSE support enabled\n");
|
||||
us->fflags |= US_FL_SANE_SENSE;
|
||||
|
|
|
|||
|
|
@ -818,6 +818,13 @@ UNUSUAL_DEV( 0x066f, 0x8000, 0x0001, 0x0001,
|
|||
US_SC_DEVICE, US_PR_DEVICE, NULL,
|
||||
US_FL_FIX_CAPACITY ),
|
||||
|
||||
/* Reported by Daniel Kukula <[email protected]> */
|
||||
UNUSUAL_DEV( 0x067b, 0x1063, 0x0100, 0x0100,
|
||||
"Prolific Technology, Inc.",
|
||||
"Prolific Storage Gadget",
|
||||
US_SC_DEVICE, US_PR_DEVICE, NULL,
|
||||
US_FL_BAD_SENSE ),
|
||||
|
||||
/* Reported by Rogerio Brito <[email protected]> */
|
||||
UNUSUAL_DEV( 0x067b, 0x2317, 0x0001, 0x001,
|
||||
"Prolific Technology, Inc.",
|
||||
|
|
|
|||
|
|
@ -463,6 +463,9 @@ static void adjust_quirks(struct us_data *us)
|
|||
case 'a':
|
||||
f |= US_FL_SANE_SENSE;
|
||||
break;
|
||||
case 'b':
|
||||
f |= US_FL_BAD_SENSE;
|
||||
break;
|
||||
case 'c':
|
||||
f |= US_FL_FIX_CAPACITY;
|
||||
break;
|
||||
|
|
|
|||
Loading…
Reference in a new issue