[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 7/7] e1000e: Fix EIAC register implementation
From: |
Dmitry Fleytman |
Subject: |
[Qemu-devel] [PATCH 7/7] e1000e: Fix EIAC register implementation |
Date: |
Thu, 15 Sep 2016 09:14:30 +0300 |
This patch fixes 2 issues:
1. Bits set in EIAC register should be cleared
from IMS when EIAM is not used.
2. Only bit that corresonds to the interrupt being
raised should be cleared.
See spec. 10.2.4.7 Interrupt Auto Clear
Signed-off-by: Dmitry Fleytman <address@hidden>
---
hw/net/e1000e_core.c | 14 +++++++++-----
1 file changed, 9 insertions(+), 5 deletions(-)
diff --git a/hw/net/e1000e_core.c b/hw/net/e1000e_core.c
index f4ec79f..3c38980 100644
--- a/hw/net/e1000e_core.c
+++ b/hw/net/e1000e_core.c
@@ -2015,13 +2015,17 @@ e1000e_msix_notify_one(E1000ECore *core, uint32_t
cause, uint32_t int_cfg)
trace_e1000e_irq_icr_clear_eiac(core->mac[ICR], core->mac[EIAC]);
- if (core->mac[EIAC] & E1000_ICR_OTHER) {
- effective_eiac = (core->mac[EIAC] & E1000_EIAC_MASK) |
- E1000_ICR_OTHER_CAUSES;
- } else {
- effective_eiac = core->mac[EIAC] & E1000_EIAC_MASK;
+ effective_eiac = core->mac[EIAC] & cause;
+
+ if (effective_eiac == E1000_ICR_OTHER) {
+ effective_eiac |= E1000_ICR_OTHER_CAUSES;
}
+
core->mac[ICR] &= ~effective_eiac;
+
+ if (!(core->mac[CTRL_EXT] & E1000_CTRL_EXT_IAME)) {
+ core->mac[IMS] &= ~effective_eiac;
+ }
}
static void
--
2.7.4
- [Qemu-devel] [PATCH 0/7] e1000e: A few fixes for RX data path, Dmitry Fleytman, 2016/09/15
- [Qemu-devel] [PATCH 5/7] e1000e: Fix OTHER interrupts processing for MSI-X, Dmitry Fleytman, 2016/09/15
- [Qemu-devel] [PATCH 6/7] e1000e: Fix spurious RX TCP ACK interrupts, Dmitry Fleytman, 2016/09/15
- [Qemu-devel] [PATCH 7/7] e1000e: Fix EIAC register implementation,
Dmitry Fleytman <=
- Re: [Qemu-devel] [PATCH 0/7] e1000e: A few fixes for RX data path, Dmitry Fleytman, 2016/09/21
- Re: [Qemu-devel] [PATCH 0/7] e1000e: A few fixes for RX data path, Jason Wang, 2016/09/23