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

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.org


Reviewed-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
Loading
Loading
Loading
Loading
+112 −88
Original line number Diff line number Diff line
@@ -70,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,
@@ -83,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 */
@@ -180,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;*/
@@ -217,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
@@ -231,15 +238,15 @@ 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)) {
@@ -353,8 +360,9 @@ static void nsphw_init(nsp_hw_data *data)
/*
 * 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  base	 = SCpnt->device->host->io_port;
	unsigned char target	 = scmd_id(SCpnt);
@@ -372,7 +380,7 @@ static bool nsphw_start_selection(struct scsi_cmnd *SCpnt)

	/* 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;
@@ -392,7 +400,7 @@ static bool nsphw_start_selection(struct scsi_cmnd *SCpnt)

	/* 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);
@@ -568,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;
@@ -587,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);
		}

@@ -608,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;
	}

@@ -630,7 +640,7 @@ 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);

@@ -704,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;
@@ -716,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);
@@ -747,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:
@@ -769,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);
		}
	}

@@ -792,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,
@@ -805,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;
@@ -815,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;

@@ -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);
			/* Put back pointer */
			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;

			break;
@@ -845,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:
@@ -868,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;
		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;
		}
	}
@@ -947,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;
@@ -1025,9 +1044,10 @@ static irqreturn_t nspintr(int irq, void *dev_id)

		if(data->CurrentSC != NULL) {
			tmpSC = data->CurrentSC;
			scsi_pointer = nsp_priv(tmpSC);
			tmpSC->result = (DID_RESET              << 16) |
				         ((tmpSC->SCp.Message & 0xff) <<  8) |
				         ((tmpSC->SCp.Status  & 0xff) <<  0);
				((scsi_pointer->Message & 0xff) <<  8) |
				((scsi_pointer->Status  & 0xff) <<  0);
			nsp_scsi_done(tmpSC);
		}
		return IRQ_HANDLED;
@@ -1041,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);
@@ -1063,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) {
@@ -1086,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);
@@ -1115,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)) &&
	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) {
		if (scsi_pointer->Message == COMMAND_COMPLETE) {
			tmpSC->result = (DID_OK		        << 16) |
					((tmpSC->SCp.Message & 0xff) <<  8) |
					((tmpSC->SCp.Status  & 0xff) <<  0);
				((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);

@@ -1154,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);

@@ -1170,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);

@@ -1180,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);

@@ -1191,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;

@@ -1204,7 +1227,7 @@ 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;

@@ -1237,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);

		/**/
@@ -1269,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;
+1 −1
Original line number Diff line number Diff line
@@ -371,7 +371,7 @@ enum _burst_mode {
};

/* 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__*/
/* end */
+1 −1
Original line number Diff line number Diff line
@@ -145,7 +145,7 @@ static void show_command(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[] = {
		"PH_UNDETERMINED",