#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)
{
{
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
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;
}
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;
}
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;
}
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;
}