diff options
-rw-r--r-- | drivers/net/ethernet/intel/e1000e/ethtool.c | 27 |
1 files changed, 24 insertions, 3 deletions
diff --git a/drivers/net/ethernet/intel/e1000e/ethtool.c b/drivers/net/ethernet/intel/e1000e/ethtool.c index 11f486e4ff7b..c62f0db6dcb0 100644 --- a/drivers/net/ethernet/intel/e1000e/ethtool.c +++ b/drivers/net/ethernet/intel/e1000e/ethtool.c | |||
@@ -1516,8 +1516,19 @@ static int e1000_set_es2lan_mac_loopback(struct e1000_adapter *adapter) | |||
1516 | static int e1000_setup_loopback_test(struct e1000_adapter *adapter) | 1516 | static int e1000_setup_loopback_test(struct e1000_adapter *adapter) |
1517 | { | 1517 | { |
1518 | struct e1000_hw *hw = &adapter->hw; | 1518 | struct e1000_hw *hw = &adapter->hw; |
1519 | u32 rctl; | 1519 | u32 rctl, fext_nvm11, tarc0; |
1520 | 1520 | ||
1521 | if (hw->mac.type == e1000_pch_spt) { | ||
1522 | fext_nvm11 = er32(FEXTNVM11); | ||
1523 | fext_nvm11 |= E1000_FEXTNVM11_DISABLE_MULR_FIX; | ||
1524 | ew32(FEXTNVM11, fext_nvm11); | ||
1525 | tarc0 = er32(TARC(0)); | ||
1526 | /* clear bits 28 & 29 (control of MULR concurrent requests) */ | ||
1527 | tarc0 &= 0xcfffffff; | ||
1528 | /* set bit 29 (value of MULR requests is now 2) */ | ||
1529 | tarc0 |= 0x20000000; | ||
1530 | ew32(TARC(0), tarc0); | ||
1531 | } | ||
1521 | if (hw->phy.media_type == e1000_media_type_fiber || | 1532 | if (hw->phy.media_type == e1000_media_type_fiber || |
1522 | hw->phy.media_type == e1000_media_type_internal_serdes) { | 1533 | hw->phy.media_type == e1000_media_type_internal_serdes) { |
1523 | switch (hw->mac.type) { | 1534 | switch (hw->mac.type) { |
@@ -1542,7 +1553,7 @@ static int e1000_setup_loopback_test(struct e1000_adapter *adapter) | |||
1542 | static void e1000_loopback_cleanup(struct e1000_adapter *adapter) | 1553 | static void e1000_loopback_cleanup(struct e1000_adapter *adapter) |
1543 | { | 1554 | { |
1544 | struct e1000_hw *hw = &adapter->hw; | 1555 | struct e1000_hw *hw = &adapter->hw; |
1545 | u32 rctl; | 1556 | u32 rctl, fext_nvm11, tarc0; |
1546 | u16 phy_reg; | 1557 | u16 phy_reg; |
1547 | 1558 | ||
1548 | rctl = er32(RCTL); | 1559 | rctl = er32(RCTL); |
@@ -1550,6 +1561,16 @@ static void e1000_loopback_cleanup(struct e1000_adapter *adapter) | |||
1550 | ew32(RCTL, rctl); | 1561 | ew32(RCTL, rctl); |
1551 | 1562 | ||
1552 | switch (hw->mac.type) { | 1563 | switch (hw->mac.type) { |
1564 | case e1000_pch_spt: | ||
1565 | fext_nvm11 = er32(FEXTNVM11); | ||
1566 | fext_nvm11 &= ~E1000_FEXTNVM11_DISABLE_MULR_FIX; | ||
1567 | ew32(FEXTNVM11, fext_nvm11); | ||
1568 | tarc0 = er32(TARC(0)); | ||
1569 | /* clear bits 28 & 29 (control of MULR concurrent requests) */ | ||
1570 | /* set bit 29 (value of MULR requests is now 0) */ | ||
1571 | tarc0 &= 0xcfffffff; | ||
1572 | ew32(TARC(0), tarc0); | ||
1573 | /* fall through */ | ||
1553 | case e1000_80003es2lan: | 1574 | case e1000_80003es2lan: |
1554 | if (hw->phy.media_type == e1000_media_type_fiber || | 1575 | if (hw->phy.media_type == e1000_media_type_fiber || |
1555 | hw->phy.media_type == e1000_media_type_internal_serdes) { | 1576 | hw->phy.media_type == e1000_media_type_internal_serdes) { |