aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJacob Keller <jacob.e.keller@intel.com>2013-03-02 02:51:42 -0500
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>2013-04-25 21:59:07 -0400
commitd87d830720a1446403ed38bfc2da268be0d356d1 (patch)
tree39d746a48f81b828705380a27c32165a658f3712
parentdc3d226f3366f98af73caffc46b5c0a57fe32a51 (diff)
ixgbe: fix EICR write in ixgbe_msix_other
Previously, the ixgbe_msix_other was writing the full 32bits of the set interrupts, instead of only the ones which the ixgbe_msix_other is handling. This resulted in a loss of performance when the X540's PPS feature is enabled due to sometimes clearing queue interrupts which resulted in the driver not getting the interrupt for cleaning the q_vector rings often enough. The fix is to simply mask the lower 16bits off so that this handler 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. Signed-off-by: Jacob Keller <jacob.e.keller@intel.com> Cc: stable <stable@vger.kernel.org> Tested-by: Phil Schmitt <phillip.j.schmitt@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
-rw-r--r--drivers/net/ethernet/intel/ixgbe/ixgbe_main.c10
1 files changed, 10 insertions, 0 deletions
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)