Subject: [PATCH] PCI: enable ITE bridge to workaround suspend/resume Wilmer reported continuous suspend/resume does not work after commit 928bea964827 ("PCI: Delay enabling bridges until they're needed"). For pci bridge without driver, FW enable it already. In pci_pm_resume/pci_pm_reenable_device after first resume will not reenable the device, aka the status is not the same as that before first suspend. Try to enable bridge to make status consistent between later resume to first resume. Link: https://bugzilla.kernel.org/show_bug.cgi?id=86421 Fixes: 928bea964827 ("PCI: Delay enabling bridges until they're needed") Reported-by: Wilmer van der Gaast Bisected-by: Wilmer van der Gaast Signed-off-by: Yinghai Lu Cc: Zhang Rui CC: stable@vger.kernel.org # v3.10+ --- drivers/pci/pci.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) Index: linux-2.6/drivers/pci/pci.c =================================================================== --- linux-2.6.orig/drivers/pci/pci.c +++ linux-2.6/drivers/pci/pci.c @@ -1263,6 +1263,22 @@ static void pci_enable_bridge(struct pci pci_set_master(dev); } +static void pci_enable_ite(struct pci_dev *dev) +{ + u16 cmd; + + if (pci_is_enabled(dev)) + return; + + /* FW enable the bridge already ? */ + pci_read_config_word(dev, PCI_COMMAND, &cmd); + if (cmd & (PCI_COMMAND_IO || PCI_COMMAND_MEMORY)) { + dev_printk(KERN_DEBUG, &dev->dev, "enable bridge from FW.\n"); + pci_enable_bridge(dev); + } +} +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ITE, 0x8892, pci_enable_ite); + static int pci_enable_device_flags(struct pci_dev *dev, unsigned long flags) { struct pci_dev *bridge;