realtek: fix standalone ports in presence of static fdb entries
[openwrt/staging/jow.git] / target / linux / realtek / files-5.15 / drivers / net / dsa / rtl83xx / dsa.c
index 3ecdda205f47f619727932d5a303b9b417fe8ae3..703306498e04dbbe9d0856995966d42d3fae3f84 100644 (file)
@@ -188,6 +188,14 @@ static int rtl83xx_setup(struct dsa_switch *ds)
        }
        priv->r->traffic_set(priv->cpu_port, BIT_ULL(priv->cpu_port));
 
+       /* For standalone ports, forward packets even if a static fdb
+        * entry for the source address exists on another port.
+        */
+       if (priv->r->set_static_move_action) {
+               for (int i = 0; i <= priv->cpu_port; i++)
+                       priv->r->set_static_move_action(i, true);
+       }
+
        if (priv->family_id == RTL8380_FAMILY_ID)
                rtl838x_print_matrix();
        else
@@ -1202,6 +1210,10 @@ static int rtl83xx_port_bridge_join(struct dsa_switch *ds, int port,
                priv->r->traffic_set(port, v);
        }
        priv->ports[port].pm |= port_bitmap;
+
+       if (priv->r->set_static_move_action)
+               priv->r->set_static_move_action(port, false);
+
        mutex_unlock(&priv->reg_mutex);
 
        return 0;
@@ -1242,6 +1254,9 @@ static void rtl83xx_port_bridge_leave(struct dsa_switch *ds, int port,
        }
        priv->ports[port].pm &= ~port_bitmap;
 
+       if (priv->r->set_static_move_action)
+               priv->r->set_static_move_action(port, true);
+
        mutex_unlock(&priv->reg_mutex);
 }