diff options
| -rw-r--r-- | drivers/net/ethernet/intel/e1000e/ich8lan.c | 31 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/e1000e/phy.h | 1 |
2 files changed, 13 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; |
diff --git a/drivers/net/ethernet/intel/e1000e/phy.h b/drivers/net/ethernet/intel/e1000e/phy.h index 3841bccf058c..537d2780b408 100644 --- a/drivers/net/ethernet/intel/e1000e/phy.h +++ b/drivers/net/ethernet/intel/e1000e/phy.h | |||
| @@ -164,6 +164,7 @@ s32 e1000_get_cable_length_82577(struct e1000_hw *hw); | |||
| 164 | #define HV_M_STATUS_AUTONEG_COMPLETE 0x1000 | 164 | #define HV_M_STATUS_AUTONEG_COMPLETE 0x1000 |
| 165 | #define HV_M_STATUS_SPEED_MASK 0x0300 | 165 | #define HV_M_STATUS_SPEED_MASK 0x0300 |
| 166 | #define HV_M_STATUS_SPEED_1000 0x0200 | 166 | #define HV_M_STATUS_SPEED_1000 0x0200 |
| 167 | #define HV_M_STATUS_SPEED_100 0x0100 | ||
| 167 | #define HV_M_STATUS_LINK_UP 0x0040 | 168 | #define HV_M_STATUS_LINK_UP 0x0040 |
| 168 | 169 | ||
| 169 | #define IGP01E1000_PHY_PCS_INIT_REG 0x00B4 | 170 | #define IGP01E1000_PHY_PCS_INIT_REG 0x00B4 |
