Bluetooth: Replace wakeable list with flag
authorAbhishek Pandit-Subedi <abhishekpandit@chromium.org>
Wed, 17 Jun 2020 14:39:09 +0000 (16:39 +0200)
committerJohan Hedberg <johan.hedberg@intel.com>
Thu, 18 Jun 2020 10:11:10 +0000 (13:11 +0300)
Since the classic device list now supports flags, convert the wakeable
list into a flag on the existing device list.

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

index 95a3935..0643c73 100644 (file)
@@ -143,6 +143,16 @@ struct bdaddr_list_with_flags {
        u32 current_flags;
 };
 
+enum hci_conn_flags {
+       HCI_CONN_FLAG_REMOTE_WAKEUP,
+       HCI_CONN_FLAG_MAX
+};
+
+#define hci_conn_test_flag(nr, flags) ((flags) & (1U << nr))
+
+/* Make sure number of flags doesn't exceed sizeof(current_flags) */
+static_assert(HCI_CONN_FLAG_MAX < 32);
+
 struct bt_uuid {
        struct list_head list;
        u8 uuid[16];
@@ -463,7 +473,6 @@ struct hci_dev {
        struct list_head        mgmt_pending;
        struct list_head        blacklist;
        struct list_head        whitelist;
-       struct list_head        wakeable;
        struct list_head        uuids;
        struct list_head        link_keys;
        struct list_head        long_term_keys;
index 8a471be..8e01afb 100644 (file)
@@ -3499,7 +3499,6 @@ struct hci_dev *hci_alloc_dev(void)
        INIT_LIST_HEAD(&hdev->mgmt_pending);
        INIT_LIST_HEAD(&hdev->blacklist);
        INIT_LIST_HEAD(&hdev->whitelist);
-       INIT_LIST_HEAD(&hdev->wakeable);
        INIT_LIST_HEAD(&hdev->uuids);
        INIT_LIST_HEAD(&hdev->link_keys);
        INIT_LIST_HEAD(&hdev->long_term_keys);
index a7f572a..a5b53d3 100644 (file)
@@ -968,15 +968,19 @@ static void hci_req_clear_event_filter(struct hci_request *req)
 
 static void hci_req_set_event_filter(struct hci_request *req)
 {
-       struct bdaddr_list *b;
+       struct bdaddr_list_with_flags *b;
        struct hci_cp_set_event_filter f;
        struct hci_dev *hdev = req->hdev;
-       u8 scan;
+       u8 scan = SCAN_DISABLED;
 
        /* Always clear event filter when starting */
        hci_req_clear_event_filter(req);
 
-       list_for_each_entry(b, &hdev->wakeable, list) {
+       list_for_each_entry(b, &hdev->whitelist, list) {
+               if (!hci_conn_test_flag(HCI_CONN_FLAG_REMOTE_WAKEUP,
+                                       b->current_flags))
+                       continue;
+
                memset(&f, 0, sizeof(f));
                bacpy(&f.addr_conn_flt.bdaddr, &b->bdaddr);
                f.flt_type = HCI_FLT_CONN_SETUP;
@@ -985,9 +989,9 @@ static void hci_req_set_event_filter(struct hci_request *req)
 
                bt_dev_dbg(hdev, "Adding event filters for %pMR", &b->bdaddr);
                hci_req_add(req, HCI_OP_SET_EVENT_FLT, sizeof(f), &f);
+               scan = SCAN_PAGE;
        }
 
-       scan = !list_empty(&hdev->wakeable) ? SCAN_PAGE : SCAN_DISABLED;
        hci_req_add(req, HCI_OP_WRITE_SCAN_ENABLE, 1, &scan);
 }