[PATCH] MSI-X: fix resume crash
So I think the right solution is to simply make pci_enable_device just flip enable bits and move the rest of the work someplace else. However a thorough cleanup is a little extreme for this point in the release cycle, so I think a quick hack that makes the code not stomp the irq when msi irq's are enabled should be the first fix. Then we can later make the code not change the irqs at all. Signed-off-by: Eric W. Biederman <ebiederm@xmission.com> Signed-off-by: Ingo Molnar <mingo@elte.hu> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
4dfc896e90
commit
bba6f6fc68
4 changed files with 15 additions and 6 deletions
|
@ -100,7 +100,9 @@ int pcibios_enable_device(struct pci_dev *dev, int mask)
|
|||
if ((err = pcibios_enable_resources(dev, mask)) < 0)
|
||||
return err;
|
||||
|
||||
return pcibios_enable_irq(dev);
|
||||
if (!dev->msi_enabled)
|
||||
pcibios_enable_irq(dev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int pcibios_assign_resources(void)
|
||||
|
|
|
@ -466,6 +466,7 @@ int pcibios_enable_device(struct pci_dev *dev, int mask)
|
|||
|
||||
if ((err = pcibios_enable_resources(dev, mask)) < 0)
|
||||
return err;
|
||||
pcibios_enable_irq(dev);
|
||||
if (!dev->msi_enabled)
|
||||
pcibios_enable_irq(dev);
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -434,11 +434,13 @@ int pcibios_enable_device(struct pci_dev *dev, int mask)
|
|||
if ((err = pcibios_enable_resources(dev, mask)) < 0)
|
||||
return err;
|
||||
|
||||
return pcibios_enable_irq(dev);
|
||||
if (!dev->msi_enabled)
|
||||
return pcibios_enable_irq(dev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void pcibios_disable_device (struct pci_dev *dev)
|
||||
{
|
||||
if (pcibios_disable_irq)
|
||||
if (!dev->msi_enabled && pcibios_disable_irq)
|
||||
pcibios_disable_irq(dev);
|
||||
}
|
||||
|
|
|
@ -557,14 +557,18 @@ pcibios_enable_device (struct pci_dev *dev, int mask)
|
|||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
return acpi_pci_irq_enable(dev);
|
||||
if (!dev->msi_enabled)
|
||||
return acpi_pci_irq_enable(dev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
pcibios_disable_device (struct pci_dev *dev)
|
||||
{
|
||||
BUG_ON(atomic_read(&dev->enable_cnt));
|
||||
acpi_pci_irq_disable(dev);
|
||||
if (!dev->msi_enabled)
|
||||
acpi_pci_irq_disable(dev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
|
|
Loading…
Reference in a new issue