ef025e6417
The previous round of fixes for the 82574 chip cause an issue with emulated e1000e devices in VMware ESXi 6.5. It also contains changes that are not strictly necessary. These patches fix the issues introduced in the previous series, revert the unnecessary changes to avoid unforeseen fallout, and avoid a case where interrupts can be missed. The final two patches of this series are already in the kernel, so no need to include them here. Patchwork: https://patchwork.ozlabs.org/cover/881776/ Signed-off-by: Stijn Tintel <stijn@linux-ipv6.be>
66 lines
2.7 KiB
Diff
66 lines
2.7 KiB
Diff
From patchwork Mon Mar 5 21:40:25 2018
|
|
Content-Type: text/plain; charset="utf-8"
|
|
MIME-Version: 1.0
|
|
Content-Transfer-Encoding: 7bit
|
|
Subject: [net,v2,1/6] e1000e: Remove Other from EIAC
|
|
X-Patchwork-Submitter: "Kirsher, Jeffrey T" <jeffrey.t.kirsher@intel.com>
|
|
X-Patchwork-Id: 881773
|
|
X-Patchwork-Delegate: davem@davemloft.net
|
|
Message-Id: <20180305214030.25141-2-jeffrey.t.kirsher@intel.com>
|
|
To: davem@davemloft.net
|
|
Cc: Benjamin Poirier <bpoirier@suse.com>, netdev@vger.kernel.org,
|
|
nhorman@redhat.com, sassmann@redhat.com, jogreene@redhat.com,
|
|
Jeff Kirsher <jeffrey.t.kirsher@intel.com>
|
|
Date: Mon, 5 Mar 2018 13:40:25 -0800
|
|
From: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
|
|
List-Id: <netdev.vger.kernel.org>
|
|
|
|
From: Benjamin Poirier <bpoirier@suse.com>
|
|
|
|
It was reported that emulated e1000e devices in vmware esxi 6.5 Build
|
|
7526125 do not link up after commit 4aea7a5c5e94 ("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
|
|
16ecba59bc33 ("e1000e: Do not read ICR in Other interrupt", v4.5-rc1).
|
|
|
|
Fixes: 4aea7a5c5e94 ("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>
|
|
---
|
|
drivers/net/ethernet/intel/e1000e/netdev.c | 5 +++--
|
|
1 file changed, 3 insertions(+), 2 deletions(-)
|
|
|
|
--- a/drivers/net/ethernet/intel/e1000e/netdev.c
|
|
+++ b/drivers/net/ethernet/intel/e1000e/netdev.c
|
|
@@ -1914,6 +1914,8 @@ static irqreturn_t e1000_msix_other(int
|
|
bool enable = true;
|
|
|
|
icr = er32(ICR);
|
|
+ ew32(ICR, E1000_ICR_OTHER);
|
|
+
|
|
if (icr & E1000_ICR_RXO) {
|
|
ew32(ICR, E1000_ICR_RXO);
|
|
enable = false;
|
|
@@ -2036,7 +2038,6 @@ static void e1000_configure_msix(struct
|
|
hw->hw_addr + E1000_EITR_82574(vector));
|
|
else
|
|
writel(1, hw->hw_addr + E1000_EITR_82574(vector));
|
|
- adapter->eiac_mask |= E1000_IMS_OTHER;
|
|
|
|
/* Cause Tx interrupts on every write back */
|
|
ivar |= BIT(31);
|
|
@@ -2261,7 +2262,7 @@ static void e1000_irq_enable(struct e100
|
|
|
|
if (adapter->msix_entries) {
|
|
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) {
|
|
ew32(IMS, IMS_ENABLE_MASK | E1000_IMS_ECCER);
|
|
} else {
|