aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/e1000e/ich8lan.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/e1000e/ich8lan.c')
-rw-r--r--drivers/net/e1000e/ich8lan.c48
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);
238static s32 e1000_set_mdio_slow_mode_hv(struct e1000_hw *hw); 242static s32 e1000_set_mdio_slow_mode_hv(struct e1000_hw *hw);
239static bool e1000_check_mng_mode_ich8lan(struct e1000_hw *hw); 243static bool e1000_check_mng_mode_ich8lan(struct e1000_hw *hw);
240static bool e1000_check_mng_mode_pchlan(struct e1000_hw *hw); 244static bool e1000_check_mng_mode_pchlan(struct e1000_hw *hw);
245static s32 e1000_k1_workaround_lv(struct e1000_hw *hw);
241 246
242static inline u16 __er16flash(struct e1000_hw *hw, unsigned long reg) 247static 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 **/
1602static 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
1629out:
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 *