]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
scsi: lpfc: Cap NPIV vports to 256
authorJames Smart <jsmart2021@gmail.com>
Fri, 30 Nov 2018 00:09:33 +0000 (16:09 -0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 17 Dec 2019 19:35:28 +0000 (20:35 +0100)
[ 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: Dick Kennedy <dick.kennedy@broadcom.com>
Signed-off-by: James Smart <jsmart2021@gmail.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/scsi/lpfc/lpfc.h
drivers/scsi/lpfc/lpfc_attr.c
drivers/scsi/lpfc/lpfc_init.c

index a62e85cb62eb225a8773be394c80f6fd8d638ea5..706aca3f7c253ad8815aaedca83006cef3a0c076 100644 (file)
@@ -966,7 +966,8 @@ struct lpfc_hba {
        struct list_head port_list;
        struct lpfc_vport *pport;       /* physical lpfc_vport pointer */
        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;            /*
                                         * For IOV HBAs max_vpi can change
                                         * after a reset. max_vports is max
index 3f69a5e4e470a2db67e9e6216e44c4435647df67..1e9002138d31cbc03acf6f99395b44a28bfe7d37 100644 (file)
@@ -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) ?
                        (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)
                        *mvpi = max_vpi;
                if (avpi)
@@ -1647,8 +1650,13 @@ lpfc_get_hba_info(struct lpfc_hba *phba,
                        *axri = pmb->un.varRdConfig.avail_xri;
                if (mvpi)
                        *mvpi = pmb->un.varRdConfig.max_vpi;
-               if (avpi)
-                       *avpi = pmb->un.varRdConfig.avail_vpi;
+               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;
+                       else
+                               *avpi = pmb->un.varRdConfig.max_vpi;
+               }
        }
 
        mempool_free(pmboxq, phba->mbox_mem_pool);
index da63c026ba460c484a44d1fdce067edd2abd83ae..57510a831735bc4d30069fee23f2d33930c08657 100644 (file)
@@ -7766,6 +7766,9 @@ lpfc_sli4_read_config(struct lpfc_hba *phba)
                        bf_get(lpfc_mbx_rd_conf_xri_base, rd_config);
                phba->sli4_hba.max_cfg_param.max_vpi =
                        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 =
                        bf_get(lpfc_mbx_rd_conf_vpi_base, rd_config);
                phba->sli4_hba.max_cfg_param.max_rpi =