Bluetooth: Configure controller address resolution if available
[linux-2.6-microblaze.git] / net / bluetooth / hci_request.c
index 7c0c2fd..7d0ba53 100644 (file)
@@ -675,6 +675,12 @@ void hci_req_add_le_scan_disable(struct hci_request *req)
                cp.enable = LE_SCAN_DISABLE;
                hci_req_add(req, HCI_OP_LE_SET_SCAN_ENABLE, sizeof(cp), &cp);
        }
+
+       if (use_ll_privacy(hdev) &&
+           hci_dev_test_flag(hdev, HCI_LL_RPA_RESOLUTION)) {
+               __u8 enable = 0x00;
+               hci_req_add(req, HCI_OP_LE_SET_ADDR_RESOLV_ENABLE, 1, &enable);
+       }
 }
 
 static void del_from_white_list(struct hci_request *req, bdaddr_t *bdaddr,
@@ -816,7 +822,8 @@ static bool scan_use_rpa(struct hci_dev *hdev)
 }
 
 static void hci_req_start_scan(struct hci_request *req, u8 type, u16 interval,
-                              u16 window, u8 own_addr_type, u8 filter_policy)
+                              u16 window, u8 own_addr_type, u8 filter_policy,
+                              bool addr_resolv)
 {
        struct hci_dev *hdev = req->hdev;
 
@@ -825,6 +832,11 @@ static void hci_req_start_scan(struct hci_request *req, u8 type, u16 interval,
                return;
        }
 
+       if (use_ll_privacy(hdev) && addr_resolv) {
+               u8 enable = 0x01;
+               hci_req_add(req, HCI_OP_LE_SET_ADDR_RESOLV_ENABLE, 1, &enable);
+       }
+
        /* Use ext scanning if set ext scan param and ext scan enable is
         * supported
         */
@@ -898,12 +910,18 @@ static void hci_req_start_scan(struct hci_request *req, u8 type, u16 interval,
        }
 }
 
+/* Ensure to call hci_req_add_le_scan_disable() first to disable the
+ * controller based address resolution to be able to reconfigure
+ * resolving list.
+ */
 void hci_req_add_le_passive_scan(struct hci_request *req)
 {
        struct hci_dev *hdev = req->hdev;
        u8 own_addr_type;
        u8 filter_policy;
        u16 window, interval;
+       /* Background scanning should run with address resolution */
+       bool addr_resolv = true;
 
        if (hdev->scanning_paused) {
                bt_dev_dbg(hdev, "Scanning is paused for suspend");
@@ -949,7 +967,7 @@ void hci_req_add_le_passive_scan(struct hci_request *req)
 
        bt_dev_dbg(hdev, "LE passive scan with whitelist = %d", filter_policy);
        hci_req_start_scan(req, LE_SCAN_PASSIVE, interval, window,
-                          own_addr_type, filter_policy);
+                          own_addr_type, filter_policy, addr_resolv);
 }
 
 static u8 get_adv_instance_scan_rsp_len(struct hci_dev *hdev, u8 instance)
@@ -2789,6 +2807,8 @@ static int active_scan(struct hci_request *req, unsigned long opt)
        u8 own_addr_type;
        /* White list is not used for discovery */
        u8 filter_policy = 0x00;
+       /* Discovery doesn't require controller address resolution */
+       bool addr_resolv = false;
        int err;
 
        BT_DBG("%s", hdev->name);
@@ -2811,7 +2831,7 @@ static int active_scan(struct hci_request *req, unsigned long opt)
 
        hci_req_start_scan(req, LE_SCAN_ACTIVE, interval,
                           hdev->le_scan_window_discovery, own_addr_type,
-                          filter_policy);
+                          filter_policy, addr_resolv);
        return 0;
 }