Kernel: Fix E1000 interrupt handling

E1000 does not support MSI-X and thus does not generate RxQ0 interrupts.
This commit is contained in:
Bananymous 2025-05-26 04:46:46 +03:00
parent 8aa4e4ff1e
commit 7f04b2c96c
1 changed files with 14 additions and 7 deletions

View File

@ -237,21 +237,28 @@ namespace Kernel
BAN::ErrorOr<void> 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<void> 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);