• Rafael J. Wysocki's avatar
    PCI PM: Restore standard config registers of all devices early · aa8c6c93
    Rafael J. Wysocki authored
    There is a problem in our handling of suspend-resume of PCI devices that
    many of them have their standard config registers restored with
    interrupts enabled and they are put into the full power state with
    interrupts enabled as well.  This may lead to the following scenario:
      * an interrupt vector is shared between two or more devices
      * one device is resumed earlier and generates an interrupt
      * the interrupt handler of another device tries to handle it and
        attempts to access the device the config space of which hasn't been
        restored yet and/or which still is in a low power state
      * the system crashes as a result
    
    To prevent this from happening we should restore the standard
    configuration registers of all devices with interrupts disabled and we
    should put them into the D0 power state right after that.
    Unfortunately, this cannot be done using the existing
    pci_set_power_state(), because it can sleep.  Also, to do it we have to
    make sure that the config spaces of all devices were actually saved
    during suspend.
    Signed-off-by: default avatarRafael J. Wysocki <rjw@sisk.pl>
    Acked-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: default avatarJesse Barnes <jbarnes@virtuousgeek.org>
    aa8c6c93
pci.c 63.3 KB