]> www.infradead.org Git - users/hch/configfs.git/commitdiff
can: kvaser_pciefd: Add MSI interrupts
authorMartin Jocic <martin.jocic@kvaser.com>
Thu, 20 Jun 2024 18:13:20 +0000 (20:13 +0200)
committerMarc Kleine-Budde <mkl@pengutronix.de>
Fri, 21 Jun 2024 07:46:02 +0000 (09:46 +0200)
Use MSI interrupts with fallback to INTx interrupts.

Signed-off-by: Martin Jocic <martin.jocic@kvaser.com>
Link: https://lore.kernel.org/all/20240620181320.235465-3-martin.jocic@kvaser.com
[mkl: kvaser_pciefd_probe(): call pci_free_irq_vectors() unconditionally]
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
drivers/net/can/kvaser_pciefd.c

index b4ffd56fdeff6c50fa398d039c001134af5c2518..a60d9efd5f8d1af3088da9f6e13793909fe27d3d 100644 (file)
@@ -1774,11 +1774,24 @@ static int kvaser_pciefd_probe(struct pci_dev *pdev,
        if (ret)
                goto err_teardown_can_ctrls;
 
-       ret = request_irq(pcie->pci->irq, kvaser_pciefd_irq_handler,
-                         IRQF_SHARED, KVASER_PCIEFD_DRV_NAME, pcie);
-       if (ret)
+       ret = pci_alloc_irq_vectors(pcie->pci, 1, 1, PCI_IRQ_INTX | PCI_IRQ_MSI);
+       if (ret < 0) {
+               dev_err(&pcie->pci->dev, "Failed to allocate IRQ vectors.\n");
                goto err_teardown_can_ctrls;
+       }
+
+       ret = pci_irq_vector(pcie->pci, 0);
+       if (ret < 0)
+               goto err_pci_free_irq_vectors;
+
+       pcie->pci->irq = ret;
 
+       ret = request_irq(pcie->pci->irq, kvaser_pciefd_irq_handler,
+                         IRQF_SHARED, KVASER_PCIEFD_DRV_NAME, pcie);
+       if (ret) {
+               dev_err(&pcie->pci->dev, "Failed to request IRQ %d\n", pcie->pci->irq);
+               goto err_pci_free_irq_vectors;
+       }
        iowrite32(KVASER_PCIEFD_SRB_IRQ_DPD0 | KVASER_PCIEFD_SRB_IRQ_DPD1,
                  KVASER_PCIEFD_SRB_ADDR(pcie) + KVASER_PCIEFD_SRB_IRQ_REG);
 
@@ -1807,6 +1820,9 @@ err_free_irq:
        iowrite32(0, irq_en_base);
        free_irq(pcie->pci->irq, pcie);
 
+err_pci_free_irq_vectors:
+       pci_free_irq_vectors(pcie->pci);
+
 err_teardown_can_ctrls:
        kvaser_pciefd_teardown_can_ctrls(pcie);
        iowrite32(0, KVASER_PCIEFD_SRB_ADDR(pcie) + KVASER_PCIEFD_SRB_CTRL_REG);
@@ -1852,7 +1868,7 @@ static void kvaser_pciefd_remove(struct pci_dev *pdev)
        iowrite32(0, KVASER_PCIEFD_PCI_IEN_ADDR(pcie));
 
        free_irq(pcie->pci->irq, pcie);
-
+       pci_free_irq_vectors(pcie->pci);
        pci_iounmap(pdev, pcie->reg_base);
        pci_release_regions(pdev);
        pci_disable_device(pdev);