Messages in this thread Patch in this message | | | From | Jiang Liu <> | Subject | [PATCH] x86, irq: Keep IRQ assignment for PCI devices during suspend/hibernation | Date | Wed, 30 Jul 2014 17:37:13 +0800 |
| |
Function pci_disable_device() may be called for PCI devices during suspend/hibernation, which in turn may release IRQ assigned to PCI interrupt. Later when pci_enable_device() is called during resume, a different IRQ may be assigned and thus break the driver. So keep IRQ assignment for PCI devices during suspend/hibernation. We check pci_dev.dev.power.is_prepared to detect that pci_disable_device() and pci_enable_device() is called during suspend/hibernation.
Signed-off-by: Jiang Liu <jiang.liu@linux.intel.com> --- Hi Borislav, I can't reproduce the issue with my test machine. So could you please help to test this patch? Regards! Gerry --- arch/x86/pci/common.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/arch/x86/pci/common.c b/arch/x86/pci/common.c index 059a76c29739..417de4c92e8f 100644 --- a/arch/x86/pci/common.c +++ b/arch/x86/pci/common.c @@ -662,14 +662,15 @@ int pcibios_enable_device(struct pci_dev *dev, int mask) if ((err = pci_enable_resources(dev, mask)) < 0) return err; - if (!pci_dev_msi_enabled(dev)) + if (!pci_dev_msi_enabled(dev) && !dev->dev.pm.is_prepared) return pcibios_enable_irq(dev); return 0; } void pcibios_disable_device (struct pci_dev *dev) { - if (!pci_dev_msi_enabled(dev) && pcibios_disable_irq) + if (!pci_dev_msi_enabled(dev) && pcibios_disable_irq && + !dev->dev.pm.is_prepared) pcibios_disable_irq(dev); } -- 1.7.10.4
| |