scsi: aacraid: Disabling TM path and only processing IOP reset
authorSagar Biradar <Sagar.Biradar@microchip.com>
Thu, 13 Feb 2020 00:29:31 +0000 (16:29 -0800)
committerMartin K. Petersen <martin.petersen@oracle.com>
Thu, 12 Mar 2020 03:07:57 +0000 (23:07 -0400)
Fixes the occasional adapter panic when sg_reset is issued with -d, -t, -b
and -H flags.  Removal of command type HBA_IU_TYPE_SCSI_TM_REQ in
aac_hba_send since iu_type, request_id and fib_flags are not populated.
Device and target reset handlers are made to send TMF commands only when
reset_state is 0.

Link: https://lore.kernel.org/r/1581553771-25796-1-git-send-email-Sagar.Biradar@microchip.com
Reviewed-by: Sagar Biradar <Sagar.Biradar@microchip.com>
Signed-off-by: Sagar Biradar <Sagar.Biradar@microchip.com>
Signed-off-by: Balsundar P <balsundar.p@microsemi.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/aacraid/commsup.c
drivers/scsi/aacraid/linit.c

index bb14a05f6d77c0298d2c33dea867fa536fc77d47..4725e4c763cfa6f3a214252cff38547b7ec4809b 100644 (file)
@@ -729,7 +729,7 @@ int aac_hba_send(u8 command, struct fib *fibptr, fib_callback callback,
                hbacmd->request_id =
                        cpu_to_le32((((u32)(fibptr - dev->fibs)) << 2) + 1);
                fibptr->flags |= FIB_CONTEXT_FLAG_SCSI_CMD;
-       } else if (command != HBA_IU_TYPE_SCSI_TM_REQ)
+       } else
                return -EINVAL;
 
 
index d0d1f3072c0ca4a658309843d2058250cce31b68..b1d133de29ab5ff72eaab6df34683094ffa2c5ae 100644 (file)
@@ -733,7 +733,11 @@ static int aac_eh_abort(struct scsi_cmnd* cmd)
                status = aac_hba_send(HBA_IU_TYPE_SCSI_TM_REQ, fib,
                                  (fib_callback) aac_hba_callback,
                                  (void *) cmd);
-
+               if (status != -EINPROGRESS) {
+                       aac_fib_complete(fib);
+                       aac_fib_free(fib);
+                       return ret;
+               }
                /* Wait up to 15 secs for completion */
                for (count = 0; count < 15; ++count) {
                        if (cmd->SCp.sent_command) {
@@ -912,11 +916,11 @@ static int aac_eh_dev_reset(struct scsi_cmnd *cmd)
 
        info = &aac->hba_map[bus][cid];
 
-       if (info->devtype != AAC_DEVTYPE_NATIVE_RAW &&
-           info->reset_state > 0)
+       if (!(info->devtype == AAC_DEVTYPE_NATIVE_RAW &&
+        !(info->reset_state > 0)))
                return FAILED;
 
-       pr_err("%s: Host adapter reset request. SCSI hang ?\n",
+       pr_err("%s: Host device reset request. SCSI hang ?\n",
               AAC_DRIVERNAME);
 
        fib = aac_fib_alloc(aac);
@@ -931,7 +935,12 @@ static int aac_eh_dev_reset(struct scsi_cmnd *cmd)
        status = aac_hba_send(command, fib,
                              (fib_callback) aac_tmf_callback,
                              (void *) info);
-
+       if (status != -EINPROGRESS) {
+               info->reset_state = 0;
+               aac_fib_complete(fib);
+               aac_fib_free(fib);
+               return ret;
+       }
        /* Wait up to 15 seconds for completion */
        for (count = 0; count < 15; ++count) {
                if (info->reset_state == 0) {
@@ -970,11 +979,11 @@ static int aac_eh_target_reset(struct scsi_cmnd *cmd)
 
        info = &aac->hba_map[bus][cid];
 
-       if (info->devtype != AAC_DEVTYPE_NATIVE_RAW &&
-           info->reset_state > 0)
+       if (!(info->devtype == AAC_DEVTYPE_NATIVE_RAW &&
+        !(info->reset_state > 0)))
                return FAILED;
 
-       pr_err("%s: Host adapter reset request. SCSI hang ?\n",
+       pr_err("%s: Host target reset request. SCSI hang ?\n",
               AAC_DRIVERNAME);
 
        fib = aac_fib_alloc(aac);
@@ -991,6 +1000,13 @@ static int aac_eh_target_reset(struct scsi_cmnd *cmd)
                              (fib_callback) aac_tmf_callback,
                              (void *) info);
 
+       if (status != -EINPROGRESS) {
+               info->reset_state = 0;
+               aac_fib_complete(fib);
+               aac_fib_free(fib);
+               return ret;
+       }
+
        /* Wait up to 15 seconds for completion */
        for (count = 0; count < 15; ++count) {
                if (info->reset_state <= 0) {
@@ -1043,7 +1059,7 @@ static int aac_eh_bus_reset(struct scsi_cmnd* cmd)
                }
        }
 
-       pr_err("%s: Host adapter reset request. SCSI hang ?\n", AAC_DRIVERNAME);
+       pr_err("%s: Host bus reset request. SCSI hang ?\n", AAC_DRIVERNAME);
 
        /*
         * Check the health of the controller