]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
scsi: mpi3mr: Avoid redundant diag-fault resets
authorRanjan Kumar <ranjan.kumar@broadcom.com>
Fri, 16 Jan 2026 06:07:14 +0000 (11:37 +0530)
committerMartin K. Petersen <martin.petersen@oracle.com>
Sat, 24 Jan 2026 03:16:16 +0000 (22:16 -0500)
Update reset handling to invoke diag-save only for diag-fault resets.
Skip issuing a diagnostic reset if the IOC is already in FAULT state,
preventing repeated fault handling and improving reset stability.

Signed-off-by: Ranjan Kumar <ranjan.kumar@broadcom.com>
Link: https://patch.msgid.link/20260116060719.32937-4-ranjan.kumar@broadcom.com
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/mpi3mr/mpi3mr_fw.c

index 869e525f3e73a2e0f47b0030a49b7417ad102cba..178738850541f28a428d8a6b6a6a1904231c0c2e 100644 (file)
@@ -1707,6 +1707,8 @@ static int mpi3mr_issue_reset(struct mpi3mr_ioc *mrioc, u16 reset_type,
            MPI3MR_RESET_REASON_OSTYPE_SHIFT) | (mrioc->facts.ioc_num <<
            MPI3MR_RESET_REASON_IOCNUM_SHIFT) | reset_reason);
        writel(reset_reason, &mrioc->sysif_regs->scratchpad[0]);
+       if (reset_type == MPI3_SYSIF_HOST_DIAG_RESET_ACTION_DIAG_FAULT)
+               mpi3mr_set_diagsave(mrioc);
        writel(host_diagnostic | reset_type,
            &mrioc->sysif_regs->host_diagnostic);
        switch (reset_type) {
@@ -5404,6 +5406,7 @@ int mpi3mr_soft_reset_handler(struct mpi3mr_ioc *mrioc,
 {
        int retval = 0, i;
        unsigned long flags;
+       enum mpi3mr_iocstate ioc_state;
        u32 host_diagnostic, timeout = MPI3_SYSIF_DIAG_SAVE_TIMEOUT * 10;
        union mpi3mr_trigger_data trigger_data;
 
@@ -5462,7 +5465,6 @@ int mpi3mr_soft_reset_handler(struct mpi3mr_ioc *mrioc,
        mrioc->io_admin_reset_sync = 1;
 
        if (snapdump) {
-               mpi3mr_set_diagsave(mrioc);
                retval = mpi3mr_issue_reset(mrioc,
                    MPI3_SYSIF_HOST_DIAG_RESET_ACTION_DIAG_FAULT, reset_reason);
                if (!retval) {
@@ -5564,8 +5566,13 @@ out:
                if (mrioc->pel_enabled)
                        atomic64_inc(&event_counter);
        } else {
-               mpi3mr_issue_reset(mrioc,
-                   MPI3_SYSIF_HOST_DIAG_RESET_ACTION_DIAG_FAULT, reset_reason);
+               dprint_reset(mrioc,
+                       "soft_reset_handler failed, marking controller as unrecoverable\n");
+               ioc_state = mpi3mr_get_iocstate(mrioc);
+
+               if (ioc_state != MRIOC_STATE_FAULT)
+                       mpi3mr_issue_reset(mrioc,
+                               MPI3_SYSIF_HOST_DIAG_RESET_ACTION_DIAG_FAULT, reset_reason);
                mrioc->device_refresh_on = 0;
                mrioc->unrecoverable = 1;
                mrioc->reset_in_progress = 0;