Bluetooth: Fix issue where set_advertising_data_complete() was not called 47/317447/1 accepted/tizen/unified/20250103.010701 accepted/tizen/unified/x/20250103.021107
authorWootak Jung <wootak.jung@samsung.com>
Tue, 10 Dec 2024 01:04:36 +0000 (10:04 +0900)
committerJaehoon Chung <jh80.chung@samsung.com>
Thu, 2 Jan 2025 06:09:28 +0000 (15:09 +0900)
Change-Id: I58035f4f9de0a28e48dc4b5ea6c57097e1240f9a
Signed-off-by: Wootak Jung <wootak.jung@samsung.com>
Signed-off-by: Jaehoon Chung <jh80.chung@samsung.com>
include/net/bluetooth/hci_sync.h
net/bluetooth/hci_sync.c
net/bluetooth/mgmt.c

index d5b4e5f20f8785dbe5e1954fd643eb81a608a571..ed64611b4017029b0e9d8fbb2e99825455cb4199 100644 (file)
@@ -142,4 +142,6 @@ int hci_le_pa_terminate_sync(struct hci_dev *hdev, u16 handle);
 #ifdef TIZEN_BT
 int hci_start_le_discovery_sync(struct hci_dev *hdev);
 int hci_stop_le_discovery_sync(struct hci_dev *hdev);
+int hci_set_advertising_data_sync(struct hci_dev *hdev, void *data);
+int hci_set_scan_rsp_data_sync(struct hci_dev *hdev, void *data);
 #endif
index 367d9f547497d1745f58d28ea7893c958b2ae8b2..a39082db79a2f7805cf053100747ab85e34e792a 100644 (file)
 #include "aosp.h"
 #include "leds.h"
 
+#ifdef TIZEN_BT
+#include <net/bluetooth/mgmt_tizen.h>
+#include "mgmt_util.h"
+#endif
+
 static void hci_cmd_sync_complete(struct hci_dev *hdev, u8 result, u16 opcode,
                                  struct sk_buff *skb)
 {
@@ -6594,4 +6599,32 @@ int hci_stop_le_discovery_sync(struct hci_dev *hdev)
 {
        return hci_scan_disable_sync(hdev);
 }
+
+int hci_set_advertising_data_sync(struct hci_dev *hdev, void *data)
+{
+       struct mgmt_pending_cmd *cmd = data;
+       struct mgmt_cp_set_advertising_data *cp = cmd->param;
+       struct hci_cp_le_set_adv_data adv;
+
+       memset(&adv, 0, sizeof(adv));
+       memcpy(adv.data, cp->data, cmd->param_len);
+       adv.length = cmd->param_len;
+
+       return __hci_cmd_sync_status(hdev, HCI_OP_LE_SET_ADV_DATA,
+                                    sizeof(adv), &adv, HCI_CMD_TIMEOUT);
+}
+
+int hci_set_scan_rsp_data_sync(struct hci_dev *hdev, void *data)
+{
+       struct mgmt_pending_cmd *cmd = data;
+       struct mgmt_cp_set_scan_rsp_data *cp = cmd->param;
+       struct hci_cp_le_set_scan_rsp_data rsp;
+
+       memset(&rsp, 0, sizeof(rsp));
+       memcpy(rsp.data, cp->data, cmd->param_len);
+       rsp.length = cmd->param_len;
+
+       return __hci_cmd_sync_status(hdev, HCI_OP_LE_SET_SCAN_RSP_DATA,
+                                    sizeof(rsp), &rsp, HCI_CMD_TIMEOUT);
+}
 #endif
index 7c01ff947fd7178f0977d422ed2f55d29ae76b0a..cda48e759a34c8edb8d6386852d467400e3defc5 100644 (file)
@@ -7143,67 +7143,53 @@ static int set_advertising_params(struct sock *sk, struct hci_dev *hdev,
        return err;
 }
 
-static void set_advertising_data_complete(struct hci_dev *hdev,
-                       u8 status, u16 opcode)
+static void set_advertising_data_complete(struct hci_dev *hdev, void *data,
+                                         int err)
 {
-       struct mgmt_cp_set_advertising_data *cp;
-       struct mgmt_pending_cmd *cmd;
-
-       BT_DBG("status 0x%02x", status);
-
-       hci_dev_lock(hdev);
-
-       cmd = pending_find(MGMT_OP_SET_ADVERTISING_DATA, hdev);
-       if (!cmd)
-               goto unlock;
+       struct mgmt_pending_cmd *cmd = data;
 
-       cp = cmd->param;
+       bt_dev_dbg(hdev, "err %d", err);
 
-       if (status)
-               mgmt_cmd_status(cmd->sk, hdev->id,
-                               MGMT_OP_SET_ADVERTISING_DATA,
-                               mgmt_status(status));
-       else
-               mgmt_cmd_complete(cmd->sk, hdev->id,
-                               MGMT_OP_SET_ADVERTISING_DATA, 0,
-                               cp, sizeof(*cp));
+       if (cmd != pending_find(MGMT_OP_SET_ADVERTISING_DATA, hdev))
+               return;
 
+       mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode, mgmt_status(err),
+                         cmd->param, 1);
        mgmt_pending_remove(cmd);
+}
 
-unlock:
-       hci_dev_unlock(hdev);
+static int set_advertising_data_sync(struct hci_dev *hdev, void *data)
+{
+       return hci_set_advertising_data_sync(hdev, data);
 }
 
 static int set_advertising_data(struct sock *sk, struct hci_dev *hdev,
-                       void *data, u16 len)
+                               void *data, u16 len)
 {
        struct mgmt_pending_cmd *cmd;
-       struct hci_request req;
-       struct mgmt_cp_set_advertising_data *cp = data;
-       struct hci_cp_le_set_adv_data adv;
        int err;
 
-       BT_DBG("%s", hdev->name);
+       bt_dev_dbg(hdev, "sock %p", sk);
 
        if (!lmp_le_capable(hdev)) {
                return mgmt_cmd_status(sk, hdev->id,
-                               MGMT_OP_SET_ADVERTISING_DATA,
-                               MGMT_STATUS_NOT_SUPPORTED);
+                                      MGMT_OP_SET_ADVERTISING_DATA,
+                                      MGMT_STATUS_NOT_SUPPORTED);
        }
 
        hci_dev_lock(hdev);
 
        if (pending_find(MGMT_OP_SET_ADVERTISING_DATA, hdev)) {
                err = mgmt_cmd_status(sk, hdev->id,
-                               MGMT_OP_SET_ADVERTISING_DATA,
-                               MGMT_STATUS_BUSY);
+                                     MGMT_OP_SET_ADVERTISING_DATA,
+                                     MGMT_STATUS_BUSY);
                goto unlocked;
        }
 
        if (len > HCI_MAX_AD_LENGTH) {
                err = mgmt_cmd_status(sk, hdev->id,
-                               MGMT_OP_SET_ADVERTISING_DATA,
-                               MGMT_STATUS_INVALID_PARAMS);
+                                     MGMT_OP_SET_ADVERTISING_DATA,
+                                     MGMT_STATUS_INVALID_PARAMS);
                goto unlocked;
        }
 
@@ -7214,21 +7200,13 @@ static int set_advertising_data(struct sock *sk, struct hci_dev *hdev,
                goto unlocked;
        }
 
-       hci_req_init(&req, hdev);
-
-       memset(&adv, 0, sizeof(adv));
-       memcpy(adv.data, cp->data, len);
-       adv.length = len;
-
-       hci_req_add(&req, HCI_OP_LE_SET_ADV_DATA, sizeof(adv), &adv);
-
-       err = hci_req_run(&req, set_advertising_data_complete);
+       err = hci_cmd_sync_queue(hdev, set_advertising_data_sync, cmd,
+                                set_advertising_data_complete);
        if (err < 0)
                mgmt_pending_remove(cmd);
 
 unlocked:
        hci_dev_unlock(hdev);
-
        return err;
 }
 
@@ -7470,63 +7448,51 @@ unlocked:
        return err;
 }
 
-static void set_scan_rsp_data_complete(struct hci_dev *hdev, u8 status,
-                       u16 opcode)
+static void set_scan_rsp_data_complete(struct hci_dev *hdev, void *data,
+                                      int err)
 {
-       struct mgmt_cp_set_scan_rsp_data *cp;
-       struct mgmt_pending_cmd *cmd;
-
-       BT_DBG("status 0x%02x", status);
-
-       hci_dev_lock(hdev);
-
-       cmd = pending_find(MGMT_OP_SET_SCAN_RSP_DATA, hdev);
-       if (!cmd)
-               goto unlock;
+       struct mgmt_pending_cmd *cmd = data;
 
-       cp = cmd->param;
+       bt_dev_dbg(hdev, "err %d", err);
 
-       if (status)
-               mgmt_cmd_status(cmd->sk, hdev->id, MGMT_OP_SET_SCAN_RSP_DATA,
-                               mgmt_status(status));
-       else
-               mgmt_cmd_complete(cmd->sk, hdev->id,
-                               MGMT_OP_SET_SCAN_RSP_DATA, 0,
-                               cp, sizeof(*cp));
+       if (cmd != pending_find(MGMT_OP_SET_SCAN_RSP_DATA, hdev))
+               return;
 
+       mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode, mgmt_status(err),
+                         cmd->param, 1);
        mgmt_pending_remove(cmd);
+}
 
-unlock:
-       hci_dev_unlock(hdev);
+static int set_scan_rsp_data_sync(struct hci_dev *hdev, void *data)
+{
+       return hci_set_scan_rsp_data_sync(hdev, data);
 }
 
 static int set_scan_rsp_data(struct sock *sk, struct hci_dev *hdev, void *data,
                        u16 len)
 {
        struct mgmt_pending_cmd *cmd;
-       struct hci_request req;
-       struct mgmt_cp_set_scan_rsp_data *cp = data;
-       struct hci_cp_le_set_scan_rsp_data rsp;
        int err;
 
-       BT_DBG("%s", hdev->name);
+       bt_dev_dbg(hdev, "sock %p", sk);
 
-       if (!lmp_le_capable(hdev))
-               return mgmt_cmd_status(sk, hdev->id,
-                               MGMT_OP_SET_SCAN_RSP_DATA,
-                               MGMT_STATUS_NOT_SUPPORTED);
+       if (!lmp_le_capable(hdev)) {
+               return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SCAN_RSP_DATA,
+                                      MGMT_STATUS_NOT_SUPPORTED);
+       }
 
        hci_dev_lock(hdev);
 
+
        if (pending_find(MGMT_OP_SET_SCAN_RSP_DATA, hdev)) {
                err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SCAN_RSP_DATA,
-                               MGMT_STATUS_BUSY);
+                                     MGMT_STATUS_BUSY);
                goto unlocked;
        }
 
        if (len > HCI_MAX_AD_LENGTH) {
                err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SCAN_RSP_DATA,
-                               MGMT_STATUS_INVALID_PARAMS);
+                                     MGMT_STATUS_INVALID_PARAMS);
                goto unlocked;
        }
 
@@ -7536,21 +7502,13 @@ static int set_scan_rsp_data(struct sock *sk, struct hci_dev *hdev, void *data,
                goto unlocked;
        }
 
-       hci_req_init(&req, hdev);
-
-       memset(&rsp, 0, sizeof(rsp));
-       memcpy(rsp.data, cp->data, len);
-       rsp.length = len;
-
-       hci_req_add(&req, HCI_OP_LE_SET_SCAN_RSP_DATA, sizeof(rsp), &rsp);
-
-       err = hci_req_run(&req, set_scan_rsp_data_complete);
+       err = hci_cmd_sync_queue(hdev, set_scan_rsp_data_sync, cmd,
+                                set_scan_rsp_data_complete);
        if (err < 0)
                mgmt_pending_remove(cmd);
 
 unlocked:
        hci_dev_unlock(hdev);
-
        return err;
 }