• Rafael J. Wysocki's avatar
    PCI PM: Read device power state from register after updating it · e13cdbd7
    Rafael J. Wysocki authored
    After attempting to change the power state of a PCI device
    pci_raw_set_power_state() doesn't check if the value it wrote into
    the device's PCI_PM_CTRL register has been stored in there, but
    unconditionally modifies the device's current_state field to reflect
    the change.  This may cause problems to happen if the power state of
    the device hasn't been changed in fact, because it will make the PCI
    PM core make a wrong assumption.
    
    To prevent such situations from happening modify
    pci_raw_set_power_state() so that it reads the device's PCI_PM_CTRL
    register after writing into it and uses the value read from the
    register to update the device's current_state field.  Also make it
    print a message saying that the device refused to change its power
    state as requested (returning an error code in such cases would cause
    suspend regressions to appear on some systems, where device drivers'
    suspend routines return error codes if pci_set_power_state() fails).
    Reviewed-by: default avatarAlex Chiang <achiang@hp.com>
    Signed-off-by: default avatarRafael J. Wysocki <rjw@sisk.pl>
    Signed-off-by: default avatarJesse Barnes <jbarnes@virtuousgeek.org>
    e13cdbd7
pci.c 72.8 KB