aboutsummaryrefslogtreecommitdiffstats
path: root/net/bluetooth/hci_event.c
diff options
context:
space:
mode:
authorJohan Hedberg <johan.hedberg@intel.com>2013-03-05 13:37:48 -0500
committerGustavo Padovan <gustavo.padovan@collabora.co.uk>2013-03-08 08:40:26 -0500
commit9238f36a5a5097018b90baa42c473d2f916a46f5 (patch)
tree304714fec2ecc9cacea615da399e8f09453f17e8 /net/bluetooth/hci_event.c
parent11714b3d7acee54eecf85d41c938923a02fdd054 (diff)
Bluetooth: Add request cmd_complete and cmd_status functions
This patch introduces functions to process the HCI request state when receiving HCI Command Status or Command Complete events. Some HCI commands, like Inquiry do not result in a Command complete event so special handling is needed for them. Inquiry is a particularly important one since it is the only forseeable "non-cmd_complete" command that will make good use of the request functionality, and its completion is either indicated by an Inquiry Complete event of a successful Command Complete for HCI_Inquiry_Cancel. 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/hci_event.c')
-rw-r--r--net/bluetooth/hci_event.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c
index 14e872aa0d2c..8b878a3bdf69 100644
--- a/net/bluetooth/hci_event.c
+++ b/net/bluetooth/hci_event.c
@@ -53,6 +53,7 @@ static void hci_cc_inquiry_cancel(struct hci_dev *hdev, struct sk_buff *skb)
53 hci_discovery_set_state(hdev, DISCOVERY_STOPPED); 53 hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
54 hci_dev_unlock(hdev); 54 hci_dev_unlock(hdev);
55 55
56 hci_req_cmd_complete(hdev, HCI_OP_INQUIRY, status);
56 hci_req_complete(hdev, HCI_OP_INQUIRY_CANCEL, status); 57 hci_req_complete(hdev, HCI_OP_INQUIRY_CANCEL, status);
57 58
58 hci_conn_check_pending(hdev); 59 hci_conn_check_pending(hdev);
@@ -1692,6 +1693,7 @@ static void hci_inquiry_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
1692 1693
1693 BT_DBG("%s status 0x%2.2x", hdev->name, status); 1694 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1694 1695
1696 hci_req_cmd_complete(hdev, HCI_OP_INQUIRY, status);
1695 hci_req_complete(hdev, HCI_OP_INQUIRY, status); 1697 hci_req_complete(hdev, HCI_OP_INQUIRY, status);
1696 1698
1697 hci_conn_check_pending(hdev); 1699 hci_conn_check_pending(hdev);
@@ -2254,6 +2256,7 @@ static void hci_qos_setup_complete_evt(struct hci_dev *hdev,
2254static void hci_cmd_complete_evt(struct hci_dev *hdev, struct sk_buff *skb) 2256static void hci_cmd_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
2255{ 2257{
2256 struct hci_ev_cmd_complete *ev = (void *) skb->data; 2258 struct hci_ev_cmd_complete *ev = (void *) skb->data;
2259 u8 status = skb->data[sizeof(*ev)];
2257 __u16 opcode; 2260 __u16 opcode;
2258 2261
2259 skb_pull(skb, sizeof(*ev)); 2262 skb_pull(skb, sizeof(*ev));
@@ -2497,6 +2500,8 @@ static void hci_cmd_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
2497 if (ev->opcode != HCI_OP_NOP) 2500 if (ev->opcode != HCI_OP_NOP)
2498 del_timer(&hdev->cmd_timer); 2501 del_timer(&hdev->cmd_timer);
2499 2502
2503 hci_req_cmd_complete(hdev, ev->opcode, status);
2504
2500 if (ev->ncmd && !test_bit(HCI_RESET, &hdev->flags)) { 2505 if (ev->ncmd && !test_bit(HCI_RESET, &hdev->flags)) {
2501 atomic_set(&hdev->cmd_cnt, 1); 2506 atomic_set(&hdev->cmd_cnt, 1);
2502 if (!skb_queue_empty(&hdev->cmd_q)) 2507 if (!skb_queue_empty(&hdev->cmd_q))
@@ -2590,6 +2595,8 @@ static void hci_cmd_status_evt(struct hci_dev *hdev, struct sk_buff *skb)
2590 if (ev->opcode != HCI_OP_NOP) 2595 if (ev->opcode != HCI_OP_NOP)
2591 del_timer(&hdev->cmd_timer); 2596 del_timer(&hdev->cmd_timer);
2592 2597
2598 hci_req_cmd_status(hdev, ev->opcode, ev->status);
2599
2593 if (ev->ncmd && !test_bit(HCI_RESET, &hdev->flags)) { 2600 if (ev->ncmd && !test_bit(HCI_RESET, &hdev->flags)) {
2594 atomic_set(&hdev->cmd_cnt, 1); 2601 atomic_set(&hdev->cmd_cnt, 1);
2595 if (!skb_queue_empty(&hdev->cmd_q)) 2602 if (!skb_queue_empty(&hdev->cmd_q))