|
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 |
|