Index: sys/dev/pci/nvme_pci.c =================================================================== RCS file: /cvsroot/src/sys/dev/pci/nvme_pci.c,v retrieving revision 1.26 diff -p -u -r1.26 nvme_pci.c --- sys/dev/pci/nvme_pci.c 23 Jan 2019 06:56:19 -0000 1.26 +++ sys/dev/pci/nvme_pci.c 12 Jun 2019 10:21:23 -0000 @@ -56,6 +56,7 @@ __KERNEL_RCSID(0, "$NetBSD: nvme_pci.c,v #include #include #include +#include #include #include @@ -73,6 +74,7 @@ int nvme_pci_mq = 1; /* INTx: ioq=1, MS struct nvme_pci_softc { struct nvme_softc psc_nvme; + struct pci_attach_args psc_pa; pci_chipset_tag_t psc_pc; pci_intr_handle_t *psc_intrs; int psc_nintrs; @@ -80,6 +82,7 @@ struct nvme_pci_softc { static int nvme_pci_match(device_t, cfdata_t, void *); static void nvme_pci_attach(device_t, device_t, void *); +static void nvme_pci_config_interrupts(device_t); static int nvme_pci_detach(device_t, int); static int nvme_pci_rescan(device_t, const char *, const int *); @@ -145,11 +148,6 @@ nvme_pci_attach(device_t parent, device_ struct nvme_pci_softc *psc = device_private(self); struct nvme_softc *sc = &psc->psc_nvme; struct pci_attach_args *pa = aux; - const struct nvme_pci_quirk *quirk; - pcireg_t memtype, reg; - bus_addr_t memaddr; - int flags, error; - int msixoff; sc->sc_dev = self; psc->psc_pc = pa->pa_pc; @@ -160,6 +158,27 @@ nvme_pci_attach(device_t parent, device_ pci_aprint_devinfo(pa, NULL); + psc->psc_pa = *pa; +#if 1 + /* Defer real attachment until after all CPUs will be ready. */ + config_interrupts(self, nvme_pci_config_interrupts); +#else + nvme_pci_config_interrupts(self); +#endif +} + +static void +nvme_pci_config_interrupts(device_t self) +{ + struct nvme_pci_softc *psc = device_private(self); + struct nvme_softc *sc = &psc->psc_nvme; + struct pci_attach_args *pa = &psc->psc_pa; + const struct nvme_pci_quirk *quirk; + pcireg_t memtype, reg; + bus_addr_t memaddr; + int flags, error; + int msixoff; + /* Map registers */ memtype = pci_mapreg_type(pa->pa_pc, pa->pa_tag, NVME_PCI_BAR); if (PCI_MAPREG_TYPE(memtype) != PCI_MAPREG_TYPE_MEM) { @@ -319,7 +338,7 @@ nvme_pci_intr_establish(struct nvme_soft /* establish hardware interrupt */ sc->sc_ih[qid] = pci_intr_establish_xname(psc->psc_pc, - psc->psc_intrs[qid], IPL_BIO, ih_func, ih_arg, intr_xname); + psc->psc_intrs[qid], IPL_SCHED, ih_func, ih_arg, intr_xname); if (sc->sc_ih[qid] == NULL) { aprint_error_dev(sc->sc_dev, "unable to establish %s interrupt\n", intr_xname);