Commit 489f597d authored by Patrick Mansfield's avatar Patrick Mansfield Committed by James Bottomley

[PATCH] Re: [PATCH] SCSI-2 LUN setting consolidation

This patch consolidates the setting of the LUN in byte 1 of the SCSI
command block for SCSI-2 and lower devices.

This is needed for multi-path IO (some devices can actually have differnt
LUN values for each path), but is also a nice clean up of the code.

sg.c was able to inhibit setting the value, this removes that capability -
if it is really needed it can be black listed in the device_list[] flags,
or sg could set a similiar flag.

This is patched against the latest bk (as of some time on Oct 16), and
patches clean against 2.5.43.

Tests were run with different adapters and various disks and a tape drive,
I have no SCSI-2 multi-lun devices, so the main verifcation was done using
a modified scsi_debug.c driver to emulate a multi-lun SCSI-2 device.

 drivers/scsi/osst.c       |    2 --
 drivers/scsi/scsi.c       |    6 ++++++
 drivers/scsi/scsi_error.c |   12 +++++-------
 drivers/scsi/scsi_ioctl.c |   16 ++++------------
 drivers/scsi/scsi_scan.c  |   31 ++++---------------------------
 drivers/scsi/sd.c         |   22 +++++-----------------
 drivers/scsi/sg.c         |    4 ----
 drivers/scsi/sr.c         |   17 ++---------------
 drivers/scsi/sr_ioctl.c   |   20 +-------------------
 drivers/scsi/sr_vendor.c  |   18 +++---------------
 drivers/scsi/st.c         |    2 --
 include/scsi/sg.h         |    2 +-
 12 files changed, 31 insertions(+), 121 deletions(-)
parent 5a7728c6
...@@ -322,8 +322,6 @@ static Scsi_Request * osst_do_scsi(Scsi_Request *SRpnt, OS_Scsi_Tape *STp, ...@@ -322,8 +322,6 @@ static Scsi_Request * osst_do_scsi(Scsi_Request *SRpnt, OS_Scsi_Tape *STp,
} }
} }
if (SRpnt->sr_device->scsi_level <= SCSI_2)
cmd[1] |= (SRpnt->sr_device->lun << 5) & 0xe0;
init_completion(&STp->wait); init_completion(&STp->wait);
SRpnt->sr_use_sg = (bytes > (STp->buffer)->sg[0].length) ? SRpnt->sr_use_sg = (bytes > (STp->buffer)->sg[0].length) ?
(STp->buffer)->use_sg : 0; (STp->buffer)->use_sg : 0;
......
...@@ -798,6 +798,12 @@ int scsi_dispatch_cmd(Scsi_Cmnd * SCpnt) ...@@ -798,6 +798,12 @@ int scsi_dispatch_cmd(Scsi_Cmnd * SCpnt)
serial_number = 1; serial_number = 1;
SCpnt->serial_number = serial_number; SCpnt->serial_number = serial_number;
SCpnt->pid = scsi_pid++; SCpnt->pid = scsi_pid++;
/*
* If SCSI-2 or lower, store the LUN value in cmnd.
*/
if (SCpnt->device->scsi_level <= SCSI_2)
SCpnt->cmnd[1] = (SCpnt->cmnd[1] & 0x1f) |
(SCpnt->lun << 5 & 0xe0);
/* /*
* We will wait MIN_RESET_DELAY clock ticks after the last reset so * We will wait MIN_RESET_DELAY clock ticks after the last reset so
......
...@@ -502,6 +502,10 @@ static int scsi_send_eh_cmnd(Scsi_Cmnd *scmd, int timeout) ...@@ -502,6 +502,10 @@ static int scsi_send_eh_cmnd(Scsi_Cmnd *scmd, int timeout)
*/ */
scmd->owner = SCSI_OWNER_LOWLEVEL; scmd->owner = SCSI_OWNER_LOWLEVEL;
if (scmd->device->scsi_level <= SCSI_2)
scmd->cmnd[1] = (scmd->cmnd[1] & 0x1f) |
(scmd->lun << 5 & 0xe0);
if (host->can_queue) { if (host->can_queue) {
DECLARE_MUTEX_LOCKED(sem); DECLARE_MUTEX_LOCKED(sem);
...@@ -610,9 +614,6 @@ static int scsi_request_sense(Scsi_Cmnd *scmd) ...@@ -610,9 +614,6 @@ static int scsi_request_sense(Scsi_Cmnd *scmd)
memcpy((void *) scmd->cmnd, (void *) generic_sense, memcpy((void *) scmd->cmnd, (void *) generic_sense,
sizeof(generic_sense)); sizeof(generic_sense));
if (scmd->device->scsi_level <= SCSI_2)
scmd->cmnd[1] = scmd->lun << 5;
scsi_result = (!scmd->host->hostt->unchecked_isa_dma) scsi_result = (!scmd->host->hostt->unchecked_isa_dma)
? &scsi_result0[0] : kmalloc(512, GFP_ATOMIC | GFP_DMA); ? &scsi_result0[0] : kmalloc(512, GFP_ATOMIC | GFP_DMA);
...@@ -839,9 +840,6 @@ static int scsi_eh_tur(Scsi_Cmnd *scmd) ...@@ -839,9 +840,6 @@ static int scsi_eh_tur(Scsi_Cmnd *scmd)
memcpy((void *) scmd->cmnd, (void *) tur_command, memcpy((void *) scmd->cmnd, (void *) tur_command,
sizeof(tur_command)); sizeof(tur_command));
if (scmd->device->scsi_level <= SCSI_2)
scmd->cmnd[1] = scmd->lun << 5;
/* /*
* zero the sense buffer. the scsi spec mandates that any * zero the sense buffer. the scsi spec mandates that any
* untransferred sense data should be interpreted as being zero. * untransferred sense data should be interpreted as being zero.
...@@ -1419,7 +1417,7 @@ static void scsi_eh_lock_door(struct scsi_device *sdev) ...@@ -1419,7 +1417,7 @@ static void scsi_eh_lock_door(struct scsi_device *sdev)
} }
sreq->sr_cmnd[0] = ALLOW_MEDIUM_REMOVAL; sreq->sr_cmnd[0] = ALLOW_MEDIUM_REMOVAL;
sreq->sr_cmnd[1] = (sdev->scsi_level <= SCSI_2) ? (sdev->lun << 5) : 0; sreq->sr_cmnd[1] = 0;
sreq->sr_cmnd[2] = 0; sreq->sr_cmnd[2] = 0;
sreq->sr_cmnd[3] = 0; sreq->sr_cmnd[3] = 0;
sreq->sr_cmnd[4] = SCSI_REMOVAL_PREVENT; sreq->sr_cmnd[4] = SCSI_REMOVAL_PREVENT;
......
...@@ -160,7 +160,7 @@ int scsi_set_medium_removal(Scsi_Device *dev, char state) ...@@ -160,7 +160,7 @@ int scsi_set_medium_removal(Scsi_Device *dev, char state)
return 0; return 0;
scsi_cmd[0] = ALLOW_MEDIUM_REMOVAL; scsi_cmd[0] = ALLOW_MEDIUM_REMOVAL;
scsi_cmd[1] = (dev->scsi_level <= SCSI_2) ? (dev->lun << 5) : 0; scsi_cmd[1] = 0;
scsi_cmd[2] = 0; scsi_cmd[2] = 0;
scsi_cmd[3] = 0; scsi_cmd[3] = 0;
scsi_cmd[4] = state; scsi_cmd[4] = state;
...@@ -297,12 +297,6 @@ int scsi_ioctl_send_command(Scsi_Device * dev, Scsi_Ioctl_Command * sic) ...@@ -297,12 +297,6 @@ int scsi_ioctl_send_command(Scsi_Device * dev, Scsi_Ioctl_Command * sic)
if(copy_from_user(buf, cmd_in + cmdlen, inlen)) if(copy_from_user(buf, cmd_in + cmdlen, inlen))
goto error; goto error;
/*
* Set the lun field to the correct value.
*/
if (dev->scsi_level <= SCSI_2)
cmd[1] = (cmd[1] & 0x1f) | (dev->lun << 5);
switch (opcode) { switch (opcode) {
case FORMAT_UNIT: case FORMAT_UNIT:
timeout = FORMAT_UNIT_TIMEOUT; timeout = FORMAT_UNIT_TIMEOUT;
...@@ -416,7 +410,6 @@ scsi_ioctl_get_pci(Scsi_Device * dev, void *arg) ...@@ -416,7 +410,6 @@ scsi_ioctl_get_pci(Scsi_Device * dev, void *arg)
int scsi_ioctl(Scsi_Device * dev, int cmd, void *arg) int scsi_ioctl(Scsi_Device * dev, int cmd, void *arg)
{ {
char scsi_cmd[MAX_COMMAND_SIZE]; char scsi_cmd[MAX_COMMAND_SIZE];
char cmd_byte1;
/* No idea how this happens.... */ /* No idea how this happens.... */
if (!dev) if (!dev)
...@@ -431,7 +424,6 @@ int scsi_ioctl(Scsi_Device * dev, int cmd, void *arg) ...@@ -431,7 +424,6 @@ int scsi_ioctl(Scsi_Device * dev, int cmd, void *arg)
if (!scsi_block_when_processing_errors(dev)) { if (!scsi_block_when_processing_errors(dev)) {
return -ENODEV; return -ENODEV;
} }
cmd_byte1 = (dev->scsi_level <= SCSI_2) ? (dev->lun << 5) : 0;
switch (cmd) { switch (cmd) {
case SCSI_IOCTL_GET_IDLUN: case SCSI_IOCTL_GET_IDLUN:
...@@ -484,7 +476,7 @@ int scsi_ioctl(Scsi_Device * dev, int cmd, void *arg) ...@@ -484,7 +476,7 @@ int scsi_ioctl(Scsi_Device * dev, int cmd, void *arg)
return scsi_set_medium_removal(dev, SCSI_REMOVAL_ALLOW); return scsi_set_medium_removal(dev, SCSI_REMOVAL_ALLOW);
case SCSI_IOCTL_TEST_UNIT_READY: case SCSI_IOCTL_TEST_UNIT_READY:
scsi_cmd[0] = TEST_UNIT_READY; scsi_cmd[0] = TEST_UNIT_READY;
scsi_cmd[1] = cmd_byte1; scsi_cmd[1] = 0;
scsi_cmd[2] = scsi_cmd[3] = scsi_cmd[5] = 0; scsi_cmd[2] = scsi_cmd[3] = scsi_cmd[5] = 0;
scsi_cmd[4] = 0; scsi_cmd[4] = 0;
return ioctl_internal_command((Scsi_Device *) dev, scsi_cmd, return ioctl_internal_command((Scsi_Device *) dev, scsi_cmd,
...@@ -492,7 +484,7 @@ int scsi_ioctl(Scsi_Device * dev, int cmd, void *arg) ...@@ -492,7 +484,7 @@ int scsi_ioctl(Scsi_Device * dev, int cmd, void *arg)
break; break;
case SCSI_IOCTL_START_UNIT: case SCSI_IOCTL_START_UNIT:
scsi_cmd[0] = START_STOP; scsi_cmd[0] = START_STOP;
scsi_cmd[1] = cmd_byte1; scsi_cmd[1] = 0;
scsi_cmd[2] = scsi_cmd[3] = scsi_cmd[5] = 0; scsi_cmd[2] = scsi_cmd[3] = scsi_cmd[5] = 0;
scsi_cmd[4] = 1; scsi_cmd[4] = 1;
return ioctl_internal_command((Scsi_Device *) dev, scsi_cmd, return ioctl_internal_command((Scsi_Device *) dev, scsi_cmd,
...@@ -500,7 +492,7 @@ int scsi_ioctl(Scsi_Device * dev, int cmd, void *arg) ...@@ -500,7 +492,7 @@ int scsi_ioctl(Scsi_Device * dev, int cmd, void *arg)
break; break;
case SCSI_IOCTL_STOP_UNIT: case SCSI_IOCTL_STOP_UNIT:
scsi_cmd[0] = START_STOP; scsi_cmd[0] = START_STOP;
scsi_cmd[1] = cmd_byte1; scsi_cmd[1] = 0;
scsi_cmd[2] = scsi_cmd[3] = scsi_cmd[5] = 0; scsi_cmd[2] = scsi_cmd[3] = scsi_cmd[5] = 0;
scsi_cmd[4] = 0; scsi_cmd[4] = 0;
return ioctl_internal_command((Scsi_Device *) dev, scsi_cmd, return ioctl_internal_command((Scsi_Device *) dev, scsi_cmd,
......
...@@ -291,14 +291,10 @@ __setup("max_scsi_report_luns=", scsi_report_luns_setup); ...@@ -291,14 +291,10 @@ __setup("max_scsi_report_luns=", scsi_report_luns_setup);
**/ **/
static void scsi_unlock_floptical(Scsi_Request *sreq, unsigned char *result) static void scsi_unlock_floptical(Scsi_Request *sreq, unsigned char *result)
{ {
Scsi_Device *sdscan = sreq->sr_device;
unsigned char scsi_cmd[MAX_COMMAND_SIZE]; unsigned char scsi_cmd[MAX_COMMAND_SIZE];
printk(KERN_NOTICE "scsi: unlocking floptical drive\n"); printk(KERN_NOTICE "scsi: unlocking floptical drive\n");
scsi_cmd[0] = MODE_SENSE; scsi_cmd[0] = MODE_SENSE;
if (sdscan->scsi_level <= SCSI_2)
scsi_cmd[1] = (sdscan->lun << 5) & 0xe0;
else
scsi_cmd[1] = 0; scsi_cmd[1] = 0;
scsi_cmd[2] = 0x2e; scsi_cmd[2] = 0x2e;
scsi_cmd[3] = 0; scsi_cmd[3] = 0;
...@@ -611,8 +607,6 @@ unsigned char *scsi_get_evpd_page(Scsi_Device *sdev, Scsi_Request *sreq) ...@@ -611,8 +607,6 @@ unsigned char *scsi_get_evpd_page(Scsi_Device *sdev, Scsi_Request *sreq)
{ {
unsigned char *evpd_page; unsigned char *evpd_page;
unsigned char scsi_cmd[MAX_COMMAND_SIZE]; unsigned char scsi_cmd[MAX_COMMAND_SIZE];
int lun = sdev->lun;
int scsi_level = sdev->scsi_level;
int max_lgth = 255; int max_lgth = 255;
retry: retry:
...@@ -629,10 +623,7 @@ unsigned char *scsi_get_evpd_page(Scsi_Device *sdev, Scsi_Request *sreq) ...@@ -629,10 +623,7 @@ unsigned char *scsi_get_evpd_page(Scsi_Device *sdev, Scsi_Request *sreq)
memset(scsi_cmd, 0, MAX_COMMAND_SIZE); memset(scsi_cmd, 0, MAX_COMMAND_SIZE);
scsi_cmd[0] = INQUIRY; scsi_cmd[0] = INQUIRY;
if ((lun > 0) && (scsi_level <= SCSI_2)) scsi_cmd[1] = 0x01;
scsi_cmd[1] = ((lun << 5) & 0xe0) | 0x01;
else
scsi_cmd[1] = 0x01; /* SCSI_3 and higher, don't touch */
scsi_cmd[4] = max_lgth; scsi_cmd[4] = max_lgth;
sreq->sr_cmd_len = 0; sreq->sr_cmd_len = 0;
sreq->sr_sense_buffer[0] = 0; sreq->sr_sense_buffer[0] = 0;
...@@ -870,8 +861,6 @@ int scsi_get_deviceid(Scsi_Device *sdev, Scsi_Request *sreq) ...@@ -870,8 +861,6 @@ int scsi_get_deviceid(Scsi_Device *sdev, Scsi_Request *sreq)
unsigned char *id_page; unsigned char *id_page;
unsigned char scsi_cmd[MAX_COMMAND_SIZE]; unsigned char scsi_cmd[MAX_COMMAND_SIZE];
int id_idx, scnt, ret; int id_idx, scnt, ret;
int lun = sdev->lun;
int scsi_level = sdev->scsi_level;
int max_lgth = 255; int max_lgth = 255;
retry: retry:
...@@ -888,10 +877,7 @@ int scsi_get_deviceid(Scsi_Device *sdev, Scsi_Request *sreq) ...@@ -888,10 +877,7 @@ int scsi_get_deviceid(Scsi_Device *sdev, Scsi_Request *sreq)
memset(scsi_cmd, 0, MAX_COMMAND_SIZE); memset(scsi_cmd, 0, MAX_COMMAND_SIZE);
scsi_cmd[0] = INQUIRY; scsi_cmd[0] = INQUIRY;
if ((lun > 0) && (scsi_level <= SCSI_2)) scsi_cmd[1] = 0x01;
scsi_cmd[1] = ((lun << 5) & 0xe0) | 0x01;
else
scsi_cmd[1] = 0x01; /* SCSI_3 and higher, don't touch */
scsi_cmd[2] = 0x83; scsi_cmd[2] = 0x83;
scsi_cmd[4] = max_lgth; scsi_cmd[4] = max_lgth;
sreq->sr_cmd_len = 0; sreq->sr_cmd_len = 0;
...@@ -977,8 +963,6 @@ int scsi_get_serialnumber(Scsi_Device *sdev, Scsi_Request *sreq) ...@@ -977,8 +963,6 @@ int scsi_get_serialnumber(Scsi_Device *sdev, Scsi_Request *sreq)
{ {
unsigned char *serialnumber_page; unsigned char *serialnumber_page;
unsigned char scsi_cmd[MAX_COMMAND_SIZE]; unsigned char scsi_cmd[MAX_COMMAND_SIZE];
int lun = sdev->lun;
int scsi_level = sdev->scsi_level;
int max_lgth = 255; int max_lgth = 255;
retry: retry:
...@@ -995,10 +979,7 @@ int scsi_get_serialnumber(Scsi_Device *sdev, Scsi_Request *sreq) ...@@ -995,10 +979,7 @@ int scsi_get_serialnumber(Scsi_Device *sdev, Scsi_Request *sreq)
memset(scsi_cmd, 0, MAX_COMMAND_SIZE); memset(scsi_cmd, 0, MAX_COMMAND_SIZE);
scsi_cmd[0] = INQUIRY; scsi_cmd[0] = INQUIRY;
if ((lun > 0) && (scsi_level <= SCSI_2)) scsi_cmd[1] = 0x01;
scsi_cmd[1] = ((lun << 5) & 0xe0) | 0x01;
else
scsi_cmd[1] = 0x01; /* SCSI_3 and higher, don't touch */
scsi_cmd[2] = 0x80; scsi_cmd[2] = 0x80;
scsi_cmd[4] = max_lgth; scsi_cmd[4] = max_lgth;
sreq->sr_cmd_len = 0; sreq->sr_cmd_len = 0;
...@@ -1181,8 +1162,6 @@ static void scsi_probe_lun(Scsi_Request *sreq, char *inq_result, ...@@ -1181,8 +1162,6 @@ static void scsi_probe_lun(Scsi_Request *sreq, char *inq_result,
memset(scsi_cmd, 0, 6); memset(scsi_cmd, 0, 6);
scsi_cmd[0] = INQUIRY; scsi_cmd[0] = INQUIRY;
if ((sdev->lun > 0) && (sdev->scsi_level <= SCSI_2))
scsi_cmd[1] = (sdev->lun << 5) & 0xe0;
scsi_cmd[4] = 36; /* issue conservative alloc_length */ scsi_cmd[4] = 36; /* issue conservative alloc_length */
sreq->sr_cmd_len = 0; sreq->sr_cmd_len = 0;
sreq->sr_data_direction = SCSI_DATA_READ; sreq->sr_data_direction = SCSI_DATA_READ;
...@@ -1230,8 +1209,6 @@ static void scsi_probe_lun(Scsi_Request *sreq, char *inq_result, ...@@ -1230,8 +1209,6 @@ static void scsi_probe_lun(Scsi_Request *sreq, char *inq_result,
if (possible_inq_resp_len > 36) { /* do additional INQUIRY */ if (possible_inq_resp_len > 36) { /* do additional INQUIRY */
memset(scsi_cmd, 0, 6); memset(scsi_cmd, 0, 6);
scsi_cmd[0] = INQUIRY; scsi_cmd[0] = INQUIRY;
if ((sdev->lun > 0) && (sdev->scsi_level <= SCSI_2))
scsi_cmd[1] = (sdev->lun << 5) & 0xe0;
scsi_cmd[4] = (unsigned char) possible_inq_resp_len; scsi_cmd[4] = (unsigned char) possible_inq_resp_len;
sreq->sr_cmd_len = 0; sreq->sr_cmd_len = 0;
sreq->sr_data_direction = SCSI_DATA_READ; sreq->sr_data_direction = SCSI_DATA_READ;
......
...@@ -402,8 +402,7 @@ static int sd_init_command(Scsi_Cmnd * SCpnt) ...@@ -402,8 +402,7 @@ static int sd_init_command(Scsi_Cmnd * SCpnt)
nbuff, (rq_data_dir(SCpnt->request) == WRITE) ? nbuff, (rq_data_dir(SCpnt->request) == WRITE) ?
"writing" : "reading", this_count, SCpnt->request->nr_sectors)); "writing" : "reading", this_count, SCpnt->request->nr_sectors));
SCpnt->cmnd[1] = (SCpnt->device->scsi_level <= SCSI_2) ? SCpnt->cmnd[1] = 0;
((SCpnt->lun << 5) & 0xe0) : 0;
if (((this_count > 0xff) || (block > 0x1fffff)) || SCpnt->device->ten) { if (((this_count > 0xff) || (block > 0x1fffff)) || SCpnt->device->ten) {
if (this_count > 0xffff) if (this_count > 0xffff)
...@@ -815,9 +814,7 @@ sd_spinup_disk(Scsi_Disk *sdkp, char *diskname, ...@@ -815,9 +814,7 @@ sd_spinup_disk(Scsi_Disk *sdkp, char *diskname,
while (retries < 3) { while (retries < 3) {
cmd[0] = TEST_UNIT_READY; cmd[0] = TEST_UNIT_READY;
cmd[1] = (sdp->scsi_level <= SCSI_2) ? memset((void *) &cmd[1], 0, 9);
((sdp->lun << 5) & 0xe0) : 0;
memset((void *) &cmd[2], 0, 8);
SRpnt->sr_cmd_len = 0; SRpnt->sr_cmd_len = 0;
SRpnt->sr_sense_buffer[0] = 0; SRpnt->sr_sense_buffer[0] = 0;
...@@ -851,9 +848,7 @@ sd_spinup_disk(Scsi_Disk *sdkp, char *diskname, ...@@ -851,9 +848,7 @@ sd_spinup_disk(Scsi_Disk *sdkp, char *diskname,
printk(KERN_NOTICE "%s: Spinning up disk...", printk(KERN_NOTICE "%s: Spinning up disk...",
diskname); diskname);
cmd[0] = START_STOP; cmd[0] = START_STOP;
cmd[1] = (sdp->scsi_level <= SCSI_2) ? cmd[1] = 1; /* Return immediately */
((sdp->lun << 5) & 0xe0) : 0;
cmd[1] |= 1; /* Return immediately */
memset((void *) &cmd[2], 0, 8); memset((void *) &cmd[2], 0, 8);
cmd[4] = 1; /* Start spin cycle */ cmd[4] = 1; /* Start spin cycle */
SRpnt->sr_cmd_len = 0; SRpnt->sr_cmd_len = 0;
...@@ -894,7 +889,6 @@ sd_read_cache_type(Scsi_Disk *sdkp, char *diskname, ...@@ -894,7 +889,6 @@ sd_read_cache_type(Scsi_Disk *sdkp, char *diskname,
Scsi_Request *SRpnt, unsigned char *buffer) { Scsi_Request *SRpnt, unsigned char *buffer) {
unsigned char cmd[10]; unsigned char cmd[10];
Scsi_Device *sdp = sdkp->device;
int the_result, retries; int the_result, retries;
retries = 3; retries = 3;
...@@ -902,9 +896,7 @@ sd_read_cache_type(Scsi_Disk *sdkp, char *diskname, ...@@ -902,9 +896,7 @@ sd_read_cache_type(Scsi_Disk *sdkp, char *diskname,
memset((void *) &cmd[0], 0, 10); memset((void *) &cmd[0], 0, 10);
cmd[0] = MODE_SENSE; cmd[0] = MODE_SENSE;
cmd[1] = (sdp->scsi_level <= SCSI_2) ? cmd[1] = 0x08; /* DBD */
((sdp->lun << 5) & 0xe0) : 0;
cmd[1] |= 0x08; /* DBD */
cmd[2] = 0x08; /* current values, cache page */ cmd[2] = 0x08; /* current values, cache page */
cmd[4] = 128; /* allocation length */ cmd[4] = 128; /* allocation length */
...@@ -968,9 +960,7 @@ sd_read_capacity(Scsi_Disk *sdkp, char *diskname, ...@@ -968,9 +960,7 @@ sd_read_capacity(Scsi_Disk *sdkp, char *diskname,
retries = 3; retries = 3;
do { do {
cmd[0] = READ_CAPACITY; cmd[0] = READ_CAPACITY;
cmd[1] = (sdp->scsi_level <= SCSI_2) ? memset((void *) &cmd[1], 0, 9);
((sdp->lun << 5) & 0xe0) : 0;
memset((void *) &cmd[2], 0, 8);
memset((void *) buffer, 0, 8); memset((void *) buffer, 0, 8);
SRpnt->sr_cmd_len = 0; SRpnt->sr_cmd_len = 0;
...@@ -1090,7 +1080,6 @@ sd_do_mode_sense6(Scsi_Device *sdp, Scsi_Request *SRpnt, ...@@ -1090,7 +1080,6 @@ sd_do_mode_sense6(Scsi_Device *sdp, Scsi_Request *SRpnt,
memset((void *) &cmd[0], 0, 8); memset((void *) &cmd[0], 0, 8);
cmd[0] = MODE_SENSE; cmd[0] = MODE_SENSE;
cmd[1] = (sdp->scsi_level <= SCSI_2) ? ((sdp->lun << 5) & 0xe0) : 0;
cmd[2] = modepage; cmd[2] = modepage;
cmd[4] = len; cmd[4] = len;
...@@ -1611,7 +1600,6 @@ static int sd_synchronize_cache(int index, int verbose) ...@@ -1611,7 +1600,6 @@ static int sd_synchronize_cache(int index, int verbose)
unsigned char cmd[10] = { 0 }; unsigned char cmd[10] = { 0 };
cmd[0] = SYNCHRONIZE_CACHE; cmd[0] = SYNCHRONIZE_CACHE;
cmd[1] = SDpnt->scsi_level <= SCSI_2 ? (SDpnt->lun << 5) & 0xe0 : 0;
/* leave the rest of the command zero to indicate /* leave the rest of the command zero to indicate
* flush everything */ * flush everything */
scsi_wait_req(SRpnt, (void *)cmd, NULL, 0, scsi_wait_req(SRpnt, (void *)cmd, NULL, 0,
......
...@@ -705,10 +705,6 @@ sg_common_write(Sg_fd * sfp, Sg_request * srp, ...@@ -705,10 +705,6 @@ sg_common_write(Sg_fd * sfp, Sg_request * srp,
SRpnt->sr_request->rq_dev = sdp->i_rdev; SRpnt->sr_request->rq_dev = sdp->i_rdev;
SRpnt->sr_sense_buffer[0] = 0; SRpnt->sr_sense_buffer[0] = 0;
SRpnt->sr_cmd_len = hp->cmd_len; SRpnt->sr_cmd_len = hp->cmd_len;
if (!(hp->flags & SG_FLAG_LUN_INHIBIT)) {
if (sdp->device->scsi_level <= SCSI_2)
cmnd[1] = (cmnd[1] & 0x1f) | (sdp->device->lun << 5);
}
SRpnt->sr_use_sg = srp->data.k_use_sg; SRpnt->sr_use_sg = srp->data.k_use_sg;
SRpnt->sr_sglist_len = srp->data.sglist_len; SRpnt->sr_sglist_len = srp->data.sglist_len;
SRpnt->sr_bufflen = srp->data.bufflen; SRpnt->sr_bufflen = srp->data.bufflen;
......
...@@ -336,9 +336,7 @@ static int sr_init_command(Scsi_Cmnd * SCpnt) ...@@ -336,9 +336,7 @@ static int sr_init_command(Scsi_Cmnd * SCpnt)
(rq_data_dir(SCpnt->request) == WRITE) ? "writing" : "reading", (rq_data_dir(SCpnt->request) == WRITE) ? "writing" : "reading",
this_count, SCpnt->request->nr_sectors)); this_count, SCpnt->request->nr_sectors));
SCpnt->cmnd[1] = (SCpnt->device->scsi_level <= SCSI_2) ? SCpnt->cmnd[1] = 0;
((SCpnt->lun << 5) & 0xe0) : 0;
block = (unsigned int)SCpnt->request->sector / (s_size >> 9); block = (unsigned int)SCpnt->request->sector / (s_size >> 9);
if (this_count > 0xffff) if (this_count > 0xffff)
...@@ -486,9 +484,7 @@ static void get_sectorsize(Scsi_CD *cd) ...@@ -486,9 +484,7 @@ static void get_sectorsize(Scsi_CD *cd)
do { do {
cmd[0] = READ_CAPACITY; cmd[0] = READ_CAPACITY;
cmd[1] = (cd->device->scsi_level <= SCSI_2) ? memset((void *) &cmd[1], 0, 9);
((cd->device->lun << 5) & 0xe0) : 0;
memset((void *) &cmd[2], 0, 8);
SRpnt->sr_request->rq_status = RQ_SCSI_BUSY; /* Mark as really busy */ SRpnt->sr_request->rq_status = RQ_SCSI_BUSY; /* Mark as really busy */
SRpnt->sr_cmd_len = 0; SRpnt->sr_cmd_len = 0;
...@@ -599,8 +595,6 @@ void get_capabilities(Scsi_CD *cd) ...@@ -599,8 +595,6 @@ void get_capabilities(Scsi_CD *cd)
} }
memset(&cgc, 0, sizeof(struct cdrom_generic_command)); memset(&cgc, 0, sizeof(struct cdrom_generic_command));
cgc.cmd[0] = MODE_SENSE; cgc.cmd[0] = MODE_SENSE;
cgc.cmd[1] = (cd->device->scsi_level <= SCSI_2) ?
((cd->device->lun << 5) & 0xe0) : 0;
cgc.cmd[2] = 0x2a; cgc.cmd[2] = 0x2a;
cgc.cmd[4] = 128; cgc.cmd[4] = 128;
cgc.buffer = buffer; cgc.buffer = buffer;
...@@ -678,13 +672,6 @@ void get_capabilities(Scsi_CD *cd) ...@@ -678,13 +672,6 @@ void get_capabilities(Scsi_CD *cd)
*/ */
static int sr_packet(struct cdrom_device_info *cdi, struct cdrom_generic_command *cgc) static int sr_packet(struct cdrom_device_info *cdi, struct cdrom_generic_command *cgc)
{ {
Scsi_CD *cd = cdi->handle;
Scsi_Device *device = cd->device;
/* set the LUN */
if (device->scsi_level <= SCSI_2)
cgc->cmd[1] |= device->lun << 5;
if (cgc->timeout <= 0) if (cgc->timeout <= 0)
cgc->timeout = IOCTL_TIMEOUT; cgc->timeout = IOCTL_TIMEOUT;
......
...@@ -200,8 +200,6 @@ static int test_unit_ready(Scsi_CD *cd) ...@@ -200,8 +200,6 @@ static int test_unit_ready(Scsi_CD *cd)
memset(&cgc, 0, sizeof(struct cdrom_generic_command)); memset(&cgc, 0, sizeof(struct cdrom_generic_command));
cgc.cmd[0] = GPCMD_TEST_UNIT_READY; cgc.cmd[0] = GPCMD_TEST_UNIT_READY;
cgc.cmd[1] = (cd->device->scsi_level <= SCSI_2) ?
((cd->device->lun) << 5) : 0;
cgc.quiet = 1; cgc.quiet = 1;
cgc.data_direction = SCSI_DATA_NONE; cgc.data_direction = SCSI_DATA_NONE;
cgc.timeout = IOCTL_TIMEOUT; cgc.timeout = IOCTL_TIMEOUT;
...@@ -215,8 +213,6 @@ int sr_tray_move(struct cdrom_device_info *cdi, int pos) ...@@ -215,8 +213,6 @@ int sr_tray_move(struct cdrom_device_info *cdi, int pos)
memset(&cgc, 0, sizeof(struct cdrom_generic_command)); memset(&cgc, 0, sizeof(struct cdrom_generic_command));
cgc.cmd[0] = GPCMD_START_STOP_UNIT; cgc.cmd[0] = GPCMD_START_STOP_UNIT;
cgc.cmd[1] = (cd->device->scsi_level <= SCSI_2) ?
((cd->device->lun) << 5) : 0;
cgc.cmd[4] = (pos == 0) ? 0x03 /* close */ : 0x02 /* eject */ ; cgc.cmd[4] = (pos == 0) ? 0x03 /* close */ : 0x02 /* eject */ ;
cgc.data_direction = SCSI_DATA_NONE; cgc.data_direction = SCSI_DATA_NONE;
cgc.timeout = IOCTL_TIMEOUT; cgc.timeout = IOCTL_TIMEOUT;
...@@ -293,8 +289,6 @@ int sr_get_mcn(struct cdrom_device_info *cdi, struct cdrom_mcn *mcn) ...@@ -293,8 +289,6 @@ int sr_get_mcn(struct cdrom_device_info *cdi, struct cdrom_mcn *mcn)
memset(&cgc, 0, sizeof(struct cdrom_generic_command)); memset(&cgc, 0, sizeof(struct cdrom_generic_command));
cgc.cmd[0] = GPCMD_READ_SUBCHANNEL; cgc.cmd[0] = GPCMD_READ_SUBCHANNEL;
cgc.cmd[1] = (cd->device->scsi_level <= SCSI_2) ?
((cd->device->lun) << 5) : 0;
cgc.cmd[2] = 0x40; /* I do want the subchannel info */ cgc.cmd[2] = 0x40; /* I do want the subchannel info */
cgc.cmd[3] = 0x02; /* Give me medium catalog number info */ cgc.cmd[3] = 0x02; /* Give me medium catalog number info */
cgc.cmd[8] = 24; cgc.cmd[8] = 24;
...@@ -327,8 +321,6 @@ int sr_select_speed(struct cdrom_device_info *cdi, int speed) ...@@ -327,8 +321,6 @@ int sr_select_speed(struct cdrom_device_info *cdi, int speed)
memset(&cgc, 0, sizeof(struct cdrom_generic_command)); memset(&cgc, 0, sizeof(struct cdrom_generic_command));
cgc.cmd[0] = GPCMD_SET_SPEED; /* SET CD SPEED */ cgc.cmd[0] = GPCMD_SET_SPEED; /* SET CD SPEED */
cgc.cmd[1] = (cd->device->scsi_level <= SCSI_2) ?
((cd->device->lun) << 5) : 0;
cgc.cmd[2] = (speed >> 8) & 0xff; /* MSB for speed (in kbytes/sec) */ cgc.cmd[2] = (speed >> 8) & 0xff; /* MSB for speed (in kbytes/sec) */
cgc.cmd[3] = speed & 0xff; /* LSB */ cgc.cmd[3] = speed & 0xff; /* LSB */
cgc.data_direction = SCSI_DATA_NONE; cgc.data_direction = SCSI_DATA_NONE;
...@@ -361,8 +353,6 @@ int sr_audio_ioctl(struct cdrom_device_info *cdi, unsigned int cmd, void *arg) ...@@ -361,8 +353,6 @@ int sr_audio_ioctl(struct cdrom_device_info *cdi, unsigned int cmd, void *arg)
struct cdrom_tochdr *tochdr = (struct cdrom_tochdr *) arg; struct cdrom_tochdr *tochdr = (struct cdrom_tochdr *) arg;
cgc.cmd[0] = GPCMD_READ_TOC_PMA_ATIP; cgc.cmd[0] = GPCMD_READ_TOC_PMA_ATIP;
cgc.cmd[1] = (cd->device->scsi_level <= SCSI_2) ?
((cd->device->lun) << 5) : 0;
cgc.cmd[8] = 12; /* LSB of length */ cgc.cmd[8] = 12; /* LSB of length */
cgc.buffer = buffer; cgc.buffer = buffer;
cgc.buflen = 12; cgc.buflen = 12;
...@@ -382,8 +372,6 @@ int sr_audio_ioctl(struct cdrom_device_info *cdi, unsigned int cmd, void *arg) ...@@ -382,8 +372,6 @@ int sr_audio_ioctl(struct cdrom_device_info *cdi, unsigned int cmd, void *arg)
struct cdrom_tocentry *tocentry = (struct cdrom_tocentry *) arg; struct cdrom_tocentry *tocentry = (struct cdrom_tocentry *) arg;
cgc.cmd[0] = GPCMD_READ_TOC_PMA_ATIP; cgc.cmd[0] = GPCMD_READ_TOC_PMA_ATIP;
cgc.cmd[1] = (cd->device->scsi_level <= SCSI_2) ?
((cd->device->lun) << 5) : 0;
cgc.cmd[1] |= (tocentry->cdte_format == CDROM_MSF) ? 0x02 : 0; cgc.cmd[1] |= (tocentry->cdte_format == CDROM_MSF) ? 0x02 : 0;
cgc.cmd[6] = tocentry->cdte_track; cgc.cmd[6] = tocentry->cdte_track;
cgc.cmd[8] = 12; /* LSB of length */ cgc.cmd[8] = 12; /* LSB of length */
...@@ -411,8 +399,6 @@ int sr_audio_ioctl(struct cdrom_device_info *cdi, unsigned int cmd, void *arg) ...@@ -411,8 +399,6 @@ int sr_audio_ioctl(struct cdrom_device_info *cdi, unsigned int cmd, void *arg)
struct cdrom_ti* ti = (struct cdrom_ti*)arg; struct cdrom_ti* ti = (struct cdrom_ti*)arg;
cgc.cmd[0] = GPCMD_PLAYAUDIO_TI; cgc.cmd[0] = GPCMD_PLAYAUDIO_TI;
cgc.cmd[1] = (cd->device->scsi_level <= SCSI_2) ?
(cd->device->lun << 5) : 0;
cgc.cmd[4] = ti->cdti_trk0; cgc.cmd[4] = ti->cdti_trk0;
cgc.cmd[5] = ti->cdti_ind0; cgc.cmd[5] = ti->cdti_ind0;
cgc.cmd[7] = ti->cdti_trk1; cgc.cmd[7] = ti->cdti_trk1;
...@@ -463,9 +449,7 @@ static int sr_read_cd(Scsi_CD *cd, unsigned char *dest, int lba, int format, int ...@@ -463,9 +449,7 @@ static int sr_read_cd(Scsi_CD *cd, unsigned char *dest, int lba, int format, int
memset(&cgc, 0, sizeof(struct cdrom_generic_command)); memset(&cgc, 0, sizeof(struct cdrom_generic_command));
cgc.cmd[0] = GPCMD_READ_CD; /* READ_CD */ cgc.cmd[0] = GPCMD_READ_CD; /* READ_CD */
cgc.cmd[1] = (cd->device->scsi_level <= SCSI_2) ? cgc.cmd[1] = ((format & 7) << 2);
(cd->device->lun << 5) : 0;
cgc.cmd[1] |= ((format & 7) << 2);
cgc.cmd[2] = (unsigned char) (lba >> 24) & 0xff; cgc.cmd[2] = (unsigned char) (lba >> 24) & 0xff;
cgc.cmd[3] = (unsigned char) (lba >> 16) & 0xff; cgc.cmd[3] = (unsigned char) (lba >> 16) & 0xff;
cgc.cmd[4] = (unsigned char) (lba >> 8) & 0xff; cgc.cmd[4] = (unsigned char) (lba >> 8) & 0xff;
...@@ -521,8 +505,6 @@ static int sr_read_sector(Scsi_CD *cd, int lba, int blksize, unsigned char *dest ...@@ -521,8 +505,6 @@ static int sr_read_sector(Scsi_CD *cd, int lba, int blksize, unsigned char *dest
memset(&cgc, 0, sizeof(struct cdrom_generic_command)); memset(&cgc, 0, sizeof(struct cdrom_generic_command));
cgc.cmd[0] = GPCMD_READ_10; cgc.cmd[0] = GPCMD_READ_10;
cgc.cmd[1] = (cd->device->scsi_level <= SCSI_2) ?
(cd->device->lun << 5) : 0;
cgc.cmd[2] = (unsigned char) (lba >> 24) & 0xff; cgc.cmd[2] = (unsigned char) (lba >> 24) & 0xff;
cgc.cmd[3] = (unsigned char) (lba >> 16) & 0xff; cgc.cmd[3] = (unsigned char) (lba >> 16) & 0xff;
cgc.cmd[4] = (unsigned char) (lba >> 8) & 0xff; cgc.cmd[4] = (unsigned char) (lba >> 8) & 0xff;
......
...@@ -124,9 +124,7 @@ int sr_set_blocklength(Scsi_CD *cd, int blocklength) ...@@ -124,9 +124,7 @@ int sr_set_blocklength(Scsi_CD *cd, int blocklength)
#endif #endif
memset(&cgc, 0, sizeof(struct cdrom_generic_command)); memset(&cgc, 0, sizeof(struct cdrom_generic_command));
cgc.cmd[0] = MODE_SELECT; cgc.cmd[0] = MODE_SELECT;
cgc.cmd[1] = (cd->device->scsi_level <= SCSI_2) ? cgc.cmd[1] = (1 << 4);
(cd->device->lun << 5) : 0;
cgc.cmd[1] |= (1 << 4);
cgc.cmd[4] = 12; cgc.cmd[4] = 12;
modesel = (struct ccs_modesel_head *) buffer; modesel = (struct ccs_modesel_head *) buffer;
memset(modesel, 0, sizeof(*modesel)); memset(modesel, 0, sizeof(*modesel));
...@@ -180,8 +178,6 @@ int sr_cd_check(struct cdrom_device_info *cdi) ...@@ -180,8 +178,6 @@ int sr_cd_check(struct cdrom_device_info *cdi)
case VENDOR_SCSI3: case VENDOR_SCSI3:
cgc.cmd[0] = READ_TOC; cgc.cmd[0] = READ_TOC;
cgc.cmd[1] = (cd->device->scsi_level <= SCSI_2) ?
(cd->device->lun << 5) : 0;
cgc.cmd[8] = 12; cgc.cmd[8] = 12;
cgc.cmd[9] = 0x40; cgc.cmd[9] = 0x40;
cgc.buffer = buffer; cgc.buffer = buffer;
...@@ -210,9 +206,7 @@ int sr_cd_check(struct cdrom_device_info *cdi) ...@@ -210,9 +206,7 @@ int sr_cd_check(struct cdrom_device_info *cdi)
case VENDOR_NEC:{ case VENDOR_NEC:{
unsigned long min, sec, frame; unsigned long min, sec, frame;
cgc.cmd[0] = 0xde; cgc.cmd[0] = 0xde;
cgc.cmd[1] = (cd->device->scsi_level <= SCSI_2) ? cgc.cmd[1] = 0x03;
(cd->device->lun << 5) : 0;
cgc.cmd[1] |= 0x03;
cgc.cmd[2] = 0xb0; cgc.cmd[2] = 0xb0;
cgc.buffer = buffer; cgc.buffer = buffer;
cgc.buflen = 0x16; cgc.buflen = 0x16;
...@@ -242,9 +236,7 @@ int sr_cd_check(struct cdrom_device_info *cdi) ...@@ -242,9 +236,7 @@ int sr_cd_check(struct cdrom_device_info *cdi)
/* we request some disc information (is it a XA-CD ?, /* we request some disc information (is it a XA-CD ?,
* where starts the last session ?) */ * where starts the last session ?) */
cgc.cmd[0] = 0xc7; cgc.cmd[0] = 0xc7;
cgc.cmd[1] = (cd->device->scsi_level <= SCSI_2) ? cgc.cmd[1] = 0x03;
(cd->device->lun << 5) : 0;
cgc.cmd[1] |= 0x03;
cgc.buffer = buffer; cgc.buffer = buffer;
cgc.buflen = 4; cgc.buflen = 4;
cgc.quiet = 1; cgc.quiet = 1;
...@@ -272,8 +264,6 @@ int sr_cd_check(struct cdrom_device_info *cdi) ...@@ -272,8 +264,6 @@ int sr_cd_check(struct cdrom_device_info *cdi)
case VENDOR_WRITER: case VENDOR_WRITER:
cgc.cmd[0] = READ_TOC; cgc.cmd[0] = READ_TOC;
cgc.cmd[1] = (cd->device->scsi_level <= SCSI_2) ?
(cd->device->lun << 5) : 0;
cgc.cmd[8] = 0x04; cgc.cmd[8] = 0x04;
cgc.cmd[9] = 0x40; cgc.cmd[9] = 0x40;
cgc.buffer = buffer; cgc.buffer = buffer;
...@@ -291,8 +281,6 @@ int sr_cd_check(struct cdrom_device_info *cdi) ...@@ -291,8 +281,6 @@ int sr_cd_check(struct cdrom_device_info *cdi)
break; break;
} }
cgc.cmd[0] = READ_TOC; /* Read TOC */ cgc.cmd[0] = READ_TOC; /* Read TOC */
cgc.cmd[1] = (cd->device->scsi_level <= SCSI_2) ?
(cd->device->lun << 5) : 0;
cgc.cmd[6] = rc & 0x7f; /* number of last session */ cgc.cmd[6] = rc & 0x7f; /* number of last session */
cgc.cmd[8] = 0x0c; cgc.cmd[8] = 0x0c;
cgc.cmd[9] = 0x40; cgc.cmd[9] = 0x40;
......
...@@ -381,8 +381,6 @@ static Scsi_Request * ...@@ -381,8 +381,6 @@ static Scsi_Request *
} }
} }
if (SRpnt->sr_device->scsi_level <= SCSI_2)
cmd[1] |= (SRpnt->sr_device->lun << 5) & 0xe0;
init_completion(&STp->wait); init_completion(&STp->wait);
SRpnt->sr_use_sg = STp->buffer->do_dio || (bytes > (STp->buffer)->frp[0].length); SRpnt->sr_use_sg = STp->buffer->do_dio || (bytes > (STp->buffer)->frp[0].length);
if (SRpnt->sr_use_sg) { if (SRpnt->sr_use_sg) {
......
...@@ -130,7 +130,7 @@ typedef struct sg_io_hdr ...@@ -130,7 +130,7 @@ typedef struct sg_io_hdr
/* following flag values can be "or"-ed together */ /* following flag values can be "or"-ed together */
#define SG_FLAG_DIRECT_IO 1 /* default is indirect IO */ #define SG_FLAG_DIRECT_IO 1 /* default is indirect IO */
#define SG_FLAG_LUN_INHIBIT 2 /* default is overwrite lun in SCSI */ #define SG_FLAG_UNUSED_LUN_INHIBIT 2 /* default is overwrite lun in SCSI */
/* command block (when <= SCSI_2) */ /* command block (when <= SCSI_2) */
#define SG_FLAG_MMAP_IO 4 /* request memory mapped IO */ #define SG_FLAG_MMAP_IO 4 /* request memory mapped IO */
#define SG_FLAG_NO_DXFER 0x10000 /* no transfer of kernel buffers to/from */ #define SG_FLAG_NO_DXFER 0x10000 /* no transfer of kernel buffers to/from */
......
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