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: Johannes Thumshirn <johannes.thumshirn@wdc.com> Reviewed-by: Himanshu Madhani <himanshu.madhani@oracle.com> Signed-off-by: Bart Van Assche <bvanassche@acm.org> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
parent
ea39700fa9
commit
3d75be6de7
@ -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 @@ out:
|
||||
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)
|
||||
|
Loading…
Reference in New Issue
Block a user