Patch "net: dsa: bcm_sf2: don't use devres for mdiobus" has been added to the 5.10-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    net: dsa: bcm_sf2: don't use devres for mdiobus

to the 5.10-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     net-dsa-bcm_sf2-don-t-use-devres-for-mdiobus.patch
and it can be found in the queue-5.10 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit ed9c42b974a8d57f58d0d3a5a0c65469d1e84ec2
Author: Vladimir Oltean <vladimir.oltean@xxxxxxx>
Date:   Mon Feb 7 18:15:49 2022 +0200

    net: dsa: bcm_sf2: don't use devres for mdiobus
    
    [ Upstream commit 08f1a20822349004bb9cc1b153ecb516e9f2889d ]
    
    As explained in commits:
    74b6d7d13307 ("net: dsa: realtek: register the MDIO bus under devres")
    5135e96a3dd2 ("net: dsa: don't allocate the slave_mii_bus using devres")
    
    mdiobus_free() will panic when called from devm_mdiobus_free() <-
    devres_release_all() <- __device_release_driver(), and that mdiobus was
    not previously unregistered.
    
    The Starfighter 2 is a platform device, so the initial set of
    constraints that I thought would cause this (I2C or SPI buses which call
    ->remove on ->shutdown) do not apply. But there is one more which
    applies here.
    
    If the DSA master itself is on a bus that calls ->remove from ->shutdown
    (like dpaa2-eth, which is on the fsl-mc bus), there is a device link
    between the switch and the DSA master, and device_links_unbind_consumers()
    will unbind the bcm_sf2 switch driver on shutdown.
    
    So the same treatment must be applied to all DSA switch drivers, which
    is: either use devres for both the mdiobus allocation and registration,
    or don't use devres at all.
    
    The bcm_sf2 driver has the code structure in place for orderly mdiobus
    removal, so just replace devm_mdiobus_alloc() with the non-devres
    variant, and add manual free where necessary, to ensure that we don't
    let devres free a still-registered bus.
    
    Fixes: ac3a68d56651 ("net: phy: don't abuse devres in devm_mdiobus_register()")
    Signed-off-by: Vladimir Oltean <vladimir.oltean@xxxxxxx>
    Reviewed-by: Florian Fainelli <f.fainelli@xxxxxxxxx>
    Signed-off-by: Jakub Kicinski <kuba@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/net/dsa/bcm_sf2.c b/drivers/net/dsa/bcm_sf2.c
index 690e9d9495e75..08a675a5328d7 100644
--- a/drivers/net/dsa/bcm_sf2.c
+++ b/drivers/net/dsa/bcm_sf2.c
@@ -504,7 +504,7 @@ static int bcm_sf2_mdio_register(struct dsa_switch *ds)
 	get_device(&priv->master_mii_bus->dev);
 	priv->master_mii_dn = dn;
 
-	priv->slave_mii_bus = devm_mdiobus_alloc(ds->dev);
+	priv->slave_mii_bus = mdiobus_alloc();
 	if (!priv->slave_mii_bus) {
 		of_node_put(dn);
 		return -ENOMEM;
@@ -564,8 +564,10 @@ static int bcm_sf2_mdio_register(struct dsa_switch *ds)
 	}
 
 	err = mdiobus_register(priv->slave_mii_bus);
-	if (err && dn)
+	if (err && dn) {
+		mdiobus_free(priv->slave_mii_bus);
 		of_node_put(dn);
+	}
 
 	return err;
 }
@@ -573,6 +575,7 @@ static int bcm_sf2_mdio_register(struct dsa_switch *ds)
 static void bcm_sf2_mdio_unregister(struct bcm_sf2_priv *priv)
 {
 	mdiobus_unregister(priv->slave_mii_bus);
+	mdiobus_free(priv->slave_mii_bus);
 	of_node_put(priv->master_mii_dn);
 }
 



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux