cxlflash: Fix location of setting resid
authorMatthew R. Ochs <mrochs@linux.vnet.ibm.com>
Wed, 21 Oct 2015 20:13:29 +0000 (15:13 -0500)
committerJames Bottomley <JBottomley@Odin.com>
Fri, 30 Oct 2015 08:11:38 +0000 (17:11 +0900)
The resid is incorrectly set which can lead to unnecessary retry
attempts by the stack. This is due to resid _always_ being set
using a value returned from the adapter. Instead, the value
should only be interpreted and set when in an underrun scenario.

Signed-off-by: Matthew R. Ochs <mrochs@linux.vnet.ibm.com>
Signed-off-by: Manoj N. Kumar <manoj@linux.vnet.ibm.com>
Reviewed-by: Brian King <brking@linux.vnet.ibm.com>
Reviewed-by: Tomas Henzl <thenzl@redhat.com>
Signed-off-by: James Bottomley <JBottomley@Odin.com>
drivers/scsi/cxlflash/main.c

index 110037d6a1b625bda77b7e0b580954ef5ce7b645..5503a403cdc07e55d6a8be8d5fcc4f755e0429e0 100644 (file)
@@ -107,6 +107,7 @@ static void process_cmd_err(struct afu_cmd *cmd, struct scsi_cmnd *scp)
 {
        struct sisl_ioarcb *ioarcb;
        struct sisl_ioasa *ioasa;
+       u32 resid;
 
        if (unlikely(!cmd))
                return;
@@ -115,9 +116,10 @@ static void process_cmd_err(struct afu_cmd *cmd, struct scsi_cmnd *scp)
        ioasa = &(cmd->sa);
 
        if (ioasa->rc.flags & SISL_RC_FLAGS_UNDERRUN) {
-               pr_debug("%s: cmd underrun cmd = %p scp = %p\n",
-                        __func__, cmd, scp);
-               scp->result = (DID_ERROR << 16);
+               resid = ioasa->resid;
+               scsi_set_resid(scp, resid);
+               pr_debug("%s: cmd underrun cmd = %p scp = %p, resid = %d\n",
+                        __func__, cmd, scp, resid);
        }
 
        if (ioasa->rc.flags & SISL_RC_FLAGS_OVERRUN) {
@@ -158,8 +160,7 @@ static void process_cmd_err(struct afu_cmd *cmd, struct scsi_cmnd *scp)
                                /* If the SISL_RC_FLAGS_OVERRUN flag was set,
                                 * then we will handle this error else where.
                                 * If not then we must handle it here.
-                                * This is probably an AFU bug. We will
-                                * attempt a retry to see if that resolves it.
+                                * This is probably an AFU bug.
                                 */
                                scp->result = (DID_ERROR << 16);
                        }
@@ -183,7 +184,7 @@ static void process_cmd_err(struct afu_cmd *cmd, struct scsi_cmnd *scp)
                /* We have an AFU error */
                switch (ioasa->rc.afu_rc) {
                case SISL_AFU_RC_NO_CHANNELS:
-                       scp->result = (DID_MEDIUM_ERROR << 16);
+                       scp->result = (DID_NO_CONNECT << 16);
                        break;
                case SISL_AFU_RC_DATA_DMA_ERR:
                        switch (ioasa->afu_extra) {
@@ -217,7 +218,6 @@ static void process_cmd_err(struct afu_cmd *cmd, struct scsi_cmnd *scp)
 static void cmd_complete(struct afu_cmd *cmd)
 {
        struct scsi_cmnd *scp;
-       u32 resid;
        ulong lock_flags;
        struct afu *afu = cmd->parent;
        struct cxlflash_cfg *cfg = afu->parent;
@@ -229,14 +229,11 @@ static void cmd_complete(struct afu_cmd *cmd)
 
        if (cmd->rcb.scp) {
                scp = cmd->rcb.scp;
-               if (unlikely(cmd->sa.rc.afu_rc ||
-                            cmd->sa.rc.scsi_rc ||
-                            cmd->sa.rc.fc_rc))
+               if (unlikely(cmd->sa.ioasc))
                        process_cmd_err(cmd, scp);
                else
                        scp->result = (DID_OK << 16);
 
-               resid = cmd->sa.resid;
                cmd_is_tmf = cmd->cmd_tmf;
                cmd_checkin(cmd); /* Don't use cmd after here */
 
@@ -244,7 +241,6 @@ static void cmd_complete(struct afu_cmd *cmd)
                                     "ioasc=%d\n", __func__, scp, scp->result,
                                     cmd->sa.ioasc);
 
-               scsi_set_resid(scp, resid);
                scsi_dma_unmap(scp);
                scp->scsi_done(scp);