aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBruce Allan <bruce.w.allan@intel.com>2011-10-10 12:46:29 -0400
committerHerton Ronaldo Krzesinski <herton.krzesinski@canonical.com>2011-10-17 13:33:27 -0400
commit61e41dfb427baedb3813dae0e70dd2131177c6ad (patch)
tree1d125e120e79be21a95149a9cbaabc1f45d5fa03
parente4825dfaadb9eeb46517785231eca5454f19a24c (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.c19
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
1636out: 1645out: