net: bcmgenet: fix bcmgenet_fixed_phy_link_update()
bcmgenet_fixed_phy_link_update() is getting called from PHY detach path:
bcmgenet_fixed_phy_link_update()
fixed_mdio_read()
mdiobus_read()
genphy_suspend()
phy_suspend()
phy_detach()
bcmgenet_close()
Looking at phy_detach() code, it does:
phydev->attached_dev->phydev = NULL;
phydev->attached_dev = NULL;
phy_suspend(phydev);
bcmgenet_fixed_phy_link_update() needs to check its function parameters
more carefully before doing anything.
Change-Id: Ic3b888c1cdc4cd9b88fd093a048bfcc856e6809b
diff --git a/drivers/net/ethernet/broadcom/genet/bcmmii.c b/drivers/net/ethernet/broadcom/genet/bcmmii.c
index 21f2170..321d401 100644
--- a/drivers/net/ethernet/broadcom/genet/bcmmii.c
+++ b/drivers/net/ethernet/broadcom/genet/bcmmii.c
@@ -454,11 +454,8 @@
static int bcmgenet_fixed_phy_link_update(struct net_device *dev,
struct fixed_phy_status *status)
{
- struct bcmgenet_priv *priv = netdev_priv(dev);
- struct phy_device *phydev = priv->phydev;
-
- if (phydev)
- status->link = !!phydev->link;
+ if (dev && dev->phydev && status)
+ status->link = !!dev->phydev->link;
return 0;
}