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

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

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

Link: https://lore.kernel.org/r/20220218195117.25689-40-bvanassche@acm.org


Reviewed-by: default avatarJohannes Thumshirn <johannes.thumshirn@wdc.com>
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 ea39700f
Loading
Loading
Loading
Loading
+29 −18
Original line number Diff line number Diff line
@@ -192,6 +192,11 @@ struct sym53c500_data {
	int fast_pio;
};

static struct scsi_pointer *sym53c500_scsi_pointer(struct scsi_cmnd *cmd)
{
	return scsi_cmd_priv(cmd);
}

enum Phase {
    idle,
    data_out,
@@ -351,6 +356,7 @@ SYM53C500_intr(int irq, void *dev_id)
	struct sym53c500_data *data =
	    (struct sym53c500_data *)dev->hostdata;
	struct scsi_cmnd *curSC = data->current_SC;
	struct scsi_pointer *scsi_pointer = sym53c500_scsi_pointer(curSC);
	int fast_pio = data->fast_pio;

	spin_lock_irqsave(dev->host_lock, flags);
@@ -397,11 +403,12 @@ SYM53C500_intr(int irq, void *dev_id)

	if (int_reg & 0x20) {		/* Disconnect */
		DEB(printk("SYM53C500: disconnect intr received\n"));
		if (curSC->SCp.phase != message_in) {	/* Unexpected disconnect */
		if (scsi_pointer->phase != message_in) {	/* Unexpected disconnect */
			curSC->result = DID_NO_CONNECT << 16;
		} else {	/* Command complete, return status and message */
			curSC->result = (curSC->SCp.Status & 0xff)
			    | ((curSC->SCp.Message & 0xff) << 8) | (DID_OK << 16);
			curSC->result = (scsi_pointer->Status & 0xff) |
				((scsi_pointer->Message & 0xff) << 8) |
				(DID_OK << 16);
		}
		goto idle_out;
	}
@@ -412,7 +419,7 @@ SYM53C500_intr(int irq, void *dev_id)
			struct scatterlist *sg;
			int i;

			curSC->SCp.phase = data_out;
			scsi_pointer->phase = data_out;
			VDEB(printk("SYM53C500: Data-Out phase\n"));
			outb(FLUSH_FIFO, port_base + CMD_REG);
			LOAD_DMA_COUNT(port_base, scsi_bufflen(curSC));	/* Max transfer size */
@@ -431,7 +438,7 @@ SYM53C500_intr(int irq, void *dev_id)
			struct scatterlist *sg;
			int i;

			curSC->SCp.phase = data_in;
			scsi_pointer->phase = data_in;
			VDEB(printk("SYM53C500: Data-In phase\n"));
			outb(FLUSH_FIFO, port_base + CMD_REG);
			LOAD_DMA_COUNT(port_base, scsi_bufflen(curSC));	/* Max transfer size */
@@ -446,12 +453,12 @@ SYM53C500_intr(int irq, void *dev_id)
		break;

	case 0x02:		/* COMMAND */
		curSC->SCp.phase = command_ph;
		scsi_pointer->phase = command_ph;
		printk("SYM53C500: Warning: Unknown interrupt occurred in command phase!\n");
		break;

	case 0x03:		/* STATUS */
		curSC->SCp.phase = status_ph;
		scsi_pointer->phase = status_ph;
		VDEB(printk("SYM53C500: Status phase\n"));
		outb(FLUSH_FIFO, port_base + CMD_REG);
		outb(INIT_CMD_COMPLETE, port_base + CMD_REG);
@@ -464,22 +471,24 @@ SYM53C500_intr(int irq, void *dev_id)

	case 0x06:		/* MESSAGE-OUT */
		DEB(printk("SYM53C500: Message-Out phase\n"));
		curSC->SCp.phase = message_out;
		scsi_pointer->phase = message_out;
		outb(SET_ATN, port_base + CMD_REG);	/* Reject the message */
		outb(MSG_ACCEPT, port_base + CMD_REG);
		break;

	case 0x07:		/* MESSAGE-IN */
		VDEB(printk("SYM53C500: Message-In phase\n"));
		curSC->SCp.phase = message_in;
		scsi_pointer->phase = message_in;

		curSC->SCp.Status = inb(port_base + SCSI_FIFO);
		curSC->SCp.Message = inb(port_base + SCSI_FIFO);
		scsi_pointer->Status = inb(port_base + SCSI_FIFO);
		scsi_pointer->Message = inb(port_base + SCSI_FIFO);

		VDEB(printk("SCSI FIFO size=%d\n", inb(port_base + FIFO_FLAGS) & 0x1f));
		DEB(printk("Status = %02x  Message = %02x\n", curSC->SCp.Status, curSC->SCp.Message));
		DEB(printk("Status = %02x  Message = %02x\n",
			   scsi_pointer->Status, scsi_pointer->Message));

		if (curSC->SCp.Message == SAVE_POINTERS || curSC->SCp.Message == DISCONNECT) {
		if (scsi_pointer->Message == SAVE_POINTERS ||
		    scsi_pointer->Message == DISCONNECT) {
			outb(SET_ATN, port_base + CMD_REG);	/* Reject message */
			DEB(printk("Discarding SAVE_POINTERS message\n"));
		}
@@ -491,7 +500,7 @@ SYM53C500_intr(int irq, void *dev_id)
	return IRQ_HANDLED;

idle_out:
	curSC->SCp.phase = idle;
	scsi_pointer->phase = idle;
	scsi_done(curSC);
	goto out;
}
@@ -539,6 +548,7 @@ SYM53C500_info(struct Scsi_Host *SChost)

static int SYM53C500_queue_lck(struct scsi_cmnd *SCpnt)
{
	struct scsi_pointer *scsi_pointer = sym53c500_scsi_pointer(SCpnt);
	int i;
	int port_base = SCpnt->device->host->io_port;
	struct sym53c500_data *data =
@@ -555,9 +565,9 @@ static int SYM53C500_queue_lck(struct scsi_cmnd *SCpnt)
	VDEB(printk("\n"));

	data->current_SC = SCpnt;
	data->current_SC->SCp.phase = command_ph;
	data->current_SC->SCp.Status = 0;
	data->current_SC->SCp.Message = 0;
	scsi_pointer->phase = command_ph;
	scsi_pointer->Status = 0;
	scsi_pointer->Message = 0;

	/* We are locked here already by the mid layer */
	REG0(port_base);
@@ -671,7 +681,8 @@ static struct scsi_host_template sym53c500_driver_template = {
     .can_queue			= 1,
     .this_id			= 7,
     .sg_tablesize		= 32,
     .shost_groups		= SYM53C500_shost_groups
     .shost_groups		= SYM53C500_shost_groups,
     .cmd_size			= sizeof(struct scsi_pointer),
};

static int SYM53C500_config_check(struct pcmcia_device *p_dev, void *priv_data)