Hi, Attached is a patch that should enable PCI MSI for pci(4)-attached re(4) NICs. I would like both review of the code, and additional testing.
I've tested it successfully on amd64 -current with a 8100E/8101E/8102E/8102EL chip. Jonathan Kollasch
Index: src/sys/dev/pci/if_re_pci.c =================================================================== RCS file: /cvsroot/src/sys/dev/pci/if_re_pci.c,v retrieving revision 1.44 diff -d -u -a -p -r1.44 if_re_pci.c --- src/sys/dev/pci/if_re_pci.c 3 May 2015 00:04:06 -0000 1.44 +++ src/sys/dev/pci/if_re_pci.c 13 Nov 2015 04:29:24 -0000 @@ -75,6 +75,7 @@ struct re_pci_softc { struct rtk_softc sc_rtk; void *sc_ih; + pci_intr_handle_t *sc_pihp; pci_chipset_tag_t sc_pc; }; @@ -174,7 +175,6 @@ re_pci_attach(device_t parent, device_t struct rtk_softc *sc = &psc->sc_rtk; struct pci_attach_args *pa = aux; pci_chipset_tag_t pc = pa->pa_pc; - pci_intr_handle_t ih; const char *intrstr = NULL; const struct rtk_type *t; uint32_t hwrev; @@ -253,12 +253,14 @@ re_pci_attach(device_t parent, device_t /* Hook interrupt last to avoid having to lock softc */ /* Allocate interrupt */ - if (pci_intr_map(pa, &ih)) { + if (pci_intr_alloc(pa, &psc->sc_pihp, NULL, 0)) { aprint_error_dev(self, "couldn't map interrupt\n"); return; } - intrstr = pci_intr_string(pc, ih, intrbuf, sizeof(intrbuf)); - psc->sc_ih = pci_intr_establish(pc, ih, IPL_NET, re_intr, sc); + intrstr = pci_intr_string(pc, psc->sc_pihp[0], intrbuf, + sizeof(intrbuf)); + psc->sc_ih = pci_intr_establish(pc, psc->sc_pihp[0], IPL_NET, + re_intr, sc); if (psc->sc_ih == NULL) { aprint_error_dev(self, "couldn't establish interrupt"); if (intrstr != NULL) @@ -305,6 +307,11 @@ re_pci_detach(device_t self, int flags) psc->sc_ih = NULL; } + if (psc->sc_pihp != NULL) { + pci_intr_release(psc->sc_pc, psc->sc_pihp, 1); + psc->sc_pihp = NULL; + } + if (sc->rtk_bsize != 0) { bus_space_unmap(sc->rtk_btag, sc->rtk_bhandle, sc->rtk_bsize); sc->rtk_bsize = 0;