phy: fix create_phy_by_mask for when its given an actual search mask
authorCormier, Jonathan <jcormier@criticallink.com>
Wed, 21 May 2014 17:08:52 +0000 (13:08 -0400)
committerTom Rini <trini@ti.com>
Thu, 5 Jun 2014 18:44:56 +0000 (14:44 -0400)
get_phy_id returns -EIO when it can't read from a phy at a given addr.  This would cause
create_phy_by_mask to return prematurely before it had tested the other addresses in the provided mask.

Example usage:
Replace
    phydev = phy_connect(bus, phy_addr, dev, phy_if)
with
    phydev = phy_find_by_mask(bus, phy_mask, phy_if)
    if (phydev)
phy_connect_dev(phydev, dev);

Signed-off-by: Cormier, Jonathan <jcormier@criticallink.com>
Cc: Joe Hershberger <joe.hershberger@gmail.com>
drivers/net/phy/phy.c

index 230ed97dd12def5b6913b030150a17d80910a4dc..aac85c4d0927e16a9060e6971c55fe59504f0b97 100644 (file)
@@ -609,10 +609,8 @@ static struct phy_device *create_phy_by_mask(struct mii_dev *bus,
        while (phy_mask) {
                int addr = ffs(phy_mask) - 1;
                int r = get_phy_id(bus, addr, devad, &phy_id);
-               if (r < 0)
-                       return ERR_PTR(r);
                /* If the PHY ID is mostly f's, we didn't find anything */
-               if ((phy_id & 0x1fffffff) != 0x1fffffff)
+               if (r == 0 && (phy_id & 0x1fffffff) != 0x1fffffff)
                        return phy_device_create(bus, addr, phy_id, interface);
                phy_mask &= ~(1 << addr);
        }