xhci(4)'s interrupt handler only schedule a soft-interrupt so we could
mark it IPL_MPSAFE.

Index: dev/pci/xhci_pci.c
===================================================================
RCS file: /cvs/src/sys/dev/pci/xhci_pci.c,v
retrieving revision 1.6
diff -u -p -r1.6 xhci_pci.c
--- dev/pci/xhci_pci.c  22 Jun 2015 08:43:27 -0000      1.6
+++ dev/pci/xhci_pci.c  27 Oct 2015 15:31:09 -0000
@@ -164,7 +164,7 @@ xhci_pci_attach(struct device *parent, s
        }
        intrstr = pci_intr_string(pa->pa_pc, ih);
 
-       psc->sc_ih = pci_intr_establish(pa->pa_pc, ih, IPL_USB,
+       psc->sc_ih = pci_intr_establish(pa->pa_pc, ih, IPL_USB | IPL_MPSAFE,
            xhci_intr, psc, psc->sc.sc_bus.bdev.dv_xname);
        if (psc->sc_ih == NULL) {
                printf(": couldn't establish interrupt");
Index: dev/usb/xhci.c
===================================================================
RCS file: /cvs/src/sys/dev/usb/xhci.c,v
retrieving revision 1.63
diff -u -p -r1.63 xhci.c
--- dev/usb/xhci.c      12 Jul 2015 12:54:31 -0000      1.63
+++ dev/usb/xhci.c      27 Oct 2015 15:29:48 -0000
@@ -606,13 +606,11 @@ xhci_intr1(struct xhci_softc *sc)
        if ((intrs & XHCI_STS_EINT) == 0)
                return (0);
 
-       sc->sc_bus.intr_context++;
        sc->sc_bus.no_intrs++;
 
        if (intrs & XHCI_STS_HSE) {
                printf("%s: host system error\n", DEVNAME(sc));
                sc->sc_bus.dying = 1;
-               sc->sc_bus.intr_context--;
                return (1);
        }
 
@@ -622,8 +620,6 @@ xhci_intr1(struct xhci_softc *sc)
        /* Acknowledge PCI interrupt */
        intrs = XRREAD4(sc, XHCI_IMAN(0));
        XRWRITE4(sc, XHCI_IMAN(0), intrs | XHCI_IMAN_INTR_PEND);
-
-       sc->sc_bus.intr_context--;
 
        return (1);
 }

Reply via email to