net: enetc: move generic MAC filtering interfaces to enetc-core
authorWei Fang <wei.fang@nxp.com>
Tue, 6 May 2025 08:07:24 +0000 (16:07 +0800)
committerJakub Kicinski <kuba@kernel.org>
Fri, 9 May 2025 02:43:51 +0000 (19:43 -0700)
Although only ENETC PF can access the MAC address filter table, the table
entries can specify MAC address filtering for one or more SIs based on
SI_BITMAP, which means that the table also supports MAC address filtering
for VFs.

Currently, only the ENETC v1 PF driver supports MAC address filtering. In
order to add the MAC address filtering support for the ENETC v4 PF driver
and VF driver in the future, the relevant generic interfaces are moved to
the enetc-core driver. This lays the basis for i.MX95 ENETC PF and VFs to
support MAC address filtering.

Signed-off-by: Wei Fang <wei.fang@nxp.com>
Reviewed-by: Vladimir Oltean <vladimir.oltean@nxp.com>
Link: https://patch.msgid.link/20250506080735.3444381-4-wei.fang@nxp.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/freescale/enetc/enetc.c
drivers/net/ethernet/freescale/enetc/enetc.h
drivers/net/ethernet/freescale/enetc/enetc_pf.c
drivers/net/ethernet/freescale/enetc/enetc_pf.h

index 3ee52f4b11660a0cff49a6875b5f365114d4ea7d..5a7af44e45946ef7e5b2a19456c6eec3fdc3663b 100644 (file)
@@ -36,6 +36,42 @@ static void enetc_change_preemptible_tcs(struct enetc_ndev_priv *priv,
        enetc_mm_commit_preemptible_tcs(priv);
 }
 
+static int enetc_mac_addr_hash_idx(const u8 *addr)
+{
+       u64 fold = __swab64(ether_addr_to_u64(addr)) >> 16;
+       u64 mask = 0;
+       int res = 0;
+       int i;
+
+       for (i = 0; i < 8; i++)
+               mask |= BIT_ULL(i * 6);
+
+       for (i = 0; i < 6; i++)
+               res |= (hweight64(fold & (mask << i)) & 0x1) << i;
+
+       return res;
+}
+
+void enetc_add_mac_addr_ht_filter(struct enetc_mac_filter *filter,
+                                 const unsigned char *addr)
+{
+       int idx = enetc_mac_addr_hash_idx(addr);
+
+       /* add hash table entry */
+       __set_bit(idx, filter->mac_hash_table);
+       filter->mac_addr_cnt++;
+}
+EXPORT_SYMBOL_GPL(enetc_add_mac_addr_ht_filter);
+
+void enetc_reset_mac_addr_filter(struct enetc_mac_filter *filter)
+{
+       filter->mac_addr_cnt = 0;
+
+       bitmap_zero(filter->mac_hash_table,
+                   ENETC_MADDR_HASH_TBL_SZ);
+}
+EXPORT_SYMBOL_GPL(enetc_reset_mac_addr_filter);
+
 static int enetc_num_stack_tx_queues(struct enetc_ndev_priv *priv)
 {
        int num_tx_rings = priv->num_tx_rings;
index 384e0bded87f8a55706f820c310700935c066b3f..c3ebb32ce50c39e3d57ecf5adde1b7061880ac59 100644 (file)
 
 #define ENETC_CBD_DATA_MEM_ALIGN 64
 
+#define ENETC_MADDR_HASH_TBL_SZ        64
+
+enum enetc_mac_addr_type {UC, MC, MADDR_TYPE};
+
+struct enetc_mac_filter {
+       union {
+               char mac_addr[ETH_ALEN];
+               DECLARE_BITMAP(mac_hash_table, ENETC_MADDR_HASH_TBL_SZ);
+       };
+       int mac_addr_cnt;
+};
+
 struct enetc_tx_swbd {
        union {
                struct sk_buff *skb;
@@ -471,6 +483,9 @@ int enetc_alloc_si_resources(struct enetc_ndev_priv *priv);
 void enetc_free_si_resources(struct enetc_ndev_priv *priv);
 int enetc_configure_si(struct enetc_ndev_priv *priv);
 int enetc_get_driver_data(struct enetc_si *si);
+void enetc_add_mac_addr_ht_filter(struct enetc_mac_filter *filter,
+                                 const unsigned char *addr);
+void enetc_reset_mac_addr_filter(struct enetc_mac_filter *filter);
 
 int enetc_open(struct net_device *ndev);
 int enetc_close(struct net_device *ndev);
index 203862ec111427b857c920d135cc764b4e6f1c55..f76403f7aee81d8c60edf1723c30c97b00f3e637 100644 (file)
@@ -72,30 +72,6 @@ static void enetc_set_isol_vlan(struct enetc_hw *hw, int si, u16 vlan, u8 qos)
        enetc_port_wr(hw, ENETC_PSIVLANR(si), val);
 }
 
-static int enetc_mac_addr_hash_idx(const u8 *addr)
-{
-       u64 fold = __swab64(ether_addr_to_u64(addr)) >> 16;
-       u64 mask = 0;
-       int res = 0;
-       int i;
-
-       for (i = 0; i < 8; i++)
-               mask |= BIT_ULL(i * 6);
-
-       for (i = 0; i < 6; i++)
-               res |= (hweight64(fold & (mask << i)) & 0x1) << i;
-
-       return res;
-}
-
-static void enetc_reset_mac_addr_filter(struct enetc_mac_filter *filter)
-{
-       filter->mac_addr_cnt = 0;
-
-       bitmap_zero(filter->mac_hash_table,
-                   ENETC_MADDR_HASH_TBL_SZ);
-}
-
 static void enetc_add_mac_addr_em_filter(struct enetc_mac_filter *filter,
                                         const unsigned char *addr)
 {
@@ -104,16 +80,6 @@ static void enetc_add_mac_addr_em_filter(struct enetc_mac_filter *filter,
        filter->mac_addr_cnt++;
 }
 
-static void enetc_add_mac_addr_ht_filter(struct enetc_mac_filter *filter,
-                                        const unsigned char *addr)
-{
-       int idx = enetc_mac_addr_hash_idx(addr);
-
-       /* add hash table entry */
-       __set_bit(idx, filter->mac_hash_table);
-       filter->mac_addr_cnt++;
-}
-
 static void enetc_clear_mac_ht_flt(struct enetc_si *si, int si_idx, int type)
 {
        bool err = si->errata & ENETC_ERR_UCMCSWP;
index a26a1286385580017ba60be0f4b7fbb4d3ec795a..a8b3c8d14254130e1defa290a8898ae9dd0cf71c 100644 (file)
@@ -5,19 +5,8 @@
 #include <linux/phylink.h>
 
 #define ENETC_PF_NUM_RINGS     8
-
-enum enetc_mac_addr_type {UC, MC, MADDR_TYPE};
 #define ENETC_MAX_NUM_MAC_FLT  ((ENETC_MAX_NUM_VFS + 1) * MADDR_TYPE)
 
-#define ENETC_MADDR_HASH_TBL_SZ        64
-struct enetc_mac_filter {
-       union {
-               char mac_addr[ETH_ALEN];
-               DECLARE_BITMAP(mac_hash_table, ENETC_MADDR_HASH_TBL_SZ);
-       };
-       int mac_addr_cnt;
-};
-
 #define ENETC_VLAN_HT_SIZE     64
 
 enum enetc_vf_flags {