As the hardware can manage multicast forwarding itself, trapping
multicast traffic to the CPU is no longer required.

Signed-off-by: DENG Qingfang <[email protected]>
---
 drivers/net/dsa/mt7530.c | 58 +++++++++++++++++++++++++++++++++++++---
 net/dsa/tag_mtk.c        | 14 +---------
 2 files changed, 56 insertions(+), 16 deletions(-)

diff --git a/drivers/net/dsa/mt7530.c b/drivers/net/dsa/mt7530.c
index 28aab0ff6e7d..20e66cf13485 100644
--- a/drivers/net/dsa/mt7530.c
+++ b/drivers/net/dsa/mt7530.c
@@ -1000,9 +1000,6 @@ mt753x_cpu_port_enable(struct dsa_switch *ds, int port)
        mt7530_write(priv, MT7530_PVC_P(port),
                     PORT_SPEC_TAG);
 
-       /* Unknown multicast frame forwarding to the cpu port */
-       mt7530_rmw(priv, MT7530_MFC, UNM_FFP_MASK, UNM_FFP(BIT(port)));
-
        /* Set CPU port number */
        if (priv->id == ID_MT7621)
                mt7530_rmw(priv, MT7530_MFC, CPU_MASK, CPU_EN | CPU_PORT(port));
@@ -1365,6 +1362,59 @@ mt7530_port_fdb_dump(struct dsa_switch *ds, int port,
        return 0;
 }
 
+static int
+mt7530_port_mdb_add(struct dsa_switch *ds, int port,
+                   const struct switchdev_obj_port_mdb *mdb)
+{
+       struct mt7530_priv *priv = ds->priv;
+       const u8 *addr = mdb->addr;
+       u16 vid = mdb->vid;
+       u8 port_mask = 0;
+       int ret;
+
+       mutex_lock(&priv->reg_mutex);
+
+       mt7530_fdb_write(priv, vid, 0, addr, 0, STATIC_EMP);
+       if (!mt7530_fdb_cmd(priv, MT7530_FDB_READ, NULL))
+               port_mask = (mt7530_read(priv, MT7530_ATRD) >> PORT_MAP)
+                           & PORT_MAP_MASK;
+
+       port_mask |= BIT(port);
+       mt7530_fdb_write(priv, vid, port_mask, addr, -1, STATIC_ENT);
+       ret = mt7530_fdb_cmd(priv, MT7530_FDB_WRITE, NULL);
+
+       mutex_unlock(&priv->reg_mutex);
+
+       return ret;
+}
+
+static int
+mt7530_port_mdb_del(struct dsa_switch *ds, int port,
+                   const struct switchdev_obj_port_mdb *mdb)
+{
+       struct mt7530_priv *priv = ds->priv;
+       const u8 *addr = mdb->addr;
+       u16 vid = mdb->vid;
+       u8 port_mask = 0;
+       int ret;
+
+       mutex_lock(&priv->reg_mutex);
+
+       mt7530_fdb_write(priv, vid, 0, addr, 0, STATIC_EMP);
+       if (!mt7530_fdb_cmd(priv, MT7530_FDB_READ, NULL))
+               port_mask = (mt7530_read(priv, MT7530_ATRD) >> PORT_MAP)
+                           & PORT_MAP_MASK;
+
+       port_mask &= ~BIT(port);
+       mt7530_fdb_write(priv, vid, port_mask, addr, -1,
+                        port_mask ? STATIC_ENT : STATIC_EMP);
+       ret = mt7530_fdb_cmd(priv, MT7530_FDB_WRITE, NULL);
+
+       mutex_unlock(&priv->reg_mutex);
+
+       return ret;
+}
+
 static int
 mt7530_vlan_cmd(struct mt7530_priv *priv, enum mt7530_vlan_cmd cmd, u16 vid)
 {
@@ -3403,6 +3453,8 @@ static const struct dsa_switch_ops mt7530_switch_ops = {
        .port_fdb_add           = mt7530_port_fdb_add,
        .port_fdb_del           = mt7530_port_fdb_del,
        .port_fdb_dump          = mt7530_port_fdb_dump,
+       .port_mdb_add           = mt7530_port_mdb_add,
+       .port_mdb_del           = mt7530_port_mdb_del,
        .port_vlan_filtering    = mt7530_port_vlan_filtering,
        .port_vlan_add          = mt7530_port_vlan_add,
        .port_vlan_del          = mt7530_port_vlan_del,
diff --git a/net/dsa/tag_mtk.c b/net/dsa/tag_mtk.c
index 38dcdded74c0..53b620e177ad 100644
--- a/net/dsa/tag_mtk.c
+++ b/net/dsa/tag_mtk.c
@@ -23,9 +23,6 @@ static struct sk_buff *mtk_tag_xmit(struct sk_buff *skb,
        struct dsa_port *dp = dsa_slave_to_port(dev);
        u8 *mtk_tag;
        bool is_vlan_skb = true;
-       unsigned char *dest = eth_hdr(skb)->h_dest;
-       bool is_multicast_skb = is_multicast_ether_addr(dest) &&
-                               !is_broadcast_ether_addr(dest);
 
        /* Build the special tag after the MAC Source Address. If VLAN header
         * is present, it's required that VLAN header and special tag is
@@ -48,10 +45,6 @@ static struct sk_buff *mtk_tag_xmit(struct sk_buff *skb,
                     MTK_HDR_XMIT_UNTAGGED;
        mtk_tag[1] = (1 << dp->index) & MTK_HDR_XMIT_DP_BIT_MASK;
 
-       /* Disable SA learning for multicast frames */
-       if (unlikely(is_multicast_skb))
-               mtk_tag[1] |= MTK_HDR_XMIT_SA_DIS;
-
        /* Tag control information is kept for 802.1Q */
        if (!is_vlan_skb) {
                mtk_tag[2] = 0;
@@ -67,9 +60,6 @@ static struct sk_buff *mtk_tag_rcv(struct sk_buff *skb, 
struct net_device *dev,
        u16 hdr;
        int port;
        __be16 *phdr;
-       unsigned char *dest = eth_hdr(skb)->h_dest;
-       bool is_multicast_skb = is_multicast_ether_addr(dest) &&
-                               !is_broadcast_ether_addr(dest);
 
        if (unlikely(!pskb_may_pull(skb, MTK_HDR_LEN)))
                return NULL;
@@ -95,9 +85,7 @@ static struct sk_buff *mtk_tag_rcv(struct sk_buff *skb, 
struct net_device *dev,
        if (!skb->dev)
                return NULL;
 
-       /* Only unicast or broadcast frames are offloaded */
-       if (likely(!is_multicast_skb))
-               skb->offload_fwd_mark = 1;
+       skb->offload_fwd_mark = 1;
 
        return skb;
 }
-- 
2.25.1

Reply via email to