[PATCH 1/3] Bluetooth: Introduce helpers for LE set scan start and complete

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Introduce a helper hci_req_start_scan() which starts an LE
scan and call it from passive_Scan() and active_scan().
There is not functionality change in this patch.

This is basically done to enable extended scanning if the
controller supports which will be done in the subsequent
patch

Signed-off-by: Jaganath Kanakkassery <jaganathx.kanakkassery@xxxxxxxxx>
---
 net/bluetooth/hci_event.c   | 37 ++++++++++++++++-------------
 net/bluetooth/hci_request.c | 58 +++++++++++++++++++--------------------------
 2 files changed, 46 insertions(+), 49 deletions(-)

diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c
index 0b4dba0..20c8471 100644
--- a/net/bluetooth/hci_event.c
+++ b/net/bluetooth/hci_event.c
@@ -1126,24 +1126,11 @@ static void store_pending_adv_report(struct
hci_dev *hdev, bdaddr_t *bdaddr,
        d->last_adv_data_len = len;
 }

-static void hci_cc_le_set_scan_enable(struct hci_dev *hdev,
-                                     struct sk_buff *skb)
+static void le_set_scan_enable_complete(struct hci_dev *hdev, u8 enable)
 {
-       struct hci_cp_le_set_scan_enable *cp;
-       __u8 status = *((__u8 *) skb->data);
-
-       BT_DBG("%s status 0x%2.2x", hdev->name, status);
-
-       if (status)
-               return;
-
-       cp = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_SCAN_ENABLE);
-       if (!cp)
-               return;
-
        hci_dev_lock(hdev);

-       switch (cp->enable) {
+       switch (enable) {
        case LE_SCAN_ENABLE:
                hci_dev_set_flag(hdev, HCI_LE_SCAN);
                if (hdev->le_scan_type == LE_SCAN_ACTIVE)
@@ -1188,13 +1175,31 @@ static void hci_cc_le_set_scan_enable(struct
hci_dev *hdev,
                break;

        default:
-               BT_ERR("Used reserved LE_Scan_Enable param %d", cp->enable);
+               BT_ERR("Used reserved LE_Scan_Enable param %d", enable);
                break;
        }

        hci_dev_unlock(hdev);
 }

+static void hci_cc_le_set_scan_enable(struct hci_dev *hdev,
+                                     struct sk_buff *skb)
+{
+       struct hci_cp_le_set_scan_enable *cp;
+       __u8 status = *((__u8 *) skb->data);
+
+       BT_DBG("%s status 0x%2.2x", hdev->name, status);
+
+       if (status)
+               return;
+
+       cp = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_SCAN_ENABLE);
+       if (!cp)
+               return;
+
+       le_set_scan_enable_complete(hdev, cp->enable);
+}
+
 static void hci_cc_le_read_white_list_size(struct hci_dev *hdev,
                                           struct sk_buff *skb)
 {
diff --git a/net/bluetooth/hci_request.c b/net/bluetooth/hci_request.c
index b73ac14..102579e 100644
--- a/net/bluetooth/hci_request.c
+++ b/net/bluetooth/hci_request.c
@@ -778,10 +778,30 @@ static bool scan_use_rpa(struct hci_dev *hdev)
        return hci_dev_test_flag(hdev, HCI_PRIVACY);
 }

-void hci_req_add_le_passive_scan(struct hci_request *req)
+static void hci_req_start_scan(struct hci_request *req, u8 type, u16 interval,
+                              u16 window, u8 own_addr_type, u8 filter_policy)
 {
        struct hci_cp_le_set_scan_param param_cp;
        struct hci_cp_le_set_scan_enable enable_cp;
+
+       memset(&param_cp, 0, sizeof(param_cp));
+       param_cp.type = type;
+       param_cp.interval = cpu_to_le16(interval);
+       param_cp.window = cpu_to_le16(window);
+       param_cp.own_address_type = own_addr_type;
+       param_cp.filter_policy = filter_policy;
+       hci_req_add(req, HCI_OP_LE_SET_SCAN_PARAM, sizeof(param_cp),
+                   &param_cp);
+
+       memset(&enable_cp, 0, sizeof(enable_cp));
+       enable_cp.enable = LE_SCAN_ENABLE;
+       enable_cp.filter_dup = LE_SCAN_FILTER_DUP_ENABLE;
+       hci_req_add(req, HCI_OP_LE_SET_SCAN_ENABLE, sizeof(enable_cp),
+                   &enable_cp);
+}
+
+void hci_req_add_le_passive_scan(struct hci_request *req)
+{
        struct hci_dev *hdev = req->hdev;
        u8 own_addr_type;
        u8 filter_policy;
@@ -815,20 +835,8 @@ void hci_req_add_le_passive_scan(struct hci_request *req)
            (hdev->le_features[0] & HCI_LE_EXT_SCAN_POLICY))
                filter_policy |= 0x02;

-       memset(&param_cp, 0, sizeof(param_cp));
-       param_cp.type = LE_SCAN_PASSIVE;
-       param_cp.interval = cpu_to_le16(hdev->le_scan_interval);
-       param_cp.window = cpu_to_le16(hdev->le_scan_window);
-       param_cp.own_address_type = own_addr_type;
-       param_cp.filter_policy = filter_policy;
-       hci_req_add(req, HCI_OP_LE_SET_SCAN_PARAM, sizeof(param_cp),
-                   &param_cp);
-
-       memset(&enable_cp, 0, sizeof(enable_cp));
-       enable_cp.enable = LE_SCAN_ENABLE;
-       enable_cp.filter_dup = LE_SCAN_FILTER_DUP_ENABLE;
-       hci_req_add(req, HCI_OP_LE_SET_SCAN_ENABLE, sizeof(enable_cp),
-                   &enable_cp);
+       hci_req_start_scan(req, LE_SCAN_PASSIVE, hdev->le_scan_interval,
+                          hdev->le_scan_window, own_addr_type, filter_policy);
 }

 static u8 get_cur_adv_instance_scan_rsp_len(struct hci_dev *hdev)
@@ -1989,8 +1997,6 @@ static int active_scan(struct hci_request *req,
unsigned long opt)
 {
        uint16_t interval = opt;
        struct hci_dev *hdev = req->hdev;
-       struct hci_cp_le_set_scan_param param_cp;
-       struct hci_cp_le_set_scan_enable enable_cp;
        u8 own_addr_type;
        int err;

@@ -2029,22 +2035,8 @@ static int active_scan(struct hci_request *req,
unsigned long opt)
        if (err < 0)
                own_addr_type = ADDR_LE_DEV_PUBLIC;

-       memset(&param_cp, 0, sizeof(param_cp));
-       param_cp.type = LE_SCAN_ACTIVE;
-       param_cp.interval = cpu_to_le16(interval);
-       param_cp.window = cpu_to_le16(DISCOV_LE_SCAN_WIN);
-       param_cp.own_address_type = own_addr_type;
-
-       hci_req_add(req, HCI_OP_LE_SET_SCAN_PARAM, sizeof(param_cp),
-                   &param_cp);
-
-       memset(&enable_cp, 0, sizeof(enable_cp));
-       enable_cp.enable = LE_SCAN_ENABLE;
-       enable_cp.filter_dup = LE_SCAN_FILTER_DUP_ENABLE;
-
-       hci_req_add(req, HCI_OP_LE_SET_SCAN_ENABLE, sizeof(enable_cp),
-                   &enable_cp);
-
+       hci_req_start_scan(req, LE_SCAN_ACTIVE, interval, DISCOV_LE_SCAN_WIN,
+                          own_addr_type, 0);
        return 0;
 }

--
2.7.4
--
To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Bluez Devel]     [Linux Wireless Networking]     [Linux Wireless Personal Area Networking]     [Linux ATH6KL]     [Linux USB Devel]     [Linux Media Drivers]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Big List of Linux Books]

  Powered by Linux