aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohan Hedberg <johan.hedberg@intel.com>2014-12-05 06:36:07 -0500
committerMarcel Holtmann <marcel@holtmann.org>2014-12-05 06:46:10 -0500
commit69487371d14b667c437d1a08b2c8a92738d12992 (patch)
treeeaad06b1e5c9d50a098c22a22ca3f51b9bbfa21f
parent2922a94fcc04f26aee1b279d38e93d4a5c295f25 (diff)
Bluetooth: Convert Get Clock Info to use cmd_complete callback
This patch converts the Get Clock Information mgmt command to take advantage of the new cmd_complete callback for pending commands. Signed-off-by: Johan Hedberg <johan.hedberg@intel.com> Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
-rw-r--r--net/bluetooth/mgmt.c59
1 files changed, 35 insertions, 24 deletions
diff --git a/net/bluetooth/mgmt.c b/net/bluetooth/mgmt.c
index ddaeebbccfba..8467d3552aa9 100644
--- a/net/bluetooth/mgmt.c
+++ b/net/bluetooth/mgmt.c
@@ -5287,10 +5287,40 @@ unlock:
5287 return err; 5287 return err;
5288} 5288}
5289 5289
5290static void get_clock_info_complete(struct hci_dev *hdev, u8 status) 5290static void clock_info_cmd_complete(struct pending_cmd *cmd, u8 status)
5291{ 5291{
5292 struct mgmt_cp_get_clock_info *cp; 5292 struct hci_conn *conn = cmd->user_data;
5293 struct mgmt_rp_get_clock_info rp; 5293 struct mgmt_rp_get_clock_info rp;
5294 struct hci_dev *hdev;
5295
5296 memset(&rp, 0, sizeof(rp));
5297 memcpy(&rp.addr, &cmd->param, sizeof(rp.addr));
5298
5299 if (status)
5300 goto complete;
5301
5302 hdev = hci_dev_get(cmd->index);
5303 if (hdev) {
5304 rp.local_clock = cpu_to_le32(hdev->clock);
5305 hci_dev_put(hdev);
5306 }
5307
5308 if (conn) {
5309 rp.piconet_clock = cpu_to_le32(conn->clock);
5310 rp.accuracy = cpu_to_le16(conn->clock_accuracy);
5311 }
5312
5313complete:
5314 cmd_complete(cmd->sk, cmd->index, cmd->opcode, status, &rp, sizeof(rp));
5315
5316 if (conn) {
5317 hci_conn_drop(conn);
5318 hci_conn_put(conn);
5319 }
5320}
5321
5322static void get_clock_info_complete(struct hci_dev *hdev, u8 status)
5323{
5294 struct hci_cp_read_clock *hci_cp; 5324 struct hci_cp_read_clock *hci_cp;
5295 struct pending_cmd *cmd; 5325 struct pending_cmd *cmd;
5296 struct hci_conn *conn; 5326 struct hci_conn *conn;
@@ -5314,29 +5344,8 @@ static void get_clock_info_complete(struct hci_dev *hdev, u8 status)
5314 if (!cmd) 5344 if (!cmd)
5315 goto unlock; 5345 goto unlock;
5316 5346
5317 cp = cmd->param; 5347 cmd->cmd_complete(cmd, mgmt_status(status));
5318
5319 memset(&rp, 0, sizeof(rp));
5320 memcpy(&rp.addr, &cp->addr, sizeof(rp.addr));
5321
5322 if (status)
5323 goto send_rsp;
5324
5325 rp.local_clock = cpu_to_le32(hdev->clock);
5326
5327 if (conn) {
5328 rp.piconet_clock = cpu_to_le32(conn->clock);
5329 rp.accuracy = cpu_to_le16(conn->clock_accuracy);
5330 }
5331
5332send_rsp:
5333 cmd_complete(cmd->sk, cmd->index, cmd->opcode, mgmt_status(status),
5334 &rp, sizeof(rp));
5335 mgmt_pending_remove(cmd); 5348 mgmt_pending_remove(cmd);
5336 if (conn) {
5337 hci_conn_drop(conn);
5338 hci_conn_put(conn);
5339 }
5340 5349
5341unlock: 5350unlock:
5342 hci_dev_unlock(hdev); 5351 hci_dev_unlock(hdev);
@@ -5392,6 +5401,8 @@ static int get_clock_info(struct sock *sk, struct hci_dev *hdev, void *data,
5392 goto unlock; 5401 goto unlock;
5393 } 5402 }
5394 5403
5404 cmd->cmd_complete = clock_info_cmd_complete;
5405
5395 hci_req_init(&req, hdev); 5406 hci_req_init(&req, hdev);
5396 5407
5397 memset(&hci_cp, 0, sizeof(hci_cp)); 5408 memset(&hci_cp, 0, sizeof(hci_cp));