diff mbox series

lpfc: Fix mailbox command failure during driver initialization

Message ID 20210921143008.64212-1-jsmart2021@gmail.com (mailing list archive)
State Accepted
Headers show
Series lpfc: Fix mailbox command failure during driver initialization | expand

Commit Message

James Smart Sept. 21, 2021, 2:30 p.m. UTC
Contention for the mailbox interface may occur during driver
initialization (immediately after a function reset), between mailbox
commands initiated via ioctl (bsg) and those driver requested by the
driver.

After setting SLI_ACTIVE flag for a port, there is a window in which
the driver will allow an ioctl to be initiated while the adapter is
initializing and issuing mailbox commands via polling. The polling
logic then gets confused.

Correct by having thread setting SLI_ACTIVE spot an active mailbox
command and allow it complete before proceeding.

Co-developed-by: Nigel Kirkland <nkirkland2304@gmail.com>
Signed-off-by: Nigel Kirkland <nkirkland2304@gmail.com>
Signed-off-by: James Smart <jsmart2021@gmail.com>
---
 drivers/scsi/lpfc/lpfc_sli.c | 15 +++++++++++++--
 1 file changed, 13 insertions(+), 2 deletions(-)

Comments

Martin K. Petersen Sept. 29, 2021, 4:20 a.m. UTC | #1
On Tue, 21 Sep 2021 07:30:08 -0700, James Smart wrote:

> Contention for the mailbox interface may occur during driver
> initialization (immediately after a function reset), between mailbox
> commands initiated via ioctl (bsg) and those driver requested by the
> driver.
> 
> After setting SLI_ACTIVE flag for a port, there is a window in which
> the driver will allow an ioctl to be initiated while the adapter is
> initializing and issuing mailbox commands via polling. The polling
> logic then gets confused.
> 
> [...]

Applied to 5.16/scsi-queue, thanks!

[1/1] lpfc: Fix mailbox command failure during driver initialization
      https://git.kernel.org/mkp/scsi/c/efe1dc571a5b
diff mbox series

Patch

diff --git a/drivers/scsi/lpfc/lpfc_sli.c b/drivers/scsi/lpfc/lpfc_sli.c
index 34cf2bfcce07..3f911cb48cf2 100644
--- a/drivers/scsi/lpfc/lpfc_sli.c
+++ b/drivers/scsi/lpfc/lpfc_sli.c
@@ -8158,6 +8158,7 @@  lpfc_sli4_hba_setup(struct lpfc_hba *phba)
 	struct lpfc_vport *vport = phba->pport;
 	struct lpfc_dmabuf *mp;
 	struct lpfc_rqb *rqbp;
+	u32 flg;
 
 	/* Perform a PCI function reset to start from clean */
 	rc = lpfc_pci_function_reset(phba);
@@ -8171,7 +8172,17 @@  lpfc_sli4_hba_setup(struct lpfc_hba *phba)
 	else {
 		spin_lock_irq(&phba->hbalock);
 		phba->sli.sli_flag |= LPFC_SLI_ACTIVE;
+		flg = phba->sli.sli_flag;
 		spin_unlock_irq(&phba->hbalock);
+		/* Allow a little time after setting SLI_ACTIVE for any polled
+		 * MBX commands to complete via BSG.
+		 */
+		for (i = 0; i < 50 && (flg & LPFC_SLI_MBOX_ACTIVE); i++) {
+			msleep(20);
+			spin_lock_irq(&phba->hbalock);
+			flg = phba->sli.sli_flag;
+			spin_unlock_irq(&phba->hbalock);
+		}
 	}
 
 	lpfc_sli4_dip(phba);
@@ -9755,7 +9766,7 @@  lpfc_sli_issue_mbox_s4(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq,
 					"(%d):2541 Mailbox command x%x "
 					"(x%x/x%x) failure: "
 					"mqe_sta: x%x mcqe_sta: x%x/x%x "
-					"Data: x%x x%x\n,",
+					"Data: x%x x%x\n",
 					mboxq->vport ? mboxq->vport->vpi : 0,
 					mboxq->u.mb.mbxCommand,
 					lpfc_sli_config_mbox_subsys_get(phba,
@@ -9789,7 +9800,7 @@  lpfc_sli_issue_mbox_s4(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq,
 					"(%d):2597 Sync Mailbox command "
 					"x%x (x%x/x%x) failure: "
 					"mqe_sta: x%x mcqe_sta: x%x/x%x "
-					"Data: x%x x%x\n,",
+					"Data: x%x x%x\n",
 					mboxq->vport ? mboxq->vport->vpi : 0,
 					mboxq->u.mb.mbxCommand,
 					lpfc_sli_config_mbox_subsys_get(phba,