aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'drivers')
-rw-r--r--drivers/net/e1000e/ich8lan.c12
-rw-r--r--drivers/net/e1000e/netdev.c29
2 files changed, 20 insertions, 21 deletions
diff --git a/drivers/net/e1000e/ich8lan.c b/drivers/net/e1000e/ich8lan.c
index 89b1e1aea526..bb346ae3d9a0 100644
--- a/drivers/net/e1000e/ich8lan.c
+++ b/drivers/net/e1000e/ich8lan.c
@@ -1475,10 +1475,6 @@ s32 e1000_lv_jumbo_workaround_ich8lan(struct e1000_hw *hw, bool enable)
1475 goto out; 1475 goto out;
1476 1476
1477 /* Enable jumbo frame workaround in the PHY */ 1477 /* Enable jumbo frame workaround in the PHY */
1478 e1e_rphy(hw, PHY_REG(769, 20), &data);
1479 ret_val = e1e_wphy(hw, PHY_REG(769, 20), data & ~(1 << 14));
1480 if (ret_val)
1481 goto out;
1482 e1e_rphy(hw, PHY_REG(769, 23), &data); 1478 e1e_rphy(hw, PHY_REG(769, 23), &data);
1483 data &= ~(0x7F << 5); 1479 data &= ~(0x7F << 5);
1484 data |= (0x37 << 5); 1480 data |= (0x37 << 5);
@@ -1487,7 +1483,6 @@ s32 e1000_lv_jumbo_workaround_ich8lan(struct e1000_hw *hw, bool enable)
1487 goto out; 1483 goto out;
1488 e1e_rphy(hw, PHY_REG(769, 16), &data); 1484 e1e_rphy(hw, PHY_REG(769, 16), &data);
1489 data &= ~(1 << 13); 1485 data &= ~(1 << 13);
1490 data |= (1 << 12);
1491 ret_val = e1e_wphy(hw, PHY_REG(769, 16), data); 1486 ret_val = e1e_wphy(hw, PHY_REG(769, 16), data);
1492 if (ret_val) 1487 if (ret_val)
1493 goto out; 1488 goto out;
@@ -1512,7 +1507,7 @@ s32 e1000_lv_jumbo_workaround_ich8lan(struct e1000_hw *hw, bool enable)
1512 1507
1513 mac_reg = er32(RCTL); 1508 mac_reg = er32(RCTL);
1514 mac_reg &= ~E1000_RCTL_SECRC; 1509 mac_reg &= ~E1000_RCTL_SECRC;
1515 ew32(FFLT_DBG, mac_reg); 1510 ew32(RCTL, mac_reg);
1516 1511
1517 ret_val = e1000e_read_kmrn_reg(hw, 1512 ret_val = e1000e_read_kmrn_reg(hw,
1518 E1000_KMRNCTRLSTA_CTRL_OFFSET, 1513 E1000_KMRNCTRLSTA_CTRL_OFFSET,
@@ -1538,17 +1533,12 @@ s32 e1000_lv_jumbo_workaround_ich8lan(struct e1000_hw *hw, bool enable)
1538 goto out; 1533 goto out;
1539 1534
1540 /* Write PHY register values back to h/w defaults */ 1535 /* Write PHY register values back to h/w defaults */
1541 e1e_rphy(hw, PHY_REG(769, 20), &data);
1542 ret_val = e1e_wphy(hw, PHY_REG(769, 20), data & ~(1 << 14));
1543 if (ret_val)
1544 goto out;
1545 e1e_rphy(hw, PHY_REG(769, 23), &data); 1536 e1e_rphy(hw, PHY_REG(769, 23), &data);
1546 data &= ~(0x7F << 5); 1537 data &= ~(0x7F << 5);
1547 ret_val = e1e_wphy(hw, PHY_REG(769, 23), data); 1538 ret_val = e1e_wphy(hw, PHY_REG(769, 23), data);
1548 if (ret_val) 1539 if (ret_val)
1549 goto out; 1540 goto out;
1550 e1e_rphy(hw, PHY_REG(769, 16), &data); 1541 e1e_rphy(hw, PHY_REG(769, 16), &data);
1551 data &= ~(1 << 12);
1552 data |= (1 << 13); 1542 data |= (1 << 13);
1553 ret_val = e1e_wphy(hw, PHY_REG(769, 16), data); 1543 ret_val = e1e_wphy(hw, PHY_REG(769, 16), data);
1554 if (ret_val) 1544 if (ret_val)
diff --git a/drivers/net/e1000e/netdev.c b/drivers/net/e1000e/netdev.c
index 2b8ef44bd2b1..e561d15c3eb1 100644
--- a/drivers/net/e1000e/netdev.c
+++ b/drivers/net/e1000e/netdev.c
@@ -2704,6 +2704,16 @@ static void e1000_setup_rctl(struct e1000_adapter *adapter)
2704 u32 psrctl = 0; 2704 u32 psrctl = 0;
2705 u32 pages = 0; 2705 u32 pages = 0;
2706 2706
2707 /* Workaround Si errata on 82579 - configure jumbo frame flow */
2708 if (hw->mac.type == e1000_pch2lan) {
2709 s32 ret_val;
2710
2711 if (adapter->netdev->mtu > ETH_DATA_LEN)
2712 ret_val = e1000_lv_jumbo_workaround_ich8lan(hw, true);
2713 else
2714 ret_val = e1000_lv_jumbo_workaround_ich8lan(hw, false);
2715 }
2716
2707 /* Program MC offset vector base */ 2717 /* Program MC offset vector base */
2708 rctl = er32(RCTL); 2718 rctl = er32(RCTL);
2709 rctl &= ~(3 << E1000_RCTL_MO_SHIFT); 2719 rctl &= ~(3 << E1000_RCTL_MO_SHIFT);
@@ -2744,16 +2754,6 @@ static void e1000_setup_rctl(struct e1000_adapter *adapter)
2744 e1e_wphy(hw, 22, phy_data); 2754 e1e_wphy(hw, 22, phy_data);
2745 } 2755 }
2746 2756
2747 /* Workaround Si errata on 82579 - configure jumbo frame flow */
2748 if (hw->mac.type == e1000_pch2lan) {
2749 s32 ret_val;
2750
2751 if (rctl & E1000_RCTL_LPE)
2752 ret_val = e1000_lv_jumbo_workaround_ich8lan(hw, true);
2753 else
2754 ret_val = e1000_lv_jumbo_workaround_ich8lan(hw, false);
2755 }
2756
2757 /* Setup buffer sizes */ 2757 /* Setup buffer sizes */
2758 rctl &= ~E1000_RCTL_SZ_4096; 2758 rctl &= ~E1000_RCTL_SZ_4096;
2759 rctl |= E1000_RCTL_BSEX; 2759 rctl |= E1000_RCTL_BSEX;
@@ -4833,6 +4833,15 @@ static int e1000_change_mtu(struct net_device *netdev, int new_mtu)
4833 return -EINVAL; 4833 return -EINVAL;
4834 } 4834 }
4835 4835
4836 /* Jumbo frame workaround on 82579 requires CRC be stripped */
4837 if ((adapter->hw.mac.type == e1000_pch2lan) &&
4838 !(adapter->flags2 & FLAG2_CRC_STRIPPING) &&
4839 (new_mtu > ETH_DATA_LEN)) {
4840 e_err("Jumbo Frames not supported on 82579 when CRC "
4841 "stripping is disabled.\n");
4842 return -EINVAL;
4843 }
4844
4836 /* 82573 Errata 17 */ 4845 /* 82573 Errata 17 */
4837 if (((adapter->hw.mac.type == e1000_82573) || 4846 if (((adapter->hw.mac.type == e1000_82573) ||
4838 (adapter->hw.mac.type == e1000_82574)) && 4847 (adapter->hw.mac.type == e1000_82574)) &&