• Kai Heng Feng's avatar
    PCI / PM: Always check PME wakeup capability for runtime wakeup support · 8feaec33
    Kai Heng Feng authored
    USB controller ASM1042 stops working after commit de3ef1eb (PM /
    core: Drop run_wake flag from struct dev_pm_info).
    
    The device in question is not power managed by platform firmware,
    furthermore, it only supports PME# from D3cold:
    Capabilities: [78] Power Management version 3
           Flags: PMEClk- DSI- D1- D2- AuxCurrent=55mA PME(D0-,D1-,D2-,D3hot-,D3cold+)
           Status: D0 NoSoftRst+ PME-Enable- DSel=0 DScale=0 PME-
    
    Before commit de3ef1eb, the device never gets runtime suspended.
    After that commit, the device gets runtime suspended to D3hot, which can
    not generate any PME#.
    
    usb_hcd_pci_probe() unconditionally calls device_wakeup_enable(), hence
    device_can_wakeup() in pci_dev_run_wake() always returns true.
    
    So pci_dev_run_wake() needs to check PME wakeup capability as its first
    condition.
    
    In addition, change wakeup flag passed to pci_target_state() from false
    to true, because we want to find the deepest state different from D3cold
    that the device can still generate PME#. In this case, it's D0 for the
    device in question.
    
    Fixes: de3ef1eb (PM / core: Drop run_wake flag from struct dev_pm_info)
    Signed-off-by: default avatarKai-Heng Feng <kai.heng.feng@canonical.com>
    Cc: 4.13+ <stable@vger.kernel.org> # 4.13+
    Acked-by: default avatarBjorn Helgaas <bhelgaas@google.com>
    Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
    8feaec33
pci.c 152 KB