aboutsummaryrefslogtreecommitdiffstats
path: root/net/bluetooth
diff options
context:
space:
mode:
authorJohan Hedberg <johan.hedberg@intel.com>2013-03-05 13:37:44 -0500
committerGustavo Padovan <gustavo.padovan@collabora.co.uk>2013-03-08 08:40:26 -0500
commit3119ae9599e5cdc1b9838563905c500b582ab6a5 (patch)
tree8be29a020c0b6082f05bb16a2cdd7e621fd118cf /net/bluetooth
parent2177bab507d2715ae3b745f47056eacd38b79fa7 (diff)
Bluetooth: Add initial skeleton for asynchronous HCI requests
This patch adds the initial definitions and functions for asynchronous HCI requests. Asynchronous requests are essentially a group of HCI commands together with an optional completion callback. The request is tracked through the already existing command queue by having the necessary context information as part of the control buffer of each skb. The only information needed in the skb control buffer is a flag for indicating that the skb is the start of a request as well as the optional complete callback that should be used when the request is complete (this will be found in the last skb of the request). Signed-off-by: Johan Hedberg <johan.hedberg@intel.com> Acked-by: Marcel Holtmann <marcel@holtmann.org> Signed-off-by: Gustavo Padovan <gustavo.padovan@collabora.co.uk>
Diffstat (limited to 'net/bluetooth')
-rw-r--r--net/bluetooth/hci_core.c30
1 files changed, 30 insertions, 0 deletions
diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c
index 6ab38fecf1fe..94b08aa9a081 100644
--- a/net/bluetooth/hci_core.c
+++ b/net/bluetooth/hci_core.c
@@ -2439,6 +2439,36 @@ static int hci_send_frame(struct sk_buff *skb)
2439 return hdev->send(skb); 2439 return hdev->send(skb);
2440} 2440}
2441 2441
2442void hci_req_init(struct hci_request *req, struct hci_dev *hdev)
2443{
2444 skb_queue_head_init(&req->cmd_q);
2445 req->hdev = hdev;
2446}
2447
2448int hci_req_run(struct hci_request *req, hci_req_complete_t complete)
2449{
2450 struct hci_dev *hdev = req->hdev;
2451 struct sk_buff *skb;
2452 unsigned long flags;
2453
2454 BT_DBG("length %u", skb_queue_len(&req->cmd_q));
2455
2456 /* Do not allow empty requests */
2457 if (skb_queue_empty(&req->cmd_q))
2458 return -EINVAL;
2459
2460 skb = skb_peek_tail(&req->cmd_q);
2461 bt_cb(skb)->req.complete = complete;
2462
2463 spin_lock_irqsave(&hdev->cmd_q.lock, flags);
2464 skb_queue_splice_tail(&req->cmd_q, &hdev->cmd_q);
2465 spin_unlock_irqrestore(&hdev->cmd_q.lock, flags);
2466
2467 queue_work(hdev->workqueue, &hdev->cmd_work);
2468
2469 return 0;
2470}
2471
2442/* Send HCI command */ 2472/* Send HCI command */
2443int hci_send_cmd(struct hci_dev *hdev, __u16 opcode, __u32 plen, void *param) 2473int hci_send_cmd(struct hci_dev *hdev, __u16 opcode, __u32 plen, void *param)
2444{ 2474{