aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/net/bluetooth/hci_core.h2
-rw-r--r--net/bluetooth/hci_core.c23
2 files changed, 20 insertions, 5 deletions
diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h
index b85eefb230fd..47129b1ee20b 100644
--- a/include/net/bluetooth/hci_core.h
+++ b/include/net/bluetooth/hci_core.h
@@ -1061,6 +1061,8 @@ void hci_req_cmd_complete(struct hci_dev *hdev, u16 opcode, u8 status);
1061 1061
1062struct sk_buff *__hci_cmd_sync(struct hci_dev *hdev, u16 opcode, u32 plen, 1062struct sk_buff *__hci_cmd_sync(struct hci_dev *hdev, u16 opcode, u32 plen,
1063 void *param, u32 timeout); 1063 void *param, u32 timeout);
1064struct sk_buff *__hci_cmd_sync_ev(struct hci_dev *hdev, u16 opcode, u32 plen,
1065 void *param, u8 event, u32 timeout);
1064 1066
1065int hci_send_cmd(struct hci_dev *hdev, __u16 opcode, __u32 plen, void *param); 1067int hci_send_cmd(struct hci_dev *hdev, __u16 opcode, __u32 plen, void *param);
1066void hci_send_acl(struct hci_chan *chan, struct sk_buff *skb, __u16 flags); 1068void hci_send_acl(struct hci_chan *chan, struct sk_buff *skb, __u16 flags);
diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c
index 7f1413cae2cb..9567e32a1f0c 100644
--- a/net/bluetooth/hci_core.c
+++ b/net/bluetooth/hci_core.c
@@ -79,7 +79,7 @@ static void hci_req_cancel(struct hci_dev *hdev, int err)
79 } 79 }
80} 80}
81 81
82struct sk_buff *hci_get_cmd_complete(struct hci_dev *hdev, u16 opcode) 82struct sk_buff *hci_get_cmd_complete(struct hci_dev *hdev, u16 opcode, u8 event)
83{ 83{
84 struct hci_ev_cmd_complete *ev; 84 struct hci_ev_cmd_complete *ev;
85 struct hci_event_hdr *hdr; 85 struct hci_event_hdr *hdr;
@@ -103,6 +103,12 @@ struct sk_buff *hci_get_cmd_complete(struct hci_dev *hdev, u16 opcode)
103 hdr = (void *) skb->data; 103 hdr = (void *) skb->data;
104 skb_pull(skb, HCI_EVENT_HDR_SIZE); 104 skb_pull(skb, HCI_EVENT_HDR_SIZE);
105 105
106 if (event) {
107 if (hdr->evt != event)
108 goto failed;
109 return skb;
110 }
111
106 if (hdr->evt != HCI_EV_CMD_COMPLETE) { 112 if (hdr->evt != HCI_EV_CMD_COMPLETE) {
107 BT_DBG("Last event is not cmd complete (0x%2.2x)", hdr->evt); 113 BT_DBG("Last event is not cmd complete (0x%2.2x)", hdr->evt);
108 goto failed; 114 goto failed;
@@ -127,8 +133,8 @@ failed:
127 return ERR_PTR(-ENODATA); 133 return ERR_PTR(-ENODATA);
128} 134}
129 135
130struct sk_buff *__hci_cmd_sync(struct hci_dev *hdev, u16 opcode, u32 plen, 136struct sk_buff *__hci_cmd_sync_ev(struct hci_dev *hdev, u16 opcode, u32 plen,
131 void *param, u32 timeout) 137 void *param, u8 event, u32 timeout)
132{ 138{
133 DECLARE_WAITQUEUE(wait, current); 139 DECLARE_WAITQUEUE(wait, current);
134 struct hci_request req; 140 struct hci_request req;
@@ -138,7 +144,7 @@ struct sk_buff *__hci_cmd_sync(struct hci_dev *hdev, u16 opcode, u32 plen,
138 144
139 hci_req_init(&req, hdev); 145 hci_req_init(&req, hdev);
140 146
141 hci_req_add(&req, opcode, plen, param); 147 hci_req_add_ev(&req, opcode, plen, param, event);
142 148
143 hdev->req_status = HCI_REQ_PEND; 149 hdev->req_status = HCI_REQ_PEND;
144 150
@@ -177,7 +183,14 @@ struct sk_buff *__hci_cmd_sync(struct hci_dev *hdev, u16 opcode, u32 plen,
177 if (err < 0) 183 if (err < 0)
178 return ERR_PTR(err); 184 return ERR_PTR(err);
179 185
180 return hci_get_cmd_complete(hdev, opcode); 186 return hci_get_cmd_complete(hdev, opcode, event);
187}
188EXPORT_SYMBOL(__hci_cmd_sync_ev);
189
190struct sk_buff *__hci_cmd_sync(struct hci_dev *hdev, u16 opcode, u32 plen,
191 void *param, u32 timeout)
192{
193 return __hci_cmd_sync_ev(hdev, opcode, plen, param, 0, timeout);
181} 194}
182EXPORT_SYMBOL(__hci_cmd_sync); 195EXPORT_SYMBOL(__hci_cmd_sync);
183 196