ixgbed: use MSI-X (via pci_allocate_interrupt_vector) when available
The previous code unconditionally required a legacy INTX line, which on bare metal is missing for nearly every modern 82599/X540/X550 board that has its IRQ lines wired to MSI-X only. pcid_interface allocates MSI-X when the device advertises it, falls back to MSI, then to legacy INTX, so the change preserves every existing path while unlocking the much higher line-rate headroom of MSI-X per-vector queuing that the device's enable_msix_interrupt code already implements in device.rs. The IRQ-acknowledge-and-write pattern is unchanged: the kernel masks the line on delivery, we must re-arm unconditionally or a foreign interrupt on a shared line leaves the line masked forever.
This commit is contained in:
@@ -19,10 +19,14 @@ fn daemon(daemon: daemon::Daemon, mut pcid_handle: PciFunctionHandle) -> ! {
|
||||
let mut name = pci_config.func.name();
|
||||
name.push_str("_ixgbe");
|
||||
|
||||
// Allocate one interrupt vector. pcid_interface::pci_allocate_interrupt_vector
|
||||
// prefers MSI-X when the device advertises it and falls back to MSI and
|
||||
// legacy INTX otherwise, so this single line makes the driver work on
|
||||
// every modern 82599/X540/X550 board that has MSI-X wired.
|
||||
let irq = pci_config
|
||||
.func
|
||||
.legacy_interrupt_line
|
||||
.expect("ixgbed: no legacy interrupts supported");
|
||||
.pci_allocate_interrupt_vector(1)
|
||||
.expect("ixgbed: failed to allocate an interrupt vector");
|
||||
|
||||
println!(" + IXGBE {}", pci_config.func.display());
|
||||
|
||||
@@ -74,9 +78,6 @@ fn daemon(daemon: daemon::Daemon, mut pcid_handle: PciFunctionHandle) -> ! {
|
||||
let mut irq = [0; 8];
|
||||
irq_file.read(&mut irq).unwrap();
|
||||
let ours = scheme.adapter().irq();
|
||||
// The kernel masks the IRQ line on delivery and only re-arms
|
||||
// it on write-back; ack unconditionally or a foreign interrupt
|
||||
// on a shared line leaves the line masked forever.
|
||||
irq_file.write(&mut irq).unwrap();
|
||||
|
||||
if ours {
|
||||
|
||||
Reference in New Issue
Block a user