diff options
author | Alexandre Belloni <alexandre.belloni@bootlin.com> | 2018-04-24 12:09:04 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2018-04-25 12:59:42 -0400 |
commit | 02a6efcab675fe32815d824837784c3f42a7d892 (patch) | |
tree | ee3c114159c833e170a405be27cf86b44b34396c /drivers | |
parent | 3be4aaf4e2d3eb95cce7835e8df797ae65ae5ac1 (diff) |
net: phy: allow scanning busses with missing phys
Some MDIO busses will error out when trying to read a phy address with no
phy present at that address. In that case, probing the bus will fail
because __mdiobus_register() is scanning the bus for all possible phys
addresses.
In case MII_PHYSID1 returns -EIO or -ENODEV, consider there is no phy at
this address and set the phy ID to 0xffffffff which is then properly
handled in get_phy_device().
Suggested-by: Andrew Lunn <andrew@lunn.ch>
Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/net/phy/phy_device.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/drivers/net/phy/phy_device.c b/drivers/net/phy/phy_device.c index ac23322a32e1..9e4ba8e80a18 100644 --- a/drivers/net/phy/phy_device.c +++ b/drivers/net/phy/phy_device.c | |||
@@ -535,8 +535,17 @@ static int get_phy_id(struct mii_bus *bus, int addr, u32 *phy_id, | |||
535 | 535 | ||
536 | /* Grab the bits from PHYIR1, and put them in the upper half */ | 536 | /* Grab the bits from PHYIR1, and put them in the upper half */ |
537 | phy_reg = mdiobus_read(bus, addr, MII_PHYSID1); | 537 | phy_reg = mdiobus_read(bus, addr, MII_PHYSID1); |
538 | if (phy_reg < 0) | 538 | if (phy_reg < 0) { |
539 | /* if there is no device, return without an error so scanning | ||
540 | * the bus works properly | ||
541 | */ | ||
542 | if (phy_reg == -EIO || phy_reg == -ENODEV) { | ||
543 | *phy_id = 0xffffffff; | ||
544 | return 0; | ||
545 | } | ||
546 | |||
539 | return -EIO; | 547 | return -EIO; |
548 | } | ||
540 | 549 | ||
541 | *phy_id = (phy_reg & 0xffff) << 16; | 550 | *phy_id = (phy_reg & 0xffff) << 16; |
542 | 551 | ||