]> git.baikalelectronics.ru Git - kernel.git/commitdiff
scsi: sym53c500_cs: Move the SCSI pointer to private command data
authorBart Van Assche <bvanassche@acm.org>
Fri, 18 Feb 2022 19:51:07 +0000 (11:51 -0800)
committerMartin K. Petersen <martin.petersen@oracle.com>
Wed, 23 Feb 2022 02:11:06 +0000 (21:11 -0500)
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>
drivers/scsi/pcmcia/sym53c500_cs.c

index fc93d2a57e1e5da547f929d29f1b5e7d264e5cbe..c4a838635893a6413b944a5423ba900742e8b56f 100644 (file)
@@ -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)