Commit 5e465242 authored by Matthew Dharm's avatar Matthew Dharm Committed by Greg Kroah-Hartman

[PATCH] usb-storage: LUN and isd200

This patch (developed with assistance from Jan Harkes
<jaharkes@cs.cmu.edu>) makes the LUN field of a bulk-only transport come
from a known-good source, rather than the likely-good command-byte.  It
also updates the ISD200 driver to work with this change.
parent 5e828ac3
...@@ -405,11 +405,14 @@ static int isd200_action( struct us_data *us, int action, ...@@ -405,11 +405,14 @@ static int isd200_action( struct us_data *us, int action,
{ {
union ata_cdb ata; union ata_cdb ata;
struct scsi_cmnd srb; struct scsi_cmnd srb;
struct scsi_device srb_dev;
struct isd200_info *info = (struct isd200_info *)us->extra; struct isd200_info *info = (struct isd200_info *)us->extra;
int status; int status;
memset(&ata, 0, sizeof(ata)); memset(&ata, 0, sizeof(ata));
memset(&srb, 0, sizeof(srb)); memset(&srb, 0, sizeof(srb));
memset(&srb_dev, 0, sizeof(srb_dev));
srb.device = &srb_dev;
ata.generic.SignatureByte0 = info->ConfigData.ATAMajorCommand; ata.generic.SignatureByte0 = info->ConfigData.ATAMajorCommand;
ata.generic.SignatureByte1 = info->ConfigData.ATAMinorCommand; ata.generic.SignatureByte1 = info->ConfigData.ATAMinorCommand;
...@@ -479,6 +482,7 @@ static int isd200_action( struct us_data *us, int action, ...@@ -479,6 +482,7 @@ static int isd200_action( struct us_data *us, int action,
} }
memcpy(srb.cmnd, &ata, sizeof(ata.generic)); memcpy(srb.cmnd, &ata, sizeof(ata.generic));
srb.cmd_len = sizeof(ata.generic);
status = usb_stor_Bulk_transport(&srb, us); status = usb_stor_Bulk_transport(&srb, us);
if (status == USB_STOR_TRANSPORT_GOOD) if (status == USB_STOR_TRANSPORT_GOOD)
status = ISD200_GOOD; status = ISD200_GOOD;
...@@ -538,6 +542,7 @@ void isd200_invoke_transport( struct us_data *us, ...@@ -538,6 +542,7 @@ void isd200_invoke_transport( struct us_data *us,
/* send the command to the transport layer */ /* send the command to the transport layer */
srb->resid = 0; srb->resid = 0;
memcpy(srb->cmnd, ataCdb, sizeof(ataCdb->generic)); memcpy(srb->cmnd, ataCdb, sizeof(ataCdb->generic));
srb->cmd_len = sizeof(ataCdb->generic);
transferStatus = usb_stor_Bulk_transport(srb, us); transferStatus = usb_stor_Bulk_transport(srb, us);
/* if the command gets aborted by the higher layers, we need to /* if the command gets aborted by the higher layers, we need to
......
...@@ -900,7 +900,7 @@ int usb_stor_Bulk_transport(Scsi_Cmnd *srb, struct us_data *us) ...@@ -900,7 +900,7 @@ int usb_stor_Bulk_transport(Scsi_Cmnd *srb, struct us_data *us)
bcb.DataTransferLength = cpu_to_le32(transfer_length); bcb.DataTransferLength = cpu_to_le32(transfer_length);
bcb.Flags = srb->sc_data_direction == SCSI_DATA_READ ? 1 << 7 : 0; bcb.Flags = srb->sc_data_direction == SCSI_DATA_READ ? 1 << 7 : 0;
bcb.Tag = srb->serial_number; bcb.Tag = srb->serial_number;
bcb.Lun = srb->cmnd[1] >> 5; bcb.Lun = srb->device->lun;
if (us->flags & US_FL_SCM_MULT_TARG) if (us->flags & US_FL_SCM_MULT_TARG)
bcb.Lun |= srb->device->id << 4; bcb.Lun |= srb->device->id << 4;
bcb.Length = srb->cmd_len; bcb.Length = srb->cmd_len;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment