| From 677fb9d6cce9214a86b72fc8fa798845fb932dc0 Mon Sep 17 00:00:00 2001 |
| From: Florian Fainelli <f.fainelli@gmail.com> |
| Date: Sat, 4 Apr 2020 14:35:17 -0700 |
| Subject: [PATCH] net: dsa: bcm_sf2: Do not register slave MDIO bus with OF |
| |
| commit 536fab5bf5826404534a6c271f622ad2930d9119 upstream. |
| |
| We were registering our slave MDIO bus with OF and doing so with |
| assigning the newly created slave_mii_bus of_node to the master MDIO bus |
| controller node. This is a bad thing to do for a number of reasons: |
| |
| - we are completely lying about the slave MII bus is arranged and yet we |
| still want to control which MDIO devices it probes. It was attempted |
| before to play tricks with the bus_mask to perform that: |
| https://www.spinics.net/lists/netdev/msg429420.html but the approach |
| was rightfully rejected |
| |
| - the device_node reference counting is messed up and we are effectively |
| doing a double probe on the devices we already probed using the |
| master, this messes up all resources reference counts (such as clocks) |
| |
| The proper fix for this as indicated by David in his reply to the |
| thread above is to use a platform data style registration so as to |
| control exactly which devices we probe: |
| https://www.spinics.net/lists/netdev/msg430083.html |
| |
| By using mdiobus_register(), our slave_mii_bus->phy_mask value is used |
| as intended, and all the PHY addresses that must be redirected towards |
| our slave MDIO bus is happening while other addresses get redirected |
| towards the master MDIO bus. |
| |
| Fixes: 461cd1b03e32 ("net: dsa: bcm_sf2: Register our slave MDIO bus") |
| Signed-off-by: Florian Fainelli <f.fainelli@gmail.com> |
| Reviewed-by: Vivien Didelot <vivien.didelot@gmail.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/net/dsa/bcm_sf2.c b/drivers/net/dsa/bcm_sf2.c |
| index 0725e1e92177..7b84ef852b9c 100644 |
| --- a/drivers/net/dsa/bcm_sf2.c |
| +++ b/drivers/net/dsa/bcm_sf2.c |
| @@ -456,7 +456,7 @@ static int bcm_sf2_mdio_register(struct dsa_switch *ds) |
| priv->slave_mii_bus->parent = ds->dev->parent; |
| priv->slave_mii_bus->phy_mask = ~priv->indir_phy_mask; |
| |
| - err = of_mdiobus_register(priv->slave_mii_bus, dn); |
| + err = mdiobus_register(priv->slave_mii_bus); |
| if (err && dn) |
| of_node_put(dn); |
| |
| -- |
| 2.7.4 |
| |