diff options
author | Bruce Allan <bruce.w.allan@intel.com> | 2009-12-02 17:02:43 +0000 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2009-12-02 19:57:17 -0800 |
commit | 5eb6f3c70fcc0fb19b9087863e6e29f96a76f3bd (patch) | |
tree | 53b19370657a6af448f5b82d2bcef9f4fb79f2c1 /drivers/net/e1000e/phy.c | |
parent | 94e5b651595a8eb77665787f7559a6a7c916c195 (diff) | |
download | kernel_samsung_smdk4412-5eb6f3c70fcc0fb19b9087863e6e29f96a76f3bd.zip kernel_samsung_smdk4412-5eb6f3c70fcc0fb19b9087863e6e29f96a76f3bd.tar.gz kernel_samsung_smdk4412-5eb6f3c70fcc0fb19b9087863e6e29f96a76f3bd.tar.bz2 |
e1000e: refactor PHY ID detection workaround
The workaround that detects the correct PHY ID when an initial read of the
PHY ID registers returns an invalid one should retry up to ten times with
a small delay between attempts using a single PHY address and then repeat
using the remaining possible PHY addresses. Do this instead of trying each
possible PHY address repeating that up to 100 times.
Signed-off-by: Bruce Allan <bruce.w.allan@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/e1000e/phy.c')
-rw-r--r-- | drivers/net/e1000e/phy.c | 26 |
1 files changed, 16 insertions, 10 deletions
diff --git a/drivers/net/e1000e/phy.c b/drivers/net/e1000e/phy.c index 0c69649..67a7188 100644 --- a/drivers/net/e1000e/phy.c +++ b/drivers/net/e1000e/phy.c @@ -2197,28 +2197,34 @@ enum e1000_phy_type e1000e_get_phy_type_from_id(u32 phy_id) s32 e1000e_determine_phy_address(struct e1000_hw *hw) { s32 ret_val = -E1000_ERR_PHY_TYPE; - u32 phy_addr= 0; - u32 i = 0; + u32 phy_addr = 0; + u32 i; enum e1000_phy_type phy_type = e1000_phy_unknown; - do { - for (phy_addr = 0; phy_addr < 4; phy_addr++) { - hw->phy.addr = phy_addr; + hw->phy.id = phy_type; + + for (phy_addr = 0; phy_addr < E1000_MAX_PHY_ADDR; phy_addr++) { + hw->phy.addr = phy_addr; + i = 0; + + do { e1000e_get_phy_id(hw); phy_type = e1000e_get_phy_type_from_id(hw->phy.id); - /* + /* * If phy_type is valid, break - we found our * PHY address */ if (phy_type != e1000_phy_unknown) { ret_val = 0; - break; + goto out; } - } - i++; - } while ((ret_val != 0) && (i < 100)); + msleep(1); + i++; + } while (i < 10); + } +out: return ret_val; } |