diff options
author | Johan Hedberg <johan.hedberg@intel.com> | 2014-12-05 06:36:07 -0500 |
---|---|---|
committer | Marcel Holtmann <marcel@holtmann.org> | 2014-12-05 06:46:10 -0500 |
commit | 69487371d14b667c437d1a08b2c8a92738d12992 (patch) | |
tree | eaad06b1e5c9d50a098c22a22ca3f51b9bbfa21f | |
parent | 2922a94fcc04f26aee1b279d38e93d4a5c295f25 (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.c | 59 |
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 | ||
5290 | static void get_clock_info_complete(struct hci_dev *hdev, u8 status) | 5290 | static 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 | |||
5313 | complete: | ||
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 | |||
5322 | static 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 | |||
5332 | send_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 | ||
5341 | unlock: | 5350 | unlock: |
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)); |