diff options
Diffstat (limited to 'drivers/net/ethernet/intel/e1000e/ich8lan.c')
-rw-r--r-- | drivers/net/ethernet/intel/e1000e/ich8lan.c | 31 |
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 | **/ |
2498 | static s32 e1000_k1_workaround_lv(struct e1000_hw *hw) | 2499 | static 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; |