phy: fix phy_id detection also for broken hardware.
authorGiuseppe Cavallaro <peppe.cavallaro@st.com>
Fri, 21 Nov 2008 04:43:18 +0000 (20:43 -0800)
committerDavid S. Miller <davem@davemloft.net>
Fri, 21 Nov 2008 04:43:18 +0000 (20:43 -0800)
This patch fixes the case when the phy_ids is mostly Fs and in some case 0x0
due to broken hardware.

Signed-off-by: Giuseppe Cavallaro <peppe.cavallaro@st.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/phy/phy_device.c

index 55bc24b234e324899b444298aeb37c847c8a9ba0..25acbbde4a6009f9c34926c0e2f89ca4e8066d6e 100644 (file)
@@ -227,8 +227,17 @@ struct phy_device * get_phy_device(struct mii_bus *bus, int addr)
        if (r)
                return ERR_PTR(r);
 
-       /* If the phy_id is all Fs or all 0s, there is no device there */
-       if ((0xffff == phy_id) || (0x00 == phy_id))
+       /* If the phy_id is mostly Fs, there is no device there */
+       if ((phy_id & 0x1fffffff) == 0x1fffffff)
+               return NULL;
+
+       /*
+        * Broken hardware is sometimes missing the pull down resistor on the
+        * MDIO line, which results in reads to non-existent devices returning
+        * 0 rather than 0xffff. Catch this here and treat 0 as a non-existent
+        * device as well.
+        */
+       if (phy_id == 0)
                return NULL;
 
        dev = phy_device_create(bus, addr, phy_id);