diff options
-rw-r--r-- | include/net/bluetooth/hci_core.h | 2 | ||||
-rw-r--r-- | net/bluetooth/hci_core.c | 23 |
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 | ||
1062 | struct sk_buff *__hci_cmd_sync(struct hci_dev *hdev, u16 opcode, u32 plen, | 1062 | struct sk_buff *__hci_cmd_sync(struct hci_dev *hdev, u16 opcode, u32 plen, |
1063 | void *param, u32 timeout); | 1063 | void *param, u32 timeout); |
1064 | struct sk_buff *__hci_cmd_sync_ev(struct hci_dev *hdev, u16 opcode, u32 plen, | ||
1065 | void *param, u8 event, u32 timeout); | ||
1064 | 1066 | ||
1065 | int hci_send_cmd(struct hci_dev *hdev, __u16 opcode, __u32 plen, void *param); | 1067 | int hci_send_cmd(struct hci_dev *hdev, __u16 opcode, __u32 plen, void *param); |
1066 | void hci_send_acl(struct hci_chan *chan, struct sk_buff *skb, __u16 flags); | 1068 | void 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 | ||
82 | struct sk_buff *hci_get_cmd_complete(struct hci_dev *hdev, u16 opcode) | 82 | struct 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 | ||
130 | struct sk_buff *__hci_cmd_sync(struct hci_dev *hdev, u16 opcode, u32 plen, | 136 | struct 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 | } | ||
188 | EXPORT_SYMBOL(__hci_cmd_sync_ev); | ||
189 | |||
190 | struct 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 | } |
182 | EXPORT_SYMBOL(__hci_cmd_sync); | 195 | EXPORT_SYMBOL(__hci_cmd_sync); |
183 | 196 | ||