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::::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") }