]> git.ipfire.org Git - thirdparty/kernel/stable.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)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 4 Jun 2025 12:37:03 +0000 (14:37 +0200)
[ Upstream commit 5612d6d51ed2634a033c95de2edec7449409cbb9 ]

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>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/scsi/mpt3sas/mpt3sas_ctl.c

index edd26a2570fa8a6dd19ea4e69afaa819c5d45a18..8ce77fbe4e3fc6ce90e7a2a16a0582ced1a81105 100644 (file)
@@ -676,6 +676,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;
 
@@ -1107,18 +1108,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);
        }