Hannes Reinecke f851aa
From: James Smart <jsmart2021@gmail.com>
Hannes Reinecke f851aa
Date: Thu, 29 Nov 2018 16:09:33 -0800
Hannes Reinecke f851aa
Subject: [PATCH] scsi: lpfc: Cap NPIV vports to 256
Hannes Reinecke f851aa
Git-commit: 8b47ae69e049ae0b3373859d901f0334322f9fe9
Takashi Iwai 48660d
Patch-mainline: v5.0-rc1
Hannes Reinecke f851aa
References: bsc#1118215
Hannes Reinecke f851aa
Hannes Reinecke f851aa
Depending on the chipset, the number of NPIV vports may vary and be in
Hannes Reinecke f851aa
excess of what most switches support (256). To avoid confusion with the
Hannes Reinecke f851aa
users, limit the reported NPIV vports to 256.
Hannes Reinecke f851aa
Hannes Reinecke f851aa
Additionally correct the 16G adapter which is reporting a bogus NPIV vport
Hannes Reinecke f851aa
number if the link is down.
Hannes Reinecke f851aa
Hannes Reinecke f851aa
Signed-off-by: Dick Kennedy <dick.kennedy@broadcom.com>
Hannes Reinecke f851aa
Signed-off-by: James Smart <jsmart2021@gmail.com>
Hannes Reinecke f851aa
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Hannes Reinecke f851aa
Acked-by: Hannes Reinecke <hare@suse.com>
Hannes Reinecke f851aa
---
Hannes Reinecke f851aa
 drivers/scsi/lpfc/lpfc.h      |  3 ++-
Hannes Reinecke f851aa
 drivers/scsi/lpfc/lpfc_attr.c | 12 ++++++++++--
Hannes Reinecke f851aa
 drivers/scsi/lpfc/lpfc_init.c |  3 +++
Hannes Reinecke f851aa
 3 files changed, 15 insertions(+), 3 deletions(-)
Hannes Reinecke f851aa
Hannes Reinecke f851aa
diff --git a/drivers/scsi/lpfc/lpfc.h b/drivers/scsi/lpfc/lpfc.h
Hannes Reinecke f851aa
index b37e0caf0781..35dcd6958fd0 100644
Hannes Reinecke f851aa
--- a/drivers/scsi/lpfc/lpfc.h
Hannes Reinecke f851aa
+++ b/drivers/scsi/lpfc/lpfc.h
Hannes Reinecke f851aa
@@ -1004,7 +1004,8 @@ struct lpfc_hba {
Hannes Reinecke f851aa
 	spinlock_t port_list_lock;	/* lock for port_list mutations */
Hannes Reinecke f851aa
 	struct lpfc_vport *pport;	/* physical lpfc_vport pointer */
Hannes Reinecke f851aa
 	uint16_t max_vpi;		/* Maximum virtual nports */
Hannes Reinecke f851aa
-#define LPFC_MAX_VPI 0xFFFF		/* Max number of VPI supported */
Hannes Reinecke f851aa
+#define LPFC_MAX_VPI	0xFF		/* Max number VPI supported 0 - 0xff */
Hannes Reinecke f851aa
+#define LPFC_MAX_VPORTS	0x100		/* Max vports per port, with pport */
Hannes Reinecke f851aa
 	uint16_t max_vports;            /*
Hannes Reinecke f851aa
 					 * For IOV HBAs max_vpi can change
Hannes Reinecke f851aa
 					 * after a reset. max_vports is max
Hannes Reinecke f851aa
diff --git a/drivers/scsi/lpfc/lpfc_attr.c b/drivers/scsi/lpfc/lpfc_attr.c
Hannes Reinecke f851aa
index 5f30e40bcc0a..feaaa015150e 100644
Hannes Reinecke f851aa
--- a/drivers/scsi/lpfc/lpfc_attr.c
Hannes Reinecke f851aa
+++ b/drivers/scsi/lpfc/lpfc_attr.c
Hannes Reinecke f851aa
@@ -1720,6 +1720,9 @@ lpfc_get_hba_info(struct lpfc_hba *phba,
Hannes Reinecke f851aa
 		max_vpi = (bf_get(lpfc_mbx_rd_conf_vpi_count, rd_config) > 0) ?
Hannes Reinecke f851aa
 			(bf_get(lpfc_mbx_rd_conf_vpi_count, rd_config) - 1) : 0;
Hannes Reinecke f851aa
 
Hannes Reinecke f851aa
+		/* Limit the max we support */
Hannes Reinecke f851aa
+		if (max_vpi > LPFC_MAX_VPI)
Hannes Reinecke f851aa
+			max_vpi = LPFC_MAX_VPI;
Hannes Reinecke f851aa
 		if (mvpi)
Hannes Reinecke f851aa
 			*mvpi = max_vpi;
Hannes Reinecke f851aa
 		if (avpi)
Hannes Reinecke f851aa
@@ -1735,8 +1738,13 @@ lpfc_get_hba_info(struct lpfc_hba *phba,
Hannes Reinecke f851aa
 			*axri = pmb->un.varRdConfig.avail_xri;
Hannes Reinecke f851aa
 		if (mvpi)
Hannes Reinecke f851aa
 			*mvpi = pmb->un.varRdConfig.max_vpi;
Hannes Reinecke f851aa
-		if (avpi)
Hannes Reinecke f851aa
-			*avpi = pmb->un.varRdConfig.avail_vpi;
Hannes Reinecke f851aa
+		if (avpi) {
Hannes Reinecke f851aa
+			/* avail_vpi is only valid if link is up and ready */
Hannes Reinecke f851aa
+			if (phba->link_state == LPFC_HBA_READY)
Hannes Reinecke f851aa
+				*avpi = pmb->un.varRdConfig.avail_vpi;
Hannes Reinecke f851aa
+			else
Hannes Reinecke f851aa
+				*avpi = pmb->un.varRdConfig.max_vpi;
Hannes Reinecke f851aa
+		}
Hannes Reinecke f851aa
 	}
Hannes Reinecke f851aa
 
Hannes Reinecke f851aa
 	mempool_free(pmboxq, phba->mbox_mem_pool);
Hannes Reinecke f851aa
diff --git a/drivers/scsi/lpfc/lpfc_init.c b/drivers/scsi/lpfc/lpfc_init.c
Hannes Reinecke f851aa
index 647a037d6f4d..716add289397 100644
Hannes Reinecke f851aa
--- a/drivers/scsi/lpfc/lpfc_init.c
Hannes Reinecke f851aa
+++ b/drivers/scsi/lpfc/lpfc_init.c
Hannes Reinecke f851aa
@@ -7958,6 +7958,9 @@ lpfc_sli4_read_config(struct lpfc_hba *phba)
Hannes Reinecke f851aa
 			bf_get(lpfc_mbx_rd_conf_xri_base, rd_config);
Hannes Reinecke f851aa
 		phba->sli4_hba.max_cfg_param.max_vpi =
Hannes Reinecke f851aa
 			bf_get(lpfc_mbx_rd_conf_vpi_count, rd_config);
Hannes Reinecke f851aa
+		/* Limit the max we support */
Hannes Reinecke f851aa
+		if (phba->sli4_hba.max_cfg_param.max_vpi > LPFC_MAX_VPORTS)
Hannes Reinecke f851aa
+			phba->sli4_hba.max_cfg_param.max_vpi = LPFC_MAX_VPORTS;
Hannes Reinecke f851aa
 		phba->sli4_hba.max_cfg_param.vpi_base =
Hannes Reinecke f851aa
 			bf_get(lpfc_mbx_rd_conf_vpi_base, rd_config);
Hannes Reinecke f851aa
 		phba->sli4_hba.max_cfg_param.max_rpi =
Hannes Reinecke f851aa
-- 
Hannes Reinecke f851aa
2.16.4
Hannes Reinecke f851aa