提交 fc4afc7b 编写于 作者: M Michael Ellerman 提交者: Greg Kroah-Hartman

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: NMichael Ellerman <michael@ellerman.id.au>
Acked-by: NEric W. Biederman <ebiederm@xmission.com>
Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
上级 00ba16ab
...@@ -674,10 +674,26 @@ int pci_enable_msix(struct pci_dev* dev, struct msix_entry *entries, int nvec) ...@@ -674,10 +674,26 @@ int pci_enable_msix(struct pci_dev* dev, struct msix_entry *entries, int nvec)
return status; 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; 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) if (!pci_msi_enable)
return; return;
if (!dev) if (!dev)
...@@ -690,18 +706,7 @@ void pci_disable_msix(struct pci_dev* dev) ...@@ -690,18 +706,7 @@ void pci_disable_msix(struct pci_dev* dev)
pci_intx(dev, 1); /* enable intx */ pci_intx(dev, 1); /* enable intx */
dev->msix_enabled = 0; dev->msix_enabled = 0;
irq = head = dev->first_msi_irq; msix_free_all_irqs(dev);
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;
} }
/** /**
...@@ -722,23 +727,9 @@ void msi_remove_pci_irq_vectors(struct pci_dev* dev) ...@@ -722,23 +727,9 @@ void msi_remove_pci_irq_vectors(struct pci_dev* dev)
BUG_ON(irq_has_action(dev->first_msi_irq)); BUG_ON(irq_has_action(dev->first_msi_irq));
msi_free_irq(dev, 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; if (dev->msix_enabled)
while (head != tail) { msix_free_all_irqs(dev);
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);
}
} }
void pci_no_msi(void) void pci_no_msi(void)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册