Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b7636e81 authored by Kishon Vijay Abraham I's avatar Kishon Vijay Abraham I Committed by Bjorn Helgaas
Browse files

misc: pci_endpoint_test: Fix BUG_ON error during pci_disable_msi()



pci_disable_msi() throws a Kernel BUG if the driver has successfully
requested an IRQ and not released it. Fix it here by freeing IRQs before
invoking pci_disable_msi().

Signed-off-by: default avatarKishon Vijay Abraham I <kishon@ti.com>
Signed-off-by: default avatarBjorn Helgaas <bhelgaas@google.com>
parent 139838ff
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -92,6 +92,7 @@ struct pci_endpoint_test {
	void __iomem	*bar[6];
	struct completion irq_raised;
	int		last_irq;
	int		num_irqs;
	/* mutex to protect the ioctls */
	struct mutex	mutex;
	struct miscdevice miscdev;
@@ -513,6 +514,7 @@ static int pci_endpoint_test_probe(struct pci_dev *pdev,
		irq = pci_alloc_irq_vectors(pdev, 1, 32, PCI_IRQ_MSI);
		if (irq < 0)
			dev_err(dev, "failed to get MSI interrupts\n");
		test->num_irqs = irq;
	}

	err = devm_request_irq(dev, pdev->irq, pci_endpoint_test_irqhandler,
@@ -587,6 +589,9 @@ static int pci_endpoint_test_probe(struct pci_dev *pdev,
			pci_iounmap(pdev, test->bar[bar]);
	}

	for (i = 0; i < irq; i++)
		devm_free_irq(dev, pdev->irq + i, test);

err_disable_msi:
	pci_disable_msi(pdev);
	pci_release_regions(pdev);
@@ -600,6 +605,7 @@ static int pci_endpoint_test_probe(struct pci_dev *pdev,
static void pci_endpoint_test_remove(struct pci_dev *pdev)
{
	int id;
	int i;
	enum pci_barno bar;
	struct pci_endpoint_test *test = pci_get_drvdata(pdev);
	struct miscdevice *misc_device = &test->miscdev;
@@ -616,6 +622,8 @@ static void pci_endpoint_test_remove(struct pci_dev *pdev)
		if (test->bar[bar])
			pci_iounmap(pdev, test->bar[bar]);
	}
	for (i = 0; i < test->num_irqs; i++)
		devm_free_irq(&pdev->dev, pdev->irq + i, test);
	pci_disable_msi(pdev);
	pci_release_regions(pdev);
	pci_disable_device(pdev);