summaryrefslogtreecommitdiff
path: root/drivers/pci/msi.c
diff options
context:
space:
mode:
authorMichael Ellerman <michael@ellerman.id.au>2007-03-22 21:51:33 +1100
committerGreg Kroah-Hartman <gregkh@suse.de>2007-05-02 19:02:36 -0700
commitfc4afc7b2bdd81e2dbded5a8222676d3161758d3 (patch)
treef746cc18be366058a764e6cc3c3625efbfbb5765 /drivers/pci/msi.c
parent00ba16ab2658afe11d4fdcaf16a331292c44bee6 (diff)
downloadlwn-fc4afc7b2bdd81e2dbded5a8222676d3161758d3.tar.gz
lwn-fc4afc7b2bdd81e2dbded5a8222676d3161758d3.zip
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: Michael Ellerman <michael@ellerman.id.au> Acked-by: Eric W. Biederman <ebiederm@xmission.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/pci/msi.c')
-rw-r--r--drivers/pci/msi.c49
1 files changed, 20 insertions, 29 deletions
diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c
index 91fed543fc84..4f326f38f9bf 100644
--- a/drivers/pci/msi.c
+++ b/drivers/pci/msi.c
@@ -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)