}
 
        pci_save_state(pci_dev);
+       pci_dev->state_saved = true;
        /*
         * This is for compatibility with existing code with legacy PM support.
         */
 static void pci_pm_default_resume_noirq(struct pci_dev *pci_dev)
 {
        pci_restore_standard_config(pci_dev);
+       pci_dev->state_saved = false;
        pci_fixup_device(pci_fixup_resume_early, pci_dev);
 }
 
        struct device_driver *drv = dev->driver;
        int error = 0;
 
+       /*
+        * This is necessary for the suspend error path in which resume is
+        * called without restoring the standard config registers of the device.
+        */
+       if (pci_dev->state_saved)
+               pci_restore_standard_config(pci_dev);
+
        if (pci_has_legacy_pm_support(pci_dev))
                return pci_legacy_resume(dev);
 
        struct device_driver *drv = dev->driver;
        int error = 0;
 
+       /*
+        * This is necessary for the hibernation error path in which restore is
+        * called without restoring the standard config registers of the device.
+        */
+       if (pci_dev->state_saved)
+               pci_restore_standard_config(pci_dev);
+
        if (pci_has_legacy_pm_support(pci_dev))
                return pci_legacy_resume(dev);