Files
RedBear-OS/local/patches/base/P6-e1000d-msi-migration.patch
vasilito ea380b7daf feat: e1000d MSI/MSI-X migration — use pci_allocate_interrupt_vector
e1000d was the last NIC driver using legacy IRQ (irq.irq_handle()).
Migrated to pci_allocate_interrupt_vector which tries MSI-X first,
then MSI, then falls back to legacy INTx — matching rtl8168d, rtl8139d,
ihdad, ihdgd, and nvmed.

63-line patch at local/patches/base/P6-e1000d-msi-migration.patch,
symlinked and wired into recipes/core/base/recipe.toml.
2026-05-04 19:00:59 +01:00

64 lines
2.3 KiB
Diff

diff --git a/drivers/net/e1000d/src/main.rs b/drivers/net/e1000d/src/main.rs
index 373ea9b3..f62eaad7 100644
--- a/drivers/net/e1000d/src/main.rs
+++ b/drivers/net/e1000d/src/main.rs
@@ -3,6 +3,7 @@ use std::os::unix::io::AsRawFd;
use driver_network::NetworkScheme;
use event::{user_data, EventQueue};
+use pcid_interface::irq_helpers::pci_allocate_interrupt_vector;
use pcid_interface::PciFunctionHandle;
pub mod device;
@@ -25,14 +26,11 @@ fn daemon(daemon: daemon::Daemon, mut pcid_handle: PciFunctionHandle) -> ! {
common::file_level(),
);
- let irq = pci_config
- .func
- .legacy_interrupt_line
- .expect("e1000d: no legacy interrupts supported");
+ let irq_vector = pci_allocate_interrupt_vector(&mut pcid_handle, "e1000d");
log::info!("E1000 {}", pci_config.func.display());
- let mut irq_file = irq.irq_handle("e1000d");
+ let irq_file = irq_vector.irq_handle();
let address = unsafe { pcid_handle.map_bar(0) }.ptr.as_ptr() as usize;
@@ -53,9 +51,11 @@ fn daemon(daemon: daemon::Daemon, mut pcid_handle: PciFunctionHandle) -> ! {
let event_queue = EventQueue::<Source>::new().expect("e1000d: failed to create event queue");
+ let irq_fd = irq_vector.irq_handle().as_raw_fd();
+
event_queue
.subscribe(
- irq_file.as_raw_fd() as usize,
+ irq_fd as usize,
Source::Irq,
event::EventFlags::READ,
)
@@ -70,15 +70,17 @@ fn daemon(daemon: daemon::Daemon, mut pcid_handle: PciFunctionHandle) -> ! {
libredox::call::setrens(0, 0).expect("e1000d: failed to enter null namespace");
- scheme.tick().unwrap();
+ scheme.tick().expect("e1000d: tick failed");
+
+ let mut irq_file = irq_vector.irq_handle();
for event in event_queue.map(|e| e.expect("e1000d: failed to get event")) {
match event.user_data {
Source::Irq => {
let mut irq = [0; 8];
- irq_file.read(&mut irq).unwrap();
+ irq_file.read(&mut irq).expect("e1000d: IRQ read failed");
if unsafe { scheme.adapter().irq() } {
- irq_file.write(&mut irq).unwrap();
+ irq_file.write(&mut irq).expect("e1000d: IRQ ack failed");
scheme.tick().expect("e1000d: failed to handle IRQ")
}