diff options
author | Bruce Allan <bruce.w.allan@intel.com> | 2011-10-10 12:46:29 -0400 |
---|---|---|
committer | Herton Ronaldo Krzesinski <herton.krzesinski@canonical.com> | 2011-10-17 13:33:27 -0400 |
commit | 61e41dfb427baedb3813dae0e70dd2131177c6ad (patch) | |
tree | 1d125e120e79be21a95149a9cbaabc1f45d5fa03 | |
parent | e4825dfaadb9eeb46517785231eca5454f19a24c (diff) |
e1000e: workaround for packet drop on 82579 at 100Mbps
BugLink: http://bugs.launchpad.net/bugs/870127
The MAC can drop short packets when the PHY detects noise on the line at
100Mbps due to a timing issue. Workaround the issue by increasing the PLL
counter so the PHY properly recognizes the synchronization pattern from the
MAC.
Signed-off-by: Bruce Allan <bruce.w.allan@intel.com>
Tested-by: Jeff Pieper <jeffrey.e.pieper@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
(cherry picked from commit 0ed013e28fe853244f4972cf18d8e2bd62eeb8fc)
Signed-off-by: Leann Ogasawara <leann.ogasawara@canonical.com>
Acked-by: Stefan Bader <stefan.bader@canonical.com>
Signed-off-by: Tim Gardner <tim.gardner@canonical.com>
-rw-r--r-- | drivers/net/e1000e/ich8lan.c | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/drivers/net/e1000e/ich8lan.c b/drivers/net/e1000e/ich8lan.c index 3369d1f6a39..ee77b94834d 100644 --- a/drivers/net/e1000e/ich8lan.c +++ b/drivers/net/e1000e/ich8lan.c | |||
@@ -137,8 +137,9 @@ | |||
137 | #define HV_PM_CTRL PHY_REG(770, 17) | 137 | #define HV_PM_CTRL PHY_REG(770, 17) |
138 | 138 | ||
139 | /* PHY Low Power Idle Control */ | 139 | /* PHY Low Power Idle Control */ |
140 | #define I82579_LPI_CTRL PHY_REG(772, 20) | 140 | #define I82579_LPI_CTRL PHY_REG(772, 20) |
141 | #define I82579_LPI_CTRL_ENABLE_MASK 0x6000 | 141 | #define I82579_LPI_CTRL_ENABLE_MASK 0x6000 |
142 | #define I82579_LPI_CTRL_FORCE_PLL_LOCK_COUNT 0x80 | ||
142 | 143 | ||
143 | /* EMI Registers */ | 144 | /* EMI Registers */ |
144 | #define I82579_EMI_ADDR 0x10 | 145 | #define I82579_EMI_ADDR 0x10 |
@@ -1611,6 +1612,7 @@ static s32 e1000_k1_workaround_lv(struct e1000_hw *hw) | |||
1611 | s32 ret_val = 0; | 1612 | s32 ret_val = 0; |
1612 | u16 status_reg = 0; | 1613 | u16 status_reg = 0; |
1613 | u32 mac_reg; | 1614 | u32 mac_reg; |
1615 | u16 phy_reg; | ||
1614 | 1616 | ||
1615 | if (hw->mac.type != e1000_pch2lan) | 1617 | if (hw->mac.type != e1000_pch2lan) |
1616 | goto out; | 1618 | goto out; |
@@ -1625,12 +1627,19 @@ static s32 e1000_k1_workaround_lv(struct e1000_hw *hw) | |||
1625 | mac_reg = er32(FEXTNVM4); | 1627 | mac_reg = er32(FEXTNVM4); |
1626 | mac_reg &= ~E1000_FEXTNVM4_BEACON_DURATION_MASK; | 1628 | mac_reg &= ~E1000_FEXTNVM4_BEACON_DURATION_MASK; |
1627 | 1629 | ||
1628 | if (status_reg & HV_M_STATUS_SPEED_1000) | 1630 | ret_val = e1e_rphy(hw, I82579_LPI_CTRL, &phy_reg); |
1631 | if (ret_val) | ||
1632 | goto out; | ||
1633 | |||
1634 | if (status_reg & HV_M_STATUS_SPEED_1000) { | ||
1629 | mac_reg |= E1000_FEXTNVM4_BEACON_DURATION_8USEC; | 1635 | mac_reg |= E1000_FEXTNVM4_BEACON_DURATION_8USEC; |
1630 | else | 1636 | phy_reg &= ~I82579_LPI_CTRL_FORCE_PLL_LOCK_COUNT; |
1637 | } else { | ||
1631 | mac_reg |= E1000_FEXTNVM4_BEACON_DURATION_16USEC; | 1638 | mac_reg |= E1000_FEXTNVM4_BEACON_DURATION_16USEC; |
1632 | 1639 | phy_reg |= I82579_LPI_CTRL_FORCE_PLL_LOCK_COUNT; | |
1640 | } | ||
1633 | ew32(FEXTNVM4, mac_reg); | 1641 | ew32(FEXTNVM4, mac_reg); |
1642 | ret_val = e1e_wphy(hw, I82579_LPI_CTRL, phy_reg); | ||
1634 | } | 1643 | } |
1635 | 1644 | ||
1636 | out: | 1645 | out: |