kernel: USB update from stlinux24_217
This commit is contained in:
@@ -58,7 +58,9 @@
|
||||
|
||||
void usb_stor_pad12_command(struct scsi_cmnd *srb, struct us_data *us)
|
||||
{
|
||||
/* Pad the SCSI command with zeros out to 12 bytes
|
||||
/*
|
||||
* Pad the SCSI command with zeros out to 12 bytes. If the
|
||||
* command already is 12 bytes or longer, leave it alone.
|
||||
*
|
||||
* NOTE: This only works because a scsi_cmnd struct field contains
|
||||
* a unsigned char cmnd[16], so we know we have storage available
|
||||
@@ -66,9 +68,6 @@ void usb_stor_pad12_command(struct scsi_cmnd *srb, struct us_data *us)
|
||||
for (; srb->cmd_len<12; srb->cmd_len++)
|
||||
srb->cmnd[srb->cmd_len] = 0;
|
||||
|
||||
/* set command length to 12 bytes */
|
||||
srb->cmd_len = 12;
|
||||
|
||||
/* send the command to the transport layer */
|
||||
usb_stor_invoke_transport(srb, us);
|
||||
}
|
||||
|
@@ -693,6 +693,9 @@ void usb_stor_invoke_transport(struct scsi_cmnd *srb, struct us_data *us)
|
||||
int temp_result;
|
||||
struct scsi_eh_save ses;
|
||||
int sense_size = US_SENSE_SIZE;
|
||||
struct scsi_sense_hdr sshdr;
|
||||
const u8 *scdd;
|
||||
u8 fm_ili;
|
||||
|
||||
/* device supports and needs bigger sense buffer */
|
||||
if (us->fflags & US_FL_SANE_SENSE)
|
||||
@@ -776,32 +779,30 @@ Retry_Sense:
|
||||
srb->sense_buffer[7] = (US_SENSE_SIZE - 8);
|
||||
}
|
||||
|
||||
scsi_normalize_sense(srb->sense_buffer, SCSI_SENSE_BUFFERSIZE,
|
||||
&sshdr);
|
||||
|
||||
US_DEBUGP("-- Result from auto-sense is %d\n", temp_result);
|
||||
US_DEBUGP("-- code: 0x%x, key: 0x%x, ASC: 0x%x, ASCQ: 0x%x\n",
|
||||
srb->sense_buffer[0],
|
||||
srb->sense_buffer[2] & 0xf,
|
||||
srb->sense_buffer[12],
|
||||
srb->sense_buffer[13]);
|
||||
sshdr.response_code, sshdr.sense_key,
|
||||
sshdr.asc, sshdr.ascq);
|
||||
#ifdef CONFIG_USB_STORAGE_DEBUG
|
||||
usb_stor_show_sense(
|
||||
srb->sense_buffer[2] & 0xf,
|
||||
srb->sense_buffer[12],
|
||||
srb->sense_buffer[13]);
|
||||
usb_stor_show_sense(sshdr.sense_key, sshdr.asc, sshdr.ascq);
|
||||
#endif
|
||||
|
||||
/* set the result so the higher layers expect this data */
|
||||
srb->result = SAM_STAT_CHECK_CONDITION;
|
||||
|
||||
scdd = scsi_sense_desc_find(srb->sense_buffer,
|
||||
SCSI_SENSE_BUFFERSIZE, 4);
|
||||
fm_ili = (scdd ? scdd[3] : srb->sense_buffer[2]) & 0xA0;
|
||||
|
||||
/* We often get empty sense data. This could indicate that
|
||||
* everything worked or that there was an unspecified
|
||||
* problem. We have to decide which.
|
||||
*/
|
||||
if ( /* Filemark 0, ignore EOM, ILI 0, no sense */
|
||||
(srb->sense_buffer[2] & 0xaf) == 0 &&
|
||||
/* No ASC or ASCQ */
|
||||
srb->sense_buffer[12] == 0 &&
|
||||
srb->sense_buffer[13] == 0) {
|
||||
|
||||
if (sshdr.sense_key == 0 && sshdr.asc == 0 && sshdr.ascq == 0 &&
|
||||
fm_ili == 0) {
|
||||
/* If things are really okay, then let's show that.
|
||||
* Zero out the sense buffer so the higher layers
|
||||
* won't realize we did an unsolicited auto-sense.
|
||||
@@ -816,7 +817,10 @@ Retry_Sense:
|
||||
*/
|
||||
} else {
|
||||
srb->result = DID_ERROR << 16;
|
||||
srb->sense_buffer[2] = HARDWARE_ERROR;
|
||||
if ((sshdr.response_code & 0x72) == 0x72)
|
||||
srb->sense_buffer[1] = HARDWARE_ERROR;
|
||||
else
|
||||
srb->sense_buffer[2] = HARDWARE_ERROR;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -1857,6 +1857,13 @@ UNUSUAL_DEV( 0x1370, 0x6828, 0x0110, 0x0110,
|
||||
US_SC_DEVICE, US_PR_DEVICE, NULL,
|
||||
US_FL_IGNORE_RESIDUE ),
|
||||
|
||||
/* Reported by Qinglin Ye <yestyle@gmail.com> */
|
||||
UNUSUAL_DEV( 0x13fe, 0x3600, 0x0100, 0x0100,
|
||||
"Kingston",
|
||||
"DT 101 G2",
|
||||
US_SC_DEVICE, US_PR_DEVICE, NULL,
|
||||
US_FL_BULK_IGNORE_TAG ),
|
||||
|
||||
/* Reported by Francesco Foresti <frafore@tiscali.it> */
|
||||
UNUSUAL_DEV( 0x14cd, 0x6600, 0x0201, 0x0201,
|
||||
"Super Top",
|
||||
@@ -1977,6 +1984,16 @@ UNUSUAL_DEV( 0x4146, 0xba01, 0x0100, 0x0100,
|
||||
"Micro Mini 1GB",
|
||||
US_SC_DEVICE, US_PR_DEVICE, NULL, US_FL_NOT_LOCKABLE ),
|
||||
|
||||
/*
|
||||
* Nick Bowler <nbowler@elliptictech.com>
|
||||
* SCSI stack spams (otherwise harmless) error messages.
|
||||
*/
|
||||
UNUSUAL_DEV( 0xc251, 0x4003, 0x0100, 0x0100,
|
||||
"Keil Software, Inc.",
|
||||
"V2M MotherBoard",
|
||||
US_SC_DEVICE, US_PR_DEVICE, NULL,
|
||||
US_FL_NOT_LOCKABLE),
|
||||
|
||||
/* Reported by Andrew Simmons <andrew.simmons@gmail.com> */
|
||||
UNUSUAL_DEV( 0xed06, 0x4500, 0x0001, 0x0001,
|
||||
"DataStor",
|
||||
|
@@ -1025,6 +1025,7 @@ static struct usb_driver usb_storage_driver = {
|
||||
.post_reset = usb_stor_post_reset,
|
||||
.id_table = usb_storage_usb_ids,
|
||||
.soft_unbind = 1,
|
||||
.no_dynamic_id = 1,
|
||||
};
|
||||
|
||||
static int __init usb_stor_init(void)
|
||||
|
Reference in New Issue
Block a user