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>
This commit is contained in:
Родитель
00ba16ab26
Коммит
fc4afc7b2b
|
@ -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)
|
||||
|
|
Загрузка…
Ссылка в новой задаче