diff --git a/kernel/kernel/Networking/E1000/E1000.cpp b/kernel/kernel/Networking/E1000/E1000.cpp index b9cc1caaa4..64c874d669 100644 --- a/kernel/kernel/Networking/E1000/E1000.cpp +++ b/kernel/kernel/Networking/E1000/E1000.cpp @@ -237,21 +237,28 @@ namespace Kernel BAN::ErrorOr E1000::enable_interrupt() { + TRY(m_pci_device.reserve_interrupts(1)); + write32(REG_ITR, 0x1000); - write32(REG_IVAR, 1 << 3); - write32(REG_EITR, 0x1000); + if (m_pci_device.interrupt_mechanism() == PCI::Device::InterruptMechanism::MSIX) + { + write32(REG_IVAR, 1 << 3); + write32(REG_EITR, 0x1000); + write32(REG_IMS, IMC_RxQ0); + } + else + { + write32(REG_IMS, IMC_RXT0); + } - write32(REG_IMS, IMC_RxQ0); - read32(REG_ICR); + write32(REG_ICR, 0xFFFFFFFF); - TRY(m_pci_device.reserve_interrupts(1)); m_pci_device.enable_interrupt(0, *this); return {}; } - BAN::ErrorOr E1000::send_bytes(BAN::MACAddress destination, EtherType protocol, BAN::ConstByteSpan buffer) { ASSERT(buffer.size() + sizeof(EthernetHeader) <= E1000_TX_BUFFER_SIZE); @@ -285,7 +292,7 @@ namespace Kernel void E1000::handle_irq() { - if (!(read32(REG_ICR) & ICR_RxQ0)) + if (!(read32(REG_ICR) & (ICR_RxQ0 | ICR_RXT0))) return; SpinLockGuard _(m_lock);