net: dsa: b53: do not set learning and unicast/multicast on up
authorJonas Gorski <jonas.gorski@gmail.com>
Tue, 29 Apr 2025 20:17:10 +0000 (22:17 +0200)
committerJakub Kicinski <kuba@kernel.org>
Thu, 8 May 2025 02:30:35 +0000 (19:30 -0700)
When a port gets set up, b53 disables learning and enables the port for
flooding. This can undo any bridge configuration on the port.

E.g. the following flow would disable learning on a port:

$ ip link add br0 type bridge
$ ip link set sw1p1 master br0 <- enables learning for sw1p1
$ ip link set br0 up
$ ip link set sw1p1 up <- disables learning again

Fix this by populating dsa_switch_ops::port_setup(), and set up initial
config there.

Fixes: f9b3827ee66c ("net: dsa: b53: Support setting learning on port")
Signed-off-by: Jonas Gorski <jonas.gorski@gmail.com>
Tested-by: Florian Fainelli <florian.fainelli@broadcom.com>
Reviewed-by: Florian Fainelli <florian.fainelli@broadcom.com>
Link: https://patch.msgid.link/20250429201710.330937-12-jonas.gorski@gmail.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/dsa/b53/b53_common.c
drivers/net/dsa/b53/b53_priv.h
drivers/net/dsa/bcm_sf2.c

index a2c0b44fc6bef16b1716ce3d9d20f85829b89240..9eb39cfa5fb27596032880692083558639a254b2 100644 (file)
@@ -578,6 +578,18 @@ static void b53_eee_enable_set(struct dsa_switch *ds, int port, bool enable)
        b53_write16(dev, B53_EEE_PAGE, B53_EEE_EN_CTRL, reg);
 }
 
+int b53_setup_port(struct dsa_switch *ds, int port)
+{
+       struct b53_device *dev = ds->priv;
+
+       b53_port_set_ucast_flood(dev, port, true);
+       b53_port_set_mcast_flood(dev, port, true);
+       b53_port_set_learning(dev, port, false);
+
+       return 0;
+}
+EXPORT_SYMBOL(b53_setup_port);
+
 int b53_enable_port(struct dsa_switch *ds, int port, struct phy_device *phy)
 {
        struct b53_device *dev = ds->priv;
@@ -590,10 +602,6 @@ int b53_enable_port(struct dsa_switch *ds, int port, struct phy_device *phy)
 
        cpu_port = dsa_to_port(ds, port)->cpu_dp->index;
 
-       b53_port_set_ucast_flood(dev, port, true);
-       b53_port_set_mcast_flood(dev, port, true);
-       b53_port_set_learning(dev, port, false);
-
        if (dev->ops->irq_enable)
                ret = dev->ops->irq_enable(dev, port);
        if (ret)
@@ -724,10 +732,6 @@ static void b53_enable_cpu_port(struct b53_device *dev, int port)
        b53_write8(dev, B53_CTRL_PAGE, B53_PORT_CTRL(port), port_ctrl);
 
        b53_brcm_hdr_setup(dev->ds, port);
-
-       b53_port_set_ucast_flood(dev, port, true);
-       b53_port_set_mcast_flood(dev, port, true);
-       b53_port_set_learning(dev, port, false);
 }
 
 static void b53_enable_mib(struct b53_device *dev)
@@ -2387,6 +2391,7 @@ static const struct dsa_switch_ops b53_switch_ops = {
        .phy_read               = b53_phy_read16,
        .phy_write              = b53_phy_write16,
        .phylink_get_caps       = b53_phylink_get_caps,
+       .port_setup             = b53_setup_port,
        .port_enable            = b53_enable_port,
        .port_disable           = b53_disable_port,
        .support_eee            = b53_support_eee,
index 4636e27fd1ee91cfb611f9952059f85a868551d2..2cf3e6a81e3785537ffff376468287e9f8563cdf 100644 (file)
@@ -384,6 +384,7 @@ enum dsa_tag_protocol b53_get_tag_protocol(struct dsa_switch *ds, int port,
                                           enum dsa_tag_protocol mprot);
 void b53_mirror_del(struct dsa_switch *ds, int port,
                    struct dsa_mall_mirror_tc_entry *mirror);
+int b53_setup_port(struct dsa_switch *ds, int port);
 int b53_enable_port(struct dsa_switch *ds, int port, struct phy_device *phy);
 void b53_disable_port(struct dsa_switch *ds, int port);
 void b53_brcm_hdr_setup(struct dsa_switch *ds, int port);
index fa2bf3fa90191a2e34b7933809d19f7de4e98cf8..454a8c7fd7eea5b247a0caf3d28f7412faef4851 100644 (file)
@@ -1230,6 +1230,7 @@ static const struct dsa_switch_ops bcm_sf2_ops = {
        .resume                 = bcm_sf2_sw_resume,
        .get_wol                = bcm_sf2_sw_get_wol,
        .set_wol                = bcm_sf2_sw_set_wol,
+       .port_setup             = b53_setup_port,
        .port_enable            = bcm_sf2_port_setup,
        .port_disable           = bcm_sf2_port_disable,
        .support_eee            = b53_support_eee,