Hannes Reinecke e7cee2
From: James Smart <jsmart2021@gmail.com>
Hannes Reinecke e7cee2
Date: Thu, 24 May 2018 21:09:01 -0700
Johannes Thumshirn 0ee922
Subject: scsi: lpfc: Fix port initialization failure.
Johannes Thumshirn 0ee922
Patch-mainline: v4.18-rc1
Johannes Thumshirn 0ee922
Git-commit: b92dc72df3c6b46d2d085b56dcc764f798323e7c
Hannes Reinecke e7cee2
References: bsc#1093290
Hannes Reinecke e7cee2
Hannes Reinecke e7cee2
The driver exits port setup after failing the
Hannes Reinecke e7cee2
lpfc_sli4_get_parameters command (messages 0356, 2541, & 1412).
Hannes Reinecke e7cee2
Hannes Reinecke e7cee2
The older CNA adapters do not support the MBX command. In the past
Hannes Reinecke e7cee2
the code was allowed to fail and continue on with initialization.
Hannes Reinecke e7cee2
However a nvme change moved a closing bracket and now makes all
Hannes Reinecke e7cee2
failures terminal.
Hannes Reinecke e7cee2
Hannes Reinecke e7cee2
Revise the logic so that terminal failure only occurs if the command
Hannes Reinecke e7cee2
failed on the newer adapters. Additionally, if parameters are set
Hannes Reinecke e7cee2
that require information from the command and the command failed,
Hannes Reinecke e7cee2
the parameters are erroneous and port set up should fail even on
Hannes Reinecke e7cee2
the older adapters.
Hannes Reinecke e7cee2
Hannes Reinecke e7cee2
Signed-off-by: Dick Kennedy <dick.kennedy@broadcom.com>
Hannes Reinecke e7cee2
Signed-off-by: James Smart <james.smart@broadcom.com>
Hannes Reinecke e7cee2
Acked-by: Hannes Reinecke <hare@suse.com>
Johannes Thumshirn 0ee922
Reviewed-by: Hannes Reinecke <hare@suse.com>
Johannes Thumshirn 0ee922
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Johannes Thumshirn 0ee922
Acked-by: Johannes Thumshirn <jthumshirn@suse.de>
Hannes Reinecke e7cee2
---
Hannes Reinecke e7cee2
 drivers/scsi/lpfc/lpfc_init.c | 21 ++++++++++++++++++---
Hannes Reinecke e7cee2
 1 file changed, 18 insertions(+), 3 deletions(-)
Hannes Reinecke e7cee2
Hannes Reinecke e7cee2
diff --git a/drivers/scsi/lpfc/lpfc_init.c b/drivers/scsi/lpfc/lpfc_init.c
Hannes Reinecke e7cee2
index 856ad25c71dc..d8eebb539e11 100644
Hannes Reinecke e7cee2
--- a/drivers/scsi/lpfc/lpfc_init.c
Hannes Reinecke e7cee2
+++ b/drivers/scsi/lpfc/lpfc_init.c
Hannes Reinecke e7cee2
@@ -5845,6 +5845,8 @@ lpfc_sli4_driver_resource_setup(struct lpfc_hba *phba)
Hannes Reinecke e7cee2
 	int fof_vectors = 0;
Hannes Reinecke e7cee2
 	int extra;
Hannes Reinecke e7cee2
 	uint64_t wwn;
Hannes Reinecke e7cee2
+	u32 if_type;
Hannes Reinecke e7cee2
+	u32 if_fam;
Hannes Reinecke e7cee2
 
Hannes Reinecke e7cee2
 	phba->sli4_hba.num_online_cpu = num_online_cpus();
Hannes Reinecke e7cee2
 	phba->sli4_hba.num_present_cpu = lpfc_present_cpu;
Hannes Reinecke e7cee2
@@ -6167,15 +6169,28 @@ lpfc_sli4_driver_resource_setup(struct lpfc_hba *phba)
Hannes Reinecke e7cee2
 	 */
Hannes Reinecke e7cee2
 	rc = lpfc_get_sli4_parameters(phba, mboxq);
Hannes Reinecke e7cee2
 	if (rc) {
Hannes Reinecke e7cee2
+		if_type = bf_get(lpfc_sli_intf_if_type,
Hannes Reinecke e7cee2
+				 &phba->sli4_hba.sli_intf);
Hannes Reinecke e7cee2
+		if_fam = bf_get(lpfc_sli_intf_sli_family,
Hannes Reinecke e7cee2
+				&phba->sli4_hba.sli_intf);
Hannes Reinecke e7cee2
 		if (phba->sli4_hba.extents_in_use &&
Hannes Reinecke e7cee2
 		    phba->sli4_hba.rpi_hdrs_in_use) {
Hannes Reinecke e7cee2
 			lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
Hannes Reinecke e7cee2
 				"2999 Unsupported SLI4 Parameters "
Hannes Reinecke e7cee2
 				"Extents and RPI headers enabled.\n");
Hannes Reinecke e7cee2
+			if (if_type == LPFC_SLI_INTF_IF_TYPE_0 &&
Hannes Reinecke e7cee2
+			    if_fam ==  LPFC_SLI_INTF_FAMILY_BE2) {
Hannes Reinecke e7cee2
+				mempool_free(mboxq, phba->mbox_mem_pool);
Hannes Reinecke e7cee2
+				rc = -EIO;
Hannes Reinecke e7cee2
+				goto out_free_bsmbx;
Hannes Reinecke e7cee2
+			}
Hannes Reinecke e7cee2
+		}
Hannes Reinecke e7cee2
+		if (!(if_type == LPFC_SLI_INTF_IF_TYPE_0 &&
Hannes Reinecke e7cee2
+		      if_fam == LPFC_SLI_INTF_FAMILY_BE2)) {
Hannes Reinecke e7cee2
+			mempool_free(mboxq, phba->mbox_mem_pool);
Hannes Reinecke e7cee2
+			rc = -EIO;
Hannes Reinecke e7cee2
+			goto out_free_bsmbx;
Hannes Reinecke e7cee2
 		}
Hannes Reinecke e7cee2
-		mempool_free(mboxq, phba->mbox_mem_pool);
Hannes Reinecke e7cee2
-		rc = -EIO;
Hannes Reinecke e7cee2
-		goto out_free_bsmbx;
Hannes Reinecke e7cee2
 	}
Hannes Reinecke e7cee2
 
Hannes Reinecke e7cee2
 	mempool_free(mboxq, phba->mbox_mem_pool);
Hannes Reinecke e7cee2
-- 
Hannes Reinecke e7cee2
2.12.3
Hannes Reinecke e7cee2