diff options
Diffstat (limited to 'drivers/net/e1000e/ich8lan.c')
-rw-r--r-- | drivers/net/e1000e/ich8lan.c | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/drivers/net/e1000e/ich8lan.c b/drivers/net/e1000e/ich8lan.c index 6f9cb0d44d3a..89b1e1aea526 100644 --- a/drivers/net/e1000e/ich8lan.c +++ b/drivers/net/e1000e/ich8lan.c | |||
@@ -105,6 +105,10 @@ | |||
105 | #define E1000_FEXTNVM_SW_CONFIG 1 | 105 | #define E1000_FEXTNVM_SW_CONFIG 1 |
106 | #define E1000_FEXTNVM_SW_CONFIG_ICH8M (1 << 27) /* Bit redefined for ICH8M :/ */ | 106 | #define E1000_FEXTNVM_SW_CONFIG_ICH8M (1 << 27) /* Bit redefined for ICH8M :/ */ |
107 | 107 | ||
108 | #define E1000_FEXTNVM4_BEACON_DURATION_MASK 0x7 | ||
109 | #define E1000_FEXTNVM4_BEACON_DURATION_8USEC 0x7 | ||
110 | #define E1000_FEXTNVM4_BEACON_DURATION_16USEC 0x3 | ||
111 | |||
108 | #define PCIE_ICH8_SNOOP_ALL PCIE_NO_SNOOP_ALL | 112 | #define PCIE_ICH8_SNOOP_ALL PCIE_NO_SNOOP_ALL |
109 | 113 | ||
110 | #define E1000_ICH_RAR_ENTRIES 7 | 114 | #define E1000_ICH_RAR_ENTRIES 7 |
@@ -238,6 +242,7 @@ static s32 e1000_k1_gig_workaround_hv(struct e1000_hw *hw, bool link); | |||
238 | static s32 e1000_set_mdio_slow_mode_hv(struct e1000_hw *hw); | 242 | static s32 e1000_set_mdio_slow_mode_hv(struct e1000_hw *hw); |
239 | static bool e1000_check_mng_mode_ich8lan(struct e1000_hw *hw); | 243 | static bool e1000_check_mng_mode_ich8lan(struct e1000_hw *hw); |
240 | static bool e1000_check_mng_mode_pchlan(struct e1000_hw *hw); | 244 | static bool e1000_check_mng_mode_pchlan(struct e1000_hw *hw); |
245 | static s32 e1000_k1_workaround_lv(struct e1000_hw *hw); | ||
241 | 246 | ||
242 | static inline u16 __er16flash(struct e1000_hw *hw, unsigned long reg) | 247 | static inline u16 __er16flash(struct e1000_hw *hw, unsigned long reg) |
243 | { | 248 | { |
@@ -653,6 +658,12 @@ static s32 e1000_check_for_copper_link_ich8lan(struct e1000_hw *hw) | |||
653 | goto out; | 658 | goto out; |
654 | } | 659 | } |
655 | 660 | ||
661 | if (hw->mac.type == e1000_pch2lan) { | ||
662 | ret_val = e1000_k1_workaround_lv(hw); | ||
663 | if (ret_val) | ||
664 | goto out; | ||
665 | } | ||
666 | |||
656 | /* | 667 | /* |
657 | * Check if there was DownShift, must be checked | 668 | * Check if there was DownShift, must be checked |
658 | * immediately after link-up | 669 | * immediately after link-up |
@@ -1583,6 +1594,43 @@ out: | |||
1583 | } | 1594 | } |
1584 | 1595 | ||
1585 | /** | 1596 | /** |
1597 | * e1000_k1_gig_workaround_lv - K1 Si workaround | ||
1598 | * @hw: pointer to the HW structure | ||
1599 | * | ||
1600 | * Workaround to set the K1 beacon duration for 82579 parts | ||
1601 | **/ | ||
1602 | static s32 e1000_k1_workaround_lv(struct e1000_hw *hw) | ||
1603 | { | ||
1604 | s32 ret_val = 0; | ||
1605 | u16 status_reg = 0; | ||
1606 | u32 mac_reg; | ||
1607 | |||
1608 | if (hw->mac.type != e1000_pch2lan) | ||
1609 | goto out; | ||
1610 | |||
1611 | /* Set K1 beacon duration based on 1Gbps speed or otherwise */ | ||
1612 | ret_val = e1e_rphy(hw, HV_M_STATUS, &status_reg); | ||
1613 | if (ret_val) | ||
1614 | goto out; | ||
1615 | |||
1616 | if ((status_reg & (HV_M_STATUS_LINK_UP | HV_M_STATUS_AUTONEG_COMPLETE)) | ||
1617 | == (HV_M_STATUS_LINK_UP | HV_M_STATUS_AUTONEG_COMPLETE)) { | ||
1618 | mac_reg = er32(FEXTNVM4); | ||
1619 | mac_reg &= ~E1000_FEXTNVM4_BEACON_DURATION_MASK; | ||
1620 | |||
1621 | if (status_reg & HV_M_STATUS_SPEED_1000) | ||
1622 | mac_reg |= E1000_FEXTNVM4_BEACON_DURATION_8USEC; | ||
1623 | else | ||
1624 | mac_reg |= E1000_FEXTNVM4_BEACON_DURATION_16USEC; | ||
1625 | |||
1626 | ew32(FEXTNVM4, mac_reg); | ||
1627 | } | ||
1628 | |||
1629 | out: | ||
1630 | return ret_val; | ||
1631 | } | ||
1632 | |||
1633 | /** | ||
1586 | * e1000_lan_init_done_ich8lan - Check for PHY config completion | 1634 | * e1000_lan_init_done_ich8lan - Check for PHY config completion |
1587 | * @hw: pointer to the HW structure | 1635 | * @hw: pointer to the HW structure |
1588 | * | 1636 | * |