|
|
682abc |
From c12480a5bc37278c977a1b9adb9ff7b74b3cc97e Mon Sep 17 00:00:00 2001
|
|
|
682abc |
From: Vladimir Oltean <vladimir.oltean@nxp.com>
|
|
|
682abc |
Date: Mon, 7 Feb 2022 18:15:49 +0200
|
|
|
682abc |
Subject: [PATCH 16/17] net: dsa: bcm_sf2: don't use devres for mdiobus
|
|
|
682abc |
Git-commit: 08f1a20822349004bb9cc1b153ecb516e9f2889d
|
|
|
682abc |
Patch-mainline: v5.17-rc4
|
|
|
682abc |
References: git-fixes
|
|
|
682abc |
|
|
|
682abc |
As explained in commits:
|
|
|
682abc |
74b6d7d13307 ("net: dsa: realtek: register the MDIO bus under devres")
|
|
|
682abc |
5135e96a3dd2 ("net: dsa: don't allocate the slave_mii_bus using devres")
|
|
|
682abc |
|
|
|
682abc |
mdiobus_free() will panic when called from devm_mdiobus_free() <-
|
|
|
682abc |
devres_release_all() <- __device_release_driver(), and that mdiobus was
|
|
|
682abc |
not previously unregistered.
|
|
|
682abc |
|
|
|
682abc |
The Starfighter 2 is a platform device, so the initial set of
|
|
|
682abc |
constraints that I thought would cause this (I2C or SPI buses which call
|
|
|
682abc |
->remove on ->shutdown) do not apply. But there is one more which
|
|
|
682abc |
applies here.
|
|
|
682abc |
|
|
|
682abc |
If the DSA master itself is on a bus that calls ->remove from ->shutdown
|
|
|
682abc |
(like dpaa2-eth, which is on the fsl-mc bus), there is a device link
|
|
|
682abc |
between the switch and the DSA master, and device_links_unbind_consumers()
|
|
|
682abc |
will unbind the bcm_sf2 switch driver on shutdown.
|
|
|
682abc |
|
|
|
682abc |
So the same treatment must be applied to all DSA switch drivers, which
|
|
|
682abc |
is: either use devres for both the mdiobus allocation and registration,
|
|
|
682abc |
or don't use devres at all.
|
|
|
682abc |
|
|
|
682abc |
The bcm_sf2 driver has the code structure in place for orderly mdiobus
|
|
|
682abc |
removal, so just replace devm_mdiobus_alloc() with the non-devres
|
|
|
682abc |
variant, and add manual free where necessary, to ensure that we don't
|
|
|
682abc |
let devres free a still-registered bus.
|
|
|
682abc |
|
|
|
682abc |
Fixes: ac3a68d56651 ("net: phy: don't abuse devres in devm_mdiobus_register()")
|
|
|
682abc |
Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
|
|
|
682abc |
Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
|
|
|
682abc |
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
|
|
682abc |
Signed-off-by: Denis Kirjanov <denis.kirjanov@suse.com>
|
|
|
682abc |
---
|
|
|
682abc |
drivers/net/dsa/bcm_sf2.c | 7 +++++--
|
|
|
682abc |
1 file changed, 5 insertions(+), 2 deletions(-)
|
|
|
682abc |
|
|
|
682abc |
diff --git a/drivers/net/dsa/bcm_sf2.c b/drivers/net/dsa/bcm_sf2.c
|
|
|
682abc |
index 7578a5c38df5..2e314e3021d8 100644
|
|
|
682abc |
--- a/drivers/net/dsa/bcm_sf2.c
|
|
|
682abc |
+++ b/drivers/net/dsa/bcm_sf2.c
|
|
|
682abc |
@@ -584,7 +584,7 @@ static int bcm_sf2_mdio_register(struct dsa_switch *ds)
|
|
|
682abc |
get_device(&priv->master_mii_bus->dev);
|
|
|
682abc |
priv->master_mii_dn = dn;
|
|
|
682abc |
|
|
|
682abc |
- priv->slave_mii_bus = devm_mdiobus_alloc(ds->dev);
|
|
|
682abc |
+ priv->slave_mii_bus = mdiobus_alloc();
|
|
|
682abc |
if (!priv->slave_mii_bus) {
|
|
|
682abc |
of_node_put(dn);
|
|
|
682abc |
return -ENOMEM;
|
|
|
682abc |
@@ -644,8 +644,10 @@ static int bcm_sf2_mdio_register(struct dsa_switch *ds)
|
|
|
682abc |
}
|
|
|
682abc |
|
|
|
682abc |
err = mdiobus_register(priv->slave_mii_bus);
|
|
|
682abc |
- if (err && dn)
|
|
|
682abc |
+ if (err && dn) {
|
|
|
682abc |
+ mdiobus_free(priv->slave_mii_bus);
|
|
|
682abc |
of_node_put(dn);
|
|
|
682abc |
+ }
|
|
|
682abc |
|
|
|
682abc |
return err;
|
|
|
682abc |
}
|
|
|
682abc |
@@ -653,6 +655,7 @@ static int bcm_sf2_mdio_register(struct dsa_switch *ds)
|
|
|
682abc |
static void bcm_sf2_mdio_unregister(struct bcm_sf2_priv *priv)
|
|
|
682abc |
{
|
|
|
682abc |
mdiobus_unregister(priv->slave_mii_bus);
|
|
|
682abc |
+ mdiobus_free(priv->slave_mii_bus);
|
|
|
682abc |
of_node_put(priv->master_mii_dn);
|
|
|
682abc |
}
|
|
|
682abc |
|
|
|
682abc |
--
|
|
|
682abc |
2.16.4
|
|
|
682abc |
|