Use MSI interrupts with fallback to legacy interrupts. Signed-off-by: Martin Jocic <martin.jocic@xxxxxxxxxx> --- drivers/net/can/kvaser_pciefd.c | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/drivers/net/can/kvaser_pciefd.c b/drivers/net/can/kvaser_pciefd.c index 63b4d2a4c7ce..53b82e11f7f3 100644 --- a/drivers/net/can/kvaser_pciefd.c +++ b/drivers/net/can/kvaser_pciefd.c @@ -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_LEGACY | PCI_IRQ_MSI); + if (ret < 0) { + dev_info(&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_free_msi; + + pcie->pci->irq = ret; + ret = request_irq(pcie->pci->irq, kvaser_pciefd_irq_handler, + IRQF_SHARED, KVASER_PCIEFD_DRV_NAME, pcie); + if (ret) { + dev_info(&pcie->pci->dev, "Failed to request IRQ %d\n", pcie->pci->irq); + goto err_free_msi; + } iowrite32(KVASER_PCIEFD_SRB_IRQ_DPD0 | KVASER_PCIEFD_SRB_IRQ_DPD1, KVASER_PCIEFD_SRB_ADDR(pcie) + KVASER_PCIEFD_SRB_IRQ_REG); @@ -1807,6 +1820,10 @@ static int kvaser_pciefd_probe(struct pci_dev *pdev, iowrite32(0, irq_en_base); free_irq(pcie->pci->irq, pcie); +err_free_msi: + if (pcie->pci->msi_enabled) + 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); -- 2.40.1