Commit e3fb8e8b authored by Oleksij Rempel's avatar Oleksij Rempel Committed by Jakub Kicinski

net: dsa: microchip: make sure drive strength configuration is not lost by soft reset

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: d67d7247 ("net: dsa: microchip: Add drive strength configuration")
Signed-off-by: default avatarOleksij Rempel <o.rempel@pengutronix.de>
Link: https://lore.kernel.org/r/20240304135612.814404-1-o.rempel@pengutronix.deSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent df479350
...@@ -2185,6 +2185,8 @@ static int ksz_pirq_setup(struct ksz_device *dev, u8 p) ...@@ -2185,6 +2185,8 @@ static int ksz_pirq_setup(struct ksz_device *dev, u8 p)
return ksz_irq_common_setup(dev, pirq); 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) static int ksz_setup(struct dsa_switch *ds)
{ {
struct ksz_device *dev = ds->priv; struct ksz_device *dev = ds->priv;
...@@ -2206,6 +2208,10 @@ static int ksz_setup(struct dsa_switch *ds) ...@@ -2206,6 +2208,10 @@ static int ksz_setup(struct dsa_switch *ds)
return ret; return ret;
} }
ret = ksz_parse_drive_strength(dev);
if (ret)
return ret;
/* set broadcast storm protection 10% rate */ /* set broadcast storm protection 10% rate */
regmap_update_bits(ksz_regmap_16(dev), regs[S_BROADCAST_CTRL], regmap_update_bits(ksz_regmap_16(dev), regs[S_BROADCAST_CTRL],
BROADCAST_STORM_RATE, BROADCAST_STORM_RATE,
...@@ -4242,10 +4248,6 @@ int ksz_switch_register(struct ksz_device *dev) ...@@ -4242,10 +4248,6 @@ int ksz_switch_register(struct ksz_device *dev)
for (port_num = 0; port_num < dev->info->port_cnt; ++port_num) for (port_num = 0; port_num < dev->info->port_cnt; ++port_num)
dev->ports[port_num].interface = PHY_INTERFACE_MODE_NA; dev->ports[port_num].interface = PHY_INTERFACE_MODE_NA;
if (dev->dev->of_node) { 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); ret = of_get_phy_mode(dev->dev->of_node, &interface);
if (ret == 0) if (ret == 0)
dev->compat_interface = interface; dev->compat_interface = interface;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment