aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/generic/pending-4.14/191-1-6-e1000e-Remove-Other-from-EIAC.diff
diff options
context:
space:
mode:
authorStijn Tintel <stijn@linux-ipv6.be>2018-06-28 11:44:10 +0200
committerStijn Tintel <stijn@linux-ipv6.be>2018-08-09 11:49:48 +0200
commitbd451d46a695ed8ee1b96be25859612cd0085af8 (patch)
treee36f4933a6361659eb48c6a81c5869dd14b3091e /target/linux/generic/pending-4.14/191-1-6-e1000e-Remove-Other-from-EIAC.diff
parentaeec1dd7bab6da7e231f43d0206c8a7bc1614919 (diff)
downloadupstream-bd451d46a695ed8ee1b96be25859612cd0085af8.tar.gz
upstream-bd451d46a695ed8ee1b96be25859612cd0085af8.tar.bz2
upstream-bd451d46a695ed8ee1b96be25859612cd0085af8.zip
kernel: add pending e1000e fixes
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> (cherry picked from commit ef025e6417abd608ee398039623ac8a306bb92c5)
Diffstat (limited to 'target/linux/generic/pending-4.14/191-1-6-e1000e-Remove-Other-from-EIAC.diff')
-rw-r--r--target/linux/generic/pending-4.14/191-1-6-e1000e-Remove-Other-from-EIAC.diff66
1 files changed, 66 insertions, 0 deletions
diff --git a/target/linux/generic/pending-4.14/191-1-6-e1000e-Remove-Other-from-EIAC.diff b/target/linux/generic/pending-4.14/191-1-6-e1000e-Remove-Other-from-EIAC.diff
new file mode 100644
index 0000000000..9ce01aac5e
--- /dev/null
+++ b/target/linux/generic/pending-4.14/191-1-6-e1000e-Remove-Other-from-EIAC.diff
@@ -0,0 +1,66 @@
+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 {