summaryrefslogtreecommitdiffstats
path: root/drivers/net
diff options
context:
space:
mode:
authorGiuseppe Cavallaro <peppe.cavallaro@st.com>2008-11-20 20:43:18 -0800
committerDavid S. Miller <davem@davemloft.net>2008-11-20 20:43:18 -0800
commit6436cbcd735a11fc93bf3353c68914bc545e6d1e (patch)
tree94aa2423de352bdabeb0b6f35d27fc6eb8bf422d /drivers/net
parent75e07fc3d87ba9b3255e1fcd735186a533ea0754 (diff)
downloadop-kernel-dev-6436cbcd735a11fc93bf3353c68914bc545e6d1e.zip
op-kernel-dev-6436cbcd735a11fc93bf3353c68914bc545e6d1e.tar.gz
phy: fix phy_id detection also for broken hardware.
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>
Diffstat (limited to 'drivers/net')
-rw-r--r--drivers/net/phy/phy_device.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/drivers/net/phy/phy_device.c b/drivers/net/phy/phy_device.c
index 55bc24b2..25acbbd 100644
--- a/drivers/net/phy/phy_device.c
+++ b/drivers/net/phy/phy_device.c
@@ -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);
OpenPOWER on IntegriCloud