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