diff options
author | Bruce Allan <bruce.w.allan@intel.com> | 2009-11-20 18:24:11 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2009-11-21 14:33:58 -0500 |
commit | bb436b20fe0ea4231a233aae7f0f7de3a3f2f5c3 (patch) | |
tree | 168d6084a2d2352c7236d13a4b2d9b1db37051d3 /drivers/net/e1000e | |
parent | 98086a954a75152f8b09c131fa443205bae5fde1 (diff) |
e1000e: disable K1 on PCH LOM when in PHY loopback mode
When performing the ethtool PHY loopback test on PCH-based LOMs (82577 and
82578), disable K1 (a MAC-PHY interconnect low power mode) otherwise
packets might get corrupted.
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')
-rw-r--r-- | drivers/net/e1000e/e1000.h | 1 | ||||
-rw-r--r-- | drivers/net/e1000e/ethtool.c | 4 | ||||
-rw-r--r-- | drivers/net/e1000e/ich8lan.c | 3 |
3 files changed, 6 insertions, 2 deletions
diff --git a/drivers/net/e1000e/e1000.h b/drivers/net/e1000e/e1000.h index 00989c5534c1..a6c68039e8d9 100644 --- a/drivers/net/e1000e/e1000.h +++ b/drivers/net/e1000e/e1000.h | |||
@@ -485,6 +485,7 @@ extern void e1000e_set_kmrn_lock_loss_workaround_ich8lan(struct e1000_hw *hw, | |||
485 | extern void e1000e_igp3_phy_powerdown_workaround_ich8lan(struct e1000_hw *hw); | 485 | extern void e1000e_igp3_phy_powerdown_workaround_ich8lan(struct e1000_hw *hw); |
486 | extern void e1000e_gig_downshift_workaround_ich8lan(struct e1000_hw *hw); | 486 | extern void e1000e_gig_downshift_workaround_ich8lan(struct e1000_hw *hw); |
487 | extern void e1000e_disable_gig_wol_ich8lan(struct e1000_hw *hw); | 487 | extern void e1000e_disable_gig_wol_ich8lan(struct e1000_hw *hw); |
488 | extern s32 e1000_configure_k1_ich8lan(struct e1000_hw *hw, bool k1_enable); | ||
488 | 489 | ||
489 | extern s32 e1000e_check_for_copper_link(struct e1000_hw *hw); | 490 | extern s32 e1000e_check_for_copper_link(struct e1000_hw *hw); |
490 | extern s32 e1000e_check_for_fiber_link(struct e1000_hw *hw); | 491 | extern s32 e1000e_check_for_fiber_link(struct e1000_hw *hw); |
diff --git a/drivers/net/e1000e/ethtool.c b/drivers/net/e1000e/ethtool.c index 67e06fd9fc45..fd7921482d2b 100644 --- a/drivers/net/e1000e/ethtool.c +++ b/drivers/net/e1000e/ethtool.c | |||
@@ -1260,6 +1260,10 @@ static int e1000_integrated_phy_loopback(struct e1000_adapter *adapter) | |||
1260 | 1260 | ||
1261 | hw->mac.autoneg = 0; | 1261 | hw->mac.autoneg = 0; |
1262 | 1262 | ||
1263 | /* Workaround: K1 must be disabled for stable 1Gbps operation */ | ||
1264 | if (hw->mac.type == e1000_pchlan) | ||
1265 | e1000_configure_k1_ich8lan(hw, false); | ||
1266 | |||
1263 | if (hw->phy.type == e1000_phy_m88) { | 1267 | if (hw->phy.type == e1000_phy_m88) { |
1264 | /* Auto-MDI/MDIX Off */ | 1268 | /* Auto-MDI/MDIX Off */ |
1265 | e1e_wphy(hw, M88E1000_PHY_SPEC_CTRL, 0x0808); | 1269 | e1e_wphy(hw, M88E1000_PHY_SPEC_CTRL, 0x0808); |
diff --git a/drivers/net/e1000e/ich8lan.c b/drivers/net/e1000e/ich8lan.c index 51ddb04ab195..bd9002e72cb6 100644 --- a/drivers/net/e1000e/ich8lan.c +++ b/drivers/net/e1000e/ich8lan.c | |||
@@ -224,7 +224,6 @@ static s32 e1000_led_off_pchlan(struct e1000_hw *hw); | |||
224 | static s32 e1000_set_lplu_state_pchlan(struct e1000_hw *hw, bool active); | 224 | static s32 e1000_set_lplu_state_pchlan(struct e1000_hw *hw, bool active); |
225 | static void e1000_lan_init_done_ich8lan(struct e1000_hw *hw); | 225 | static void e1000_lan_init_done_ich8lan(struct e1000_hw *hw); |
226 | static s32 e1000_k1_gig_workaround_hv(struct e1000_hw *hw, bool link); | 226 | static s32 e1000_k1_gig_workaround_hv(struct e1000_hw *hw, bool link); |
227 | static s32 e1000_configure_k1_ich8lan(struct e1000_hw *hw, bool k1_enable); | ||
228 | 227 | ||
229 | static inline u16 __er16flash(struct e1000_hw *hw, unsigned long reg) | 228 | static inline u16 __er16flash(struct e1000_hw *hw, unsigned long reg) |
230 | { | 229 | { |
@@ -1023,7 +1022,7 @@ out: | |||
1023 | * | 1022 | * |
1024 | * Success returns 0, Failure returns -E1000_ERR_PHY (-2) | 1023 | * Success returns 0, Failure returns -E1000_ERR_PHY (-2) |
1025 | **/ | 1024 | **/ |
1026 | static s32 e1000_configure_k1_ich8lan(struct e1000_hw *hw, bool k1_enable) | 1025 | s32 e1000_configure_k1_ich8lan(struct e1000_hw *hw, bool k1_enable) |
1027 | { | 1026 | { |
1028 | s32 ret_val = 0; | 1027 | s32 ret_val = 0; |
1029 | u32 ctrl_reg = 0; | 1028 | u32 ctrl_reg = 0; |