]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
scsi: mpt3sas: Send a diag reset if target reset fails
authorShivasharan S <shivasharan.srikanteshwara@broadcom.com>
Thu, 13 Feb 2025 01:26:55 +0000 (17:26 -0800)
committerMartin K. Petersen <martin.petersen@oracle.com>
Fri, 21 Feb 2025 02:46:36 +0000 (21:46 -0500)
When an IOCTL times out and driver issues a target reset, if firmware
fails the task management elevate the recovery by issuing a diag reset to
controller.

Signed-off-by: Shivasharan S <shivasharan.srikanteshwara@broadcom.com>
Link: https://lore.kernel.org/r/1739410016-27503-5-git-send-email-shivasharan.srikanteshwara@broadcom.com
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/mpt3sas/mpt3sas_ctl.c

index 523aef23d1fcb89fadd81d215058f18e4950e8a0..bd3919f15adbeb0ce526ec425748aaf7297eb71f 100644 (file)
@@ -716,6 +716,7 @@ _ctl_do_mpt_command(struct MPT3SAS_ADAPTER *ioc, struct mpt3_ioctl_command karg,
        size_t data_in_sz = 0;
        long ret;
        u16 device_handle = MPT3SAS_INVALID_DEVICE_HANDLE;
+       int tm_ret;
 
        issue_reset = 0;
 
@@ -1174,18 +1175,25 @@ _ctl_do_mpt_command(struct MPT3SAS_ADAPTER *ioc, struct mpt3_ioctl_command karg,
                        if (pcie_device && (!ioc->tm_custom_handling) &&
                            (!(mpt3sas_scsih_is_pcie_scsi_device(
                            pcie_device->device_info))))
-                               mpt3sas_scsih_issue_locked_tm(ioc,
+                               tm_ret = mpt3sas_scsih_issue_locked_tm(ioc,
                                  le16_to_cpu(mpi_request->FunctionDependent1),
                                  0, 0, 0,
                                  MPI2_SCSITASKMGMT_TASKTYPE_TARGET_RESET, 0,
                                  0, pcie_device->reset_timeout,
                        MPI26_SCSITASKMGMT_MSGFLAGS_PROTOCOL_LVL_RST_PCIE);
                        else
-                               mpt3sas_scsih_issue_locked_tm(ioc,
+                               tm_ret = mpt3sas_scsih_issue_locked_tm(ioc,
                                  le16_to_cpu(mpi_request->FunctionDependent1),
                                  0, 0, 0,
                                  MPI2_SCSITASKMGMT_TASKTYPE_TARGET_RESET, 0,
                                  0, 30, MPI2_SCSITASKMGMT_MSGFLAGS_LINK_RESET);
+
+                       if (tm_ret != SUCCESS) {
+                               ioc_info(ioc,
+                                        "target reset failed, issue hard reset: handle (0x%04x)\n",
+                                        le16_to_cpu(mpi_request->FunctionDependent1));
+                               mpt3sas_base_hard_reset_handler(ioc, FORCE_BIG_HAMMER);
+                       }
                } else
                        mpt3sas_base_hard_reset_handler(ioc, FORCE_BIG_HAMMER);
        }