]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
scsi: mpt3sas: Diag-Reset when Doorbell-In-Use bit is set during driver load time
authorRanjan Kumar <ranjan.kumar@broadcom.com>
Sun, 10 Nov 2024 17:33:40 +0000 (23:03 +0530)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 9 Jan 2025 12:24:58 +0000 (13:24 +0100)
[ Upstream commit 3f5eb062e8aa335643181c480e6c590c6cedfd22 ]

Issue a Diag-Reset when the "Doorbell-In-Use" bit is set during the
driver load/initialization.

Signed-off-by: Ranjan Kumar <ranjan.kumar@broadcom.com>
Link: https://lore.kernel.org/r/20241110173341.11595-2-ranjan.kumar@broadcom.com
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/scsi/mpt3sas/mpt3sas_base.c

index 53528711dac1ff18288a102840eedf92b8ffd152..768635de93da9a53261677a371b4a6aaf0c04187 100644 (file)
@@ -6008,11 +6008,12 @@ _base_handshake_req_reply_wait(struct MPT3SAS_ADAPTER *ioc, int request_bytes,
        int i;
        u8 failed;
        __le32 *mfp;
+       int ret_val;
 
        /* make sure doorbell is not in use */
        if ((ioc->base_readl_ext_retry(&ioc->chip->Doorbell) & MPI2_DOORBELL_USED)) {
                ioc_err(ioc, "doorbell is in use (line=%d)\n", __LINE__);
-               return -EFAULT;
+               goto doorbell_diag_reset;
        }
 
        /* clear pending doorbell interrupts from previous state changes */
@@ -6102,6 +6103,10 @@ _base_handshake_req_reply_wait(struct MPT3SAS_ADAPTER *ioc, int request_bytes,
                            le32_to_cpu(mfp[i]));
        }
        return 0;
+
+doorbell_diag_reset:
+       ret_val = _base_diag_reset(ioc);
+       return ret_val;
 }
 
 /**