diff options
author | David S. Miller <davem@davemloft.net> | 2013-04-26 23:33:41 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2013-04-26 23:33:41 -0400 |
commit | c39904a0ac22cf05f5f44226457f6da0fe65457e (patch) | |
tree | eda7488e1093465d1017de782956a95e65d195ae | |
parent | b38a54eaa0acc5991cbad93bf44b355aa43f6d6f (diff) | |
parent | c4a56de88c6cd9996fb5dc7576d6c4934b5e6465 (diff) |
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/jkirsher/net-next
Jeff Kirsher says:
====================
This series contains updates to e1000e, igb and ixgbe.
There are 2 patches in this series which could be applied to net,
but since Linus is so very close to releasing 3.9, I do not think
it prudent to try and push these into net at this time. I have CC'd
stable on these patches so that they can queue them up as soon as
3.9 gets released.
The 2 patches are:
e1000e: fix numeric overflow in phc settime method
ixgbe: fix EICR write in ixgbe_msix_other
Richard provides a fix for e1000e by using a helper function from time.h
to resolve a unintended overflow in the PTP settime function.
Bruce provides a fix to wait for NAPI to be done with the current context
after disabling interrupts and then disable NAPI when the interface
is going down. This fixes a possible "unable to handle kernel paging
request" panic in net-next.
Andi Kleen provides a patch for igb to use mdelay instead of udelay
when we needed 100000us.
Jacob provides a fix for ixgbe to simply mask the lower 16bits off so that
ixgbe_msix_other does not write them in the EICR, which causes them to
remain high and be properly handled by the clean_rings interrupt routine
as normal.
Emil cleans up the logic in ixgbe_setup_loopback_test() to only access
registers applicable to the MAC type. In addition, removes majority
of the AUTOC register reads by using a cached value instead to avoid
writing corrupted values to AUTOC due to bad FW. Emil also add support
for disabling link during boot time. Lastly, he provides a patch which
adds the MAC type to the version in ethtool_regs which will make it
easier to check the MAC type when dumping registers with ethtool.
There is a separate ethtool tool patch which is dependent upon Emil's
last patch of the series to add the MAC type to the version in
ethtool_regs, which will be sent separately.
====================
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | drivers/net/ethernet/intel/e1000e/netdev.c | 7 | ||||
-rw-r--r-- | drivers/net/ethernet/intel/e1000e/ptp.c | 3 | ||||
-rw-r--r-- | drivers/net/ethernet/intel/igb/e1000_phy.c | 6 | ||||
-rw-r--r-- | drivers/net/ethernet/intel/ixgbe/ixgbe_82599.c | 61 | ||||
-rw-r--r-- | drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c | 29 | ||||
-rw-r--r-- | drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | 10 | ||||
-rw-r--r-- | drivers/net/ethernet/intel/ixgbe/ixgbe_type.h | 2 |
7 files changed, 80 insertions, 38 deletions
diff --git a/drivers/net/ethernet/intel/e1000e/netdev.c b/drivers/net/ethernet/intel/e1000e/netdev.c index da7f2fad5ba4..a27e3bcc3249 100644 --- a/drivers/net/ethernet/intel/e1000e/netdev.c +++ b/drivers/net/ethernet/intel/e1000e/netdev.c | |||
@@ -4016,6 +4016,8 @@ void e1000e_down(struct e1000_adapter *adapter) | |||
4016 | 4016 | ||
4017 | e1000_irq_disable(adapter); | 4017 | e1000_irq_disable(adapter); |
4018 | 4018 | ||
4019 | napi_synchronize(&adapter->napi); | ||
4020 | |||
4019 | del_timer_sync(&adapter->watchdog_timer); | 4021 | del_timer_sync(&adapter->watchdog_timer); |
4020 | del_timer_sync(&adapter->phy_info_timer); | 4022 | del_timer_sync(&adapter->phy_info_timer); |
4021 | 4023 | ||
@@ -4372,12 +4374,13 @@ static int e1000_close(struct net_device *netdev) | |||
4372 | 4374 | ||
4373 | pm_runtime_get_sync(&pdev->dev); | 4375 | pm_runtime_get_sync(&pdev->dev); |
4374 | 4376 | ||
4375 | napi_disable(&adapter->napi); | ||
4376 | |||
4377 | if (!test_bit(__E1000_DOWN, &adapter->state)) { | 4377 | if (!test_bit(__E1000_DOWN, &adapter->state)) { |
4378 | e1000e_down(adapter); | 4378 | e1000e_down(adapter); |
4379 | e1000_free_irq(adapter); | 4379 | e1000_free_irq(adapter); |
4380 | } | 4380 | } |
4381 | |||
4382 | napi_disable(&adapter->napi); | ||
4383 | |||
4381 | e1000_power_down_phy(adapter); | 4384 | e1000_power_down_phy(adapter); |
4382 | 4385 | ||
4383 | e1000e_free_tx_resources(adapter->tx_ring); | 4386 | e1000e_free_tx_resources(adapter->tx_ring); |
diff --git a/drivers/net/ethernet/intel/e1000e/ptp.c b/drivers/net/ethernet/intel/e1000e/ptp.c index b477fa53ec94..065f8c80d4f2 100644 --- a/drivers/net/ethernet/intel/e1000e/ptp.c +++ b/drivers/net/ethernet/intel/e1000e/ptp.c | |||
@@ -145,8 +145,7 @@ static int e1000e_phc_settime(struct ptp_clock_info *ptp, | |||
145 | unsigned long flags; | 145 | unsigned long flags; |
146 | u64 ns; | 146 | u64 ns; |
147 | 147 | ||
148 | ns = ts->tv_sec * NSEC_PER_SEC; | 148 | ns = timespec_to_ns(ts); |
149 | ns += ts->tv_nsec; | ||
150 | 149 | ||
151 | /* reset the timecounter */ | 150 | /* reset the timecounter */ |
152 | spin_lock_irqsave(&adapter->systim_lock, flags); | 151 | spin_lock_irqsave(&adapter->systim_lock, flags); |
diff --git a/drivers/net/ethernet/intel/igb/e1000_phy.c b/drivers/net/ethernet/intel/igb/e1000_phy.c index fd46add6c4e4..115b0da6e013 100644 --- a/drivers/net/ethernet/intel/igb/e1000_phy.c +++ b/drivers/net/ethernet/intel/igb/e1000_phy.c | |||
@@ -1130,7 +1130,7 @@ s32 igb_phy_force_speed_duplex_igp(struct e1000_hw *hw) | |||
1130 | if (phy->autoneg_wait_to_complete) { | 1130 | if (phy->autoneg_wait_to_complete) { |
1131 | hw_dbg("Waiting for forced speed/duplex link on IGP phy.\n"); | 1131 | hw_dbg("Waiting for forced speed/duplex link on IGP phy.\n"); |
1132 | 1132 | ||
1133 | ret_val = igb_phy_has_link(hw, PHY_FORCE_LIMIT, 100000, &link); | 1133 | ret_val = igb_phy_has_link(hw, PHY_FORCE_LIMIT, 10000, &link); |
1134 | if (ret_val) | 1134 | if (ret_val) |
1135 | goto out; | 1135 | goto out; |
1136 | 1136 | ||
@@ -1138,7 +1138,7 @@ s32 igb_phy_force_speed_duplex_igp(struct e1000_hw *hw) | |||
1138 | hw_dbg("Link taking longer than expected.\n"); | 1138 | hw_dbg("Link taking longer than expected.\n"); |
1139 | 1139 | ||
1140 | /* Try once more */ | 1140 | /* Try once more */ |
1141 | ret_val = igb_phy_has_link(hw, PHY_FORCE_LIMIT, 100000, &link); | 1141 | ret_val = igb_phy_has_link(hw, PHY_FORCE_LIMIT, 10000, &link); |
1142 | if (ret_val) | 1142 | if (ret_val) |
1143 | goto out; | 1143 | goto out; |
1144 | } | 1144 | } |
@@ -1590,7 +1590,7 @@ s32 igb_phy_has_link(struct e1000_hw *hw, u32 iterations, | |||
1590 | * it across the board. | 1590 | * it across the board. |
1591 | */ | 1591 | */ |
1592 | ret_val = hw->phy.ops.read_reg(hw, PHY_STATUS, &phy_status); | 1592 | ret_val = hw->phy.ops.read_reg(hw, PHY_STATUS, &phy_status); |
1593 | if (ret_val) { | 1593 | if (ret_val && usec_interval > 0) { |
1594 | /* If the first read fails, another entity may have | 1594 | /* If the first read fails, another entity may have |
1595 | * ownership of the resources, wait and try again to | 1595 | * ownership of the resources, wait and try again to |
1596 | * see if they have relinquished the resources yet. | 1596 | * see if they have relinquished the resources yet. |
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_82599.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_82599.c index 3f792428ca53..0b82d38bc97d 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_82599.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_82599.c | |||
@@ -167,9 +167,9 @@ static s32 ixgbe_setup_sfp_modules_82599(struct ixgbe_hw *hw) | |||
167 | } | 167 | } |
168 | 168 | ||
169 | /* Restart DSP and set SFI mode */ | 169 | /* Restart DSP and set SFI mode */ |
170 | IXGBE_WRITE_REG(hw, IXGBE_AUTOC, (IXGBE_READ_REG(hw, | 170 | IXGBE_WRITE_REG(hw, IXGBE_AUTOC, ((hw->mac.orig_autoc) | |
171 | IXGBE_AUTOC) | IXGBE_AUTOC_LMS_10G_SERIAL)); | 171 | IXGBE_AUTOC_LMS_10G_SERIAL)); |
172 | 172 | hw->mac.cached_autoc = IXGBE_READ_REG(hw, IXGBE_AUTOC); | |
173 | ret_val = ixgbe_reset_pipeline_82599(hw); | 173 | ret_val = ixgbe_reset_pipeline_82599(hw); |
174 | 174 | ||
175 | if (got_lock) { | 175 | if (got_lock) { |
@@ -803,12 +803,9 @@ static s32 ixgbe_setup_mac_link_82599(struct ixgbe_hw *hw, | |||
803 | bool autoneg_wait_to_complete) | 803 | bool autoneg_wait_to_complete) |
804 | { | 804 | { |
805 | s32 status = 0; | 805 | s32 status = 0; |
806 | u32 autoc = IXGBE_READ_REG(hw, IXGBE_AUTOC); | 806 | u32 autoc, pma_pmd_1g, link_mode, start_autoc; |
807 | u32 autoc2 = IXGBE_READ_REG(hw, IXGBE_AUTOC2); | 807 | u32 autoc2 = IXGBE_READ_REG(hw, IXGBE_AUTOC2); |
808 | u32 start_autoc = autoc; | ||
809 | u32 orig_autoc = 0; | 808 | u32 orig_autoc = 0; |
810 | u32 link_mode = autoc & IXGBE_AUTOC_LMS_MASK; | ||
811 | u32 pma_pmd_1g = autoc & IXGBE_AUTOC_1G_PMA_PMD_MASK; | ||
812 | u32 pma_pmd_10g_serial = autoc2 & IXGBE_AUTOC2_10G_SERIAL_PMA_PMD_MASK; | 809 | u32 pma_pmd_10g_serial = autoc2 & IXGBE_AUTOC2_10G_SERIAL_PMA_PMD_MASK; |
813 | u32 links_reg; | 810 | u32 links_reg; |
814 | u32 i; | 811 | u32 i; |
@@ -831,9 +828,14 @@ static s32 ixgbe_setup_mac_link_82599(struct ixgbe_hw *hw, | |||
831 | 828 | ||
832 | /* Use stored value (EEPROM defaults) of AUTOC to find KR/KX4 support*/ | 829 | /* Use stored value (EEPROM defaults) of AUTOC to find KR/KX4 support*/ |
833 | if (hw->mac.orig_link_settings_stored) | 830 | if (hw->mac.orig_link_settings_stored) |
834 | orig_autoc = hw->mac.orig_autoc; | 831 | autoc = hw->mac.orig_autoc; |
835 | else | 832 | else |
836 | orig_autoc = autoc; | 833 | autoc = IXGBE_READ_REG(hw, IXGBE_AUTOC); |
834 | |||
835 | orig_autoc = autoc; | ||
836 | start_autoc = hw->mac.cached_autoc; | ||
837 | link_mode = autoc & IXGBE_AUTOC_LMS_MASK; | ||
838 | pma_pmd_1g = autoc & IXGBE_AUTOC_1G_PMA_PMD_MASK; | ||
837 | 839 | ||
838 | if (link_mode == IXGBE_AUTOC_LMS_KX4_KX_KR || | 840 | if (link_mode == IXGBE_AUTOC_LMS_KX4_KX_KR || |
839 | link_mode == IXGBE_AUTOC_LMS_KX4_KX_KR_1G_AN || | 841 | link_mode == IXGBE_AUTOC_LMS_KX4_KX_KR_1G_AN || |
@@ -887,6 +889,7 @@ static s32 ixgbe_setup_mac_link_82599(struct ixgbe_hw *hw, | |||
887 | 889 | ||
888 | /* Restart link */ | 890 | /* Restart link */ |
889 | IXGBE_WRITE_REG(hw, IXGBE_AUTOC, autoc); | 891 | IXGBE_WRITE_REG(hw, IXGBE_AUTOC, autoc); |
892 | hw->mac.cached_autoc = autoc; | ||
890 | ixgbe_reset_pipeline_82599(hw); | 893 | ixgbe_reset_pipeline_82599(hw); |
891 | 894 | ||
892 | if (got_lock) | 895 | if (got_lock) |
@@ -958,7 +961,7 @@ static s32 ixgbe_reset_hw_82599(struct ixgbe_hw *hw) | |||
958 | { | 961 | { |
959 | ixgbe_link_speed link_speed; | 962 | ixgbe_link_speed link_speed; |
960 | s32 status; | 963 | s32 status; |
961 | u32 ctrl, i, autoc, autoc2; | 964 | u32 ctrl, i, autoc2; |
962 | u32 curr_lms; | 965 | u32 curr_lms; |
963 | bool link_up = false; | 966 | bool link_up = false; |
964 | 967 | ||
@@ -991,8 +994,12 @@ static s32 ixgbe_reset_hw_82599(struct ixgbe_hw *hw) | |||
991 | if (hw->phy.reset_disable == false && hw->phy.ops.reset != NULL) | 994 | if (hw->phy.reset_disable == false && hw->phy.ops.reset != NULL) |
992 | hw->phy.ops.reset(hw); | 995 | hw->phy.ops.reset(hw); |
993 | 996 | ||
994 | /* remember AUTOC LMS from before we reset */ | 997 | /* remember AUTOC from before we reset */ |
995 | curr_lms = IXGBE_READ_REG(hw, IXGBE_AUTOC) & IXGBE_AUTOC_LMS_MASK; | 998 | if (hw->mac.cached_autoc) |
999 | curr_lms = hw->mac.cached_autoc & IXGBE_AUTOC_LMS_MASK; | ||
1000 | else | ||
1001 | curr_lms = IXGBE_READ_REG(hw, IXGBE_AUTOC) & | ||
1002 | IXGBE_AUTOC_LMS_MASK; | ||
996 | 1003 | ||
997 | mac_reset_top: | 1004 | mac_reset_top: |
998 | /* | 1005 | /* |
@@ -1042,10 +1049,18 @@ mac_reset_top: | |||
1042 | * stored off yet. Otherwise restore the stored original | 1049 | * stored off yet. Otherwise restore the stored original |
1043 | * values since the reset operation sets back to defaults. | 1050 | * values since the reset operation sets back to defaults. |
1044 | */ | 1051 | */ |
1045 | autoc = IXGBE_READ_REG(hw, IXGBE_AUTOC); | 1052 | hw->mac.cached_autoc = IXGBE_READ_REG(hw, IXGBE_AUTOC); |
1046 | autoc2 = IXGBE_READ_REG(hw, IXGBE_AUTOC2); | 1053 | autoc2 = IXGBE_READ_REG(hw, IXGBE_AUTOC2); |
1054 | |||
1055 | /* Enable link if disabled in NVM */ | ||
1056 | if (autoc2 & IXGBE_AUTOC2_LINK_DISABLE_MASK) { | ||
1057 | autoc2 &= ~IXGBE_AUTOC2_LINK_DISABLE_MASK; | ||
1058 | IXGBE_WRITE_REG(hw, IXGBE_AUTOC2, autoc2); | ||
1059 | IXGBE_WRITE_FLUSH(hw); | ||
1060 | } | ||
1061 | |||
1047 | if (hw->mac.orig_link_settings_stored == false) { | 1062 | if (hw->mac.orig_link_settings_stored == false) { |
1048 | hw->mac.orig_autoc = autoc; | 1063 | hw->mac.orig_autoc = hw->mac.cached_autoc; |
1049 | hw->mac.orig_autoc2 = autoc2; | 1064 | hw->mac.orig_autoc2 = autoc2; |
1050 | hw->mac.orig_link_settings_stored = true; | 1065 | hw->mac.orig_link_settings_stored = true; |
1051 | } else { | 1066 | } else { |
@@ -1062,7 +1077,7 @@ mac_reset_top: | |||
1062 | (hw->mac.orig_autoc & ~IXGBE_AUTOC_LMS_MASK) | | 1077 | (hw->mac.orig_autoc & ~IXGBE_AUTOC_LMS_MASK) | |
1063 | curr_lms; | 1078 | curr_lms; |
1064 | 1079 | ||
1065 | if (autoc != hw->mac.orig_autoc) { | 1080 | if (hw->mac.cached_autoc != hw->mac.orig_autoc) { |
1066 | /* Need SW/FW semaphore around AUTOC writes if LESM is | 1081 | /* Need SW/FW semaphore around AUTOC writes if LESM is |
1067 | * on, likewise reset_pipeline requires us to hold | 1082 | * on, likewise reset_pipeline requires us to hold |
1068 | * this lock as it also writes to AUTOC. | 1083 | * this lock as it also writes to AUTOC. |
@@ -1078,6 +1093,7 @@ mac_reset_top: | |||
1078 | } | 1093 | } |
1079 | 1094 | ||
1080 | IXGBE_WRITE_REG(hw, IXGBE_AUTOC, hw->mac.orig_autoc); | 1095 | IXGBE_WRITE_REG(hw, IXGBE_AUTOC, hw->mac.orig_autoc); |
1096 | hw->mac.cached_autoc = hw->mac.orig_autoc; | ||
1081 | ixgbe_reset_pipeline_82599(hw); | 1097 | ixgbe_reset_pipeline_82599(hw); |
1082 | 1098 | ||
1083 | if (got_lock) | 1099 | if (got_lock) |
@@ -2178,10 +2194,19 @@ static s32 ixgbe_read_eeprom_82599(struct ixgbe_hw *hw, | |||
2178 | **/ | 2194 | **/ |
2179 | s32 ixgbe_reset_pipeline_82599(struct ixgbe_hw *hw) | 2195 | s32 ixgbe_reset_pipeline_82599(struct ixgbe_hw *hw) |
2180 | { | 2196 | { |
2181 | s32 i, autoc_reg, ret_val; | 2197 | s32 ret_val; |
2182 | s32 anlp1_reg = 0; | 2198 | u32 anlp1_reg = 0; |
2199 | u32 i, autoc_reg, autoc2_reg; | ||
2200 | |||
2201 | /* Enable link if disabled in NVM */ | ||
2202 | autoc2_reg = IXGBE_READ_REG(hw, IXGBE_AUTOC2); | ||
2203 | if (autoc2_reg & IXGBE_AUTOC2_LINK_DISABLE_MASK) { | ||
2204 | autoc2_reg &= ~IXGBE_AUTOC2_LINK_DISABLE_MASK; | ||
2205 | IXGBE_WRITE_REG(hw, IXGBE_AUTOC2, autoc2_reg); | ||
2206 | IXGBE_WRITE_FLUSH(hw); | ||
2207 | } | ||
2183 | 2208 | ||
2184 | autoc_reg = IXGBE_READ_REG(hw, IXGBE_AUTOC); | 2209 | autoc_reg = hw->mac.cached_autoc; |
2185 | autoc_reg |= IXGBE_AUTOC_AN_RESTART; | 2210 | autoc_reg |= IXGBE_AUTOC_AN_RESTART; |
2186 | 2211 | ||
2187 | /* Write AUTOC register with toggled LMS[2] bit and Restart_AN */ | 2212 | /* Write AUTOC register with toggled LMS[2] bit and Restart_AN */ |
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c index bbe00bcc7582..d3754722adb4 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c | |||
@@ -440,7 +440,8 @@ static void ixgbe_get_regs(struct net_device *netdev, | |||
440 | 440 | ||
441 | memset(p, 0, IXGBE_REGS_LEN * sizeof(u32)); | 441 | memset(p, 0, IXGBE_REGS_LEN * sizeof(u32)); |
442 | 442 | ||
443 | regs->version = (1 << 24) | hw->revision_id << 16 | hw->device_id; | 443 | regs->version = hw->mac.type << 24 | hw->revision_id << 16 | |
444 | hw->device_id; | ||
444 | 445 | ||
445 | /* General Registers */ | 446 | /* General Registers */ |
446 | regs_buff[0] = IXGBE_READ_REG(hw, IXGBE_CTRL); | 447 | regs_buff[0] = IXGBE_READ_REG(hw, IXGBE_CTRL); |
@@ -1609,16 +1610,9 @@ static int ixgbe_setup_loopback_test(struct ixgbe_adapter *adapter) | |||
1609 | struct ixgbe_hw *hw = &adapter->hw; | 1610 | struct ixgbe_hw *hw = &adapter->hw; |
1610 | u32 reg_data; | 1611 | u32 reg_data; |
1611 | 1612 | ||
1612 | /* X540 needs to set the MACC.FLU bit to force link up */ | ||
1613 | if (adapter->hw.mac.type == ixgbe_mac_X540) { | ||
1614 | reg_data = IXGBE_READ_REG(hw, IXGBE_MACC); | ||
1615 | reg_data |= IXGBE_MACC_FLU; | ||
1616 | IXGBE_WRITE_REG(hw, IXGBE_MACC, reg_data); | ||
1617 | } | ||
1618 | 1613 | ||
1619 | /* right now we only support MAC loopback in the driver */ | ||
1620 | reg_data = IXGBE_READ_REG(hw, IXGBE_HLREG0); | ||
1621 | /* Setup MAC loopback */ | 1614 | /* Setup MAC loopback */ |
1615 | reg_data = IXGBE_READ_REG(hw, IXGBE_HLREG0); | ||
1622 | reg_data |= IXGBE_HLREG0_LPBK; | 1616 | reg_data |= IXGBE_HLREG0_LPBK; |
1623 | IXGBE_WRITE_REG(hw, IXGBE_HLREG0, reg_data); | 1617 | IXGBE_WRITE_REG(hw, IXGBE_HLREG0, reg_data); |
1624 | 1618 | ||
@@ -1626,10 +1620,19 @@ static int ixgbe_setup_loopback_test(struct ixgbe_adapter *adapter) | |||
1626 | reg_data |= IXGBE_FCTRL_BAM | IXGBE_FCTRL_SBP | IXGBE_FCTRL_MPE; | 1620 | reg_data |= IXGBE_FCTRL_BAM | IXGBE_FCTRL_SBP | IXGBE_FCTRL_MPE; |
1627 | IXGBE_WRITE_REG(hw, IXGBE_FCTRL, reg_data); | 1621 | IXGBE_WRITE_REG(hw, IXGBE_FCTRL, reg_data); |
1628 | 1622 | ||
1629 | reg_data = IXGBE_READ_REG(hw, IXGBE_AUTOC); | 1623 | /* X540 needs to set the MACC.FLU bit to force link up */ |
1630 | reg_data &= ~IXGBE_AUTOC_LMS_MASK; | 1624 | if (adapter->hw.mac.type == ixgbe_mac_X540) { |
1631 | reg_data |= IXGBE_AUTOC_LMS_10G_LINK_NO_AN | IXGBE_AUTOC_FLU; | 1625 | reg_data = IXGBE_READ_REG(hw, IXGBE_MACC); |
1632 | IXGBE_WRITE_REG(hw, IXGBE_AUTOC, reg_data); | 1626 | reg_data |= IXGBE_MACC_FLU; |
1627 | IXGBE_WRITE_REG(hw, IXGBE_MACC, reg_data); | ||
1628 | } else { | ||
1629 | if (hw->mac.orig_autoc) { | ||
1630 | reg_data = hw->mac.orig_autoc | IXGBE_AUTOC_FLU; | ||
1631 | IXGBE_WRITE_REG(hw, IXGBE_AUTOC, reg_data); | ||
1632 | } else { | ||
1633 | return 10; | ||
1634 | } | ||
1635 | } | ||
1633 | IXGBE_WRITE_FLUSH(hw); | 1636 | IXGBE_WRITE_FLUSH(hw); |
1634 | usleep_range(10000, 20000); | 1637 | usleep_range(10000, 20000); |
1635 | 1638 | ||
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c index 88f67375e85e..d30fbdd81fca 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | |||
@@ -2454,6 +2454,16 @@ static irqreturn_t ixgbe_msix_other(int irq, void *data) | |||
2454 | * with the write to EICR. | 2454 | * with the write to EICR. |
2455 | */ | 2455 | */ |
2456 | eicr = IXGBE_READ_REG(hw, IXGBE_EICS); | 2456 | eicr = IXGBE_READ_REG(hw, IXGBE_EICS); |
2457 | |||
2458 | /* The lower 16bits of the EICR register are for the queue interrupts | ||
2459 | * which should be masked here in order to not accidently clear them if | ||
2460 | * the bits are high when ixgbe_msix_other is called. There is a race | ||
2461 | * condition otherwise which results in possible performance loss | ||
2462 | * especially if the ixgbe_msix_other interrupt is triggering | ||
2463 | * consistently (as it would when PPS is turned on for the X540 device) | ||
2464 | */ | ||
2465 | eicr &= 0xFFFF0000; | ||
2466 | |||
2457 | IXGBE_WRITE_REG(hw, IXGBE_EICR, eicr); | 2467 | IXGBE_WRITE_REG(hw, IXGBE_EICR, eicr); |
2458 | 2468 | ||
2459 | if (eicr & IXGBE_EICR_LSC) | 2469 | if (eicr & IXGBE_EICR_LSC) |
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_type.h b/drivers/net/ethernet/intel/ixgbe/ixgbe_type.h index 6d7066531139..70c6aa3d3f95 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_type.h +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_type.h | |||
@@ -1593,6 +1593,7 @@ enum { | |||
1593 | #define IXGBE_AUTOC2_10G_KR (0x0 << IXGBE_AUTOC2_10G_SERIAL_PMA_PMD_SHIFT) | 1593 | #define IXGBE_AUTOC2_10G_KR (0x0 << IXGBE_AUTOC2_10G_SERIAL_PMA_PMD_SHIFT) |
1594 | #define IXGBE_AUTOC2_10G_XFI (0x1 << IXGBE_AUTOC2_10G_SERIAL_PMA_PMD_SHIFT) | 1594 | #define IXGBE_AUTOC2_10G_XFI (0x1 << IXGBE_AUTOC2_10G_SERIAL_PMA_PMD_SHIFT) |
1595 | #define IXGBE_AUTOC2_10G_SFI (0x2 << IXGBE_AUTOC2_10G_SERIAL_PMA_PMD_SHIFT) | 1595 | #define IXGBE_AUTOC2_10G_SFI (0x2 << IXGBE_AUTOC2_10G_SERIAL_PMA_PMD_SHIFT) |
1596 | #define IXGBE_AUTOC2_LINK_DISABLE_MASK 0x70000000 | ||
1596 | 1597 | ||
1597 | #define IXGBE_MACC_FLU 0x00000001 | 1598 | #define IXGBE_MACC_FLU 0x00000001 |
1598 | #define IXGBE_MACC_FSV_10G 0x00030000 | 1599 | #define IXGBE_MACC_FSV_10G 0x00030000 |
@@ -2928,6 +2929,7 @@ struct ixgbe_mac_info { | |||
2928 | u32 max_tx_queues; | 2929 | u32 max_tx_queues; |
2929 | u32 max_rx_queues; | 2930 | u32 max_rx_queues; |
2930 | u32 orig_autoc; | 2931 | u32 orig_autoc; |
2932 | u32 cached_autoc; | ||
2931 | u32 orig_autoc2; | 2933 | u32 orig_autoc2; |
2932 | bool orig_link_settings_stored; | 2934 | bool orig_link_settings_stored; |
2933 | bool autotry_restart; | 2935 | bool autotry_restart; |