net: dsa: microchip: make sure drive strength configuration is not lost by soft reset
authorOleksij Rempel <o.rempel@pengutronix.de>
Mon, 4 Mar 2024 13:56:12 +0000 (14:56 +0100)
committerJakub Kicinski <kuba@kernel.org>
Fri, 8 Mar 2024 04:23:50 +0000 (20:23 -0800)
This driver has two separate reset sequence in different places:
- gpio/HW reset on start of ksz_switch_register()
- SW reset on start of ksz_setup()

The second one will overwrite drive strength configuration made in the
ksz_switch_register().

To fix it, move ksz_parse_drive_strength() from ksz_switch_register() to
ksz_setup().

Fixes: d67d7247f641 ("net: dsa: microchip: Add drive strength configuration")
Signed-off-by: Oleksij Rempel <o.rempel@pengutronix.de>
Link: https://lore.kernel.org/r/20240304135612.814404-1-o.rempel@pengutronix.de
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/dsa/microchip/ksz_common.c

index 245dfb7a7a315dd82dcb8275137247976438b0e8..25a49708f4842a1428e25c6dba6dd585cd72efa6 100644 (file)
@@ -2185,6 +2185,8 @@ static int ksz_pirq_setup(struct ksz_device *dev, u8 p)
        return ksz_irq_common_setup(dev, pirq);
 }
 
+static int ksz_parse_drive_strength(struct ksz_device *dev);
+
 static int ksz_setup(struct dsa_switch *ds)
 {
        struct ksz_device *dev = ds->priv;
@@ -2206,6 +2208,10 @@ static int ksz_setup(struct dsa_switch *ds)
                return ret;
        }
 
+       ret = ksz_parse_drive_strength(dev);
+       if (ret)
+               return ret;
+
        /* set broadcast storm protection 10% rate */
        regmap_update_bits(ksz_regmap_16(dev), regs[S_BROADCAST_CTRL],
                           BROADCAST_STORM_RATE,
@@ -4242,10 +4248,6 @@ int ksz_switch_register(struct ksz_device *dev)
        for (port_num = 0; port_num < dev->info->port_cnt; ++port_num)
                dev->ports[port_num].interface = PHY_INTERFACE_MODE_NA;
        if (dev->dev->of_node) {
-               ret = ksz_parse_drive_strength(dev);
-               if (ret)
-                       return ret;
-
                ret = of_get_phy_mode(dev->dev->of_node, &interface);
                if (ret == 0)
                        dev->compat_interface = interface;