diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/net/e1000e/ich8lan.c | 12 | ||||
-rw-r--r-- | drivers/net/e1000e/netdev.c | 29 |
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)) && |