[PATCH] UBUNTU: (fix) NVMe: restore code to always use MSI/MSI-x interrupts

Dan Streetman dan.streetman at canonical.com
Wed Dec 7 23:34:12 UTC 2016


BugLink: http://bugs.launchpad.net/bugs/1647887

Commit 90c9712fbb388077b5e53069cae43f1acbb0102a ("NVMe: Always use MSI/MSI-x
interrupts") changed the NVMe driver to always use MSI/MSI-x interrupts.
However, later commit 30d6592fce71beabe18460252c3823747c4742f6 ("NVMe: Don't
unmap controller registers on reset") as well as commit
e9820e415895bdd9cfd21f87e80e3e0a10f131f0 ("UBUNTU: (fix) NVMe: Don't unmap
controller registers on reset") accidentally reverted part of the original
commit, which reverted the NVMe driver to using GSI interrupts instead of
always using MSI/MSI-x interrupts.

This un-reverts the accidental reversion, to restore the NVMe driver to
always use MSI/MSI-x interrupts.

Signed-off-by: Dan Streetman <dan.streetman at canonical.com>
---
 drivers/nvme/host/pci.c | 19 ++++++++++++-------
 1 file changed, 12 insertions(+), 7 deletions(-)

diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c
index aef8652..7b91d57 100644
--- a/drivers/nvme/host/pci.c
+++ b/drivers/nvme/host/pci.c
@@ -1726,7 +1726,6 @@ static int nvme_pci_enable(struct nvme_dev *dev)
 	if (pci_enable_device_mem(pdev))
 		return result;
 
-	dev->entry[0].vector = pdev->irq;
 	pci_set_master(pdev);
 
 	if (dma_set_mask_and_coherent(dev->dev, DMA_BIT_MASK(64)) &&
@@ -1739,16 +1738,22 @@ static int nvme_pci_enable(struct nvme_dev *dev)
 	}
 
 	/*
-	 * Some devices don't advertse INTx interrupts, pre-enable a single
-	 * MSIX vec for setup. We'll adjust this later.
+	 * Some devices and/or platforms don't advertise or work with INTx
+	 * interrupts. Pre-enable a single MSIX or MSI vec for setup. We'll
+	 * adjust this later.
 	 */
-	if (!pdev->irq) {
-		result = pci_enable_msix(pdev, dev->entry, 1);
-		if (result < 0)
-			goto disable;
+	if (pci_enable_msix(pdev, dev->entry, 1)) {
+		pci_enable_msi(pdev);
+		dev->entry[0].vector = pdev->irq;
+	}
+
+	if (!dev->entry[0].vector) {
+		result = -ENODEV;
+		goto disable;
 	}
 
 	cap = lo_hi_readq(dev->bar + NVME_REG_CAP);
+
 	dev->q_depth = min_t(int, NVME_CAP_MQES(cap) + 1, NVME_Q_DEPTH);
 	dev->db_stride = 1 << NVME_CAP_STRIDE(cap);
 	dev->dbs = dev->bar + 4096;
-- 
2.9.3





More information about the kernel-team mailing list