aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/intel/e1000e/ich8lan.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/ethernet/intel/e1000e/ich8lan.c')
-rw-r--r--drivers/net/ethernet/intel/e1000e/ich8lan.c31
1 files changed, 12 insertions, 19 deletions
diff --git a/drivers/net/ethernet/intel/e1000e/ich8lan.c b/drivers/net/ethernet/intel/e1000e/ich8lan.c
index 9866f264f55e..9b736b8625ae 100644
--- a/drivers/net/ethernet/intel/e1000e/ich8lan.c
+++ b/drivers/net/ethernet/intel/e1000e/ich8lan.c
@@ -2493,51 +2493,44 @@ release:
2493 * e1000_k1_gig_workaround_lv - K1 Si workaround 2493 * e1000_k1_gig_workaround_lv - K1 Si workaround
2494 * @hw: pointer to the HW structure 2494 * @hw: pointer to the HW structure
2495 * 2495 *
2496 * Workaround to set the K1 beacon duration for 82579 parts 2496 * Workaround to set the K1 beacon duration for 82579 parts in 10Mbps
2497 * Disable K1 in 1000Mbps and 100Mbps
2497 **/ 2498 **/
2498static s32 e1000_k1_workaround_lv(struct e1000_hw *hw) 2499static s32 e1000_k1_workaround_lv(struct e1000_hw *hw)
2499{ 2500{
2500 s32 ret_val = 0; 2501 s32 ret_val = 0;
2501 u16 status_reg = 0; 2502 u16 status_reg = 0;
2502 u32 mac_reg;
2503 u16 phy_reg;
2504 2503
2505 if (hw->mac.type != e1000_pch2lan) 2504 if (hw->mac.type != e1000_pch2lan)
2506 return 0; 2505 return 0;
2507 2506
2508 /* Set K1 beacon duration based on 1Gbps speed or otherwise */ 2507 /* Set K1 beacon duration based on 10Mbs speed */
2509 ret_val = e1e_rphy(hw, HV_M_STATUS, &status_reg); 2508 ret_val = e1e_rphy(hw, HV_M_STATUS, &status_reg);
2510 if (ret_val) 2509 if (ret_val)
2511 return ret_val; 2510 return ret_val;
2512 2511
2513 if ((status_reg & (HV_M_STATUS_LINK_UP | HV_M_STATUS_AUTONEG_COMPLETE)) 2512 if ((status_reg & (HV_M_STATUS_LINK_UP | HV_M_STATUS_AUTONEG_COMPLETE))
2514 == (HV_M_STATUS_LINK_UP | HV_M_STATUS_AUTONEG_COMPLETE)) { 2513 == (HV_M_STATUS_LINK_UP | HV_M_STATUS_AUTONEG_COMPLETE)) {
2515 mac_reg = er32(FEXTNVM4); 2514 if (status_reg &
2516 mac_reg &= ~E1000_FEXTNVM4_BEACON_DURATION_MASK; 2515 (HV_M_STATUS_SPEED_1000 | HV_M_STATUS_SPEED_100)) {
2517
2518 ret_val = e1e_rphy(hw, I82579_LPI_CTRL, &phy_reg);
2519 if (ret_val)
2520 return ret_val;
2521
2522 if (status_reg & HV_M_STATUS_SPEED_1000) {
2523 u16 pm_phy_reg; 2516 u16 pm_phy_reg;
2524 2517
2525 mac_reg |= E1000_FEXTNVM4_BEACON_DURATION_8USEC; 2518 /* LV 1G/100 Packet drop issue wa */
2526 phy_reg &= ~I82579_LPI_CTRL_FORCE_PLL_LOCK_COUNT;
2527 /* LV 1G Packet drop issue wa */
2528 ret_val = e1e_rphy(hw, HV_PM_CTRL, &pm_phy_reg); 2519 ret_val = e1e_rphy(hw, HV_PM_CTRL, &pm_phy_reg);
2529 if (ret_val) 2520 if (ret_val)
2530 return ret_val; 2521 return ret_val;
2531 pm_phy_reg &= ~HV_PM_CTRL_PLL_STOP_IN_K1_GIGA; 2522 pm_phy_reg &= ~HV_PM_CTRL_K1_ENABLE;
2532 ret_val = e1e_wphy(hw, HV_PM_CTRL, pm_phy_reg); 2523 ret_val = e1e_wphy(hw, HV_PM_CTRL, pm_phy_reg);
2533 if (ret_val) 2524 if (ret_val)
2534 return ret_val; 2525 return ret_val;
2535 } else { 2526 } else {
2527 u32 mac_reg;
2528
2529 mac_reg = er32(FEXTNVM4);
2530 mac_reg &= ~E1000_FEXTNVM4_BEACON_DURATION_MASK;
2536 mac_reg |= E1000_FEXTNVM4_BEACON_DURATION_16USEC; 2531 mac_reg |= E1000_FEXTNVM4_BEACON_DURATION_16USEC;
2537 phy_reg |= I82579_LPI_CTRL_FORCE_PLL_LOCK_COUNT; 2532 ew32(FEXTNVM4, mac_reg);
2538 } 2533 }
2539 ew32(FEXTNVM4, mac_reg);
2540 ret_val = e1e_wphy(hw, I82579_LPI_CTRL, phy_reg);
2541 } 2534 }
2542 2535
2543 return ret_val; 2536 return ret_val;