123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 |
- 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" <[email protected]>
- X-Patchwork-Id: 881773
- X-Patchwork-Delegate: [email protected]
- Message-Id: <[email protected]>
- To: [email protected]
- Cc: Benjamin Poirier <[email protected]>, [email protected],
- [email protected], [email protected], [email protected],
- Jeff Kirsher <[email protected]>
- Date: Mon, 5 Mar 2018 13:40:25 -0800
- From: Jeff Kirsher <[email protected]>
- List-Id: <netdev.vger.kernel.org>
- From: Benjamin Poirier <[email protected]>
- 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 <[email protected]>
- Tested-by: Aaron Brown <[email protected]>
- Signed-off-by: Jeff Kirsher <[email protected]>
- ---
- 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 {
|