From: Wootak Jung Date: Tue, 10 Dec 2024 01:04:36 +0000 (+0900) Subject: Bluetooth: Fix issue where set_advertising_data_complete() was not called X-Git-Tag: accepted/tizen/unified/20250103.010701^0 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=fadeaf35a055d88c9eded237647057fa90ced754;p=platform%2Fkernel%2Flinux-riscv.git Bluetooth: Fix issue where set_advertising_data_complete() was not called Change-Id: I58035f4f9de0a28e48dc4b5ea6c57097e1240f9a Signed-off-by: Wootak Jung Signed-off-by: Jaehoon Chung --- diff --git a/include/net/bluetooth/hci_sync.h b/include/net/bluetooth/hci_sync.h index d5b4e5f20f87..ed64611b4017 100644 --- a/include/net/bluetooth/hci_sync.h +++ b/include/net/bluetooth/hci_sync.h @@ -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 diff --git a/net/bluetooth/hci_sync.c b/net/bluetooth/hci_sync.c index 367d9f547497..a39082db79a2 100644 --- a/net/bluetooth/hci_sync.c +++ b/net/bluetooth/hci_sync.c @@ -21,6 +21,11 @@ #include "aosp.h" #include "leds.h" +#ifdef TIZEN_BT +#include +#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 diff --git a/net/bluetooth/mgmt.c b/net/bluetooth/mgmt.c index 7c01ff947fd7..cda48e759a34 100644 --- a/net/bluetooth/mgmt.c +++ b/net/bluetooth/mgmt.c @@ -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; }