From: Wei Fang <[email protected]>

The num_vsi field in struct enetc_port_caps is populated by reading the
NUM_VSI field of the ECAPR1 register, which reports the number of VSIs
supported by the ENETC4 port. When CONFIG_PCI_IOV is enabled, this value
matches the total number of VFs reported by the PCI SR-IOV capability,
which is already stored in pf->total_vfs during probe via
pci_sriov_get_totalvfs(). When CONFIG_PCI_IOV is disabled,
pci_sriov_get_totalvfs() returns 0, but this is benign since
pci_enable_sriov() is also stubbed to return -ENODEV, so no VF can be
created, and enetc4_enable_all_si() only enables the PF SI (PSI).

Since pf->total_vfs already reflects the number of VFs that can actually
be used, and is the established convention in the sibling FSL_ENETC PF
driver, there is no need to read and cache num_vsi separately in the port
capabilities structure. Remove the num_vsi field from enetc_port_caps and
the associated ECAPR1_NUM_VSI macro, and replace all uses of
pf->caps.num_vsi with pf->total_vfs in the ring allocation, MSI-X
configuration, SI enable, and debugfs code paths.

Signed-off-by: Wei Fang <[email protected]>
---
 .../ethernet/freescale/enetc/enetc4_debugfs.c | 13 +++----
 .../net/ethernet/freescale/enetc/enetc4_hw.h  |  1 -
 .../net/ethernet/freescale/enetc/enetc4_pf.c  | 39 +++++++++----------
 .../net/ethernet/freescale/enetc/enetc_pf.h   |  1 -
 4 files changed, 24 insertions(+), 30 deletions(-)

diff --git a/drivers/net/ethernet/freescale/enetc/enetc4_debugfs.c 
b/drivers/net/ethernet/freescale/enetc/enetc4_debugfs.c
index be378bf8f74d..5029038bf99f 100644
--- a/drivers/net/ethernet/freescale/enetc/enetc4_debugfs.c
+++ b/drivers/net/ethernet/freescale/enetc/enetc4_debugfs.c
@@ -28,17 +28,14 @@ static void enetc_show_si_mac_hash_filter(struct seq_file 
*s, int i)
 
 static int enetc_mac_filter_show(struct seq_file *s, void *data)
 {
-       struct enetc_si *si = s->private;
-       struct enetc_hw *hw = &si->hw;
+       struct enetc_pf *pf = enetc_si_priv(s->private);
+       struct enetc_hw *hw = &pf->si->hw;
+       int num_si = pf->total_vfs + 1;
        struct maft_entry_data maft;
        struct ntmp_user *user;
-       struct enetc_pf *pf;
        u32 val, entry_id;
-       int i, num_si;
        int err = 0;
-
-       pf = enetc_si_priv(si);
-       num_si = pf->caps.num_vsi + 1;
+       int i;
 
        val = enetc_port_rd(hw, ENETC4_PSIPMMR);
        for (i = 0; i < num_si; i++) {
@@ -52,7 +49,7 @@ static int enetc_mac_filter_show(struct seq_file *s, void 
*data)
        for (i = 0; i < num_si; i++)
                enetc_show_si_mac_hash_filter(s, i);
 
-       user = &si->ntmp_user;
+       user = &pf->si->ntmp_user;
        rtnl_lock();
 
        if (bitmap_empty(user->maft_eid_bitmap, user->maft_num_entries))
diff --git a/drivers/net/ethernet/freescale/enetc/enetc4_hw.h 
b/drivers/net/ethernet/freescale/enetc/enetc4_hw.h
index 09025e7a2a3a..4856e0ba4d00 100644
--- a/drivers/net/ethernet/freescale/enetc/enetc4_hw.h
+++ b/drivers/net/ethernet/freescale/enetc/enetc4_hw.h
@@ -50,7 +50,6 @@
 #define  ECAPR1_NUM_MCH                        GENMASK(9, 8)
 #define  ECAPR1_NUM_UCH                        GENMASK(11, 10)
 #define  ECAPR1_NUM_MSIX               GENMASK(22, 12)
-#define  ECAPR1_NUM_VSI                        GENMASK(27, 24)
 #define  ECAPR1_NUM_IPV                        BIT(31)
 
 #define ENETC4_ECAPR2                  0x8
diff --git a/drivers/net/ethernet/freescale/enetc/enetc4_pf.c 
b/drivers/net/ethernet/freescale/enetc/enetc4_pf.c
index cab79f81d6fe..8d536a3831e3 100644
--- a/drivers/net/ethernet/freescale/enetc/enetc4_pf.c
+++ b/drivers/net/ethernet/freescale/enetc/enetc4_pf.c
@@ -23,7 +23,6 @@ static void enetc4_get_port_caps(struct enetc_pf *pf)
        u32 val;
 
        val = enetc_port_rd(hw, ENETC4_ECAPR1);
-       pf->caps.num_vsi = (val & ECAPR1_NUM_VSI) >> 24;
        pf->caps.num_msix = ((val & ECAPR1_NUM_MSIX) >> 12) + 1;
 
        val = enetc_port_rd(hw, ENETC4_ECAPR2);
@@ -255,34 +254,35 @@ static void enetc4_default_rings_allocation(struct 
enetc_pf *pf)
 {
        struct enetc_hw *hw = &pf->si->hw;
        u32 num_rx_bdr, num_tx_bdr, val;
+       int num_vfs = pf->total_vfs;
        u32 vf_tx_bdr, vf_rx_bdr;
        int i, rx_rem, tx_rem;
 
-       if (pf->caps.num_rx_bdr < ENETC_SI_MAX_RING_NUM + pf->caps.num_vsi)
-               num_rx_bdr = pf->caps.num_rx_bdr - pf->caps.num_vsi;
+       if (pf->caps.num_rx_bdr < ENETC_SI_MAX_RING_NUM + num_vfs)
+               num_rx_bdr = pf->caps.num_rx_bdr - num_vfs;
        else
                num_rx_bdr = ENETC_SI_MAX_RING_NUM;
 
-       if (pf->caps.num_tx_bdr < ENETC_SI_MAX_RING_NUM + pf->caps.num_vsi)
-               num_tx_bdr = pf->caps.num_tx_bdr - pf->caps.num_vsi;
+       if (pf->caps.num_tx_bdr < ENETC_SI_MAX_RING_NUM + num_vfs)
+               num_tx_bdr = pf->caps.num_tx_bdr - num_vfs;
        else
                num_tx_bdr = ENETC_SI_MAX_RING_NUM;
 
        val = enetc4_psicfgr0_val_construct(false, num_tx_bdr, num_rx_bdr);
        enetc_port_wr(hw, ENETC4_PSICFGR0(0), val);
 
-       if (!pf->caps.num_vsi)
+       if (!num_vfs)
                return;
 
        num_rx_bdr = pf->caps.num_rx_bdr - num_rx_bdr;
-       rx_rem = num_rx_bdr % pf->caps.num_vsi;
-       num_rx_bdr = num_rx_bdr / pf->caps.num_vsi;
+       rx_rem = num_rx_bdr % num_vfs;
+       num_rx_bdr = num_rx_bdr / num_vfs;
 
        num_tx_bdr = pf->caps.num_tx_bdr - num_tx_bdr;
-       tx_rem = num_tx_bdr % pf->caps.num_vsi;
-       num_tx_bdr = num_tx_bdr / pf->caps.num_vsi;
+       tx_rem = num_tx_bdr % num_vfs;
+       num_tx_bdr = num_tx_bdr / num_vfs;
 
-       for (i = 0; i < pf->caps.num_vsi; i++) {
+       for (i = 0; i < num_vfs; i++) {
                vf_tx_bdr = (i < tx_rem) ? num_tx_bdr + 1 : num_tx_bdr;
                vf_rx_bdr = (i < rx_rem) ? num_rx_bdr + 1 : num_rx_bdr;
                val = enetc4_psicfgr0_val_construct(true, vf_tx_bdr, vf_rx_bdr);
@@ -299,26 +299,25 @@ static void enetc4_allocate_si_rings(struct enetc_pf *pf)
 static void enetc4_set_si_msix_num(struct enetc_pf *pf)
 {
        struct enetc_hw *hw = &pf->si->hw;
-       int i, num_msix, total_si;
+       int num_si = pf->total_vfs + 1;
+       int i, num_msix;
        u32 val;
 
-       total_si = pf->caps.num_vsi + 1;
-
-       num_msix = pf->caps.num_msix / total_si +
-                  pf->caps.num_msix % total_si - 1;
+       num_msix = pf->caps.num_msix / num_si +
+                  pf->caps.num_msix % num_si - 1;
        val = num_msix & PSICFGR2_NUM_MSIX;
        enetc_port_wr(hw, ENETC4_PSICFGR2(0), val);
 
-       num_msix = pf->caps.num_msix / total_si - 1;
+       num_msix = pf->caps.num_msix / num_si - 1;
        val = num_msix & PSICFGR2_NUM_MSIX;
-       for (i = 0; i < pf->caps.num_vsi; i++)
+       for (i = 0; i < pf->total_vfs; i++)
                enetc_port_wr(hw, ENETC4_PSICFGR2(i + 1), val);
 }
 
 static void enetc4_enable_all_si(struct enetc_pf *pf)
 {
        struct enetc_hw *hw = &pf->si->hw;
-       int num_si = pf->caps.num_vsi + 1;
+       int num_si = pf->total_vfs + 1;
        u32 si_bitmap = 0;
        int i;
 
@@ -339,7 +338,7 @@ static void enetc4_configure_port_si(struct enetc_pf *pf)
        enetc_port_wr(hw, ENETC4_PSIVLANFMR, PSIVLANFMR_VS);
 
        /* Enforce VLAN promiscuous mode for all SIs */
-       for (int i = 0; i < pf->caps.num_vsi + 1; i++)
+       for (int i = 0; i < pf->total_vfs + 1; i++)
                enetc_set_si_vlan_promisc(pf->si, i, true);
 
        /* Disable SI MAC multicast & unicast promiscuous */
diff --git a/drivers/net/ethernet/freescale/enetc/enetc_pf.h 
b/drivers/net/ethernet/freescale/enetc/enetc_pf.h
index 1bd3063a3be3..56d23a8a11a0 100644
--- a/drivers/net/ethernet/freescale/enetc/enetc_pf.h
+++ b/drivers/net/ethernet/freescale/enetc/enetc_pf.h
@@ -17,7 +17,6 @@ struct enetc_vf_state {
 };
 
 struct enetc_port_caps {
-       int num_vsi;
        int num_msix;
        int num_rx_bdr;
        int num_tx_bdr;
-- 
2.34.1


Reply via email to