• R
    ACPI / PM: Take unusual configurations of power resources into account · b5d667eb
    Rafael J. Wysocki 提交于
    Commit d2e5f0c1 (ACPI / PCI: Rework the setup and cleanup of device
    wakeup) moved the initial disabling of system wakeup for PCI devices
    into a place where it can actually work and that exposed a hidden old
    issue with crap^Wunusual system designs where the same power
    resources are used for both wakeup power and device power control at
    run time.
    
    Namely, say there is one power resource such that the ACPI power
    state D0 of a PCI device depends on that power resource (i.e. the
    device is in D0 when that power resource is "on") and it is used
    as a wakeup power resource for the same device.  Then, calling
    acpi_pci_sleep_wake(pci_dev, false) for the device in question will
    cause the reference counter of that power resource to drop to 0,
    which in turn will cause it to be turned off.  As a result, the
    device will go into D3cold at that point, although it should have
    stayed in D0.
    
    As it turns out, that happens to USB controllers on some laptops
    and USB becomes unusable on those machines as a result, which is
    a major regression from v3.8.
    
    To fix this problem, (1) increment the reference counters of wakup
    power resources during their initialization if they are "on"
    initially, (2) prevent acpi_disable_wakeup_device_power() from
    decrementing the reference counters of wakeup power resources that
    were not enabled for wakeup power previously, and (3) prevent
    acpi_enable_wakeup_device_power() from incrementing the reference
    counters of wakeup power resources that already are enabled for
    wakeup power.
    
    In addition to that, if it is impossible to determine the initial
    states of wakeup power resources, avoid enabling wakeup for devices
    whose wakeup power depends on those power resources.
    Reported-by: NDave Jones <davej@redhat.com>
    Reported-by: NFabio Baltieri <fabio.baltieri@linaro.org>
    Tested-by: NFabio Baltieri <fabio.baltieri@linaro.org>
    Signed-off-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
    b5d667eb
internal.h 4.5 KB