realtek: dsa: Simplify port member handling
authorSven Eckelmann <[email protected]>
Thu, 9 Oct 2025 14:28:47 +0000 (16:28 +0200)
committerRobert Marko <[email protected]>
Sun, 12 Oct 2025 10:49:49 +0000 (12:49 +0200)
It is not necessary to read the back the current port members for a
specific port for enabling/disabling a port. All these members which are
expected to be in the HW port matrix of an active port are already stored
in the port specific member "pm".

And when a port is disabled, the port must no longer forwarding traffic to
any other port. Just writing 0 to the members is therefore good enough and
no read-back of the old HW state is necessary.

Signed-off-by: Sven Eckelmann <[email protected]>
Link: https://github.com/openwrt/openwrt/pull/20360
Signed-off-by: Robert Marko <[email protected]>
target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/dsa.c

index d97283065f6d66bb9fcc9dd85aca422e6eb028a9..74cd728de5a8ddea09b3b7e0ec8b2f6588cc2213 100644 (file)
@@ -1428,7 +1428,6 @@ static int rtl83xx_port_enable(struct dsa_switch *ds, int port,
                                struct phy_device *phydev)
 {
        struct rtl838x_switch_priv *priv = ds->priv;
-       u64 v;
 
        pr_debug("%s: %x %d", __func__, (u32) priv, port);
        priv->ports[port].enable = true;
@@ -1448,9 +1447,7 @@ static int rtl83xx_port_enable(struct dsa_switch *ds, int port,
        }
 
        /* add all other ports in the same bridge to switch mask of port */
-       v = priv->r->traffic_get(port);
-       v |= priv->ports[port].pm;
-       priv->r->traffic_set(port, v);
+       priv->r->traffic_set(port, priv->ports[port].pm);
 
        /* TODO: Figure out if this is necessary */
        if (priv->family_id == RTL9300_FAMILY_ID) {
@@ -1467,7 +1464,6 @@ static int rtl83xx_port_enable(struct dsa_switch *ds, int port,
 static void rtl83xx_port_disable(struct dsa_switch *ds, int port)
 {
        struct rtl838x_switch_priv *priv = ds->priv;
-       u64 v;
 
        pr_debug("%s %x: %d", __func__, (u32)priv, port);
        /* you can only disable user ports */
@@ -1478,10 +1474,8 @@ static void rtl83xx_port_disable(struct dsa_switch *ds, int port)
        /* remove port from switch mask of CPU_PORT */
        priv->r->traffic_disable(priv->cpu_port, port);
 
-       /* remove all other ports in the same bridge from switch mask of port */
-       v = priv->r->traffic_get(port);
-       v &= ~priv->ports[port].pm;
-       priv->r->traffic_set(port, v);
+       /* remove all other ports from switch mask of port */
+       priv->r->traffic_set(port, 0);
 
        priv->ports[port].enable = false;
 }