From 79cd43965150900d5b576611a13e5009e4204777 Mon Sep 17 00:00:00 2001 From: "Wesley W. Terpstra" <w.terpstra@gsi.de> Date: Fri, 15 Feb 2013 18:15:58 +0100 Subject: [PATCH] pcie-wb: support systems without MSI interrupts --- pcie-wb/pcie_wb.c | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/pcie-wb/pcie_wb.c b/pcie-wb/pcie_wb.c index 838c92b..264a086 100644 --- a/pcie-wb/pcie_wb.c +++ b/pcie-wb/pcie_wb.c @@ -330,6 +330,7 @@ static int probe(struct pci_dev *pdev, const struct pci_device_id *id) /* Initialize structure */ dev->pci_dev = pdev; + dev->msi = 1; dev->wb.wops = &wb_ops; dev->wb.parent = &pdev->dev; mutex_init(&dev->mutex); @@ -352,11 +353,14 @@ static int probe(struct pci_dev *pdev, const struct pci_device_id *id) /* enable message signaled interrupts */ if (pci_enable_msi(pdev) != 0) { /* resort to legacy interrupts */ - printk(KERN_ALERT PCIE_WB ": could not enable MSI interrupting\n"); - goto fail_master; + printk(KERN_ALERT PCIE_WB ": could not enable MSI interrupting (using legacy)\n"); + dev->msi = 0; } - pci_intx(pdev, 0); /* disable legacy interrupts */ + if (dev->msi) { + /* disable legacy interrupts when using MSI */ + pci_intx(pdev, 0); + } if (request_irq(pdev->irq, irq_handler, 0, "pcie_wb", dev) < 0) { printk(KERN_ALERT PCIE_WB ": could not register interrupt handler\n"); @@ -373,10 +377,13 @@ static int probe(struct pci_dev *pdev, const struct pci_device_id *id) fail_irq: free_irq(dev->pci_dev->irq, dev); fail_msi: - pci_intx(pdev, 1); - pci_disable_msi(pdev); -fail_master: + if (dev->msi) { + pci_intx(pdev, 1); + pci_disable_msi(pdev); + } +/*fail_master:*/ pci_clear_master(pdev); +/*fail_bar1:*/ destroy_bar(&dev->pci_res[1]); fail_bar0: destroy_bar(&dev->pci_res[0]); @@ -396,8 +403,10 @@ static void remove(struct pci_dev *pdev) wishbone_unregister(&dev->wb); free_irq(dev->pci_dev->irq, dev); - pci_intx(pdev, 1); - pci_disable_msi(pdev); + if (dev->msi) { + pci_intx(pdev, 1); + pci_disable_msi(pdev); + } pci_clear_master(pdev); destroy_bar(&dev->pci_res[1]); destroy_bar(&dev->pci_res[0]); -- GitLab