e1000e: Resolve intermittent negotiation issue on 82574/82583.
authorMatthew Vick <matthew.vick@intel.com>
Wed, 25 Apr 2012 07:25:18 +0000 (07:25 +0000)
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>
Thu, 3 May 2012 09:26:48 +0000 (02:26 -0700)
For 82574 and 82583 devices, resolve an intermittent link issue where
the link negotiates to 100Mbps rather than 1Gbps when powering off the
PHY and powering on the PHY after several seconds.

Signed-off-by: Matthew Vick <matthew.vick@intel.com>
Tested-by: Aaron Brown <aaron.f.brown@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
drivers/net/ethernet/intel/e1000e/phy.c

index bd5ef64b300342ee41ee3c6b688c02e9bc135bdd..ad22b8c8abd22b5f5de1e6f94fa07ad63eaa1942 100644 (file)
@@ -722,8 +722,24 @@ s32 e1000e_copper_link_setup_m88(struct e1000_hw *hw)
                phy_data |= M88E1000_PSCR_POLARITY_REVERSAL;
 
        /* Enable downshift on BM (disabled by default) */
-       if (phy->type == e1000_phy_bm)
+       if (phy->type == e1000_phy_bm) {
+               /* For 82574/82583, first disable then enable downshift */
+               if (phy->id == BME1000_E_PHY_ID_R2) {
+                       phy_data &= ~BME1000_PSCR_ENABLE_DOWNSHIFT;
+                       ret_val = e1e_wphy(hw, M88E1000_PHY_SPEC_CTRL,
+                                          phy_data);
+                       if (ret_val)
+                               return ret_val;
+                       /* Commit the changes. */
+                       ret_val = e1000e_commit_phy(hw);
+                       if (ret_val) {
+                               e_dbg("Error committing the PHY changes\n");
+                               return ret_val;
+                       }
+               }
+
                phy_data |= BME1000_PSCR_ENABLE_DOWNSHIFT;
+       }
 
        ret_val = e1e_wphy(hw, M88E1000_PHY_SPEC_CTRL, phy_data);
        if (ret_val)