Commit ea39700f authored by Bart Van Assche's avatar Bart Van Assche Committed by Martin K. Petersen

scsi: nsp_cs: Move the SCSI pointer to private command data

Set .cmd_size in the SCSI host template instead of using the SCSI pointer
in struct scsi_cmnd.
This patch prepares for removal of the SCSI pointer from struct scsi_cmnd.

Link: https://lore.kernel.org/r/20220218195117.25689-39-bvanassche@acm.orgReviewed-by: default avatarHimanshu Madhani <himanshu.madhani@oracle.com>
Signed-off-by: default avatarBart Van Assche <bvanassche@acm.org>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 195771c5
...@@ -70,6 +70,11 @@ static bool free_ports = 0; ...@@ -70,6 +70,11 @@ static bool free_ports = 0;
module_param(free_ports, bool, 0); module_param(free_ports, bool, 0);
MODULE_PARM_DESC(free_ports, "Release IO ports after configuration? (default: 0 (=no))"); MODULE_PARM_DESC(free_ports, "Release IO ports after configuration? (default: 0 (=no))");
static struct scsi_pointer *nsp_priv(struct scsi_cmnd *cmd)
{
return scsi_cmd_priv(cmd);
}
static struct scsi_host_template nsp_driver_template = { static struct scsi_host_template nsp_driver_template = {
.proc_name = "nsp_cs", .proc_name = "nsp_cs",
.show_info = nsp_show_info, .show_info = nsp_show_info,
...@@ -83,6 +88,7 @@ static struct scsi_host_template nsp_driver_template = { ...@@ -83,6 +88,7 @@ static struct scsi_host_template nsp_driver_template = {
.this_id = NSP_INITIATOR_ID, .this_id = NSP_INITIATOR_ID,
.sg_tablesize = SG_ALL, .sg_tablesize = SG_ALL,
.dma_boundary = PAGE_SIZE - 1, .dma_boundary = PAGE_SIZE - 1,
.cmd_size = sizeof(struct scsi_pointer),
}; };
static nsp_hw_data nsp_data_base; /* attach <-> detect glue */ static nsp_hw_data nsp_data_base; /* attach <-> detect glue */
...@@ -180,8 +186,9 @@ static void nsp_scsi_done(struct scsi_cmnd *SCpnt) ...@@ -180,8 +186,9 @@ static void nsp_scsi_done(struct scsi_cmnd *SCpnt)
scsi_done(SCpnt); scsi_done(SCpnt);
} }
static int nsp_queuecommand_lck(struct scsi_cmnd *SCpnt) static int nsp_queuecommand_lck(struct scsi_cmnd *const SCpnt)
{ {
struct scsi_pointer *scsi_pointer = nsp_priv(SCpnt);
#ifdef NSP_DEBUG #ifdef NSP_DEBUG
/*unsigned int host_id = SCpnt->device->host->this_id;*/ /*unsigned int host_id = SCpnt->device->host->this_id;*/
/*unsigned int base = SCpnt->device->host->io_port;*/ /*unsigned int base = SCpnt->device->host->io_port;*/
...@@ -217,11 +224,11 @@ static int nsp_queuecommand_lck(struct scsi_cmnd *SCpnt) ...@@ -217,11 +224,11 @@ static int nsp_queuecommand_lck(struct scsi_cmnd *SCpnt)
data->CurrentSC = SCpnt; data->CurrentSC = SCpnt;
SCpnt->SCp.Status = SAM_STAT_CHECK_CONDITION; scsi_pointer->Status = SAM_STAT_CHECK_CONDITION;
SCpnt->SCp.Message = 0; scsi_pointer->Message = 0;
SCpnt->SCp.have_data_in = IO_UNKNOWN; scsi_pointer->have_data_in = IO_UNKNOWN;
SCpnt->SCp.sent_command = 0; scsi_pointer->sent_command = 0;
SCpnt->SCp.phase = PH_UNDETERMINED; scsi_pointer->phase = PH_UNDETERMINED;
scsi_set_resid(SCpnt, scsi_bufflen(SCpnt)); scsi_set_resid(SCpnt, scsi_bufflen(SCpnt));
/* setup scratch area /* setup scratch area
...@@ -231,15 +238,15 @@ static int nsp_queuecommand_lck(struct scsi_cmnd *SCpnt) ...@@ -231,15 +238,15 @@ static int nsp_queuecommand_lck(struct scsi_cmnd *SCpnt)
SCp.buffers_residual : left buffers in list SCp.buffers_residual : left buffers in list
SCp.phase : current state of the command */ SCp.phase : current state of the command */
if (scsi_bufflen(SCpnt)) { if (scsi_bufflen(SCpnt)) {
SCpnt->SCp.buffer = scsi_sglist(SCpnt); scsi_pointer->buffer = scsi_sglist(SCpnt);
SCpnt->SCp.ptr = BUFFER_ADDR; scsi_pointer->ptr = BUFFER_ADDR(SCpnt);
SCpnt->SCp.this_residual = SCpnt->SCp.buffer->length; scsi_pointer->this_residual = scsi_pointer->buffer->length;
SCpnt->SCp.buffers_residual = scsi_sg_count(SCpnt) - 1; scsi_pointer->buffers_residual = scsi_sg_count(SCpnt) - 1;
} else { } else {
SCpnt->SCp.ptr = NULL; scsi_pointer->ptr = NULL;
SCpnt->SCp.this_residual = 0; scsi_pointer->this_residual = 0;
SCpnt->SCp.buffer = NULL; scsi_pointer->buffer = NULL;
SCpnt->SCp.buffers_residual = 0; scsi_pointer->buffers_residual = 0;
} }
if (!nsphw_start_selection(SCpnt)) { if (!nsphw_start_selection(SCpnt)) {
...@@ -353,8 +360,9 @@ static void nsphw_init(nsp_hw_data *data) ...@@ -353,8 +360,9 @@ static void nsphw_init(nsp_hw_data *data)
/* /*
* Start selection phase * Start selection phase
*/ */
static bool nsphw_start_selection(struct scsi_cmnd *SCpnt) static bool nsphw_start_selection(struct scsi_cmnd *const SCpnt)
{ {
struct scsi_pointer *scsi_pointer = nsp_priv(SCpnt);
unsigned int host_id = SCpnt->device->host->this_id; unsigned int host_id = SCpnt->device->host->this_id;
unsigned int base = SCpnt->device->host->io_port; unsigned int base = SCpnt->device->host->io_port;
unsigned char target = scmd_id(SCpnt); unsigned char target = scmd_id(SCpnt);
...@@ -372,7 +380,7 @@ static bool nsphw_start_selection(struct scsi_cmnd *SCpnt) ...@@ -372,7 +380,7 @@ static bool nsphw_start_selection(struct scsi_cmnd *SCpnt)
/* start arbitration */ /* start arbitration */
//nsp_dbg(NSP_DEBUG_RESELECTION, "start arbit"); //nsp_dbg(NSP_DEBUG_RESELECTION, "start arbit");
SCpnt->SCp.phase = PH_ARBSTART; scsi_pointer->phase = PH_ARBSTART;
nsp_index_write(base, SETARBIT, ARBIT_GO); nsp_index_write(base, SETARBIT, ARBIT_GO);
time_out = 1000; time_out = 1000;
...@@ -392,7 +400,7 @@ static bool nsphw_start_selection(struct scsi_cmnd *SCpnt) ...@@ -392,7 +400,7 @@ static bool nsphw_start_selection(struct scsi_cmnd *SCpnt)
/* assert select line */ /* assert select line */
//nsp_dbg(NSP_DEBUG_RESELECTION, "assert SEL line"); //nsp_dbg(NSP_DEBUG_RESELECTION, "assert SEL line");
SCpnt->SCp.phase = PH_SELSTART; scsi_pointer->phase = PH_SELSTART;
udelay(3); /* wait 2.4us */ udelay(3); /* wait 2.4us */
nsp_index_write(base, SCSIDATALATCH, BIT(host_id) | BIT(target)); nsp_index_write(base, SCSIDATALATCH, BIT(host_id) | BIT(target));
nsp_index_write(base, SCSIBUSCTRL, SCSI_SEL | SCSI_BSY | SCSI_ATN); nsp_index_write(base, SCSIBUSCTRL, SCSI_SEL | SCSI_BSY | SCSI_ATN);
...@@ -568,8 +576,9 @@ static int nsp_expect_signal(struct scsi_cmnd *SCpnt, ...@@ -568,8 +576,9 @@ static int nsp_expect_signal(struct scsi_cmnd *SCpnt,
/* /*
* transfer SCSI message * transfer SCSI message
*/ */
static int nsp_xfer(struct scsi_cmnd *SCpnt, int phase) static int nsp_xfer(struct scsi_cmnd *const SCpnt, int phase)
{ {
struct scsi_pointer *scsi_pointer = nsp_priv(SCpnt);
unsigned int base = SCpnt->device->host->io_port; unsigned int base = SCpnt->device->host->io_port;
nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata; nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
char *buf = data->MsgBuffer; char *buf = data->MsgBuffer;
...@@ -587,7 +596,7 @@ static int nsp_xfer(struct scsi_cmnd *SCpnt, int phase) ...@@ -587,7 +596,7 @@ static int nsp_xfer(struct scsi_cmnd *SCpnt, int phase)
} }
/* if last byte, negate ATN */ /* if last byte, negate ATN */
if (len == 1 && SCpnt->SCp.phase == PH_MSG_OUT) { if (len == 1 && scsi_pointer->phase == PH_MSG_OUT) {
nsp_index_write(base, SCSIBUSCTRL, AUTODIRECTION | ACKENB); nsp_index_write(base, SCSIBUSCTRL, AUTODIRECTION | ACKENB);
} }
...@@ -608,14 +617,15 @@ static int nsp_xfer(struct scsi_cmnd *SCpnt, int phase) ...@@ -608,14 +617,15 @@ static int nsp_xfer(struct scsi_cmnd *SCpnt, int phase)
/* /*
* get extra SCSI data from fifo * get extra SCSI data from fifo
*/ */
static int nsp_dataphase_bypass(struct scsi_cmnd *SCpnt) static int nsp_dataphase_bypass(struct scsi_cmnd *const SCpnt)
{ {
struct scsi_pointer *scsi_pointer = nsp_priv(SCpnt);
nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata; nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
unsigned int count; unsigned int count;
//nsp_dbg(NSP_DEBUG_DATA_IO, "in"); //nsp_dbg(NSP_DEBUG_DATA_IO, "in");
if (SCpnt->SCp.have_data_in != IO_IN) { if (scsi_pointer->have_data_in != IO_IN) {
return 0; return 0;
} }
...@@ -630,7 +640,7 @@ static int nsp_dataphase_bypass(struct scsi_cmnd *SCpnt) ...@@ -630,7 +640,7 @@ static int nsp_dataphase_bypass(struct scsi_cmnd *SCpnt)
* data phase skip only occures in case of SCSI_LOW_READ * data phase skip only occures in case of SCSI_LOW_READ
*/ */
nsp_dbg(NSP_DEBUG_DATA_IO, "use bypass quirk"); nsp_dbg(NSP_DEBUG_DATA_IO, "use bypass quirk");
SCpnt->SCp.phase = PH_DATA; scsi_pointer->phase = PH_DATA;
nsp_pio_read(SCpnt); nsp_pio_read(SCpnt);
nsp_setup_fifo(data, false); nsp_setup_fifo(data, false);
...@@ -704,8 +714,9 @@ static int nsp_fifo_count(struct scsi_cmnd *SCpnt) ...@@ -704,8 +714,9 @@ static int nsp_fifo_count(struct scsi_cmnd *SCpnt)
/* /*
* read data in DATA IN phase * read data in DATA IN phase
*/ */
static void nsp_pio_read(struct scsi_cmnd *SCpnt) static void nsp_pio_read(struct scsi_cmnd *const SCpnt)
{ {
struct scsi_pointer *scsi_pointer = nsp_priv(SCpnt);
unsigned int base = SCpnt->device->host->io_port; unsigned int base = SCpnt->device->host->io_port;
unsigned long mmio_base = SCpnt->device->host->base; unsigned long mmio_base = SCpnt->device->host->base;
nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata; nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
...@@ -716,24 +727,25 @@ static void nsp_pio_read(struct scsi_cmnd *SCpnt) ...@@ -716,24 +727,25 @@ static void nsp_pio_read(struct scsi_cmnd *SCpnt)
ocount = data->FifoCount; ocount = data->FifoCount;
nsp_dbg(NSP_DEBUG_DATA_IO, "in SCpnt=0x%p resid=%d ocount=%d ptr=0x%p this_residual=%d buffers=0x%p nbuf=%d", nsp_dbg(NSP_DEBUG_DATA_IO, "in SCpnt=0x%p resid=%d ocount=%d ptr=0x%p this_residual=%d buffers=0x%p nbuf=%d",
SCpnt, scsi_get_resid(SCpnt), ocount, SCpnt->SCp.ptr, SCpnt, scsi_get_resid(SCpnt), ocount, scsi_pointer->ptr,
SCpnt->SCp.this_residual, SCpnt->SCp.buffer, scsi_pointer->this_residual, scsi_pointer->buffer,
SCpnt->SCp.buffers_residual); scsi_pointer->buffers_residual);
time_out = 1000; time_out = 1000;
while ((time_out-- != 0) && while ((time_out-- != 0) &&
(SCpnt->SCp.this_residual > 0 || SCpnt->SCp.buffers_residual > 0 ) ) { (scsi_pointer->this_residual > 0 ||
scsi_pointer->buffers_residual > 0)) {
stat = nsp_index_read(base, SCSIBUSMON); stat = nsp_index_read(base, SCSIBUSMON);
stat &= BUSMON_PHASE_MASK; stat &= BUSMON_PHASE_MASK;
res = nsp_fifo_count(SCpnt) - ocount; res = nsp_fifo_count(SCpnt) - ocount;
//nsp_dbg(NSP_DEBUG_DATA_IO, "ptr=0x%p this=0x%x ocount=0x%x res=0x%x", SCpnt->SCp.ptr, SCpnt->SCp.this_residual, ocount, res); //nsp_dbg(NSP_DEBUG_DATA_IO, "ptr=0x%p this=0x%x ocount=0x%x res=0x%x", scsi_pointer->ptr, scsi_pointer->this_residual, ocount, res);
if (res == 0) { /* if some data available ? */ if (res == 0) { /* if some data available ? */
if (stat == BUSPHASE_DATA_IN) { /* phase changed? */ if (stat == BUSPHASE_DATA_IN) { /* phase changed? */
//nsp_dbg(NSP_DEBUG_DATA_IO, " wait for data this=%d", SCpnt->SCp.this_residual); //nsp_dbg(NSP_DEBUG_DATA_IO, " wait for data this=%d", scsi_pointer->this_residual);
continue; continue;
} else { } else {
nsp_dbg(NSP_DEBUG_DATA_IO, "phase changed stat=0x%x", stat); nsp_dbg(NSP_DEBUG_DATA_IO, "phase changed stat=0x%x", stat);
...@@ -747,20 +759,21 @@ static void nsp_pio_read(struct scsi_cmnd *SCpnt) ...@@ -747,20 +759,21 @@ static void nsp_pio_read(struct scsi_cmnd *SCpnt)
continue; continue;
} }
res = min(res, SCpnt->SCp.this_residual); res = min(res, scsi_pointer->this_residual);
switch (data->TransferMode) { switch (data->TransferMode) {
case MODE_IO32: case MODE_IO32:
res &= ~(BIT(1)|BIT(0)); /* align 4 */ res &= ~(BIT(1)|BIT(0)); /* align 4 */
nsp_fifo32_read(base, SCpnt->SCp.ptr, res >> 2); nsp_fifo32_read(base, scsi_pointer->ptr, res >> 2);
break; break;
case MODE_IO8: case MODE_IO8:
nsp_fifo8_read (base, SCpnt->SCp.ptr, res ); nsp_fifo8_read(base, scsi_pointer->ptr, res);
break; break;
case MODE_MEM32: case MODE_MEM32:
res &= ~(BIT(1)|BIT(0)); /* align 4 */ res &= ~(BIT(1)|BIT(0)); /* align 4 */
nsp_mmio_fifo32_read(mmio_base, SCpnt->SCp.ptr, res >> 2); nsp_mmio_fifo32_read(mmio_base, scsi_pointer->ptr,
res >> 2);
break; break;
default: default:
...@@ -769,22 +782,23 @@ static void nsp_pio_read(struct scsi_cmnd *SCpnt) ...@@ -769,22 +782,23 @@ static void nsp_pio_read(struct scsi_cmnd *SCpnt)
} }
nsp_inc_resid(SCpnt, -res); nsp_inc_resid(SCpnt, -res);
SCpnt->SCp.ptr += res; scsi_pointer->ptr += res;
SCpnt->SCp.this_residual -= res; scsi_pointer->this_residual -= res;
ocount += res; ocount += res;
//nsp_dbg(NSP_DEBUG_DATA_IO, "ptr=0x%p this_residual=0x%x ocount=0x%x", SCpnt->SCp.ptr, SCpnt->SCp.this_residual, ocount); //nsp_dbg(NSP_DEBUG_DATA_IO, "ptr=0x%p this_residual=0x%x ocount=0x%x", scsi_pointer->ptr, scsi_pointer->this_residual, ocount);
/* go to next scatter list if available */ /* go to next scatter list if available */
if (SCpnt->SCp.this_residual == 0 && if (scsi_pointer->this_residual == 0 &&
SCpnt->SCp.buffers_residual != 0 ) { scsi_pointer->buffers_residual != 0 ) {
//nsp_dbg(NSP_DEBUG_DATA_IO, "scatterlist next timeout=%d", time_out); //nsp_dbg(NSP_DEBUG_DATA_IO, "scatterlist next timeout=%d", time_out);
SCpnt->SCp.buffers_residual--; scsi_pointer->buffers_residual--;
SCpnt->SCp.buffer = sg_next(SCpnt->SCp.buffer); scsi_pointer->buffer = sg_next(scsi_pointer->buffer);
SCpnt->SCp.ptr = BUFFER_ADDR; scsi_pointer->ptr = BUFFER_ADDR(SCpnt);
SCpnt->SCp.this_residual = SCpnt->SCp.buffer->length; scsi_pointer->this_residual =
scsi_pointer->buffer->length;
time_out = 1000; time_out = 1000;
//nsp_dbg(NSP_DEBUG_DATA_IO, "page: 0x%p, off: 0x%x", SCpnt->SCp.buffer->page, SCpnt->SCp.buffer->offset); //nsp_dbg(NSP_DEBUG_DATA_IO, "page: 0x%p, off: 0x%x", scsi_pointer->buffer->page, scsi_pointer->buffer->offset);
} }
} }
...@@ -792,8 +806,8 @@ static void nsp_pio_read(struct scsi_cmnd *SCpnt) ...@@ -792,8 +806,8 @@ static void nsp_pio_read(struct scsi_cmnd *SCpnt)
if (time_out < 0) { if (time_out < 0) {
nsp_msg(KERN_DEBUG, "pio read timeout resid=%d this_residual=%d buffers_residual=%d", nsp_msg(KERN_DEBUG, "pio read timeout resid=%d this_residual=%d buffers_residual=%d",
scsi_get_resid(SCpnt), SCpnt->SCp.this_residual, scsi_get_resid(SCpnt), scsi_pointer->this_residual,
SCpnt->SCp.buffers_residual); scsi_pointer->buffers_residual);
} }
nsp_dbg(NSP_DEBUG_DATA_IO, "read ocount=0x%x", ocount); nsp_dbg(NSP_DEBUG_DATA_IO, "read ocount=0x%x", ocount);
nsp_dbg(NSP_DEBUG_DATA_IO, "r cmd=%d resid=0x%x\n", data->CmdId, nsp_dbg(NSP_DEBUG_DATA_IO, "r cmd=%d resid=0x%x\n", data->CmdId,
...@@ -805,6 +819,7 @@ static void nsp_pio_read(struct scsi_cmnd *SCpnt) ...@@ -805,6 +819,7 @@ static void nsp_pio_read(struct scsi_cmnd *SCpnt)
*/ */
static void nsp_pio_write(struct scsi_cmnd *SCpnt) static void nsp_pio_write(struct scsi_cmnd *SCpnt)
{ {
struct scsi_pointer *scsi_pointer = nsp_priv(SCpnt);
unsigned int base = SCpnt->device->host->io_port; unsigned int base = SCpnt->device->host->io_port;
unsigned long mmio_base = SCpnt->device->host->base; unsigned long mmio_base = SCpnt->device->host->base;
nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata; nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
...@@ -815,14 +830,15 @@ static void nsp_pio_write(struct scsi_cmnd *SCpnt) ...@@ -815,14 +830,15 @@ static void nsp_pio_write(struct scsi_cmnd *SCpnt)
ocount = data->FifoCount; ocount = data->FifoCount;
nsp_dbg(NSP_DEBUG_DATA_IO, "in fifocount=%d ptr=0x%p this_residual=%d buffers=0x%p nbuf=%d resid=0x%x", nsp_dbg(NSP_DEBUG_DATA_IO, "in fifocount=%d ptr=0x%p this_residual=%d buffers=0x%p nbuf=%d resid=0x%x",
data->FifoCount, SCpnt->SCp.ptr, SCpnt->SCp.this_residual, data->FifoCount, scsi_pointer->ptr, scsi_pointer->this_residual,
SCpnt->SCp.buffer, SCpnt->SCp.buffers_residual, scsi_pointer->buffer, scsi_pointer->buffers_residual,
scsi_get_resid(SCpnt)); scsi_get_resid(SCpnt));
time_out = 1000; time_out = 1000;
while ((time_out-- != 0) && while ((time_out-- != 0) &&
(SCpnt->SCp.this_residual > 0 || SCpnt->SCp.buffers_residual > 0)) { (scsi_pointer->this_residual > 0 ||
scsi_pointer->buffers_residual > 0)) {
stat = nsp_index_read(base, SCSIBUSMON); stat = nsp_index_read(base, SCSIBUSMON);
stat &= BUSMON_PHASE_MASK; stat &= BUSMON_PHASE_MASK;
...@@ -832,8 +848,8 @@ static void nsp_pio_write(struct scsi_cmnd *SCpnt) ...@@ -832,8 +848,8 @@ static void nsp_pio_write(struct scsi_cmnd *SCpnt)
nsp_dbg(NSP_DEBUG_DATA_IO, "phase changed stat=0x%x, res=%d\n", stat, res); nsp_dbg(NSP_DEBUG_DATA_IO, "phase changed stat=0x%x, res=%d\n", stat, res);
/* Put back pointer */ /* Put back pointer */
nsp_inc_resid(SCpnt, res); nsp_inc_resid(SCpnt, res);
SCpnt->SCp.ptr -= res; scsi_pointer->ptr -= res;
SCpnt->SCp.this_residual += res; scsi_pointer->this_residual += res;
ocount -= res; ocount -= res;
break; break;
...@@ -845,21 +861,22 @@ static void nsp_pio_write(struct scsi_cmnd *SCpnt) ...@@ -845,21 +861,22 @@ static void nsp_pio_write(struct scsi_cmnd *SCpnt)
continue; continue;
} }
res = min(SCpnt->SCp.this_residual, WFIFO_CRIT); res = min(scsi_pointer->this_residual, WFIFO_CRIT);
//nsp_dbg(NSP_DEBUG_DATA_IO, "ptr=0x%p this=0x%x res=0x%x", SCpnt->SCp.ptr, SCpnt->SCp.this_residual, res); //nsp_dbg(NSP_DEBUG_DATA_IO, "ptr=0x%p this=0x%x res=0x%x", scsi_pointer->ptr, scsi_pointer->this_residual, res);
switch (data->TransferMode) { switch (data->TransferMode) {
case MODE_IO32: case MODE_IO32:
res &= ~(BIT(1)|BIT(0)); /* align 4 */ res &= ~(BIT(1)|BIT(0)); /* align 4 */
nsp_fifo32_write(base, SCpnt->SCp.ptr, res >> 2); nsp_fifo32_write(base, scsi_pointer->ptr, res >> 2);
break; break;
case MODE_IO8: case MODE_IO8:
nsp_fifo8_write (base, SCpnt->SCp.ptr, res ); nsp_fifo8_write(base, scsi_pointer->ptr, res);
break; break;
case MODE_MEM32: case MODE_MEM32:
res &= ~(BIT(1)|BIT(0)); /* align 4 */ res &= ~(BIT(1)|BIT(0)); /* align 4 */
nsp_mmio_fifo32_write(mmio_base, SCpnt->SCp.ptr, res >> 2); nsp_mmio_fifo32_write(mmio_base, scsi_pointer->ptr,
res >> 2);
break; break;
default: default:
...@@ -868,18 +885,19 @@ static void nsp_pio_write(struct scsi_cmnd *SCpnt) ...@@ -868,18 +885,19 @@ static void nsp_pio_write(struct scsi_cmnd *SCpnt)
} }
nsp_inc_resid(SCpnt, -res); nsp_inc_resid(SCpnt, -res);
SCpnt->SCp.ptr += res; scsi_pointer->ptr += res;
SCpnt->SCp.this_residual -= res; scsi_pointer->this_residual -= res;
ocount += res; ocount += res;
/* go to next scatter list if available */ /* go to next scatter list if available */
if (SCpnt->SCp.this_residual == 0 && if (scsi_pointer->this_residual == 0 &&
SCpnt->SCp.buffers_residual != 0 ) { scsi_pointer->buffers_residual != 0 ) {
//nsp_dbg(NSP_DEBUG_DATA_IO, "scatterlist next"); //nsp_dbg(NSP_DEBUG_DATA_IO, "scatterlist next");
SCpnt->SCp.buffers_residual--; scsi_pointer->buffers_residual--;
SCpnt->SCp.buffer = sg_next(SCpnt->SCp.buffer); scsi_pointer->buffer = sg_next(scsi_pointer->buffer);
SCpnt->SCp.ptr = BUFFER_ADDR; scsi_pointer->ptr = BUFFER_ADDR(SCpnt);
SCpnt->SCp.this_residual = SCpnt->SCp.buffer->length; scsi_pointer->this_residual =
scsi_pointer->buffer->length;
time_out = 1000; time_out = 1000;
} }
} }
...@@ -947,6 +965,7 @@ static irqreturn_t nspintr(int irq, void *dev_id) ...@@ -947,6 +965,7 @@ static irqreturn_t nspintr(int irq, void *dev_id)
unsigned int base; unsigned int base;
unsigned char irq_status, irq_phase, phase; unsigned char irq_status, irq_phase, phase;
struct scsi_cmnd *tmpSC; struct scsi_cmnd *tmpSC;
struct scsi_pointer *scsi_pointer;
unsigned char target, lun; unsigned char target, lun;
unsigned int *sync_neg; unsigned int *sync_neg;
int i, tmp; int i, tmp;
...@@ -1025,9 +1044,10 @@ static irqreturn_t nspintr(int irq, void *dev_id) ...@@ -1025,9 +1044,10 @@ static irqreturn_t nspintr(int irq, void *dev_id)
if(data->CurrentSC != NULL) { if(data->CurrentSC != NULL) {
tmpSC = data->CurrentSC; tmpSC = data->CurrentSC;
scsi_pointer = nsp_priv(tmpSC);
tmpSC->result = (DID_RESET << 16) | tmpSC->result = (DID_RESET << 16) |
((tmpSC->SCp.Message & 0xff) << 8) | ((scsi_pointer->Message & 0xff) << 8) |
((tmpSC->SCp.Status & 0xff) << 0); ((scsi_pointer->Status & 0xff) << 0);
nsp_scsi_done(tmpSC); nsp_scsi_done(tmpSC);
} }
return IRQ_HANDLED; return IRQ_HANDLED;
...@@ -1041,6 +1061,7 @@ static irqreturn_t nspintr(int irq, void *dev_id) ...@@ -1041,6 +1061,7 @@ static irqreturn_t nspintr(int irq, void *dev_id)
} }
tmpSC = data->CurrentSC; tmpSC = data->CurrentSC;
scsi_pointer = nsp_priv(tmpSC);
target = tmpSC->device->id; target = tmpSC->device->id;
lun = tmpSC->device->lun; lun = tmpSC->device->lun;
sync_neg = &(data->Sync[target].SyncNegotiation); sync_neg = &(data->Sync[target].SyncNegotiation);
...@@ -1063,7 +1084,7 @@ static irqreturn_t nspintr(int irq, void *dev_id) ...@@ -1063,7 +1084,7 @@ static irqreturn_t nspintr(int irq, void *dev_id)
//show_phase(tmpSC); //show_phase(tmpSC);
switch(tmpSC->SCp.phase) { switch (scsi_pointer->phase) {
case PH_SELSTART: case PH_SELSTART:
// *sync_neg = SYNC_NOT_YET; // *sync_neg = SYNC_NOT_YET;
if ((phase & BUSMON_BSY) == 0) { if ((phase & BUSMON_BSY) == 0) {
...@@ -1086,7 +1107,7 @@ static irqreturn_t nspintr(int irq, void *dev_id) ...@@ -1086,7 +1107,7 @@ static irqreturn_t nspintr(int irq, void *dev_id)
/* attention assert */ /* attention assert */
//nsp_dbg(NSP_DEBUG_INTR, "attention assert"); //nsp_dbg(NSP_DEBUG_INTR, "attention assert");
data->SelectionTimeOut = 0; data->SelectionTimeOut = 0;
tmpSC->SCp.phase = PH_SELECTED; scsi_pointer->phase = PH_SELECTED;
nsp_index_write(base, SCSIBUSCTRL, SCSI_ATN); nsp_index_write(base, SCSIBUSCTRL, SCSI_ATN);
udelay(1); udelay(1);
nsp_index_write(base, SCSIBUSCTRL, SCSI_ATN | AUTODIRECTION | ACKENB); nsp_index_write(base, SCSIBUSCTRL, SCSI_ATN | AUTODIRECTION | ACKENB);
...@@ -1115,17 +1136,18 @@ static irqreturn_t nspintr(int irq, void *dev_id) ...@@ -1115,17 +1136,18 @@ static irqreturn_t nspintr(int irq, void *dev_id)
//nsp_dbg(NSP_DEBUG_INTR, "start scsi seq"); //nsp_dbg(NSP_DEBUG_INTR, "start scsi seq");
/* normal disconnect */ /* normal disconnect */
if (((tmpSC->SCp.phase == PH_MSG_IN) || (tmpSC->SCp.phase == PH_MSG_OUT)) && if ((scsi_pointer->phase == PH_MSG_IN ||
(irq_phase & LATCHED_BUS_FREE) != 0 ) { scsi_pointer->phase == PH_MSG_OUT) &&
(irq_phase & LATCHED_BUS_FREE) != 0) {
nsp_dbg(NSP_DEBUG_INTR, "normal disconnect irq_status=0x%x, phase=0x%x, irq_phase=0x%x", irq_status, phase, irq_phase); nsp_dbg(NSP_DEBUG_INTR, "normal disconnect irq_status=0x%x, phase=0x%x, irq_phase=0x%x", irq_status, phase, irq_phase);
//*sync_neg = SYNC_NOT_YET; //*sync_neg = SYNC_NOT_YET;
/* all command complete and return status */ /* all command complete and return status */
if (tmpSC->SCp.Message == COMMAND_COMPLETE) { if (scsi_pointer->Message == COMMAND_COMPLETE) {
tmpSC->result = (DID_OK << 16) | tmpSC->result = (DID_OK << 16) |
((tmpSC->SCp.Message & 0xff) << 8) | ((scsi_pointer->Message & 0xff) << 8) |
((tmpSC->SCp.Status & 0xff) << 0); ((scsi_pointer->Status & 0xff) << 0);
nsp_dbg(NSP_DEBUG_INTR, "command complete result=0x%x", tmpSC->result); nsp_dbg(NSP_DEBUG_INTR, "command complete result=0x%x", tmpSC->result);
nsp_scsi_done(tmpSC); nsp_scsi_done(tmpSC);
...@@ -1154,7 +1176,7 @@ static irqreturn_t nspintr(int irq, void *dev_id) ...@@ -1154,7 +1176,7 @@ static irqreturn_t nspintr(int irq, void *dev_id)
return IRQ_HANDLED; return IRQ_HANDLED;
} }
tmpSC->SCp.phase = PH_COMMAND; scsi_pointer->phase = PH_COMMAND;
nsp_nexus(tmpSC); nsp_nexus(tmpSC);
...@@ -1170,8 +1192,8 @@ static irqreturn_t nspintr(int irq, void *dev_id) ...@@ -1170,8 +1192,8 @@ static irqreturn_t nspintr(int irq, void *dev_id)
case BUSPHASE_DATA_OUT: case BUSPHASE_DATA_OUT:
nsp_dbg(NSP_DEBUG_INTR, "BUSPHASE_DATA_OUT"); nsp_dbg(NSP_DEBUG_INTR, "BUSPHASE_DATA_OUT");
tmpSC->SCp.phase = PH_DATA; scsi_pointer->phase = PH_DATA;
tmpSC->SCp.have_data_in = IO_OUT; scsi_pointer->have_data_in = IO_OUT;
nsp_pio_write(tmpSC); nsp_pio_write(tmpSC);
...@@ -1180,8 +1202,8 @@ static irqreturn_t nspintr(int irq, void *dev_id) ...@@ -1180,8 +1202,8 @@ static irqreturn_t nspintr(int irq, void *dev_id)
case BUSPHASE_DATA_IN: case BUSPHASE_DATA_IN:
nsp_dbg(NSP_DEBUG_INTR, "BUSPHASE_DATA_IN"); nsp_dbg(NSP_DEBUG_INTR, "BUSPHASE_DATA_IN");
tmpSC->SCp.phase = PH_DATA; scsi_pointer->phase = PH_DATA;
tmpSC->SCp.have_data_in = IO_IN; scsi_pointer->have_data_in = IO_IN;
nsp_pio_read(tmpSC); nsp_pio_read(tmpSC);
...@@ -1191,10 +1213,11 @@ static irqreturn_t nspintr(int irq, void *dev_id) ...@@ -1191,10 +1213,11 @@ static irqreturn_t nspintr(int irq, void *dev_id)
nsp_dataphase_bypass(tmpSC); nsp_dataphase_bypass(tmpSC);
nsp_dbg(NSP_DEBUG_INTR, "BUSPHASE_STATUS"); nsp_dbg(NSP_DEBUG_INTR, "BUSPHASE_STATUS");
tmpSC->SCp.phase = PH_STATUS; scsi_pointer->phase = PH_STATUS;
tmpSC->SCp.Status = nsp_index_read(base, SCSIDATAWITHACK); scsi_pointer->Status = nsp_index_read(base, SCSIDATAWITHACK);
nsp_dbg(NSP_DEBUG_INTR, "message=0x%x status=0x%x", tmpSC->SCp.Message, tmpSC->SCp.Status); nsp_dbg(NSP_DEBUG_INTR, "message=0x%x status=0x%x",
scsi_pointer->Message, scsi_pointer->Status);
break; break;
...@@ -1204,7 +1227,7 @@ static irqreturn_t nspintr(int irq, void *dev_id) ...@@ -1204,7 +1227,7 @@ static irqreturn_t nspintr(int irq, void *dev_id)
goto timer_out; goto timer_out;
} }
tmpSC->SCp.phase = PH_MSG_OUT; scsi_pointer->phase = PH_MSG_OUT;
//*sync_neg = SYNC_NOT_YET; //*sync_neg = SYNC_NOT_YET;
...@@ -1237,7 +1260,7 @@ static irqreturn_t nspintr(int irq, void *dev_id) ...@@ -1237,7 +1260,7 @@ static irqreturn_t nspintr(int irq, void *dev_id)
goto timer_out; goto timer_out;
} }
tmpSC->SCp.phase = PH_MSG_IN; scsi_pointer->phase = PH_MSG_IN;
nsp_message_in(tmpSC); nsp_message_in(tmpSC);
/**/ /**/
...@@ -1269,9 +1292,10 @@ static irqreturn_t nspintr(int irq, void *dev_id) ...@@ -1269,9 +1292,10 @@ static irqreturn_t nspintr(int irq, void *dev_id)
i += (1 + data->MsgBuffer[i+1]); i += (1 + data->MsgBuffer[i+1]);
} }
} }
tmpSC->SCp.Message = tmp; scsi_pointer->Message = tmp;
nsp_dbg(NSP_DEBUG_INTR, "message=0x%x len=%d", tmpSC->SCp.Message, data->MsgLen); nsp_dbg(NSP_DEBUG_INTR, "message=0x%x len=%d",
scsi_pointer->Message, data->MsgLen);
show_message(data); show_message(data);
break; break;
......
...@@ -371,7 +371,7 @@ enum _burst_mode { ...@@ -371,7 +371,7 @@ enum _burst_mode {
}; };
/* scatter-gather table */ /* scatter-gather table */
# define BUFFER_ADDR ((char *)((sg_virt(SCpnt->SCp.buffer)))) #define BUFFER_ADDR(SCpnt) ((char *)(sg_virt(nsp_priv(SCpnt)->buffer)))
#endif /*__nsp_cs__*/ #endif /*__nsp_cs__*/
/* end */ /* end */
...@@ -145,7 +145,7 @@ static void show_command(struct scsi_cmnd *SCpnt) ...@@ -145,7 +145,7 @@ static void show_command(struct scsi_cmnd *SCpnt)
static void show_phase(struct scsi_cmnd *SCpnt) static void show_phase(struct scsi_cmnd *SCpnt)
{ {
int i = SCpnt->SCp.phase; int i = nsp_scsi_pointer(SCpnt)->phase;
char *ph[] = { char *ph[] = {
"PH_UNDETERMINED", "PH_UNDETERMINED",
......
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