diff --git a/sys/dev/nvme/nvme_ctrlr.c b/sys/dev/nvme/nvme_ctrlr.c index a8d8d1b99647..6dba83708df4 100644 --- a/sys/dev/nvme/nvme_ctrlr.c +++ b/sys/dev/nvme/nvme_ctrlr.c @@ -1405,9 +1405,12 @@ nvme_ctrlr_shared_handler(void *arg) { struct nvme_controller *ctrlr = arg; - nvme_mmio_write_4(ctrlr, intms, 1); + /* INTMS/INTMC are undefined when configured for MSI-X. */ + if (!ctrlr->is_msix) + nvme_mmio_write_4(ctrlr, intms, 1); nvme_ctrlr_poll(ctrlr); - nvme_mmio_write_4(ctrlr, intmc, 1); + if (!ctrlr->is_msix) + nvme_mmio_write_4(ctrlr, intmc, 1); } #define NVME_MAX_PAGES (int)(1024 / sizeof(vm_page_t)) diff --git a/sys/dev/nvme/nvme_pci.c b/sys/dev/nvme/nvme_pci.c index 8ea31850d09b..5d4fab3b2ab1 100644 --- a/sys/dev/nvme/nvme_pci.c +++ b/sys/dev/nvme/nvme_pci.c @@ -385,6 +385,7 @@ again: ctrlr->msi_count = 0; goto msi; } + ctrlr->is_msix = true; if (ctrlr->msi_count == 1) return (nvme_ctrlr_setup_shared(ctrlr, 1)); if (ctrlr->msi_count != num_vectors_requested) { diff --git a/sys/dev/nvme/nvme_private.h b/sys/dev/nvme/nvme_private.h index f96729608ed5..9bee1b23bd4e 100644 --- a/sys/dev/nvme/nvme_private.h +++ b/sys/dev/nvme/nvme_private.h @@ -257,6 +257,7 @@ struct nvme_controller { struct resource *msix_pba_resource; int msi_count; + bool is_msix; uint32_t enable_aborts; uint32_t num_io_queues;