e1000e: Fix EIAC register implementation
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 <dmitry@daynix.com> Signed-off-by: Jason Wang <jasowang@redhat.com>
This commit is contained in:
parent
4100c026b6
commit
b38636b837
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue