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

Commit fc4afc7b authored by Michael Ellerman's avatar Michael Ellerman Committed by Greg Kroah-Hartman
Browse files

MSI: Consolidate MSI-X irq freeing code



For the MSI-X case we do exactly the same logic in pci_disable_msix() and
msi_remove_pci_irq_vectors(), so consolidate them.

msi_remove_pci_irq_vectors() wasn't setting dev->first_msi_irq to 0, but
I think it should have been, so the consolidated version does.

Signed-off-by: default avatarMichael Ellerman <michael@ellerman.id.au>
Acked-by: default avatarEric W. Biederman <ebiederm@xmission.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 00ba16ab
Loading
Loading
Loading
Loading
+20 −29
Original line number Diff line number Diff line
@@ -674,10 +674,26 @@ int pci_enable_msix(struct pci_dev* dev, struct msix_entry *entries, int nvec)
	return status;
}

void pci_disable_msix(struct pci_dev* dev)
static void msix_free_all_irqs(struct pci_dev *dev)
{
	int irq, head, tail = 0;

	irq = head = dev->first_msi_irq;
	while (head != tail) {
		tail = get_irq_msi(irq)->link.tail;

		BUG_ON(irq_has_action(irq));

		if (irq != head)
			msi_free_irq(dev, irq);
		irq = tail;
	}
	msi_free_irq(dev, irq);
	dev->first_msi_irq = 0;
}

void pci_disable_msix(struct pci_dev* dev)
{
	if (!pci_msi_enable)
		return;
	if (!dev)
@@ -690,18 +706,7 @@ void pci_disable_msix(struct pci_dev* dev)
	pci_intx(dev, 1);		/* enable intx */
	dev->msix_enabled = 0;

	irq = head = dev->first_msi_irq;
	while (head != tail) {
		tail = get_irq_msi(irq)->link.tail;

		BUG_ON(irq_has_action(irq));

		if (irq != head)	/* Release MSI-X irq */
			msi_free_irq(dev, irq);
		irq = tail;
	}
	msi_free_irq(dev, irq);
	dev->first_msi_irq = 0;
	msix_free_all_irqs(dev);
}

/**
@@ -722,23 +727,9 @@ void msi_remove_pci_irq_vectors(struct pci_dev* dev)
		BUG_ON(irq_has_action(dev->first_msi_irq));
		msi_free_irq(dev, dev->first_msi_irq);
	}
	if (dev->msix_enabled) {
		int irq, head, tail = 0;
		void __iomem *base = NULL;

		irq = head = dev->first_msi_irq;
		while (head != tail) {
			tail = get_irq_msi(irq)->link.tail;
			base = get_irq_msi(irq)->mask_base;

			BUG_ON(irq_has_action(irq));

			if (irq != head) /* Release MSI-X irq */
				msi_free_irq(dev, irq);
			irq = tail;
		}
		msi_free_irq(dev, irq);
	}
	if (dev->msix_enabled)
		msix_free_all_irqs(dev);
}

void pci_no_msi(void)