scsi: ppa: Move the SCSI pointer to private command data
authorBart Van Assche <bvanassche@acm.org>
Fri, 18 Feb 2022 19:51:08 +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-41-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/ppa.c

index 003043de23a553b8b49c59240e3bf2b08908249d..c6c1bc60822417461feffb83c639ed71353244cb 100644 (file)
@@ -45,6 +45,11 @@ typedef struct {
 
 #include  "ppa.h"
 
+static struct scsi_pointer *ppa_scsi_pointer(struct scsi_cmnd *cmd)
+{
+       return scsi_cmd_priv(cmd);
+}
+
 static inline ppa_struct *ppa_dev(struct Scsi_Host *host)
 {
        return *(ppa_struct **)&host->hostdata;
@@ -56,7 +61,7 @@ static void got_it(ppa_struct *dev)
 {
        dev->base = dev->dev->port->base;
        if (dev->cur_cmd)
-               dev->cur_cmd->SCp.phase = 1;
+               ppa_scsi_pointer(dev->cur_cmd)->phase = 1;
        else
                wake_up(dev->waiting);
 }
@@ -511,13 +516,14 @@ static inline int ppa_send_command(struct scsi_cmnd *cmd)
  * The driver appears to remain stable if we speed up the parallel port
  * i/o in this function, but not elsewhere.
  */
-static int ppa_completion(struct scsi_cmnd *cmd)
+static int ppa_completion(struct scsi_cmnd *const cmd)
 {
        /* Return codes:
         * -1     Error
         *  0     Told to schedule
         *  1     Finished data transfer
         */
+       struct scsi_pointer *scsi_pointer = ppa_scsi_pointer(cmd);
        ppa_struct *dev = ppa_dev(cmd->device->host);
        unsigned short ppb = dev->base;
        unsigned long start_jiffies = jiffies;
@@ -543,7 +549,7 @@ static int ppa_completion(struct scsi_cmnd *cmd)
                if (time_after(jiffies, start_jiffies + 1))
                        return 0;
 
-               if ((cmd->SCp.this_residual <= 0)) {
+               if (scsi_pointer->this_residual <= 0) {
                        ppa_fail(dev, DID_ERROR);
                        return -1;      /* ERROR_RETURN */
                }
@@ -572,28 +578,30 @@ static int ppa_completion(struct scsi_cmnd *cmd)
                }
 
                /* determine if we should use burst I/O */
-               fast = (bulk && (cmd->SCp.this_residual >= PPA_BURST_SIZE))
-                   ? PPA_BURST_SIZE : 1;
+               fast = bulk && scsi_pointer->this_residual >= PPA_BURST_SIZE ?
+                       PPA_BURST_SIZE : 1;
 
                if (r == (unsigned char) 0xc0)
-                       status = ppa_out(dev, cmd->SCp.ptr, fast);
+                       status = ppa_out(dev, scsi_pointer->ptr, fast);
                else
-                       status = ppa_in(dev, cmd->SCp.ptr, fast);
+                       status = ppa_in(dev, scsi_pointer->ptr, fast);
 
-               cmd->SCp.ptr += fast;
-               cmd->SCp.this_residual -= fast;
+               scsi_pointer->ptr += fast;
+               scsi_pointer->this_residual -= fast;
 
                if (!status) {
                        ppa_fail(dev, DID_BUS_BUSY);
                        return -1;      /* ERROR_RETURN */
                }
-               if (cmd->SCp.buffer && !cmd->SCp.this_residual) {
+               if (scsi_pointer->buffer && !scsi_pointer->this_residual) {
                        /* if scatter/gather, advance to the next segment */
-                       if (cmd->SCp.buffers_residual--) {
-                               cmd->SCp.buffer = sg_next(cmd->SCp.buffer);
-                               cmd->SCp.this_residual =
-                                   cmd->SCp.buffer->length;
-                               cmd->SCp.ptr = sg_virt(cmd->SCp.buffer);
+                       if (scsi_pointer->buffers_residual--) {
+                               scsi_pointer->buffer =
+                                       sg_next(scsi_pointer->buffer);
+                               scsi_pointer->this_residual =
+                                   scsi_pointer->buffer->length;
+                               scsi_pointer->ptr =
+                                       sg_virt(scsi_pointer->buffer);
                        }
                }
                /* Now check to see if the drive is ready to comunicate */
@@ -658,7 +666,7 @@ static void ppa_interrupt(struct work_struct *work)
        }
 #endif
 
-       if (cmd->SCp.phase > 1)
+       if (ppa_scsi_pointer(cmd)->phase > 1)
                ppa_disconnect(dev);
 
        ppa_pb_dismiss(dev);
@@ -670,6 +678,7 @@ static void ppa_interrupt(struct work_struct *work)
 
 static int ppa_engine(ppa_struct *dev, struct scsi_cmnd *cmd)
 {
+       struct scsi_pointer *scsi_pointer = ppa_scsi_pointer(cmd);
        unsigned short ppb = dev->base;
        unsigned char l = 0, h = 0;
        int retv;
@@ -680,7 +689,7 @@ static int ppa_engine(ppa_struct *dev, struct scsi_cmnd *cmd)
        if (dev->failed)
                return 0;
 
-       switch (cmd->SCp.phase) {
+       switch (scsi_pointer->phase) {
        case 0:         /* Phase 0 - Waiting for parport */
                if (time_after(jiffies, dev->jstart + HZ)) {
                        /*
@@ -715,7 +724,7 @@ static int ppa_engine(ppa_struct *dev, struct scsi_cmnd *cmd)
                                        return 1;       /* Try again in a jiffy */
                                }
                        }
-                       cmd->SCp.phase++;
+                       scsi_pointer->phase++;
                }
                fallthrough;
 
@@ -724,7 +733,7 @@ static int ppa_engine(ppa_struct *dev, struct scsi_cmnd *cmd)
                        ppa_fail(dev, DID_NO_CONNECT);
                        return 0;
                }
-               cmd->SCp.phase++;
+               scsi_pointer->phase++;
                fallthrough;
 
        case 3:         /* Phase 3 - Ready to accept a command */
@@ -734,21 +743,22 @@ static int ppa_engine(ppa_struct *dev, struct scsi_cmnd *cmd)
 
                if (!ppa_send_command(cmd))
                        return 0;
-               cmd->SCp.phase++;
+               scsi_pointer->phase++;
                fallthrough;
 
        case 4:         /* Phase 4 - Setup scatter/gather buffers */
                if (scsi_bufflen(cmd)) {
-                       cmd->SCp.buffer = scsi_sglist(cmd);
-                       cmd->SCp.this_residual = cmd->SCp.buffer->length;
-                       cmd->SCp.ptr = sg_virt(cmd->SCp.buffer);
+                       scsi_pointer->buffer = scsi_sglist(cmd);
+                       scsi_pointer->this_residual =
+                               scsi_pointer->buffer->length;
+                       scsi_pointer->ptr = sg_virt(scsi_pointer->buffer);
                } else {
-                       cmd->SCp.buffer = NULL;
-                       cmd->SCp.this_residual = 0;
-                       cmd->SCp.ptr = NULL;
+                       scsi_pointer->buffer = NULL;
+                       scsi_pointer->this_residual = 0;
+                       scsi_pointer->ptr = NULL;
                }
-               cmd->SCp.buffers_residual = scsi_sg_count(cmd) - 1;
-               cmd->SCp.phase++;
+               scsi_pointer->buffers_residual = scsi_sg_count(cmd) - 1;
+               scsi_pointer->phase++;
                fallthrough;
 
        case 5:         /* Phase 5 - Data transfer stage */
@@ -761,7 +771,7 @@ static int ppa_engine(ppa_struct *dev, struct scsi_cmnd *cmd)
                        return 0;
                if (retv == 0)
                        return 1;
-               cmd->SCp.phase++;
+               scsi_pointer->phase++;
                fallthrough;
 
        case 6:         /* Phase 6 - Read status/message */
@@ -798,7 +808,7 @@ static int ppa_queuecommand_lck(struct scsi_cmnd *cmd)
        dev->jstart = jiffies;
        dev->cur_cmd = cmd;
        cmd->result = DID_ERROR << 16;  /* default return code */
-       cmd->SCp.phase = 0;     /* bus free */
+       ppa_scsi_pointer(cmd)->phase = 0;       /* bus free */
 
        schedule_delayed_work(&dev->ppa_tq, 0);
 
@@ -839,7 +849,7 @@ static int ppa_abort(struct scsi_cmnd *cmd)
         * have tied the SCSI_MESSAGE line high in the interface
         */
 
-       switch (cmd->SCp.phase) {
+       switch (ppa_scsi_pointer(cmd)->phase) {
        case 0:         /* Do not have access to parport */
        case 1:         /* Have not connected to interface */
                dev->cur_cmd = NULL;    /* Forget the problem */
@@ -861,7 +871,7 @@ static int ppa_reset(struct scsi_cmnd *cmd)
 {
        ppa_struct *dev = ppa_dev(cmd->device->host);
 
-       if (cmd->SCp.phase)
+       if (ppa_scsi_pointer(cmd)->phase)
                ppa_disconnect(dev);
        dev->cur_cmd = NULL;    /* Forget the problem */
 
@@ -976,6 +986,7 @@ static struct scsi_host_template ppa_template = {
        .sg_tablesize           = SG_ALL,
        .can_queue              = 1,
        .slave_alloc            = ppa_adjust_queue,
+       .cmd_size               = sizeof(struct scsi_pointer),
 };
 
 /***************************************************************************