提交 451d95a9 编写于 作者: B Brian Gix 提交者: Marcel Holtmann

Bluetooth: hci_sync: Enable synch'd set_bredr

Uses previously written:
  hci_write_fast_connectable_sync
  hci_update_scan_sync
  hci_update_adv_data_sync
Signed-off-by: NBrian Gix <brian.gix@intel.com>
Signed-off-by: NMarcel Holtmann <marcel@holtmann.org>
上级 353a0249
...@@ -69,6 +69,7 @@ int hci_update_passive_scan_sync(struct hci_dev *hdev); ...@@ -69,6 +69,7 @@ int hci_update_passive_scan_sync(struct hci_dev *hdev);
int hci_update_passive_scan(struct hci_dev *hdev); int hci_update_passive_scan(struct hci_dev *hdev);
int hci_write_fast_connectable_sync(struct hci_dev *hdev, bool enable); int hci_write_fast_connectable_sync(struct hci_dev *hdev, bool enable);
int hci_update_scan_sync(struct hci_dev *hdev);
int hci_dev_open_sync(struct hci_dev *hdev); int hci_dev_open_sync(struct hci_dev *hdev);
int hci_dev_close_sync(struct hci_dev *hdev); int hci_dev_close_sync(struct hci_dev *hdev);
......
...@@ -2262,7 +2262,7 @@ static int hci_write_scan_enable_sync(struct hci_dev *hdev, u8 val) ...@@ -2262,7 +2262,7 @@ static int hci_write_scan_enable_sync(struct hci_dev *hdev, u8 val)
HCI_CMD_TIMEOUT); HCI_CMD_TIMEOUT);
} }
static int hci_update_scan_sync(struct hci_dev *hdev) int hci_update_scan_sync(struct hci_dev *hdev)
{ {
u8 scan; u8 scan;
......
...@@ -5953,20 +5953,14 @@ static int set_fast_connectable(struct sock *sk, struct hci_dev *hdev, ...@@ -5953,20 +5953,14 @@ static int set_fast_connectable(struct sock *sk, struct hci_dev *hdev,
return err; return err;
} }
static void set_bredr_complete(struct hci_dev *hdev, u8 status, u16 opcode) static void set_bredr_complete(struct hci_dev *hdev, void *data, int err)
{ {
struct mgmt_pending_cmd *cmd; struct mgmt_pending_cmd *cmd = data;
bt_dev_dbg(hdev, "status 0x%02x", status);
hci_dev_lock(hdev);
cmd = pending_find(MGMT_OP_SET_BREDR, hdev); bt_dev_dbg(hdev, "err %d", err);
if (!cmd)
goto unlock;
if (status) { if (err) {
u8 mgmt_err = mgmt_status(status); u8 mgmt_err = mgmt_status(err);
/* We need to restore the flag if related HCI commands /* We need to restore the flag if related HCI commands
* failed. * failed.
...@@ -5979,17 +5973,31 @@ static void set_bredr_complete(struct hci_dev *hdev, u8 status, u16 opcode) ...@@ -5979,17 +5973,31 @@ static void set_bredr_complete(struct hci_dev *hdev, u8 status, u16 opcode)
new_settings(hdev, cmd->sk); new_settings(hdev, cmd->sk);
} }
mgmt_pending_remove(cmd); mgmt_pending_free(cmd);
}
unlock: static int set_bredr_sync(struct hci_dev *hdev, void *data)
hci_dev_unlock(hdev); {
int status;
status = hci_write_fast_connectable_sync(hdev, false);
if (!status)
status = hci_update_scan_sync(hdev);
/* Since only the advertising data flags will change, there
* is no need to update the scan response data.
*/
if (!status)
status = hci_update_adv_data_sync(hdev, hdev->cur_adv_instance);
return status;
} }
static int set_bredr(struct sock *sk, struct hci_dev *hdev, void *data, u16 len) static int set_bredr(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
{ {
struct mgmt_mode *cp = data; struct mgmt_mode *cp = data;
struct mgmt_pending_cmd *cmd; struct mgmt_pending_cmd *cmd;
struct hci_request req;
int err; int err;
bt_dev_dbg(hdev, "sock %p", sk); bt_dev_dbg(hdev, "sock %p", sk);
...@@ -6061,15 +6069,19 @@ static int set_bredr(struct sock *sk, struct hci_dev *hdev, void *data, u16 len) ...@@ -6061,15 +6069,19 @@ static int set_bredr(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
} }
} }
if (pending_find(MGMT_OP_SET_BREDR, hdev)) { cmd = mgmt_pending_new(sk, MGMT_OP_SET_BREDR, hdev, data, len);
err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_BREDR, if (!cmd)
MGMT_STATUS_BUSY);
goto unlock;
}
cmd = mgmt_pending_add(sk, MGMT_OP_SET_BREDR, hdev, data, len);
if (!cmd) {
err = -ENOMEM; err = -ENOMEM;
else
err = hci_cmd_sync_queue(hdev, set_bredr_sync, cmd,
set_bredr_complete);
if (err < 0) {
mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_BREDR,
MGMT_STATUS_FAILED);
if (cmd)
mgmt_pending_free(cmd);
goto unlock; goto unlock;
} }
...@@ -6078,20 +6090,6 @@ static int set_bredr(struct sock *sk, struct hci_dev *hdev, void *data, u16 len) ...@@ -6078,20 +6090,6 @@ static int set_bredr(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
*/ */
hci_dev_set_flag(hdev, HCI_BREDR_ENABLED); hci_dev_set_flag(hdev, HCI_BREDR_ENABLED);
hci_req_init(&req, hdev);
__hci_req_write_fast_connectable(&req, false);
__hci_req_update_scan(&req);
/* Since only the advertising data flags will change, there
* is no need to update the scan response data.
*/
__hci_req_update_adv_data(&req, hdev->cur_adv_instance);
err = hci_req_run(&req, set_bredr_complete);
if (err < 0)
mgmt_pending_remove(cmd);
unlock: unlock:
hci_dev_unlock(hdev); hci_dev_unlock(hdev);
return err; return err;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册