scsi: lpfc: Update phba link state conditional before sending CMF_SYNC_WQE
authorJustin Tee <justin.tee@broadcom.com>
Thu, 12 Sep 2024 23:24:41 +0000 (16:24 -0700)
committerMartin K. Petersen <martin.petersen@oracle.com>
Fri, 13 Sep 2024 01:21:19 +0000 (21:21 -0400)
It's possible for the driver to send a CMF_SYNC_WQE to nonresponsive
firmware during reset of the adapter.  The phba link_state conditional
check is currently a strict == LPFC_LINK_DOWN, which does not cover
initialization states before reaching the LPFC_LINK_UP state.

Update the phba->link_state conditional to < LPFC_LINK_UP so that all
initialization states are covered before allowing sending CMF_SYNC_WQE.

Update taking of the hbalock to be during this link_state check as well.

Signed-off-by: Justin Tee <justin.tee@broadcom.com>
Link: https://lore.kernel.org/r/20240912232447.45607-3-justintee8345@gmail.com
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/lpfc/lpfc_sli.c

index 332b8d2..bb5fd33 100644 (file)
@@ -1940,12 +1940,15 @@ lpfc_issue_cmf_sync_wqe(struct lpfc_hba *phba, u32 ms, u64 total)
        atot = atomic_xchg(&phba->cgn_sync_alarm_cnt, 0);
        wtot = atomic_xchg(&phba->cgn_sync_warn_cnt, 0);
 
+       spin_lock_irqsave(&phba->hbalock, iflags);
+
        /* ONLY Managed mode will send the CMF_SYNC_WQE to the HBA */
        if (phba->cmf_active_mode != LPFC_CFG_MANAGED ||
-           phba->link_state == LPFC_LINK_DOWN)
-               return 0;
+           phba->link_state < LPFC_LINK_UP) {
+               ret_val = 0;
+               goto out_unlock;
+       }
 
-       spin_lock_irqsave(&phba->hbalock, iflags);
        sync_buf = __lpfc_sli_get_iocbq(phba);
        if (!sync_buf) {
                lpfc_printf_log(phba, KERN_ERR, LOG_CGN_MGMT,