e1000e: Remove Other from EIAC
commit745d0bd3af
upstream. It was reported that emulated e1000e devices in vmware esxi 6.5 Build 7526125 do not link up after commit4aea7a5c5e
("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 before16ecba59bc
("e1000e: Do not read ICR in Other interrupt", v4.5-rc1). Fixes:4aea7a5c5e
("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>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
57d6f87ac3
commit
0d99649c5e
@ -1914,6 +1914,8 @@ static irqreturn_t e1000_msix_other(int __always_unused irq, void *data)
|
|||||||
bool enable = true;
|
bool enable = true;
|
||||||
|
|
||||||
icr = er32(ICR);
|
icr = er32(ICR);
|
||||||
|
ew32(ICR, E1000_ICR_OTHER);
|
||||||
|
|
||||||
if (icr & E1000_ICR_RXO) {
|
if (icr & E1000_ICR_RXO) {
|
||||||
ew32(ICR, E1000_ICR_RXO);
|
ew32(ICR, E1000_ICR_RXO);
|
||||||
enable = false;
|
enable = false;
|
||||||
@ -2036,7 +2038,6 @@ static void e1000_configure_msix(struct e1000_adapter *adapter)
|
|||||||
hw->hw_addr + E1000_EITR_82574(vector));
|
hw->hw_addr + E1000_EITR_82574(vector));
|
||||||
else
|
else
|
||||||
writel(1, hw->hw_addr + E1000_EITR_82574(vector));
|
writel(1, hw->hw_addr + E1000_EITR_82574(vector));
|
||||||
adapter->eiac_mask |= E1000_IMS_OTHER;
|
|
||||||
|
|
||||||
/* Cause Tx interrupts on every write back */
|
/* Cause Tx interrupts on every write back */
|
||||||
ivar |= BIT(31);
|
ivar |= BIT(31);
|
||||||
@ -2261,7 +2262,7 @@ static void e1000_irq_enable(struct e1000_adapter *adapter)
|
|||||||
|
|
||||||
if (adapter->msix_entries) {
|
if (adapter->msix_entries) {
|
||||||
ew32(EIAC_82574, adapter->eiac_mask & E1000_EIAC_MASK_82574);
|
ew32(EIAC_82574, adapter->eiac_mask & E1000_EIAC_MASK_82574);
|
||||||
ew32(IMS, adapter->eiac_mask | E1000_IMS_LSC);
|
ew32(IMS, adapter->eiac_mask | E1000_IMS_OTHER | E1000_IMS_LSC);
|
||||||
} else if (hw->mac.type >= e1000_pch_lpt) {
|
} else if (hw->mac.type >= e1000_pch_lpt) {
|
||||||
ew32(IMS, IMS_ENABLE_MASK | E1000_IMS_ECCER);
|
ew32(IMS, IMS_ENABLE_MASK | E1000_IMS_ECCER);
|
||||||
} else {
|
} else {
|
||||||
|
Reference in New Issue
Block a user