scsi: mpi3mr: Invoke soft reset upon TSU or event ack time out
authorRanjan Kumar <ranjan.kumar@broadcom.com>
Fri, 4 Aug 2023 10:42:43 +0000 (16:12 +0530)
committerMartin K. Petersen <martin.petersen@oracle.com>
Tue, 8 Aug 2023 01:41:47 +0000 (21:41 -0400)
When a timestamp update or an event acknowledgment command times out, the
driver invokes the soft reset handler to recover the controller while
holding a mutex lock. The soft reset handler also tries to acquire the same
mutex to send initialization commands to the controller which leads to a
deadlock scenario.

To resolve the issue the driver will check thestatus and if this indicates
the controller is operational, the driver will issue a diagnostic fault
reset and exit out of the command processing function. If the controller is
already faulted or asynchronously reset, then the driver will just exit the
command processing function.

Signed-off-by: Ranjan Kumar <ranjan.kumar@broadcom.com>
Link: https://lore.kernel.org/r/20230804104248.118924-2-ranjan.kumar@broadcom.com
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/mpi3mr/mpi3mr_fw.c

index 5fa07d6ee5b8ee5b52b77c826577b66f98c094b2..11b78d4a87a0b2d97055a0d296847379301c2f7c 100644 (file)
@@ -2343,8 +2343,8 @@ static int mpi3mr_sync_timestamp(struct mpi3mr_ioc *mrioc)
                ioc_err(mrioc, "Issue IOUCTL time_stamp: command timed out\n");
                mrioc->init_cmds.is_waiting = 0;
                if (!(mrioc->init_cmds.state & MPI3MR_CMD_RESET))
-                       mpi3mr_soft_reset_handler(mrioc,
-                           MPI3MR_RESET_FROM_TSU_TIMEOUT, 1);
+                       mpi3mr_check_rh_fault_ioc(mrioc,
+                           MPI3MR_RESET_FROM_TSU_TIMEOUT);
                retval = -1;
                goto out_unlock;
        }
@@ -3359,8 +3359,8 @@ int mpi3mr_process_event_ack(struct mpi3mr_ioc *mrioc, u8 event,
        if (!(mrioc->init_cmds.state & MPI3MR_CMD_COMPLETE)) {
                ioc_err(mrioc, "Issue EvtNotify: command timed out\n");
                if (!(mrioc->init_cmds.state & MPI3MR_CMD_RESET))
-                       mpi3mr_soft_reset_handler(mrioc,
-                           MPI3MR_RESET_FROM_EVTACK_TIMEOUT, 1);
+                       mpi3mr_check_rh_fault_ioc(mrioc,
+                           MPI3MR_RESET_FROM_EVTACK_TIMEOUT);
                retval = -1;
                goto out_unlock;
        }