From 96d5ed9cc7b6e9b6a607522c45e94cc375d8aa05 Mon Sep 17 00:00:00 2001 From: Bananymous Date: Fri, 6 Jun 2025 03:45:35 +0300 Subject: [PATCH] Kernel: Fix E1000 driver interrupts I have no idea why, but E1000 seems to be missing interrupts frequently when clearing ICR only at the end of the interrupt handler --- kernel/kernel/Networking/E1000/E1000.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/kernel/kernel/Networking/E1000/E1000.cpp b/kernel/kernel/Networking/E1000/E1000.cpp index 64c874d6..5d9cc368 100644 --- a/kernel/kernel/Networking/E1000/E1000.cpp +++ b/kernel/kernel/Networking/E1000/E1000.cpp @@ -292,8 +292,10 @@ namespace Kernel void E1000::handle_irq() { - if (!(read32(REG_ICR) & (ICR_RxQ0 | ICR_RXT0))) + const uint32_t icr = read32(REG_ICR); + if (!(icr & (ICR_RxQ0 | ICR_RXT0))) return; + write32(REG_ICR, icr); SpinLockGuard _(m_lock); @@ -315,8 +317,6 @@ namespace Kernel descriptor.status = 0; write32(REG_RDT0, rx_current); } - - write32(REG_ICR, 0xFFFFFFFF); } }