• Hans de Goede's avatar
    Revert "Bluetooth: hci_bcm: Streamline runtime PM code" · b09c6152
    Hans de Goede authored
    This reverts commit 43fff768 ("Bluetooth: hci_bcm: Streamline runtime
    PM code"). The commit msg for this commit states "No functional change
    intended.", but replacing:
    
     pm_runtime_get();
     pm_runtime_mark_last_busy();
     pm_runtime_put_autosuspend();
    
    with:
    
     pm_request_resume();
    
    Does result in a functional change, pm_request_resume() only calls
    pm_runtime_mark_last_busy() if the device was suspended before the call.
    
    This results in the following happening:
    
    1) Device is runtime suspended
    2) Device drives host_wake IRQ logically high as it starts receiving data
    3) bcm_host_wake() gets called, causes the device to runtime-resume,
       current time gets marked as last_busy time
    4) After 5 seconds the autosuspend timer expires and the dev autosuspends
       as no one has been calling pm_runtime_mark_last_busy(), the device was
       resumed during those 5 seconds, so all the pm_request_resume() calls
       while receiving data and/or bcm_host_wake() calls were nops
    5) If 4) happens while the device has (just received) data in its buffer to
       be read by the host the IRQ line is *already* / still logically high
       when we autosuspend and since we use an edge triggered IRQ, the IRQ
       will never trigger, causing the device to get stuck in suspend
    
    Therefor this commit has to be reverted, so that we avoid the device
    getting stuck in suspend.
    Signed-off-by: default avatarHans de Goede <hdegoede@redhat.com>
    Acked-by: default avatarLukas Wunner <lukas@wunner.de>
    Signed-off-by: default avatarMarcel Holtmann <marcel@holtmann.org>
    b09c6152
hci_bcm.c 28.5 KB