diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2022-03-24 19:37:53 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2022-03-24 19:37:53 -0700 |
commit | 6f2689a7662809ff39f2b24e452d11569c21ea2f (patch) | |
tree | 6dfbfd3feb4d77a66bf06f246640ae4ed321bbb2 /drivers/scsi/pcmcia/nsp_cs.c | |
parent | b1f8ccdaae0310332d16f65bf0f622f9d4ae2391 (diff) | |
parent | 66daf3e6b9936328cb28eaaa29dddfe96343cc85 (diff) |
Merge tag 'scsi-misc' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi
Pull SCSI updates from James Bottomley:
"This series consists of the usual driver updates (qla2xxx, pm8001,
libsas, smartpqi, scsi_debug, lpfc, iscsi, mpi3mr) plus minor updates
and bug fixes.
The high blast radius core update is the removal of write same, which
affects block and several non-SCSI devices. The other big change,
which is more local, is the removal of the SCSI pointer"
* tag 'scsi-misc' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi: (281 commits)
scsi: scsi_ioctl: Drop needless assignment in sg_io()
scsi: bsg: Drop needless assignment in scsi_bsg_sg_io_fn()
scsi: lpfc: Copyright updates for 14.2.0.0 patches
scsi: lpfc: Update lpfc version to 14.2.0.0
scsi: lpfc: SLI path split: Refactor BSG paths
scsi: lpfc: SLI path split: Refactor Abort paths
scsi: lpfc: SLI path split: Refactor SCSI paths
scsi: lpfc: SLI path split: Refactor CT paths
scsi: lpfc: SLI path split: Refactor misc ELS paths
scsi: lpfc: SLI path split: Refactor VMID paths
scsi: lpfc: SLI path split: Refactor FDISC paths
scsi: lpfc: SLI path split: Refactor LS_RJT paths
scsi: lpfc: SLI path split: Refactor LS_ACC paths
scsi: lpfc: SLI path split: Refactor the RSCN/SCR/RDF/EDC/FARPR paths
scsi: lpfc: SLI path split: Refactor PLOGI/PRLI/ADISC/LOGO paths
scsi: lpfc: SLI path split: Refactor base ELS paths and the FLOGI path
scsi: lpfc: SLI path split: Introduce lpfc_prep_wqe
scsi: lpfc: SLI path split: Refactor fast and slow paths to native SLI4
scsi: lpfc: SLI path split: Refactor lpfc_iocbq
scsi: lpfc: Use kcalloc()
...
Diffstat (limited to 'drivers/scsi/pcmcia/nsp_cs.c')
-rw-r--r-- | drivers/scsi/pcmcia/nsp_cs.c | 246 |
1 files changed, 131 insertions, 115 deletions
diff --git a/drivers/scsi/pcmcia/nsp_cs.c b/drivers/scsi/pcmcia/nsp_cs.c index 92c818a8a84a..48acab03a8a0 100644 --- a/drivers/scsi/pcmcia/nsp_cs.c +++ b/drivers/scsi/pcmcia/nsp_cs.c @@ -41,10 +41,9 @@ #include <asm/io.h> #include <asm/irq.h> -#include <../drivers/scsi/scsi.h> -#include <scsi/scsi_host.h> - #include <scsi/scsi.h> +#include <scsi/scsi_cmnd.h> +#include <scsi/scsi_host.h> #include <scsi/scsi_ioctl.h> #include <pcmcia/cistpl.h> @@ -71,6 +70,11 @@ static bool free_ports = 0; module_param(free_ports, bool, 0); 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 = { .proc_name = "nsp_cs", .show_info = nsp_show_info, @@ -84,6 +88,7 @@ static struct scsi_host_template nsp_driver_template = { .this_id = NSP_INITIATOR_ID, .sg_tablesize = SG_ALL, .dma_boundary = PAGE_SIZE - 1, + .cmd_size = sizeof(struct scsi_pointer), }; static nsp_hw_data nsp_data_base; /* attach <-> detect glue */ @@ -181,8 +186,9 @@ static void nsp_scsi_done(struct scsi_cmnd *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 /*unsigned int host_id = SCpnt->device->host->this_id;*/ /*unsigned int base = SCpnt->device->host->io_port;*/ @@ -218,11 +224,11 @@ static int nsp_queuecommand_lck(struct scsi_cmnd *SCpnt) data->CurrentSC = SCpnt; - SCpnt->SCp.Status = SAM_STAT_CHECK_CONDITION; - SCpnt->SCp.Message = 0; - SCpnt->SCp.have_data_in = IO_UNKNOWN; - SCpnt->SCp.sent_command = 0; - SCpnt->SCp.phase = PH_UNDETERMINED; + scsi_pointer->Status = SAM_STAT_CHECK_CONDITION; + scsi_pointer->Message = 0; + scsi_pointer->have_data_in = IO_UNKNOWN; + scsi_pointer->sent_command = 0; + scsi_pointer->phase = PH_UNDETERMINED; scsi_set_resid(SCpnt, scsi_bufflen(SCpnt)); /* setup scratch area @@ -232,18 +238,18 @@ static int nsp_queuecommand_lck(struct scsi_cmnd *SCpnt) SCp.buffers_residual : left buffers in list SCp.phase : current state of the command */ if (scsi_bufflen(SCpnt)) { - SCpnt->SCp.buffer = scsi_sglist(SCpnt); - SCpnt->SCp.ptr = BUFFER_ADDR; - SCpnt->SCp.this_residual = SCpnt->SCp.buffer->length; - SCpnt->SCp.buffers_residual = scsi_sg_count(SCpnt) - 1; + scsi_pointer->buffer = scsi_sglist(SCpnt); + scsi_pointer->ptr = BUFFER_ADDR(SCpnt); + scsi_pointer->this_residual = scsi_pointer->buffer->length; + scsi_pointer->buffers_residual = scsi_sg_count(SCpnt) - 1; } else { - SCpnt->SCp.ptr = NULL; - SCpnt->SCp.this_residual = 0; - SCpnt->SCp.buffer = NULL; - SCpnt->SCp.buffers_residual = 0; + scsi_pointer->ptr = NULL; + scsi_pointer->this_residual = 0; + scsi_pointer->buffer = NULL; + scsi_pointer->buffers_residual = 0; } - if (nsphw_start_selection(SCpnt) == FALSE) { + if (!nsphw_start_selection(SCpnt)) { nsp_dbg(NSP_DEBUG_QUEUECOMMAND, "selection fail"); SCpnt->result = DID_BUS_BUSY << 16; nsp_scsi_done(SCpnt); @@ -263,14 +269,14 @@ static DEF_SCSI_QCMD(nsp_queuecommand) /* * setup PIO FIFO transfer mode and enable/disable to data out */ -static void nsp_setup_fifo(nsp_hw_data *data, int enabled) +static void nsp_setup_fifo(nsp_hw_data *data, bool enabled) { unsigned int base = data->BaseAddress; unsigned char transfer_mode_reg; //nsp_dbg(NSP_DEBUG_DATA_IO, "enabled=%d", enabled); - if (enabled != FALSE) { + if (enabled) { transfer_mode_reg = TRANSFER_GO | BRAIND; } else { transfer_mode_reg = 0; @@ -298,7 +304,7 @@ static void nsphw_init_sync(nsp_hw_data *data) /* * Initialize Ninja hardware */ -static int nsphw_init(nsp_hw_data *data) +static void nsphw_init(nsp_hw_data *data) { unsigned int base = data->BaseAddress; @@ -348,16 +354,15 @@ static int nsphw_init(nsp_hw_data *data) SCSI_RESET_IRQ_EI ); nsp_write(base, IRQCONTROL, IRQCONTROL_ALLCLEAR); - nsp_setup_fifo(data, FALSE); - - return TRUE; + nsp_setup_fifo(data, false); } /* * Start selection phase */ -static int 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 base = SCpnt->device->host->io_port; unsigned char target = scmd_id(SCpnt); @@ -370,12 +375,12 @@ static int nsphw_start_selection(struct scsi_cmnd *SCpnt) phase = nsp_index_read(base, SCSIBUSMON); if(phase != BUSMON_BUS_FREE) { //nsp_dbg(NSP_DEBUG_RESELECTION, "bus busy"); - return FALSE; + return false; } /* start arbitration */ //nsp_dbg(NSP_DEBUG_RESELECTION, "start arbit"); - SCpnt->SCp.phase = PH_ARBSTART; + scsi_pointer->phase = PH_ARBSTART; nsp_index_write(base, SETARBIT, ARBIT_GO); time_out = 1000; @@ -390,12 +395,12 @@ static int nsphw_start_selection(struct scsi_cmnd *SCpnt) if (!(arbit & ARBIT_WIN)) { //nsp_dbg(NSP_DEBUG_RESELECTION, "arbit fail"); nsp_index_write(base, SETARBIT, ARBIT_FLAG_CLEAR); - return FALSE; + return false; } /* assert select line */ //nsp_dbg(NSP_DEBUG_RESELECTION, "assert SEL line"); - SCpnt->SCp.phase = PH_SELSTART; + scsi_pointer->phase = PH_SELSTART; udelay(3); /* wait 2.4us */ nsp_index_write(base, SCSIDATALATCH, BIT(host_id) | BIT(target)); nsp_index_write(base, SCSIBUSCTRL, SCSI_SEL | SCSI_BSY | SCSI_ATN); @@ -409,7 +414,7 @@ static int nsphw_start_selection(struct scsi_cmnd *SCpnt) nsp_start_timer(SCpnt, 1000/51); data->SelectionTimeOut = 1; - return TRUE; + return true; } struct nsp_sync_table { @@ -479,7 +484,7 @@ static int nsp_analyze_sdtr(struct scsi_cmnd *SCpnt) sync->SyncRegister = 0; sync->AckWidth = 0; - return FALSE; + return false; } sync->SyncRegister = (sync_table->chip_period << SYNCREG_PERIOD_SHIFT) | @@ -488,7 +493,7 @@ static int nsp_analyze_sdtr(struct scsi_cmnd *SCpnt) nsp_dbg(NSP_DEBUG_SYNC, "sync_reg=0x%x, ack_width=0x%x", sync->SyncRegister, sync->AckWidth); - return TRUE; + return true; } @@ -571,8 +576,9 @@ static int nsp_expect_signal(struct scsi_cmnd *SCpnt, /* * 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; nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata; char *buf = data->MsgBuffer; @@ -590,7 +596,7 @@ static int nsp_xfer(struct scsi_cmnd *SCpnt, int phase) } /* 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); } @@ -611,14 +617,15 @@ static int nsp_xfer(struct scsi_cmnd *SCpnt, int phase) /* * 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; unsigned int count; //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; } @@ -633,9 +640,9 @@ static int nsp_dataphase_bypass(struct scsi_cmnd *SCpnt) * data phase skip only occures in case of SCSI_LOW_READ */ nsp_dbg(NSP_DEBUG_DATA_IO, "use bypass quirk"); - SCpnt->SCp.phase = PH_DATA; + scsi_pointer->phase = PH_DATA; nsp_pio_read(SCpnt); - nsp_setup_fifo(data, FALSE); + nsp_setup_fifo(data, false); return 0; } @@ -643,7 +650,7 @@ static int nsp_dataphase_bypass(struct scsi_cmnd *SCpnt) /* * accept reselection */ -static int nsp_reselected(struct scsi_cmnd *SCpnt) +static void nsp_reselected(struct scsi_cmnd *SCpnt) { unsigned int base = SCpnt->device->host->io_port; unsigned int host_id = SCpnt->device->host->this_id; @@ -675,8 +682,6 @@ static int nsp_reselected(struct scsi_cmnd *SCpnt) bus_reg = nsp_index_read(base, SCSIBUSCTRL) & ~(SCSI_BSY | SCSI_ATN); nsp_index_write(base, SCSIBUSCTRL, bus_reg); nsp_index_write(base, SCSIBUSCTRL, bus_reg | AUTODIRECTION | ACKENB); - - return TRUE; } /* @@ -709,8 +714,9 @@ static int nsp_fifo_count(struct scsi_cmnd *SCpnt) /* * 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 long mmio_base = SCpnt->device->host->base; nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata; @@ -721,24 +727,25 @@ static void nsp_pio_read(struct scsi_cmnd *SCpnt) 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", - SCpnt, scsi_get_resid(SCpnt), ocount, SCpnt->SCp.ptr, - SCpnt->SCp.this_residual, SCpnt->SCp.buffer, - SCpnt->SCp.buffers_residual); + SCpnt, scsi_get_resid(SCpnt), ocount, scsi_pointer->ptr, + scsi_pointer->this_residual, scsi_pointer->buffer, + scsi_pointer->buffers_residual); time_out = 1000; 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 &= BUSMON_PHASE_MASK; 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 (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; } else { nsp_dbg(NSP_DEBUG_DATA_IO, "phase changed stat=0x%x", stat); @@ -752,20 +759,21 @@ static void nsp_pio_read(struct scsi_cmnd *SCpnt) continue; } - res = min(res, SCpnt->SCp.this_residual); + res = min(res, scsi_pointer->this_residual); switch (data->TransferMode) { case MODE_IO32: 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; case MODE_IO8: - nsp_fifo8_read (base, SCpnt->SCp.ptr, res ); + nsp_fifo8_read(base, scsi_pointer->ptr, res); break; case MODE_MEM32: 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; default: @@ -774,22 +782,23 @@ static void nsp_pio_read(struct scsi_cmnd *SCpnt) } nsp_inc_resid(SCpnt, -res); - SCpnt->SCp.ptr += res; - SCpnt->SCp.this_residual -= res; + scsi_pointer->ptr += res; + scsi_pointer->this_residual -= 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 */ - if (SCpnt->SCp.this_residual == 0 && - SCpnt->SCp.buffers_residual != 0 ) { + if (scsi_pointer->this_residual == 0 && + scsi_pointer->buffers_residual != 0 ) { //nsp_dbg(NSP_DEBUG_DATA_IO, "scatterlist next timeout=%d", time_out); - SCpnt->SCp.buffers_residual--; - SCpnt->SCp.buffer = sg_next(SCpnt->SCp.buffer); - SCpnt->SCp.ptr = BUFFER_ADDR; - SCpnt->SCp.this_residual = SCpnt->SCp.buffer->length; + scsi_pointer->buffers_residual--; + scsi_pointer->buffer = sg_next(scsi_pointer->buffer); + scsi_pointer->ptr = BUFFER_ADDR(SCpnt); + scsi_pointer->this_residual = + scsi_pointer->buffer->length; 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); } } @@ -797,8 +806,8 @@ static void nsp_pio_read(struct scsi_cmnd *SCpnt) if (time_out < 0) { nsp_msg(KERN_DEBUG, "pio read timeout resid=%d this_residual=%d buffers_residual=%d", - scsi_get_resid(SCpnt), SCpnt->SCp.this_residual, - SCpnt->SCp.buffers_residual); + scsi_get_resid(SCpnt), scsi_pointer->this_residual, + scsi_pointer->buffers_residual); } 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, @@ -810,6 +819,7 @@ static void nsp_pio_read(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 long mmio_base = SCpnt->device->host->base; nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata; @@ -820,14 +830,15 @@ static void nsp_pio_write(struct scsi_cmnd *SCpnt) 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", - data->FifoCount, SCpnt->SCp.ptr, SCpnt->SCp.this_residual, - SCpnt->SCp.buffer, SCpnt->SCp.buffers_residual, + data->FifoCount, scsi_pointer->ptr, scsi_pointer->this_residual, + scsi_pointer->buffer, scsi_pointer->buffers_residual, scsi_get_resid(SCpnt)); time_out = 1000; 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 &= BUSMON_PHASE_MASK; @@ -837,9 +848,9 @@ 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); /* Put back pointer */ nsp_inc_resid(SCpnt, res); - SCpnt->SCp.ptr -= res; - SCpnt->SCp.this_residual += res; - ocount -= res; + scsi_pointer->ptr -= res; + scsi_pointer->this_residual += res; + ocount -= res; break; } @@ -850,21 +861,22 @@ static void nsp_pio_write(struct scsi_cmnd *SCpnt) 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) { case MODE_IO32: 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; case MODE_IO8: - nsp_fifo8_write (base, SCpnt->SCp.ptr, res ); + nsp_fifo8_write(base, scsi_pointer->ptr, res); break; case MODE_MEM32: 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; default: @@ -873,18 +885,19 @@ static void nsp_pio_write(struct scsi_cmnd *SCpnt) } nsp_inc_resid(SCpnt, -res); - SCpnt->SCp.ptr += res; - SCpnt->SCp.this_residual -= res; - ocount += res; + scsi_pointer->ptr += res; + scsi_pointer->this_residual -= res; + ocount += res; /* go to next scatter list if available */ - if (SCpnt->SCp.this_residual == 0 && - SCpnt->SCp.buffers_residual != 0 ) { + if (scsi_pointer->this_residual == 0 && + scsi_pointer->buffers_residual != 0 ) { //nsp_dbg(NSP_DEBUG_DATA_IO, "scatterlist next"); - SCpnt->SCp.buffers_residual--; - SCpnt->SCp.buffer = sg_next(SCpnt->SCp.buffer); - SCpnt->SCp.ptr = BUFFER_ADDR; - SCpnt->SCp.this_residual = SCpnt->SCp.buffer->length; + scsi_pointer->buffers_residual--; + scsi_pointer->buffer = sg_next(scsi_pointer->buffer); + scsi_pointer->ptr = BUFFER_ADDR(SCpnt); + scsi_pointer->this_residual = + scsi_pointer->buffer->length; time_out = 1000; } } @@ -931,7 +944,7 @@ static int nsp_nexus(struct scsi_cmnd *SCpnt) } /* setup pdma fifo */ - nsp_setup_fifo(data, TRUE); + nsp_setup_fifo(data, true); /* clear ack counter */ data->FifoCount = 0; @@ -952,6 +965,7 @@ static irqreturn_t nspintr(int irq, void *dev_id) unsigned int base; unsigned char irq_status, irq_phase, phase; struct scsi_cmnd *tmpSC; + struct scsi_pointer *scsi_pointer; unsigned char target, lun; unsigned int *sync_neg; int i, tmp; @@ -1030,9 +1044,10 @@ static irqreturn_t nspintr(int irq, void *dev_id) if(data->CurrentSC != NULL) { tmpSC = data->CurrentSC; - tmpSC->result = (DID_RESET << 16) | - ((tmpSC->SCp.Message & 0xff) << 8) | - ((tmpSC->SCp.Status & 0xff) << 0); + scsi_pointer = nsp_priv(tmpSC); + tmpSC->result = (DID_RESET << 16) | + ((scsi_pointer->Message & 0xff) << 8) | + ((scsi_pointer->Status & 0xff) << 0); nsp_scsi_done(tmpSC); } return IRQ_HANDLED; @@ -1046,6 +1061,7 @@ static irqreturn_t nspintr(int irq, void *dev_id) } tmpSC = data->CurrentSC; + scsi_pointer = nsp_priv(tmpSC); target = tmpSC->device->id; lun = tmpSC->device->lun; sync_neg = &(data->Sync[target].SyncNegotiation); @@ -1057,9 +1073,8 @@ static irqreturn_t nspintr(int irq, void *dev_id) if (irq_phase & RESELECT_IRQ) { nsp_dbg(NSP_DEBUG_INTR, "reselect"); nsp_write(base, IRQCONTROL, IRQCONTROL_RESELECT_CLEAR); - if (nsp_reselected(tmpSC) != FALSE) { - return IRQ_HANDLED; - } + nsp_reselected(tmpSC); + return IRQ_HANDLED; } if ((irq_phase & (PHASE_CHANGE_IRQ | LATCHED_BUS_FREE)) == 0) { @@ -1069,7 +1084,7 @@ static irqreturn_t nspintr(int irq, void *dev_id) //show_phase(tmpSC); - switch(tmpSC->SCp.phase) { + switch (scsi_pointer->phase) { case PH_SELSTART: // *sync_neg = SYNC_NOT_YET; if ((phase & BUSMON_BSY) == 0) { @@ -1092,7 +1107,7 @@ static irqreturn_t nspintr(int irq, void *dev_id) /* attention assert */ //nsp_dbg(NSP_DEBUG_INTR, "attention assert"); data->SelectionTimeOut = 0; - tmpSC->SCp.phase = PH_SELECTED; + scsi_pointer->phase = PH_SELECTED; nsp_index_write(base, SCSIBUSCTRL, SCSI_ATN); udelay(1); nsp_index_write(base, SCSIBUSCTRL, SCSI_ATN | AUTODIRECTION | ACKENB); @@ -1121,17 +1136,18 @@ static irqreturn_t nspintr(int irq, void *dev_id) //nsp_dbg(NSP_DEBUG_INTR, "start scsi seq"); /* normal disconnect */ - if (((tmpSC->SCp.phase == PH_MSG_IN) || (tmpSC->SCp.phase == PH_MSG_OUT)) && - (irq_phase & LATCHED_BUS_FREE) != 0 ) { + if ((scsi_pointer->phase == PH_MSG_IN || + 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); //*sync_neg = SYNC_NOT_YET; /* all command complete and return status */ - if (tmpSC->SCp.Message == COMMAND_COMPLETE) { - tmpSC->result = (DID_OK << 16) | - ((tmpSC->SCp.Message & 0xff) << 8) | - ((tmpSC->SCp.Status & 0xff) << 0); + if (scsi_pointer->Message == COMMAND_COMPLETE) { + tmpSC->result = (DID_OK << 16) | + ((scsi_pointer->Message & 0xff) << 8) | + ((scsi_pointer->Status & 0xff) << 0); nsp_dbg(NSP_DEBUG_INTR, "command complete result=0x%x", tmpSC->result); nsp_scsi_done(tmpSC); @@ -1160,7 +1176,7 @@ static irqreturn_t nspintr(int irq, void *dev_id) return IRQ_HANDLED; } - tmpSC->SCp.phase = PH_COMMAND; + scsi_pointer->phase = PH_COMMAND; nsp_nexus(tmpSC); @@ -1176,8 +1192,8 @@ static irqreturn_t nspintr(int irq, void *dev_id) case BUSPHASE_DATA_OUT: nsp_dbg(NSP_DEBUG_INTR, "BUSPHASE_DATA_OUT"); - tmpSC->SCp.phase = PH_DATA; - tmpSC->SCp.have_data_in = IO_OUT; + scsi_pointer->phase = PH_DATA; + scsi_pointer->have_data_in = IO_OUT; nsp_pio_write(tmpSC); @@ -1186,8 +1202,8 @@ static irqreturn_t nspintr(int irq, void *dev_id) case BUSPHASE_DATA_IN: nsp_dbg(NSP_DEBUG_INTR, "BUSPHASE_DATA_IN"); - tmpSC->SCp.phase = PH_DATA; - tmpSC->SCp.have_data_in = IO_IN; + scsi_pointer->phase = PH_DATA; + scsi_pointer->have_data_in = IO_IN; nsp_pio_read(tmpSC); @@ -1197,10 +1213,11 @@ static irqreturn_t nspintr(int irq, void *dev_id) nsp_dataphase_bypass(tmpSC); 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); - nsp_dbg(NSP_DEBUG_INTR, "message=0x%x status=0x%x", tmpSC->SCp.Message, tmpSC->SCp.Status); + scsi_pointer->Status = nsp_index_read(base, SCSIDATAWITHACK); + nsp_dbg(NSP_DEBUG_INTR, "message=0x%x status=0x%x", + scsi_pointer->Message, scsi_pointer->Status); break; @@ -1210,12 +1227,12 @@ static irqreturn_t nspintr(int irq, void *dev_id) goto timer_out; } - tmpSC->SCp.phase = PH_MSG_OUT; + scsi_pointer->phase = PH_MSG_OUT; //*sync_neg = SYNC_NOT_YET; data->MsgLen = i = 0; - data->MsgBuffer[i] = IDENTIFY(TRUE, lun); i++; + data->MsgBuffer[i] = IDENTIFY(true, lun); i++; if (*sync_neg == SYNC_NOT_YET) { data->Sync[target].SyncPeriod = 0; @@ -1243,7 +1260,7 @@ static irqreturn_t nspintr(int irq, void *dev_id) goto timer_out; } - tmpSC->SCp.phase = PH_MSG_IN; + scsi_pointer->phase = PH_MSG_IN; nsp_message_in(tmpSC); /**/ @@ -1275,9 +1292,10 @@ static irqreturn_t nspintr(int irq, void *dev_id) 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); break; @@ -1614,9 +1632,7 @@ static int nsp_cs_config(struct pcmcia_device *link) nsp_dbg(NSP_DEBUG_INIT, "I/O[0x%x+0x%x] IRQ %d", data->BaseAddress, data->NumAddress, data->IrqNumber); - if(nsphw_init(data) == FALSE) { - goto cs_failed; - } + nsphw_init(data); host = nsp_detect(&nsp_driver_template); |