e1000e: refactor PHY ID detection workaround
Bruce Allan [Wed, 2 Dec 2009 17:02:43 +0000 (17:02 +0000)]
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>

drivers/net/e1000e/hw.h
drivers/net/e1000e/phy.c

index 41609d5..a7d08da 100644 (file)
@@ -219,7 +219,7 @@ enum e1e_registers {
        E1000_HICR      = 0x08F00, /* Host Interface Control */
 };
 
-/* RSS registers */
+#define E1000_MAX_PHY_ADDR             4
 
 /* IGP01E1000 Specific Registers */
 #define IGP01E1000_PHY_PORT_CONFIG     0x10 /* Port Config */
index 0c69649..67a7188 100644 (file)
@@ -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;
 }