Skip to content

Commit 0d99649

Browse files
gobenjigregkh
authored andcommitted
e1000e: Remove Other from EIAC
commit 745d0bd upstream. It was reported that emulated e1000e devices in vmware esxi 6.5 Build 7526125 do not link up after commit 4aea7a5 ("e1000e: Avoid receiver overrun interrupt bursts", v4.15-rc1). Some tracing shows that after e1000e_trigger_lsc() is called, ICR reads out as 0x0 in e1000_msix_other() on emulated e1000e devices. In comparison, on real e1000e 82574 hardware, icr=0x80000004 (_INT_ASSERTED | _LSC) in the same situation. Some experimentation showed that this flaw in vmware e1000e emulation can be worked around by not setting Other in EIAC. This is how it was before 16ecba5 ("e1000e: Do not read ICR in Other interrupt", v4.5-rc1). Fixes: 4aea7a5 ("e1000e: Avoid receiver overrun interrupt bursts") Signed-off-by: Benjamin Poirier <bpoirier@suse.com> Tested-by: Aaron Brown <aaron.f.brown@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com> Cc: Ben Hutchings <ben@decadent.org.uk> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent 57d6f87 commit 0d99649

1 file changed

Lines changed: 3 additions & 2 deletions

File tree

  • drivers/net/ethernet/intel/e1000e

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1914,6 +1914,8 @@ static irqreturn_t e1000_msix_other(int __always_unused irq, void *data)
19141914
bool enable = true;
19151915

19161916
icr = er32(ICR);
1917+
ew32(ICR, E1000_ICR_OTHER);
1918+
19171919
if (icr & E1000_ICR_RXO) {
19181920
ew32(ICR, E1000_ICR_RXO);
19191921
enable = false;
@@ -2036,7 +2038,6 @@ static void e1000_configure_msix(struct e1000_adapter *adapter)
20362038
hw->hw_addr + E1000_EITR_82574(vector));
20372039
else
20382040
writel(1, hw->hw_addr + E1000_EITR_82574(vector));
2039-
adapter->eiac_mask |= E1000_IMS_OTHER;
20402041

20412042
/* Cause Tx interrupts on every write back */
20422043
ivar |= BIT(31);
@@ -2261,7 +2262,7 @@ static void e1000_irq_enable(struct e1000_adapter *adapter)
22612262

22622263
if (adapter->msix_entries) {
22632264
ew32(EIAC_82574, adapter->eiac_mask & E1000_EIAC_MASK_82574);
2264-
ew32(IMS, adapter->eiac_mask | E1000_IMS_LSC);
2265+
ew32(IMS, adapter->eiac_mask | E1000_IMS_OTHER | E1000_IMS_LSC);
22652266
} else if (hw->mac.type >= e1000_pch_lpt) {
22662267
ew32(IMS, IMS_ENABLE_MASK | E1000_IMS_ECCER);
22672268
} else {

0 commit comments

Comments
 (0)