• R
    PCI PM: Fix suspend error paths and testing facility breakage · 418e4da3
    Rafael J. Wysocki 提交于
    If one of device drivers refuses to suspend by returning error code
    from its ->suspend() callback, the devices that have already been
    suspended are resumed by executing their drivers' ->resume()
    callbacks.  Some of these callbacks expect the device's
    configuration space to be restored if the device has been put into
    D3 before they are called.  Unfortunately, this mechanism has been
    broken by recent changes moving the restoration of config spaces
    of some devices (most importantly, USB controllers and HDA Intel)
    into the resume callbacks executed with interrupts off.  Obviously,
    these callbacks are not invoked in the suspend error path and, as a
    result, the system cannot be successfully brought back into the
    working state in case of a suspend error.  The same thing happens
    in the hibernation error path right before putting the system into
    S4.
    
    Similarly, the suspend testing facility associated with the
    /sys/power/pm_test file is broken, because it uses the very same
    mechanism that is used in the suspend and hibernation error paths.
    
    Fix the breakage by making the PCI core restore the configuration
    spaces of PCI devices that haven't been restored already before
    pci_pm_resume() is called for those devices by the PM core.
    Signed-off-by: NRafael J. Wysocki <rjw@sisk.pl>
    Signed-off-by: NJesse Barnes <jbarnes@virtuousgeek.org>
    418e4da3
pci-driver.c 22.4 KB