Bluetooth: Add hook for driver to prevent wake from suspend
authorAbhishek Pandit-Subedi <abhishekpandit@chromium.org>
Wed, 13 May 2020 02:19:26 +0000 (19:19 -0700)
committerMarcel Holtmann <marcel@holtmann.org>
Wed, 13 May 2020 07:12:04 +0000 (09:12 +0200)
Let drivers have a hook to disable configuring scanning during suspend.
Drivers should use the device_may_wakeup function call to determine
whether hci should be configured for wakeup.

For example, an implementation for btusb may look like the following:

  bool btusb_prevent_wake(struct hci_dev *hdev)
  {
        struct btusb_data *data = hci_get_drvdata(hdev);
        return !device_may_wakeup(&data->udev->dev);
  }

Signed-off-by: Abhishek Pandit-Subedi <abhishekpandit@chromium.org>
Reviewed-by: Alain Michaud <alainm@chromium.org>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
include/net/bluetooth/hci_core.h
net/bluetooth/hci_core.c

index 869ee2b..5dcf85f 100644 (file)
@@ -503,6 +503,7 @@ struct hci_dev {
        int (*set_diag)(struct hci_dev *hdev, bool enable);
        int (*set_bdaddr)(struct hci_dev *hdev, const bdaddr_t *bdaddr);
        void (*cmd_timeout)(struct hci_dev *hdev);
+       bool (*prevent_wake)(struct hci_dev *hdev);
 };
 
 #define HCI_PHY_HANDLE(handle) (handle & 0xff)
index de1f4e7..dbe2d79 100644 (file)
@@ -3350,8 +3350,10 @@ static int hci_suspend_notifier(struct notifier_block *nb, unsigned long action,
                 */
                ret = hci_change_suspend_state(hdev, BT_SUSPEND_DISCONNECT);
 
-               /* Only configure whitelist if disconnect succeeded */
-               if (!ret)
+               /* Only configure whitelist if disconnect succeeded and wake
+                * isn't being prevented.
+                */
+               if (!ret && !(hdev->prevent_wake && hdev->prevent_wake(hdev)))
                        ret = hci_change_suspend_state(hdev,
                                                BT_SUSPEND_CONFIGURE_WAKE);
        } else if (action == PM_POST_SUSPEND) {