mv643xx_eth: defer probing if Marvell Orion MDIO driver not loaded

When both the Marvell MV643XX ethernet driver and the Orion MDIO driver
are compiled as modules, the ethernet driver may be probed before the
MDIO driver.  Let mv643xx_eth_probe() return EPROBE_DEFER in this case,
i.e. when it cannot find the PHY.

Signed-off-by: Simon Baatz <gmbnomis@gmail.com>
Acked-by: Florian Fainelli <florian@openwrt.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Simon Baatz 2013-03-24 10:34:00 +00:00 committed by David S. Miller
parent 404b8bed14
commit 976c90b901
1 changed files with 9 additions and 3 deletions

View File

@ -2681,7 +2681,7 @@ static struct phy_device *phy_scan(struct mv643xx_eth_private *mp,
}
/* Attempt to connect to the PHY using orion-mdio */
phydev = NULL;
phydev = ERR_PTR(-ENODEV);
for (i = 0; i < num; i++) {
int addr = (start + i) & 0x1f;
@ -2812,11 +2812,17 @@ static int mv643xx_eth_probe(struct platform_device *pdev)
netif_set_real_num_tx_queues(dev, mp->txq_count);
netif_set_real_num_rx_queues(dev, mp->rxq_count);
if (pd->phy_addr != MV643XX_ETH_PHY_NONE)
if (pd->phy_addr != MV643XX_ETH_PHY_NONE) {
mp->phy = phy_scan(mp, pd->phy_addr);
if (mp->phy != NULL)
if (IS_ERR(mp->phy)) {
err = PTR_ERR(mp->phy);
if (err == -ENODEV)
err = -EPROBE_DEFER;
goto out;
}
phy_init(mp, pd->speed, pd->duplex);
}
SET_ETHTOOL_OPS(dev, &mv643xx_eth_ethtool_ops);