forked from Minki/linux
[PATCH] USB Storage: remove dependency on SCSI-provided serial/tag number
This patch started life as as531 from Alan Stern. It has been rediffed against the latest tree. The SCSI people have deprecated the use of scsi_cmnd.serial_number for anything other than printk. Worse than that, the SCSI core doesn't always increment the number (when the error handler is running, for example). So this patch creates a locally-stored value for use in bulk-only tags. The net result is a simplification, since we no longer have to save & restore the serial_number value while autosensing. 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>
This commit is contained in:
parent
9a57116bc9
commit
0f64e07813
@ -611,7 +611,6 @@ void usb_stor_invoke_transport(struct scsi_cmnd *srb, struct us_data *us)
|
||||
unsigned char old_sc_data_direction;
|
||||
unsigned char old_cmd_len;
|
||||
unsigned char old_cmnd[MAX_COMMAND_SIZE];
|
||||
unsigned long old_serial_number;
|
||||
int old_resid;
|
||||
|
||||
US_DEBUGP("Issuing auto-REQUEST_SENSE\n");
|
||||
@ -648,10 +647,6 @@ void usb_stor_invoke_transport(struct scsi_cmnd *srb, struct us_data *us)
|
||||
old_sg = srb->use_sg;
|
||||
srb->use_sg = 0;
|
||||
|
||||
/* change the serial number -- toggle the high bit*/
|
||||
old_serial_number = srb->serial_number;
|
||||
srb->serial_number ^= 0x80000000;
|
||||
|
||||
/* issue the auto-sense command */
|
||||
old_resid = srb->resid;
|
||||
srb->resid = 0;
|
||||
@ -662,7 +657,6 @@ void usb_stor_invoke_transport(struct scsi_cmnd *srb, struct us_data *us)
|
||||
srb->request_buffer = old_request_buffer;
|
||||
srb->request_bufflen = old_request_bufflen;
|
||||
srb->use_sg = old_sg;
|
||||
srb->serial_number = old_serial_number;
|
||||
srb->sc_data_direction = old_sc_data_direction;
|
||||
srb->cmd_len = old_cmd_len;
|
||||
memcpy(srb->cmnd, old_cmnd, MAX_COMMAND_SIZE);
|
||||
@ -985,7 +979,7 @@ int usb_stor_Bulk_transport(struct scsi_cmnd *srb, struct us_data *us)
|
||||
bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN);
|
||||
bcb->DataTransferLength = cpu_to_le32(transfer_length);
|
||||
bcb->Flags = srb->sc_data_direction == DMA_FROM_DEVICE ? 1 << 7 : 0;
|
||||
bcb->Tag = srb->serial_number;
|
||||
bcb->Tag = ++us->tag;
|
||||
bcb->Lun = srb->device->lun;
|
||||
if (us->flags & US_FL_SCM_MULT_TARG)
|
||||
bcb->Lun |= srb->device->id << 4;
|
||||
@ -1074,7 +1068,7 @@ int usb_stor_Bulk_transport(struct scsi_cmnd *srb, struct us_data *us)
|
||||
US_DEBUGP("Bulk Status S 0x%x T 0x%x R %u Stat 0x%x\n",
|
||||
le32_to_cpu(bcs->Signature), bcs->Tag,
|
||||
residue, bcs->Status);
|
||||
if (bcs->Tag != srb->serial_number || bcs->Status > US_BULK_STAT_PHASE) {
|
||||
if (bcs->Tag != us->tag || bcs->Status > US_BULK_STAT_PHASE) {
|
||||
US_DEBUGP("Bulk logical error\n");
|
||||
return USB_STOR_TRANSPORT_ERROR;
|
||||
}
|
||||
|
@ -158,6 +158,7 @@ struct us_data {
|
||||
|
||||
/* SCSI interfaces */
|
||||
struct scsi_cmnd *srb; /* current srb */
|
||||
unsigned int tag; /* current dCBWTag */
|
||||
|
||||
/* thread information */
|
||||
int pid; /* control thread */
|
||||
|
Loading…
Reference in New Issue
Block a user