diff --git a/Cargo.lock b/Cargo.lock index 28bca81fc7..b539e5d1d3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -379,6 +379,7 @@ dependencies = [ "bitflags 1.3.2", "common", "netutils", + "pcid", "redox-daemon", "redox_event 0.1.0", "redox_syscall 0.4.1", diff --git a/e1000d/Cargo.toml b/e1000d/Cargo.toml index bc1bc8b47e..90b9367de0 100644 --- a/e1000d/Cargo.toml +++ b/e1000d/Cargo.toml @@ -11,3 +11,4 @@ redox_event = { git = "https://gitlab.redox-os.org/redox-os/event.git" } redox_syscall = "0.4" common = { path = "../common" } +pcid = { path = "../pcid" } diff --git a/e1000d/config.toml b/e1000d/config.toml index 932e33bae8..5ab5ad0bd5 100644 --- a/e1000d/config.toml +++ b/e1000d/config.toml @@ -2,4 +2,5 @@ name = "E1000 NIC" class = 0x02 ids = { 0x8086 = [0x1004, 0x100e, 0x100f, 0x1503] } -command = ["e1000d", "$NAME", "$BAR0", "$BARSIZE0", "$IRQ"] +command = ["e1000d"] +use_channel = true diff --git a/e1000d/src/main.rs b/e1000d/src/main.rs index 2e2a617c8f..328c7d0d3c 100644 --- a/e1000d/src/main.rs +++ b/e1000d/src/main.rs @@ -3,13 +3,14 @@ extern crate netutils; extern crate syscall; use std::cell::RefCell; -use std::{env, process}; use std::fs::File; use std::io::{ErrorKind, Read, Result, Write}; use std::os::unix::io::{AsRawFd, FromRawFd, RawFd}; +use std::process; use std::sync::Arc; use event::EventQueue; +use pcid_interface::{PciBar, PcidServerHandle}; use syscall::{EventFlags, Packet, SchemeBlockMut}; pub mod device; @@ -58,19 +59,23 @@ fn handle_update( } fn main() { - let mut args = env::args().skip(1); + let mut pcid_handle = + PcidServerHandle::connect_default().expect("e1000d: failed to setup channel to pcid"); + let pci_config = pcid_handle + .fetch_config() + .expect("e1000d: failed to fetch config"); - let mut name = args.next().expect("e1000d: no name provided"); + let mut name = pci_config.func.name(); name.push_str("_e1000"); - let bar_str = args.next().expect("e1000d: no address provided"); - let bar = usize::from_str_radix(&bar_str, 16).expect("e1000d: failed to parse address"); + let bar = match pci_config.func.bars[0] { + PciBar::Memory32(addr) => addr as usize, + PciBar::Memory64(addr) => addr as usize, + PciBar::None | PciBar::Port(_) => unreachable!(), + }; + let bar_size = pci_config.func.bar_sizes[0] as usize; - let bar_size_str = args.next().expect("e1000d: no address size provided"); - let bar_size = usize::from_str_radix(&bar_size_str, 16).expect("e1000d: failed to parse address size"); - - let irq_str = args.next().expect("e1000d: no irq provided"); - let irq = irq_str.parse::().expect("e1000d: failed to parse irq"); + let irq = pci_config.func.legacy_interrupt_line; eprintln!(" + E1000 {} on: {:X} size: {} IRQ: {}", name, bar, bar_size, irq);