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>
        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 */
 
 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;
 }