This is a fairly conservative diff that enables MSI on the newer em(4)
parts, essentially everything handled by the Linux e1000e driver.
Please test if you have anything that's vaguely recent.
Index: if_em.c
===================================================================
RCS file: /cvs/src/sys/dev/pci/if_em.c,v
retrieving revision 1.257
diff -u -p -r1.257 if_em.c
--- if_em.c 3 Jun 2011 13:06:06 -0000 1.257
+++ if_em.c 15 Jun 2011 13:02:14 -0000
@@ -329,6 +329,10 @@ em_attach(struct device *parent, struct
/* Determine hardware revision */
em_identify_hardware(sc);
+ /* Only use MSIe on the newer PCIe parts */
+ if (sc->hw.mac_type < em_82571)
+ pa->pa_flags &= ~PCI_FLAGS_MSI_ENABLED;
+
/* Parameters (to be read from user) */
if (sc->hw.mac_type >= em_82544) {
sc->num_tx_desc = EM_MAX_TXD;
@@ -1615,7 +1619,7 @@ em_allocate_pci_resources(struct em_soft
}
}
- if (pci_intr_map(pa, &ih)) {
+ if (pci_intr_map_msi(pa, &ih) && pci_intr_map(pa, &ih)) {
printf(": couldn't map interrupt\n");
return (ENXIO);
}