Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2759c73b authored by James Smart's avatar James Smart Committed by Greg Kroah-Hartman
Browse files

scsi: lpfc: Cap NPIV vports to 256



[ Upstream commit 8b47ae69e049ae0b3373859d901f0334322f9fe9 ]

Depending on the chipset, the number of NPIV vports may vary and be in
excess of what most switches support (256). To avoid confusion with the
users, limit the reported NPIV vports to 256.

Additionally correct the 16G adapter which is reporting a bogus NPIV vport
number if the link is down.

Signed-off-by: default avatarDick Kennedy <dick.kennedy@broadcom.com>
Signed-off-by: default avatarJames Smart <jsmart2021@gmail.com>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
parent 6b0a3e81
Loading
Loading
Loading
Loading
+2 −1
Original line number Original line Diff line number Diff line
@@ -966,7 +966,8 @@ struct lpfc_hba {
	struct list_head port_list;
	struct list_head port_list;
	struct lpfc_vport *pport;	/* physical lpfc_vport pointer */
	struct lpfc_vport *pport;	/* physical lpfc_vport pointer */
	uint16_t max_vpi;		/* Maximum virtual nports */
	uint16_t max_vpi;		/* Maximum virtual nports */
#define LPFC_MAX_VPI 0xFFFF		/* Max number of VPI supported */
#define LPFC_MAX_VPI	0xFF		/* Max number VPI supported 0 - 0xff */
#define LPFC_MAX_VPORTS	0x100		/* Max vports per port, with pport */
	uint16_t max_vports;            /*
	uint16_t max_vports;            /*
					 * For IOV HBAs max_vpi can change
					 * For IOV HBAs max_vpi can change
					 * after a reset. max_vports is max
					 * after a reset. max_vports is max
+10 −2
Original line number Original line Diff line number Diff line
@@ -1632,6 +1632,9 @@ lpfc_get_hba_info(struct lpfc_hba *phba,
		max_vpi = (bf_get(lpfc_mbx_rd_conf_vpi_count, rd_config) > 0) ?
		max_vpi = (bf_get(lpfc_mbx_rd_conf_vpi_count, rd_config) > 0) ?
			(bf_get(lpfc_mbx_rd_conf_vpi_count, rd_config) - 1) : 0;
			(bf_get(lpfc_mbx_rd_conf_vpi_count, rd_config) - 1) : 0;


		/* Limit the max we support */
		if (max_vpi > LPFC_MAX_VPI)
			max_vpi = LPFC_MAX_VPI;
		if (mvpi)
		if (mvpi)
			*mvpi = max_vpi;
			*mvpi = max_vpi;
		if (avpi)
		if (avpi)
@@ -1647,8 +1650,13 @@ lpfc_get_hba_info(struct lpfc_hba *phba,
			*axri = pmb->un.varRdConfig.avail_xri;
			*axri = pmb->un.varRdConfig.avail_xri;
		if (mvpi)
		if (mvpi)
			*mvpi = pmb->un.varRdConfig.max_vpi;
			*mvpi = pmb->un.varRdConfig.max_vpi;
		if (avpi)
		if (avpi) {
			/* avail_vpi is only valid if link is up and ready */
			if (phba->link_state == LPFC_HBA_READY)
				*avpi = pmb->un.varRdConfig.avail_vpi;
				*avpi = pmb->un.varRdConfig.avail_vpi;
			else
				*avpi = pmb->un.varRdConfig.max_vpi;
		}
	}
	}


	mempool_free(pmboxq, phba->mbox_mem_pool);
	mempool_free(pmboxq, phba->mbox_mem_pool);
+3 −0
Original line number Original line Diff line number Diff line
@@ -7766,6 +7766,9 @@ lpfc_sli4_read_config(struct lpfc_hba *phba)
			bf_get(lpfc_mbx_rd_conf_xri_base, rd_config);
			bf_get(lpfc_mbx_rd_conf_xri_base, rd_config);
		phba->sli4_hba.max_cfg_param.max_vpi =
		phba->sli4_hba.max_cfg_param.max_vpi =
			bf_get(lpfc_mbx_rd_conf_vpi_count, rd_config);
			bf_get(lpfc_mbx_rd_conf_vpi_count, rd_config);
		/* Limit the max we support */
		if (phba->sli4_hba.max_cfg_param.max_vpi > LPFC_MAX_VPORTS)
			phba->sli4_hba.max_cfg_param.max_vpi = LPFC_MAX_VPORTS;
		phba->sli4_hba.max_cfg_param.vpi_base =
		phba->sli4_hba.max_cfg_param.vpi_base =
			bf_get(lpfc_mbx_rd_conf_vpi_base, rd_config);
			bf_get(lpfc_mbx_rd_conf_vpi_base, rd_config);
		phba->sli4_hba.max_cfg_param.max_rpi =
		phba->sli4_hba.max_cfg_param.max_rpi =