From: Wei Fang <[email protected]>

Remove the enetc_set_vlan_promisc(), enetc_enable_si_vlan_promisc() and
enetc_disable_si_vlan_promisc() functions, and introduce a new unified
function enetc_set_si_vlan_promisc() to enable or disable VLAN
promiscuous mode for a specific SI. This simplifies the logic and makes
the interface more straightforward. The vlan_promisc_simap field in
struct enetc_pf is no longer needed to track the current state.

As ENETC V4 only changes the address offset of PSIPVMR register compared
to V1 without any functional difference, enetc_set_si_vlan_promisc() can
be moved to enetc_pf_common.c in the future with minor adjustments to be
reused by the ENETC V4 driver

Signed-off-by: Wei Fang <[email protected]>
---
 .../net/ethernet/freescale/enetc/enetc_hw.h   |  5 ++-
 .../net/ethernet/freescale/enetc/enetc_pf.c   | 36 ++++++++-----------
 .../net/ethernet/freescale/enetc/enetc_pf.h   |  1 -
 3 files changed, 16 insertions(+), 26 deletions(-)

diff --git a/drivers/net/ethernet/freescale/enetc/enetc_hw.h 
b/drivers/net/ethernet/freescale/enetc/enetc_hw.h
index 66bfda60da9c..16da732dc5de 100644
--- a/drivers/net/ethernet/freescale/enetc/enetc_hw.h
+++ b/drivers/net/ethernet/freescale/enetc/enetc_hw.h
@@ -185,9 +185,8 @@ enum enetc_bdr_type {TX, RX};
 #define  PSIPMMR_SI_MAC_MP(n)  BIT((n) + 16)
 
 #define ENETC_PSIPVMR          0x001c
-#define ENETC_VLAN_PROMISC_MAP_ALL     0x7
-#define ENETC_PSIPVMR_SET_VP(simap)    ((simap) & 0x7)
-#define ENETC_PSIPVMR_SET_VUTA(simap)  (((simap) & 0x7) << 16)
+#define  PSIPVMR_SI_VLAN_P(n)  BIT(n) /* n = SI index */
+
 #define ENETC_PSIPMAR0(n)      (0x0100 + (n) * 0x8) /* n = SI index */
 #define ENETC_PSIPMAR1(n)      (0x0104 + (n) * 0x8)
 #define ENETC_PVCLCTR          0x0208
diff --git a/drivers/net/ethernet/freescale/enetc/enetc_pf.c 
b/drivers/net/ethernet/freescale/enetc/enetc_pf.c
index db2a800a7aaf..afc02ed62c77 100644
--- a/drivers/net/ethernet/freescale/enetc/enetc_pf.c
+++ b/drivers/net/ethernet/freescale/enetc/enetc_pf.c
@@ -42,24 +42,20 @@ static void enetc_pf_destroy_pcs(struct phylink_pcs *pcs)
        lynx_pcs_destroy(pcs);
 }
 
-static void enetc_set_vlan_promisc(struct enetc_hw *hw, char si_map)
+static void enetc_set_si_vlan_promisc(struct enetc_si *si, int si_id,
+                                     bool promisc)
 {
-       u32 val = enetc_port_rd(hw, ENETC_PSIPVMR);
+       struct enetc_hw *hw = &si->hw;
+       u32 val;
 
-       val &= ~ENETC_PSIPVMR_SET_VP(ENETC_VLAN_PROMISC_MAP_ALL);
-       enetc_port_wr(hw, ENETC_PSIPVMR, ENETC_PSIPVMR_SET_VP(si_map) | val);
-}
+       val = enetc_port_rd(hw, ENETC_PSIPVMR);
 
-static void enetc_enable_si_vlan_promisc(struct enetc_pf *pf, int si_idx)
-{
-       pf->vlan_promisc_simap |= BIT(si_idx);
-       enetc_set_vlan_promisc(&pf->si->hw, pf->vlan_promisc_simap);
-}
+       if (promisc)
+               val |= PSIPVMR_SI_VLAN_P(si_id);
+       else
+               val &= ~PSIPVMR_SI_VLAN_P(si_id);
 
-static void enetc_disable_si_vlan_promisc(struct enetc_pf *pf, int si_idx)
-{
-       pf->vlan_promisc_simap &= ~BIT(si_idx);
-       enetc_set_vlan_promisc(&pf->si->hw, pf->vlan_promisc_simap);
+       enetc_port_wr(hw, ENETC_PSIPVMR, val);
 }
 
 static void enetc_set_isol_vlan(struct enetc_hw *hw, int si, u16 vlan, u8 qos)
@@ -441,10 +437,9 @@ static void enetc_configure_port(struct enetc_pf *pf)
 
        /* split up RFS entries */
        enetc_port_assign_rfs_entries(pf->si);
-
        /* enforce VLAN promisc mode for all SIs */
-       pf->vlan_promisc_simap = ENETC_VLAN_PROMISC_MAP_ALL;
-       enetc_set_vlan_promisc(hw, pf->vlan_promisc_simap);
+       for (int i = 0; i < pf->total_vfs + 1; i++)
+               enetc_set_si_vlan_promisc(pf->si, i, true);
 
        enetc_port_wr(hw, ENETC_PSIPMMR, 0);
 
@@ -466,12 +461,9 @@ static int enetc_pf_set_features(struct net_device *ndev,
        }
 
        if (changed & NETIF_F_HW_VLAN_CTAG_FILTER) {
-               struct enetc_pf *pf = enetc_si_priv(priv->si);
+               bool promisc = !(features & NETIF_F_HW_VLAN_CTAG_FILTER);
 
-               if (!!(features & NETIF_F_HW_VLAN_CTAG_FILTER))
-                       enetc_disable_si_vlan_promisc(pf, 0);
-               else
-                       enetc_enable_si_vlan_promisc(pf, 0);
+               enetc_set_si_vlan_promisc(priv->si, 0, promisc);
        }
 
        if (changed & NETIF_F_LOOPBACK)
diff --git a/drivers/net/ethernet/freescale/enetc/enetc_pf.h 
b/drivers/net/ethernet/freescale/enetc/enetc_pf.h
index 7e886dc49997..1bd3063a3be3 100644
--- a/drivers/net/ethernet/freescale/enetc/enetc_pf.h
+++ b/drivers/net/ethernet/freescale/enetc/enetc_pf.h
@@ -45,7 +45,6 @@ struct enetc_pf {
        struct work_struct msg_task;
        char msg_int_name[ENETC_INT_NAME_MAX];
 
-       char vlan_promisc_simap; /* bitmap of SIs in VLAN promisc mode */
        DECLARE_BITMAP(vlan_ht_filter, ENETC_VLAN_HT_SIZE);
        DECLARE_BITMAP(active_vlans, VLAN_N_VID);
 
-- 
2.34.1


Reply via email to