mirror of
https://github.com/torvalds/linux.git
synced 2026-06-01 02:53:36 +02:00
net: dsa: lantiq_gswip: fix order in .remove operation
Russell King pointed out that disabling the switch by clearing
GSWIP_MDIO_GLOB_ENABLE before calling dsa_unregister_switch() is
problematic, as it violates a Golden Rule of driver development to
always first unpublish userspace interfaces and then disable the
hardware.
Fix this, and also simplify the probe() function, by introducing a
dsa_switch_ops teardown() operation which takes care of clearing the
GSWIP_MDIO_GLOB_ENABLE bit.
Fixes: 14fceff477 ("net: dsa: Add Lantiq / Intel DSA driver for vrx200")
Suggested-by: "Russell King (Oracle)" <linux@armlinux.org.uk>
Signed-off-by: Daniel Golle <daniel@makrotopia.org>
Link: https://patch.msgid.link/4ebd72a29edc1e4059b9666a26a0bb5d906a829a.1765241054.git.daniel@makrotopia.org
Reviewed-by: Vladimir Oltean <olteanv@gmail.com>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
This commit is contained in:
parent
7b07be1ff1
commit
377d66fa86
|
|
@ -444,9 +444,6 @@ static void gswip_remove(struct platform_device *pdev)
|
|||
if (!priv)
|
||||
return;
|
||||
|
||||
/* disable the switch */
|
||||
gswip_disable_switch(priv);
|
||||
|
||||
dsa_unregister_switch(priv->ds);
|
||||
|
||||
for (i = 0; i < priv->num_gphy_fw; i++)
|
||||
|
|
|
|||
|
|
@ -752,6 +752,13 @@ static int gswip_setup(struct dsa_switch *ds)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void gswip_teardown(struct dsa_switch *ds)
|
||||
{
|
||||
struct gswip_priv *priv = ds->priv;
|
||||
|
||||
regmap_clear_bits(priv->mdio, GSWIP_MDIO_GLOB, GSWIP_MDIO_GLOB_ENABLE);
|
||||
}
|
||||
|
||||
static enum dsa_tag_protocol gswip_get_tag_protocol(struct dsa_switch *ds,
|
||||
int port,
|
||||
enum dsa_tag_protocol mp)
|
||||
|
|
@ -1629,6 +1636,7 @@ static const struct phylink_mac_ops gswip_phylink_mac_ops = {
|
|||
static const struct dsa_switch_ops gswip_switch_ops = {
|
||||
.get_tag_protocol = gswip_get_tag_protocol,
|
||||
.setup = gswip_setup,
|
||||
.teardown = gswip_teardown,
|
||||
.port_setup = gswip_port_setup,
|
||||
.port_enable = gswip_port_enable,
|
||||
.port_disable = gswip_port_disable,
|
||||
|
|
@ -1718,15 +1726,14 @@ int gswip_probe_common(struct gswip_priv *priv, u32 version)
|
|||
|
||||
err = gswip_validate_cpu_port(priv->ds);
|
||||
if (err)
|
||||
goto disable_switch;
|
||||
goto unregister_switch;
|
||||
|
||||
dev_info(priv->dev, "probed GSWIP version %lx mod %lx\n",
|
||||
GSWIP_VERSION_REV(version), GSWIP_VERSION_MOD(version));
|
||||
|
||||
return 0;
|
||||
|
||||
disable_switch:
|
||||
gswip_disable_switch(priv);
|
||||
unregister_switch:
|
||||
dsa_unregister_switch(priv->ds);
|
||||
|
||||
return err;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user