Skip to content

Commit 0a8047a

Browse files
gobenjiJeff Kirsher
authored andcommitted
e1000e: Fix msi-x interrupt automask
Since the introduction of 82574 support in e1000e, the driver has worked on the assumption that msi-x interrupt generation is automatically disabled after each irq. As it turns out, this is not the case. Currently, rx interrupts can fire multiple times before and during napi processing. This can be a problem for users because frames that arrive in a certain window (after adapter->clean_rx() but before napi_complete_done() has cleared NAPI_STATE_SCHED) generate an interrupt which does not lead to napi_schedule(). These frames sit in the rx queue until another frame arrives (a tcp retransmit for example). While the EIAC and CTRL_EXT registers are properly configured for irq automask, the modification of IAM in e1000_configure_msix() is what prevents automask from working as intended. This patch removes that erroneous write and fixes interrupt rearming for tx interrupts. It also clears IAME from CTRL_EXT. This is not strictly necessary for operation of the driver but it is to avoid disruption from potential programs that access the registers directly, like `ethregs -c`. Reported-by: Frank Steiner <[email protected]> Signed-off-by: Benjamin Poirier <[email protected]> Tested-by: Aaron Brown <[email protected]> Signed-off-by: Jeff Kirsher <[email protected]>
1 parent a61cfe4 commit 0a8047a

File tree

1 file changed

+5
-6
lines changed
  • drivers/net/ethernet/intel/e1000e

1 file changed

+5
-6
lines changed

drivers/net/ethernet/intel/e1000e/netdev.c

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1931,6 +1931,9 @@ static irqreturn_t e1000_intr_msix_tx(int __always_unused irq, void *data)
19311931
/* Ring was not completely cleaned, so fire another interrupt */
19321932
ew32(ICS, tx_ring->ims_val);
19331933

1934+
if (!test_bit(__E1000_DOWN, &adapter->state))
1935+
ew32(IMS, adapter->tx_ring->ims_val);
1936+
19341937
return IRQ_HANDLED;
19351938
}
19361939

@@ -2020,12 +2023,8 @@ static void e1000_configure_msix(struct e1000_adapter *adapter)
20202023
ew32(IVAR, ivar);
20212024

20222025
/* enable MSI-X PBA support */
2023-
ctrl_ext = er32(CTRL_EXT);
2024-
ctrl_ext |= E1000_CTRL_EXT_PBA_CLR;
2025-
2026-
/* Auto-Mask Other interrupts upon ICR read */
2027-
ew32(IAM, ~E1000_EIAC_MASK_82574 | E1000_IMS_OTHER);
2028-
ctrl_ext |= E1000_CTRL_EXT_EIAME;
2026+
ctrl_ext = er32(CTRL_EXT) & ~E1000_CTRL_EXT_IAME;
2027+
ctrl_ext |= E1000_CTRL_EXT_PBA_CLR | E1000_CTRL_EXT_EIAME;
20292028
ew32(CTRL_EXT, ctrl_ext);
20302029
e1e_flush();
20312030
}

0 commit comments

Comments
 (0)