67 lines
2.7 KiB
Diff
67 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 {
|