irda: use get_unaligned_* helpers
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / net / bluetooth / hci_event.c
CommitLineData
8e87d142 1/*
1da177e4
LT
2 BlueZ - Bluetooth protocol stack for Linux
3 Copyright (C) 2000-2001 Qualcomm Incorporated
4
5 Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com>
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License version 2 as
9 published by the Free Software Foundation;
10
11 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
12 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
13 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
14 IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
8e87d142
YH
15 CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
16 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
17 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
1da177e4
LT
18 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19
8e87d142
YH
20 ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
21 COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
1da177e4
LT
22 SOFTWARE IS DISCLAIMED.
23*/
24
25/* Bluetooth HCI event handling. */
26
1da177e4
LT
27#include <linux/module.h>
28
29#include <linux/types.h>
30#include <linux/errno.h>
31#include <linux/kernel.h>
1da177e4
LT
32#include <linux/slab.h>
33#include <linux/poll.h>
34#include <linux/fcntl.h>
35#include <linux/init.h>
36#include <linux/skbuff.h>
37#include <linux/interrupt.h>
38#include <linux/notifier.h>
39#include <net/sock.h>
40
41#include <asm/system.h>
42#include <asm/uaccess.h>
43#include <asm/unaligned.h>
44
45#include <net/bluetooth/bluetooth.h>
46#include <net/bluetooth/hci_core.h>
47
48#ifndef CONFIG_BT_HCI_CORE_DEBUG
49#undef BT_DBG
50#define BT_DBG(D...)
51#endif
52
53/* Handle HCI Event packets */
54
a9de9248 55static void hci_cc_inquiry_cancel(struct hci_dev *hdev, struct sk_buff *skb)
1da177e4 56{
a9de9248 57 __u8 status = *((__u8 *) skb->data);
1da177e4 58
a9de9248 59 BT_DBG("%s status 0x%x", hdev->name, status);
1da177e4 60
a9de9248
MH
61 if (status)
62 return;
1da177e4 63
a9de9248 64 clear_bit(HCI_INQUIRY, &hdev->flags);
6bd57416 65
a9de9248
MH
66 hci_req_complete(hdev, status);
67
68 hci_conn_check_pending(hdev);
69}
6bd57416 70
a9de9248
MH
71static void hci_cc_exit_periodic_inq(struct hci_dev *hdev, struct sk_buff *skb)
72{
73 __u8 status = *((__u8 *) skb->data);
6bd57416 74
a9de9248 75 BT_DBG("%s status 0x%x", hdev->name, status);
6bd57416 76
a9de9248
MH
77 if (status)
78 return;
1da177e4 79
a9de9248
MH
80 clear_bit(HCI_INQUIRY, &hdev->flags);
81
82 hci_conn_check_pending(hdev);
83}
84
85static void hci_cc_remote_name_req_cancel(struct hci_dev *hdev, struct sk_buff *skb)
86{
87 BT_DBG("%s", hdev->name);
88}
89
90static void hci_cc_role_discovery(struct hci_dev *hdev, struct sk_buff *skb)
91{
92 struct hci_rp_role_discovery *rp = (void *) skb->data;
93 struct hci_conn *conn;
94
95 BT_DBG("%s status 0x%x", hdev->name, rp->status);
96
97 if (rp->status)
98 return;
99
100 hci_dev_lock(hdev);
101
102 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(rp->handle));
103 if (conn) {
104 if (rp->role)
105 conn->link_mode &= ~HCI_LM_MASTER;
106 else
107 conn->link_mode |= HCI_LM_MASTER;
1da177e4 108 }
a9de9248
MH
109
110 hci_dev_unlock(hdev);
1da177e4
LT
111}
112
a9de9248 113static void hci_cc_write_link_policy(struct hci_dev *hdev, struct sk_buff *skb)
1da177e4 114{
a9de9248 115 struct hci_rp_write_link_policy *rp = (void *) skb->data;
1da177e4 116 struct hci_conn *conn;
04837f64 117 void *sent;
1da177e4 118
a9de9248 119 BT_DBG("%s status 0x%x", hdev->name, rp->status);
1da177e4 120
a9de9248
MH
121 if (rp->status)
122 return;
1da177e4 123
a9de9248
MH
124 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_LINK_POLICY);
125 if (!sent)
126 return;
1da177e4 127
a9de9248 128 hci_dev_lock(hdev);
1da177e4 129
a9de9248
MH
130 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(rp->handle));
131 if (conn) {
132 __le16 policy = get_unaligned((__le16 *) (sent + 2));
133 conn->link_policy = __le16_to_cpu(policy);
134 }
1da177e4 135
a9de9248
MH
136 hci_dev_unlock(hdev);
137}
1da177e4 138
a9de9248
MH
139static void hci_cc_reset(struct hci_dev *hdev, struct sk_buff *skb)
140{
141 __u8 status = *((__u8 *) skb->data);
04837f64 142
a9de9248 143 BT_DBG("%s status 0x%x", hdev->name, status);
04837f64 144
a9de9248
MH
145 hci_req_complete(hdev, status);
146}
04837f64 147
a9de9248
MH
148static void hci_cc_write_local_name(struct hci_dev *hdev, struct sk_buff *skb)
149{
150 __u8 status = *((__u8 *) skb->data);
151 void *sent;
04837f64 152
a9de9248 153 BT_DBG("%s status 0x%x", hdev->name, status);
04837f64 154
a9de9248
MH
155 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_LOCAL_NAME);
156 if (!sent)
157 return;
04837f64 158
a9de9248
MH
159 if (!status)
160 memcpy(hdev->dev_name, sent, 248);
161}
162
163static void hci_cc_read_local_name(struct hci_dev *hdev, struct sk_buff *skb)
164{
165 struct hci_rp_read_local_name *rp = (void *) skb->data;
166
167 BT_DBG("%s status 0x%x", hdev->name, rp->status);
168
169 if (rp->status)
170 return;
171
172 memcpy(hdev->dev_name, rp->name, 248);
173}
174
175static void hci_cc_write_auth_enable(struct hci_dev *hdev, struct sk_buff *skb)
176{
177 __u8 status = *((__u8 *) skb->data);
178 void *sent;
179
180 BT_DBG("%s status 0x%x", hdev->name, status);
181
182 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_AUTH_ENABLE);
183 if (!sent)
184 return;
185
186 if (!status) {
187 __u8 param = *((__u8 *) sent);
188
189 if (param == AUTH_ENABLED)
190 set_bit(HCI_AUTH, &hdev->flags);
191 else
192 clear_bit(HCI_AUTH, &hdev->flags);
1da177e4 193 }
a9de9248
MH
194
195 hci_req_complete(hdev, status);
1da177e4
LT
196}
197
a9de9248 198static void hci_cc_write_encrypt_mode(struct hci_dev *hdev, struct sk_buff *skb)
1da177e4 199{
a9de9248 200 __u8 status = *((__u8 *) skb->data);
1da177e4
LT
201 void *sent;
202
a9de9248 203 BT_DBG("%s status 0x%x", hdev->name, status);
1da177e4 204
a9de9248
MH
205 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_ENCRYPT_MODE);
206 if (!sent)
207 return;
1da177e4 208
a9de9248
MH
209 if (!status) {
210 __u8 param = *((__u8 *) sent);
211
212 if (param)
213 set_bit(HCI_ENCRYPT, &hdev->flags);
214 else
215 clear_bit(HCI_ENCRYPT, &hdev->flags);
216 }
1da177e4 217
a9de9248
MH
218 hci_req_complete(hdev, status);
219}
1da177e4 220
a9de9248
MH
221static void hci_cc_write_scan_enable(struct hci_dev *hdev, struct sk_buff *skb)
222{
223 __u8 status = *((__u8 *) skb->data);
224 void *sent;
1da177e4 225
a9de9248 226 BT_DBG("%s status 0x%x", hdev->name, status);
1da177e4 227
a9de9248
MH
228 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_SCAN_ENABLE);
229 if (!sent)
230 return;
1da177e4 231
a9de9248
MH
232 if (!status) {
233 __u8 param = *((__u8 *) sent);
1da177e4 234
a9de9248
MH
235 clear_bit(HCI_PSCAN, &hdev->flags);
236 clear_bit(HCI_ISCAN, &hdev->flags);
1da177e4 237
a9de9248
MH
238 if (param & SCAN_INQUIRY)
239 set_bit(HCI_ISCAN, &hdev->flags);
1da177e4 240
a9de9248
MH
241 if (param & SCAN_PAGE)
242 set_bit(HCI_PSCAN, &hdev->flags);
243 }
1da177e4 244
a9de9248
MH
245 hci_req_complete(hdev, status);
246}
1da177e4 247
a9de9248
MH
248static void hci_cc_read_class_of_dev(struct hci_dev *hdev, struct sk_buff *skb)
249{
250 struct hci_rp_read_class_of_dev *rp = (void *) skb->data;
1da177e4 251
a9de9248 252 BT_DBG("%s status 0x%x", hdev->name, rp->status);
1da177e4 253
a9de9248
MH
254 if (rp->status)
255 return;
1da177e4 256
a9de9248 257 memcpy(hdev->dev_class, rp->dev_class, 3);
1da177e4 258
a9de9248
MH
259 BT_DBG("%s class 0x%.2x%.2x%.2x", hdev->name,
260 hdev->dev_class[2], hdev->dev_class[1], hdev->dev_class[0]);
261}
1da177e4 262
a9de9248
MH
263static void hci_cc_write_class_of_dev(struct hci_dev *hdev, struct sk_buff *skb)
264{
265 __u8 status = *((__u8 *) skb->data);
266 void *sent;
1da177e4 267
a9de9248 268 BT_DBG("%s status 0x%x", hdev->name, status);
1da177e4 269
a9de9248
MH
270 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_CLASS_OF_DEV);
271 if (!sent)
272 return;
1da177e4 273
a9de9248
MH
274 if (!status)
275 memcpy(hdev->dev_class, sent, 3);
276}
1da177e4 277
a9de9248
MH
278static void hci_cc_read_voice_setting(struct hci_dev *hdev, struct sk_buff *skb)
279{
280 struct hci_rp_read_voice_setting *rp = (void *) skb->data;
281 __u16 setting;
282
283 BT_DBG("%s status 0x%x", hdev->name, rp->status);
284
285 if (rp->status)
286 return;
287
288 setting = __le16_to_cpu(rp->voice_setting);
289
290 if (hdev->voice_setting == setting )
291 return;
292
293 hdev->voice_setting = setting;
294
295 BT_DBG("%s voice setting 0x%04x", hdev->name, setting);
296
297 if (hdev->notify) {
298 tasklet_disable(&hdev->tx_task);
299 hdev->notify(hdev, HCI_NOTIFY_VOICE_SETTING);
300 tasklet_enable(&hdev->tx_task);
301 }
302}
303
304static void hci_cc_write_voice_setting(struct hci_dev *hdev, struct sk_buff *skb)
305{
306 __u8 status = *((__u8 *) skb->data);
307 void *sent;
308
309 BT_DBG("%s status 0x%x", hdev->name, status);
1da177e4 310
a9de9248
MH
311 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_VOICE_SETTING);
312 if (!sent)
313 return;
1da177e4 314
a9de9248
MH
315 if (!status) {
316 __u16 setting = __le16_to_cpu(get_unaligned((__le16 *) sent));
1da177e4 317
a9de9248 318 if (hdev->voice_setting != setting) {
1da177e4
LT
319 hdev->voice_setting = setting;
320
a9de9248 321 BT_DBG("%s voice setting 0x%04x", hdev->name, setting);
1da177e4
LT
322
323 if (hdev->notify) {
324 tasklet_disable(&hdev->tx_task);
325 hdev->notify(hdev, HCI_NOTIFY_VOICE_SETTING);
326 tasklet_enable(&hdev->tx_task);
327 }
328 }
1da177e4
LT
329 }
330}
331
a9de9248 332static void hci_cc_host_buffer_size(struct hci_dev *hdev, struct sk_buff *skb)
1da177e4 333{
a9de9248 334 __u8 status = *((__u8 *) skb->data);
1da177e4 335
a9de9248 336 BT_DBG("%s status 0x%x", hdev->name, status);
1da177e4 337
a9de9248
MH
338 hci_req_complete(hdev, status);
339}
1143e5a6 340
a9de9248
MH
341static void hci_cc_read_local_version(struct hci_dev *hdev, struct sk_buff *skb)
342{
343 struct hci_rp_read_local_version *rp = (void *) skb->data;
1143e5a6 344
a9de9248 345 BT_DBG("%s status 0x%x", hdev->name, rp->status);
1143e5a6 346
a9de9248
MH
347 if (rp->status)
348 return;
1143e5a6 349
a9de9248
MH
350 hdev->hci_ver = rp->hci_ver;
351 hdev->hci_rev = btohs(rp->hci_rev);
352 hdev->manufacturer = btohs(rp->manufacturer);
1143e5a6 353
a9de9248
MH
354 BT_DBG("%s manufacturer %d hci ver %d:%d", hdev->name,
355 hdev->manufacturer,
356 hdev->hci_ver, hdev->hci_rev);
357}
1da177e4 358
a9de9248
MH
359static void hci_cc_read_local_commands(struct hci_dev *hdev, struct sk_buff *skb)
360{
361 struct hci_rp_read_local_commands *rp = (void *) skb->data;
1da177e4 362
a9de9248 363 BT_DBG("%s status 0x%x", hdev->name, rp->status);
1da177e4 364
a9de9248
MH
365 if (rp->status)
366 return;
1da177e4 367
a9de9248
MH
368 memcpy(hdev->commands, rp->commands, sizeof(hdev->commands));
369}
1da177e4 370
a9de9248
MH
371static void hci_cc_read_local_features(struct hci_dev *hdev, struct sk_buff *skb)
372{
373 struct hci_rp_read_local_features *rp = (void *) skb->data;
5b7f9909 374
a9de9248 375 BT_DBG("%s status 0x%x", hdev->name, rp->status);
1da177e4 376
a9de9248
MH
377 if (rp->status)
378 return;
5b7f9909 379
a9de9248 380 memcpy(hdev->features, rp->features, 8);
5b7f9909 381
a9de9248
MH
382 /* Adjust default settings according to features
383 * supported by device. */
1da177e4 384
a9de9248
MH
385 if (hdev->features[0] & LMP_3SLOT)
386 hdev->pkt_type |= (HCI_DM3 | HCI_DH3);
1da177e4 387
a9de9248
MH
388 if (hdev->features[0] & LMP_5SLOT)
389 hdev->pkt_type |= (HCI_DM5 | HCI_DH5);
1da177e4 390
a9de9248
MH
391 if (hdev->features[1] & LMP_HV2) {
392 hdev->pkt_type |= (HCI_HV2);
393 hdev->esco_type |= (ESCO_HV2);
394 }
1da177e4 395
a9de9248
MH
396 if (hdev->features[1] & LMP_HV3) {
397 hdev->pkt_type |= (HCI_HV3);
398 hdev->esco_type |= (ESCO_HV3);
399 }
1da177e4 400
a9de9248
MH
401 if (hdev->features[3] & LMP_ESCO)
402 hdev->esco_type |= (ESCO_EV3);
da1f5198 403
a9de9248
MH
404 if (hdev->features[4] & LMP_EV4)
405 hdev->esco_type |= (ESCO_EV4);
da1f5198 406
a9de9248
MH
407 if (hdev->features[4] & LMP_EV5)
408 hdev->esco_type |= (ESCO_EV5);
1da177e4 409
a9de9248
MH
410 BT_DBG("%s features 0x%.2x%.2x%.2x%.2x%.2x%.2x%.2x%.2x", hdev->name,
411 hdev->features[0], hdev->features[1],
412 hdev->features[2], hdev->features[3],
413 hdev->features[4], hdev->features[5],
414 hdev->features[6], hdev->features[7]);
415}
1da177e4 416
a9de9248
MH
417static void hci_cc_read_buffer_size(struct hci_dev *hdev, struct sk_buff *skb)
418{
419 struct hci_rp_read_buffer_size *rp = (void *) skb->data;
1da177e4 420
a9de9248 421 BT_DBG("%s status 0x%x", hdev->name, rp->status);
1da177e4 422
a9de9248
MH
423 if (rp->status)
424 return;
1da177e4 425
a9de9248
MH
426 hdev->acl_mtu = __le16_to_cpu(rp->acl_mtu);
427 hdev->sco_mtu = rp->sco_mtu;
428 hdev->acl_pkts = __le16_to_cpu(rp->acl_max_pkt);
429 hdev->sco_pkts = __le16_to_cpu(rp->sco_max_pkt);
430
431 if (test_bit(HCI_QUIRK_FIXUP_BUFFER_SIZE, &hdev->quirks)) {
432 hdev->sco_mtu = 64;
433 hdev->sco_pkts = 8;
1da177e4 434 }
a9de9248
MH
435
436 hdev->acl_cnt = hdev->acl_pkts;
437 hdev->sco_cnt = hdev->sco_pkts;
438
439 BT_DBG("%s acl mtu %d:%d sco mtu %d:%d", hdev->name,
440 hdev->acl_mtu, hdev->acl_pkts,
441 hdev->sco_mtu, hdev->sco_pkts);
442}
443
444static void hci_cc_read_bd_addr(struct hci_dev *hdev, struct sk_buff *skb)
445{
446 struct hci_rp_read_bd_addr *rp = (void *) skb->data;
447
448 BT_DBG("%s status 0x%x", hdev->name, rp->status);
449
450 if (!rp->status)
451 bacpy(&hdev->bdaddr, &rp->bdaddr);
452
453 hci_req_complete(hdev, rp->status);
454}
455
456static inline void hci_cs_inquiry(struct hci_dev *hdev, __u8 status)
457{
458 BT_DBG("%s status 0x%x", hdev->name, status);
459
460 if (status) {
461 hci_req_complete(hdev, status);
462
463 hci_conn_check_pending(hdev);
464 } else
465 set_bit(HCI_INQUIRY, &hdev->flags);
1da177e4
LT
466}
467
1da177e4
LT
468static inline void hci_cs_create_conn(struct hci_dev *hdev, __u8 status)
469{
a9de9248 470 struct hci_cp_create_conn *cp;
1da177e4 471 struct hci_conn *conn;
1da177e4 472
a9de9248
MH
473 BT_DBG("%s status 0x%x", hdev->name, status);
474
475 cp = hci_sent_cmd_data(hdev, HCI_OP_CREATE_CONN);
1da177e4
LT
476 if (!cp)
477 return;
478
479 hci_dev_lock(hdev);
480
481 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->bdaddr);
482
a9de9248 483 BT_DBG("%s bdaddr %s conn %p", hdev->name, batostr(&cp->bdaddr), conn);
1da177e4
LT
484
485 if (status) {
486 if (conn && conn->state == BT_CONNECT) {
4c67bc74
MH
487 if (status != 0x0c || conn->attempt > 2) {
488 conn->state = BT_CLOSED;
489 hci_proto_connect_cfm(conn, status);
490 hci_conn_del(conn);
491 } else
492 conn->state = BT_CONNECT2;
1da177e4
LT
493 }
494 } else {
495 if (!conn) {
496 conn = hci_conn_add(hdev, ACL_LINK, &cp->bdaddr);
497 if (conn) {
498 conn->out = 1;
499 conn->link_mode |= HCI_LM_MASTER;
500 } else
501 BT_ERR("No memmory for new connection");
502 }
503 }
504
505 hci_dev_unlock(hdev);
506}
507
a9de9248 508static void hci_cs_add_sco(struct hci_dev *hdev, __u8 status)
1da177e4 509{
a9de9248
MH
510 struct hci_cp_add_sco *cp;
511 struct hci_conn *acl, *sco;
512 __u16 handle;
1da177e4 513
b6a0dc82
MH
514 BT_DBG("%s status 0x%x", hdev->name, status);
515
a9de9248
MH
516 if (!status)
517 return;
1da177e4 518
a9de9248
MH
519 cp = hci_sent_cmd_data(hdev, HCI_OP_ADD_SCO);
520 if (!cp)
521 return;
1da177e4 522
a9de9248 523 handle = __le16_to_cpu(cp->handle);
1da177e4 524
a9de9248 525 BT_DBG("%s handle %d", hdev->name, handle);
1da177e4 526
a9de9248 527 hci_dev_lock(hdev);
1da177e4 528
a9de9248
MH
529 acl = hci_conn_hash_lookup_handle(hdev, handle);
530 if (acl && (sco = acl->link)) {
531 sco->state = BT_CLOSED;
1da177e4 532
a9de9248
MH
533 hci_proto_connect_cfm(sco, status);
534 hci_conn_del(sco);
535 }
1da177e4 536
a9de9248
MH
537 hci_dev_unlock(hdev);
538}
1da177e4 539
a9de9248
MH
540static void hci_cs_remote_name_req(struct hci_dev *hdev, __u8 status)
541{
542 BT_DBG("%s status 0x%x", hdev->name, status);
543}
1da177e4 544
a9de9248
MH
545static void hci_cs_setup_sync_conn(struct hci_dev *hdev, __u8 status)
546{
b6a0dc82
MH
547 struct hci_cp_setup_sync_conn *cp;
548 struct hci_conn *acl, *sco;
549 __u16 handle;
550
a9de9248 551 BT_DBG("%s status 0x%x", hdev->name, status);
b6a0dc82
MH
552
553 if (!status)
554 return;
555
556 cp = hci_sent_cmd_data(hdev, HCI_OP_SETUP_SYNC_CONN);
557 if (!cp)
558 return;
559
560 handle = __le16_to_cpu(cp->handle);
561
562 BT_DBG("%s handle %d", hdev->name, handle);
563
564 hci_dev_lock(hdev);
565
566 acl = hci_conn_hash_lookup_handle(hdev, handle);
567 if (acl && (sco = acl->link)) {
568 sco->state = BT_CLOSED;
569
570 hci_proto_connect_cfm(sco, status);
571 hci_conn_del(sco);
572 }
573
574 hci_dev_unlock(hdev);
1da177e4
LT
575}
576
a9de9248 577static void hci_cs_sniff_mode(struct hci_dev *hdev, __u8 status)
1da177e4 578{
a9de9248
MH
579 struct hci_cp_sniff_mode *cp;
580 struct hci_conn *conn;
1da177e4 581
a9de9248 582 BT_DBG("%s status 0x%x", hdev->name, status);
04837f64 583
a9de9248
MH
584 if (!status)
585 return;
04837f64 586
a9de9248
MH
587 cp = hci_sent_cmd_data(hdev, HCI_OP_SNIFF_MODE);
588 if (!cp)
589 return;
04837f64 590
a9de9248 591 hci_dev_lock(hdev);
04837f64 592
a9de9248
MH
593 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
594 if (conn)
595 clear_bit(HCI_CONN_MODE_CHANGE_PEND, &conn->pend);
04837f64 596
a9de9248
MH
597 hci_dev_unlock(hdev);
598}
04837f64 599
a9de9248
MH
600static void hci_cs_exit_sniff_mode(struct hci_dev *hdev, __u8 status)
601{
602 struct hci_cp_exit_sniff_mode *cp;
603 struct hci_conn *conn;
04837f64 604
a9de9248 605 BT_DBG("%s status 0x%x", hdev->name, status);
04837f64 606
a9de9248
MH
607 if (!status)
608 return;
04837f64 609
a9de9248
MH
610 cp = hci_sent_cmd_data(hdev, HCI_OP_EXIT_SNIFF_MODE);
611 if (!cp)
612 return;
04837f64 613
a9de9248 614 hci_dev_lock(hdev);
1da177e4 615
a9de9248
MH
616 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
617 if (conn)
618 clear_bit(HCI_CONN_MODE_CHANGE_PEND, &conn->pend);
1da177e4 619
a9de9248 620 hci_dev_unlock(hdev);
1da177e4
LT
621}
622
1da177e4
LT
623static inline void hci_inquiry_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
624{
625 __u8 status = *((__u8 *) skb->data);
626
627 BT_DBG("%s status %d", hdev->name, status);
628
629 clear_bit(HCI_INQUIRY, &hdev->flags);
6bd57416 630
a9de9248 631 hci_req_complete(hdev, status);
6bd57416 632
a9de9248 633 hci_conn_check_pending(hdev);
1da177e4
LT
634}
635
1da177e4
LT
636static inline void hci_inquiry_result_evt(struct hci_dev *hdev, struct sk_buff *skb)
637{
45bb4bf0 638 struct inquiry_data data;
a9de9248 639 struct inquiry_info *info = (void *) (skb->data + 1);
1da177e4
LT
640 int num_rsp = *((__u8 *) skb->data);
641
642 BT_DBG("%s num_rsp %d", hdev->name, num_rsp);
643
45bb4bf0
MH
644 if (!num_rsp)
645 return;
646
1da177e4 647 hci_dev_lock(hdev);
45bb4bf0 648
1da177e4 649 for (; num_rsp; num_rsp--) {
1da177e4
LT
650 bacpy(&data.bdaddr, &info->bdaddr);
651 data.pscan_rep_mode = info->pscan_rep_mode;
652 data.pscan_period_mode = info->pscan_period_mode;
653 data.pscan_mode = info->pscan_mode;
654 memcpy(data.dev_class, info->dev_class, 3);
655 data.clock_offset = info->clock_offset;
656 data.rssi = 0x00;
657 info++;
658 hci_inquiry_cache_update(hdev, &data);
659 }
45bb4bf0 660
1da177e4
LT
661 hci_dev_unlock(hdev);
662}
663
1da177e4
LT
664static inline void hci_conn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
665{
a9de9248
MH
666 struct hci_ev_conn_complete *ev = (void *) skb->data;
667 struct hci_conn *conn;
1da177e4
LT
668
669 BT_DBG("%s", hdev->name);
670
671 hci_dev_lock(hdev);
672
673 conn = hci_conn_hash_lookup_ba(hdev, ev->link_type, &ev->bdaddr);
a9de9248
MH
674 if (!conn)
675 goto unlock;
1da177e4
LT
676
677 if (!ev->status) {
678 conn->handle = __le16_to_cpu(ev->handle);
679 conn->state = BT_CONNECTED;
680
681 if (test_bit(HCI_AUTH, &hdev->flags))
682 conn->link_mode |= HCI_LM_AUTH;
683
684 if (test_bit(HCI_ENCRYPT, &hdev->flags))
685 conn->link_mode |= HCI_LM_ENCRYPT;
686
04837f64
MH
687 /* Get remote features */
688 if (conn->type == ACL_LINK) {
689 struct hci_cp_read_remote_features cp;
690 cp.handle = ev->handle;
a9de9248 691 hci_send_cmd(hdev, HCI_OP_READ_REMOTE_FEATURES, sizeof(cp), &cp);
04837f64
MH
692 }
693
1da177e4
LT
694 /* Set link policy */
695 if (conn->type == ACL_LINK && hdev->link_policy) {
696 struct hci_cp_write_link_policy cp;
697 cp.handle = ev->handle;
aca3192c 698 cp.policy = cpu_to_le16(hdev->link_policy);
a9de9248 699 hci_send_cmd(hdev, HCI_OP_WRITE_LINK_POLICY, sizeof(cp), &cp);
1da177e4
LT
700 }
701
702 /* Set packet type for incoming connection */
703 if (!conn->out) {
704 struct hci_cp_change_conn_ptype cp;
705 cp.handle = ev->handle;
8e87d142 706 cp.pkt_type = (conn->type == ACL_LINK) ?
aca3192c
YH
707 cpu_to_le16(hdev->pkt_type & ACL_PTYPE_MASK):
708 cpu_to_le16(hdev->pkt_type & SCO_PTYPE_MASK);
1da177e4 709
a9de9248 710 hci_send_cmd(hdev, HCI_OP_CHANGE_CONN_PTYPE, sizeof(cp), &cp);
37e97b4e
MH
711 } else {
712 /* Update disconnect timer */
713 hci_conn_hold(conn);
714 hci_conn_put(conn);
1da177e4
LT
715 }
716 } else
717 conn->state = BT_CLOSED;
718
719 if (conn->type == ACL_LINK) {
720 struct hci_conn *sco = conn->link;
721 if (sco) {
b6a0dc82
MH
722 if (!ev->status) {
723 if (lmp_esco_capable(hdev))
724 hci_setup_sync(sco, conn->handle);
725 else
726 hci_add_sco(sco, conn->handle);
727 } else {
1da177e4
LT
728 hci_proto_connect_cfm(sco, ev->status);
729 hci_conn_del(sco);
730 }
731 }
732 }
733
734 hci_proto_connect_cfm(conn, ev->status);
735 if (ev->status)
736 hci_conn_del(conn);
737
a9de9248 738unlock:
1da177e4 739 hci_dev_unlock(hdev);
1da177e4 740
a9de9248 741 hci_conn_check_pending(hdev);
1da177e4
LT
742}
743
a9de9248 744static inline void hci_conn_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
1da177e4 745{
a9de9248
MH
746 struct hci_ev_conn_request *ev = (void *) skb->data;
747 int mask = hdev->link_mode;
1da177e4 748
a9de9248
MH
749 BT_DBG("%s bdaddr %s type 0x%x", hdev->name,
750 batostr(&ev->bdaddr), ev->link_type);
1da177e4 751
a9de9248 752 mask |= hci_proto_connect_ind(hdev, &ev->bdaddr, ev->link_type);
1da177e4 753
a9de9248
MH
754 if (mask & HCI_LM_ACCEPT) {
755 /* Connection accepted */
1da177e4 756 struct hci_conn *conn;
1da177e4 757
a9de9248 758 hci_dev_lock(hdev);
b6a0dc82 759
a9de9248
MH
760 conn = hci_conn_hash_lookup_ba(hdev, ev->link_type, &ev->bdaddr);
761 if (!conn) {
762 if (!(conn = hci_conn_add(hdev, ev->link_type, &ev->bdaddr))) {
763 BT_ERR("No memmory for new connection");
764 hci_dev_unlock(hdev);
765 return;
1da177e4
LT
766 }
767 }
b6a0dc82 768
a9de9248
MH
769 memcpy(conn->dev_class, ev->dev_class, 3);
770 conn->state = BT_CONNECT;
b6a0dc82 771
a9de9248 772 hci_dev_unlock(hdev);
1da177e4 773
b6a0dc82
MH
774 if (ev->link_type == ACL_LINK || !lmp_esco_capable(hdev)) {
775 struct hci_cp_accept_conn_req cp;
1da177e4 776
b6a0dc82
MH
777 bacpy(&cp.bdaddr, &ev->bdaddr);
778
779 if (lmp_rswitch_capable(hdev) && (mask & HCI_LM_MASTER))
780 cp.role = 0x00; /* Become master */
781 else
782 cp.role = 0x01; /* Remain slave */
783
784 hci_send_cmd(hdev, HCI_OP_ACCEPT_CONN_REQ,
785 sizeof(cp), &cp);
786 } else {
787 struct hci_cp_accept_sync_conn_req cp;
788
789 bacpy(&cp.bdaddr, &ev->bdaddr);
790 cp.pkt_type = cpu_to_le16(hdev->esco_type);
791
792 cp.tx_bandwidth = cpu_to_le32(0x00001f40);
793 cp.rx_bandwidth = cpu_to_le32(0x00001f40);
794 cp.max_latency = cpu_to_le16(0xffff);
795 cp.content_format = cpu_to_le16(hdev->voice_setting);
796 cp.retrans_effort = 0xff;
1da177e4 797
b6a0dc82
MH
798 hci_send_cmd(hdev, HCI_OP_ACCEPT_SYNC_CONN_REQ,
799 sizeof(cp), &cp);
800 }
a9de9248
MH
801 } else {
802 /* Connection rejected */
803 struct hci_cp_reject_conn_req cp;
1da177e4 804
a9de9248
MH
805 bacpy(&cp.bdaddr, &ev->bdaddr);
806 cp.reason = 0x0f;
807 hci_send_cmd(hdev, HCI_OP_REJECT_CONN_REQ, sizeof(cp), &cp);
1da177e4 808 }
1da177e4
LT
809}
810
a9de9248 811static inline void hci_disconn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
04837f64 812{
a9de9248 813 struct hci_ev_disconn_complete *ev = (void *) skb->data;
04837f64
MH
814 struct hci_conn *conn;
815
816 BT_DBG("%s status %d", hdev->name, ev->status);
817
a9de9248
MH
818 if (ev->status)
819 return;
820
04837f64
MH
821 hci_dev_lock(hdev);
822
823 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
824 if (conn) {
a9de9248
MH
825 conn->state = BT_CLOSED;
826 hci_proto_disconn_ind(conn, ev->reason);
827 hci_conn_del(conn);
04837f64
MH
828 }
829
830 hci_dev_unlock(hdev);
831}
832
1da177e4
LT
833static inline void hci_auth_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
834{
a9de9248 835 struct hci_ev_auth_complete *ev = (void *) skb->data;
04837f64 836 struct hci_conn *conn;
1da177e4
LT
837
838 BT_DBG("%s status %d", hdev->name, ev->status);
839
840 hci_dev_lock(hdev);
841
04837f64 842 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
1da177e4
LT
843 if (conn) {
844 if (!ev->status)
845 conn->link_mode |= HCI_LM_AUTH;
846
847 clear_bit(HCI_CONN_AUTH_PEND, &conn->pend);
848
849 hci_auth_cfm(conn, ev->status);
850
851 if (test_bit(HCI_CONN_ENCRYPT_PEND, &conn->pend)) {
852 if (!ev->status) {
853 struct hci_cp_set_conn_encrypt cp;
aca3192c 854 cp.handle = cpu_to_le16(conn->handle);
1da177e4 855 cp.encrypt = 1;
a9de9248
MH
856 hci_send_cmd(conn->hdev,
857 HCI_OP_SET_CONN_ENCRYPT, sizeof(cp), &cp);
1da177e4
LT
858 } else {
859 clear_bit(HCI_CONN_ENCRYPT_PEND, &conn->pend);
860 hci_encrypt_cfm(conn, ev->status, 0x00);
861 }
862 }
863 }
864
865 hci_dev_unlock(hdev);
866}
867
a9de9248 868static inline void hci_remote_name_evt(struct hci_dev *hdev, struct sk_buff *skb)
1da177e4 869{
a9de9248 870 BT_DBG("%s", hdev->name);
1da177e4 871
a9de9248
MH
872 hci_conn_check_pending(hdev);
873}
874
875static inline void hci_encrypt_change_evt(struct hci_dev *hdev, struct sk_buff *skb)
876{
877 struct hci_ev_encrypt_change *ev = (void *) skb->data;
878 struct hci_conn *conn;
879
880 BT_DBG("%s status %d", hdev->name, ev->status);
1da177e4
LT
881
882 hci_dev_lock(hdev);
883
04837f64 884 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
1da177e4
LT
885 if (conn) {
886 if (!ev->status) {
887 if (ev->encrypt)
888 conn->link_mode |= HCI_LM_ENCRYPT;
889 else
890 conn->link_mode &= ~HCI_LM_ENCRYPT;
891 }
892
893 clear_bit(HCI_CONN_ENCRYPT_PEND, &conn->pend);
894
895 hci_encrypt_cfm(conn, ev->status, ev->encrypt);
896 }
897
898 hci_dev_unlock(hdev);
899}
900
a9de9248 901static inline void hci_change_link_key_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
1da177e4 902{
a9de9248 903 struct hci_ev_change_link_key_complete *ev = (void *) skb->data;
04837f64 904 struct hci_conn *conn;
1da177e4
LT
905
906 BT_DBG("%s status %d", hdev->name, ev->status);
907
908 hci_dev_lock(hdev);
909
04837f64 910 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
1da177e4
LT
911 if (conn) {
912 if (!ev->status)
913 conn->link_mode |= HCI_LM_SECURE;
914
915 clear_bit(HCI_CONN_AUTH_PEND, &conn->pend);
916
917 hci_key_change_cfm(conn, ev->status);
918 }
919
920 hci_dev_unlock(hdev);
921}
922
a9de9248 923static inline void hci_remote_features_evt(struct hci_dev *hdev, struct sk_buff *skb)
1da177e4 924{
a9de9248
MH
925 struct hci_ev_remote_features *ev = (void *) skb->data;
926 struct hci_conn *conn;
927
928 BT_DBG("%s status %d", hdev->name, ev->status);
929
930 if (ev->status)
931 return;
932
933 hci_dev_lock(hdev);
934
935 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
936 if (conn)
937 memcpy(conn->features, ev->features, 8);
938
939 hci_dev_unlock(hdev);
1da177e4
LT
940}
941
a9de9248 942static inline void hci_remote_version_evt(struct hci_dev *hdev, struct sk_buff *skb)
1da177e4 943{
a9de9248 944 BT_DBG("%s", hdev->name);
1da177e4
LT
945}
946
a9de9248 947static inline void hci_qos_setup_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
1da177e4 948{
a9de9248 949 BT_DBG("%s", hdev->name);
1da177e4
LT
950}
951
a9de9248
MH
952static inline void hci_cmd_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
953{
954 struct hci_ev_cmd_complete *ev = (void *) skb->data;
955 __u16 opcode;
956
957 skb_pull(skb, sizeof(*ev));
958
959 opcode = __le16_to_cpu(ev->opcode);
960
961 switch (opcode) {
962 case HCI_OP_INQUIRY_CANCEL:
963 hci_cc_inquiry_cancel(hdev, skb);
964 break;
965
966 case HCI_OP_EXIT_PERIODIC_INQ:
967 hci_cc_exit_periodic_inq(hdev, skb);
968 break;
969
970 case HCI_OP_REMOTE_NAME_REQ_CANCEL:
971 hci_cc_remote_name_req_cancel(hdev, skb);
972 break;
973
974 case HCI_OP_ROLE_DISCOVERY:
975 hci_cc_role_discovery(hdev, skb);
976 break;
977
978 case HCI_OP_WRITE_LINK_POLICY:
979 hci_cc_write_link_policy(hdev, skb);
980 break;
981
982 case HCI_OP_RESET:
983 hci_cc_reset(hdev, skb);
984 break;
985
986 case HCI_OP_WRITE_LOCAL_NAME:
987 hci_cc_write_local_name(hdev, skb);
988 break;
989
990 case HCI_OP_READ_LOCAL_NAME:
991 hci_cc_read_local_name(hdev, skb);
992 break;
993
994 case HCI_OP_WRITE_AUTH_ENABLE:
995 hci_cc_write_auth_enable(hdev, skb);
996 break;
997
998 case HCI_OP_WRITE_ENCRYPT_MODE:
999 hci_cc_write_encrypt_mode(hdev, skb);
1000 break;
1001
1002 case HCI_OP_WRITE_SCAN_ENABLE:
1003 hci_cc_write_scan_enable(hdev, skb);
1004 break;
1005
1006 case HCI_OP_READ_CLASS_OF_DEV:
1007 hci_cc_read_class_of_dev(hdev, skb);
1008 break;
1009
1010 case HCI_OP_WRITE_CLASS_OF_DEV:
1011 hci_cc_write_class_of_dev(hdev, skb);
1012 break;
1013
1014 case HCI_OP_READ_VOICE_SETTING:
1015 hci_cc_read_voice_setting(hdev, skb);
1016 break;
1017
1018 case HCI_OP_WRITE_VOICE_SETTING:
1019 hci_cc_write_voice_setting(hdev, skb);
1020 break;
1021
1022 case HCI_OP_HOST_BUFFER_SIZE:
1023 hci_cc_host_buffer_size(hdev, skb);
1024 break;
1025
1026 case HCI_OP_READ_LOCAL_VERSION:
1027 hci_cc_read_local_version(hdev, skb);
1028 break;
1029
1030 case HCI_OP_READ_LOCAL_COMMANDS:
1031 hci_cc_read_local_commands(hdev, skb);
1032 break;
1033
1034 case HCI_OP_READ_LOCAL_FEATURES:
1035 hci_cc_read_local_features(hdev, skb);
1036 break;
1037
1038 case HCI_OP_READ_BUFFER_SIZE:
1039 hci_cc_read_buffer_size(hdev, skb);
1040 break;
1041
1042 case HCI_OP_READ_BD_ADDR:
1043 hci_cc_read_bd_addr(hdev, skb);
1044 break;
1045
1046 default:
1047 BT_DBG("%s opcode 0x%x", hdev->name, opcode);
1048 break;
1049 }
1050
1051 if (ev->ncmd) {
1052 atomic_set(&hdev->cmd_cnt, 1);
1053 if (!skb_queue_empty(&hdev->cmd_q))
1054 hci_sched_cmd(hdev);
1055 }
1056}
1057
1058static inline void hci_cmd_status_evt(struct hci_dev *hdev, struct sk_buff *skb)
1059{
1060 struct hci_ev_cmd_status *ev = (void *) skb->data;
1061 __u16 opcode;
1062
1063 skb_pull(skb, sizeof(*ev));
1064
1065 opcode = __le16_to_cpu(ev->opcode);
1066
1067 switch (opcode) {
1068 case HCI_OP_INQUIRY:
1069 hci_cs_inquiry(hdev, ev->status);
1070 break;
1071
1072 case HCI_OP_CREATE_CONN:
1073 hci_cs_create_conn(hdev, ev->status);
1074 break;
1075
1076 case HCI_OP_ADD_SCO:
1077 hci_cs_add_sco(hdev, ev->status);
1078 break;
1079
1080 case HCI_OP_REMOTE_NAME_REQ:
1081 hci_cs_remote_name_req(hdev, ev->status);
1082 break;
1083
1084 case HCI_OP_SETUP_SYNC_CONN:
1085 hci_cs_setup_sync_conn(hdev, ev->status);
1086 break;
1087
1088 case HCI_OP_SNIFF_MODE:
1089 hci_cs_sniff_mode(hdev, ev->status);
1090 break;
1091
1092 case HCI_OP_EXIT_SNIFF_MODE:
1093 hci_cs_exit_sniff_mode(hdev, ev->status);
1094 break;
1095
1096 default:
1097 BT_DBG("%s opcode 0x%x", hdev->name, opcode);
1098 break;
1099 }
1100
1101 if (ev->ncmd) {
1102 atomic_set(&hdev->cmd_cnt, 1);
1103 if (!skb_queue_empty(&hdev->cmd_q))
1104 hci_sched_cmd(hdev);
1105 }
1106}
1107
1108static inline void hci_role_change_evt(struct hci_dev *hdev, struct sk_buff *skb)
1109{
1110 struct hci_ev_role_change *ev = (void *) skb->data;
1111 struct hci_conn *conn;
1112
1113 BT_DBG("%s status %d", hdev->name, ev->status);
1114
1115 hci_dev_lock(hdev);
1116
1117 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
1118 if (conn) {
1119 if (!ev->status) {
1120 if (ev->role)
1121 conn->link_mode &= ~HCI_LM_MASTER;
1122 else
1123 conn->link_mode |= HCI_LM_MASTER;
1124 }
1125
1126 clear_bit(HCI_CONN_RSWITCH_PEND, &conn->pend);
1127
1128 hci_role_switch_cfm(conn, ev->status, ev->role);
1129 }
1130
1131 hci_dev_unlock(hdev);
1132}
1133
1134static inline void hci_num_comp_pkts_evt(struct hci_dev *hdev, struct sk_buff *skb)
1135{
1136 struct hci_ev_num_comp_pkts *ev = (void *) skb->data;
1137 __le16 *ptr;
1138 int i;
1139
1140 skb_pull(skb, sizeof(*ev));
1141
1142 BT_DBG("%s num_hndl %d", hdev->name, ev->num_hndl);
1143
1144 if (skb->len < ev->num_hndl * 4) {
1145 BT_DBG("%s bad parameters", hdev->name);
1146 return;
1147 }
1148
1149 tasklet_disable(&hdev->tx_task);
1150
1151 for (i = 0, ptr = (__le16 *) skb->data; i < ev->num_hndl; i++) {
1152 struct hci_conn *conn;
1153 __u16 handle, count;
1154
1155 handle = __le16_to_cpu(get_unaligned(ptr++));
1156 count = __le16_to_cpu(get_unaligned(ptr++));
1157
1158 conn = hci_conn_hash_lookup_handle(hdev, handle);
1159 if (conn) {
1160 conn->sent -= count;
1161
1162 if (conn->type == ACL_LINK) {
1163 if ((hdev->acl_cnt += count) > hdev->acl_pkts)
1164 hdev->acl_cnt = hdev->acl_pkts;
1165 } else {
1166 if ((hdev->sco_cnt += count) > hdev->sco_pkts)
1167 hdev->sco_cnt = hdev->sco_pkts;
1168 }
1169 }
1170 }
1171
1172 hci_sched_tx(hdev);
1173
1174 tasklet_enable(&hdev->tx_task);
1175}
1176
1177static inline void hci_mode_change_evt(struct hci_dev *hdev, struct sk_buff *skb)
04837f64 1178{
a9de9248 1179 struct hci_ev_mode_change *ev = (void *) skb->data;
04837f64
MH
1180 struct hci_conn *conn;
1181
1182 BT_DBG("%s status %d", hdev->name, ev->status);
1183
1184 hci_dev_lock(hdev);
1185
1186 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
a9de9248
MH
1187 if (conn) {
1188 conn->mode = ev->mode;
1189 conn->interval = __le16_to_cpu(ev->interval);
1190
1191 if (!test_and_clear_bit(HCI_CONN_MODE_CHANGE_PEND, &conn->pend)) {
1192 if (conn->mode == HCI_CM_ACTIVE)
1193 conn->power_save = 1;
1194 else
1195 conn->power_save = 0;
1196 }
04837f64
MH
1197 }
1198
1199 hci_dev_unlock(hdev);
1200}
1201
a9de9248
MH
1202static inline void hci_pin_code_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
1203{
1204 BT_DBG("%s", hdev->name);
1205}
1206
1207static inline void hci_link_key_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
1208{
1209 BT_DBG("%s", hdev->name);
1210}
1211
1212static inline void hci_link_key_notify_evt(struct hci_dev *hdev, struct sk_buff *skb)
1213{
1214 BT_DBG("%s", hdev->name);
1215}
1216
1da177e4
LT
1217static inline void hci_clock_offset_evt(struct hci_dev *hdev, struct sk_buff *skb)
1218{
a9de9248 1219 struct hci_ev_clock_offset *ev = (void *) skb->data;
04837f64 1220 struct hci_conn *conn;
1da177e4
LT
1221
1222 BT_DBG("%s status %d", hdev->name, ev->status);
1223
1224 hci_dev_lock(hdev);
1225
04837f64 1226 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
1da177e4
LT
1227 if (conn && !ev->status) {
1228 struct inquiry_entry *ie;
1229
1230 if ((ie = hci_inquiry_cache_lookup(hdev, &conn->dst))) {
1231 ie->data.clock_offset = ev->clock_offset;
1232 ie->timestamp = jiffies;
1233 }
1234 }
1235
1236 hci_dev_unlock(hdev);
1237}
1238
85a1e930
MH
1239static inline void hci_pscan_rep_mode_evt(struct hci_dev *hdev, struct sk_buff *skb)
1240{
a9de9248 1241 struct hci_ev_pscan_rep_mode *ev = (void *) skb->data;
85a1e930
MH
1242 struct inquiry_entry *ie;
1243
1244 BT_DBG("%s", hdev->name);
1245
1246 hci_dev_lock(hdev);
1247
1248 if ((ie = hci_inquiry_cache_lookup(hdev, &ev->bdaddr))) {
1249 ie->data.pscan_rep_mode = ev->pscan_rep_mode;
1250 ie->timestamp = jiffies;
1251 }
1252
1253 hci_dev_unlock(hdev);
1254}
1255
a9de9248
MH
1256static inline void hci_inquiry_result_with_rssi_evt(struct hci_dev *hdev, struct sk_buff *skb)
1257{
1258 struct inquiry_data data;
1259 int num_rsp = *((__u8 *) skb->data);
1260
1261 BT_DBG("%s num_rsp %d", hdev->name, num_rsp);
1262
1263 if (!num_rsp)
1264 return;
1265
1266 hci_dev_lock(hdev);
1267
1268 if ((skb->len - 1) / num_rsp != sizeof(struct inquiry_info_with_rssi)) {
1269 struct inquiry_info_with_rssi_and_pscan_mode *info = (void *) (skb->data + 1);
1270
1271 for (; num_rsp; num_rsp--) {
1272 bacpy(&data.bdaddr, &info->bdaddr);
1273 data.pscan_rep_mode = info->pscan_rep_mode;
1274 data.pscan_period_mode = info->pscan_period_mode;
1275 data.pscan_mode = info->pscan_mode;
1276 memcpy(data.dev_class, info->dev_class, 3);
1277 data.clock_offset = info->clock_offset;
1278 data.rssi = info->rssi;
1279 info++;
1280 hci_inquiry_cache_update(hdev, &data);
1281 }
1282 } else {
1283 struct inquiry_info_with_rssi *info = (void *) (skb->data + 1);
1284
1285 for (; num_rsp; num_rsp--) {
1286 bacpy(&data.bdaddr, &info->bdaddr);
1287 data.pscan_rep_mode = info->pscan_rep_mode;
1288 data.pscan_period_mode = info->pscan_period_mode;
1289 data.pscan_mode = 0x00;
1290 memcpy(data.dev_class, info->dev_class, 3);
1291 data.clock_offset = info->clock_offset;
1292 data.rssi = info->rssi;
1293 info++;
1294 hci_inquiry_cache_update(hdev, &data);
1295 }
1296 }
1297
1298 hci_dev_unlock(hdev);
1299}
1300
1301static inline void hci_remote_ext_features_evt(struct hci_dev *hdev, struct sk_buff *skb)
1302{
1303 BT_DBG("%s", hdev->name);
1304}
1305
1306static inline void hci_sync_conn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
1307{
b6a0dc82
MH
1308 struct hci_ev_sync_conn_complete *ev = (void *) skb->data;
1309 struct hci_conn *conn;
1310
1311 BT_DBG("%s status %d", hdev->name, ev->status);
1312
1313 hci_dev_lock(hdev);
1314
1315 conn = hci_conn_hash_lookup_ba(hdev, ev->link_type, &ev->bdaddr);
1316 if (!conn)
1317 goto unlock;
1318
1319 if (!ev->status) {
1320 conn->handle = __le16_to_cpu(ev->handle);
1321 conn->state = BT_CONNECTED;
1322 } else
1323 conn->state = BT_CLOSED;
1324
1325 hci_proto_connect_cfm(conn, ev->status);
1326 if (ev->status)
1327 hci_conn_del(conn);
1328
1329unlock:
1330 hci_dev_unlock(hdev);
a9de9248
MH
1331}
1332
1333static inline void hci_sync_conn_changed_evt(struct hci_dev *hdev, struct sk_buff *skb)
1334{
1335 BT_DBG("%s", hdev->name);
1336}
1337
04837f64
MH
1338static inline void hci_sniff_subrate_evt(struct hci_dev *hdev, struct sk_buff *skb)
1339{
a9de9248 1340 struct hci_ev_sniff_subrate *ev = (void *) skb->data;
04837f64
MH
1341 struct hci_conn *conn;
1342
1343 BT_DBG("%s status %d", hdev->name, ev->status);
1344
1345 hci_dev_lock(hdev);
1346
1347 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
1348 if (conn) {
1349 }
1350
1351 hci_dev_unlock(hdev);
1352}
1353
a9de9248 1354static inline void hci_extended_inquiry_result_evt(struct hci_dev *hdev, struct sk_buff *skb)
1da177e4 1355{
a9de9248
MH
1356 struct inquiry_data data;
1357 struct extended_inquiry_info *info = (void *) (skb->data + 1);
1358 int num_rsp = *((__u8 *) skb->data);
1da177e4 1359
a9de9248 1360 BT_DBG("%s num_rsp %d", hdev->name, num_rsp);
1da177e4 1361
a9de9248
MH
1362 if (!num_rsp)
1363 return;
1da177e4 1364
a9de9248
MH
1365 hci_dev_lock(hdev);
1366
1367 for (; num_rsp; num_rsp--) {
1368 bacpy(&data.bdaddr, &info->bdaddr);
1369 data.pscan_rep_mode = info->pscan_rep_mode;
1370 data.pscan_period_mode = info->pscan_period_mode;
1371 data.pscan_mode = 0x00;
1372 memcpy(data.dev_class, info->dev_class, 3);
1373 data.clock_offset = info->clock_offset;
1374 data.rssi = info->rssi;
1375 info++;
1376 hci_inquiry_cache_update(hdev, &data);
1377 }
1378
1379 hci_dev_unlock(hdev);
1380}
1da177e4 1381
a9de9248
MH
1382void hci_event_packet(struct hci_dev *hdev, struct sk_buff *skb)
1383{
1384 struct hci_event_hdr *hdr = (void *) skb->data;
1385 __u8 event = hdr->evt;
1386
1387 skb_pull(skb, HCI_EVENT_HDR_SIZE);
1388
1389 switch (event) {
1da177e4
LT
1390 case HCI_EV_INQUIRY_COMPLETE:
1391 hci_inquiry_complete_evt(hdev, skb);
1392 break;
1393
1394 case HCI_EV_INQUIRY_RESULT:
1395 hci_inquiry_result_evt(hdev, skb);
1396 break;
1397
a9de9248
MH
1398 case HCI_EV_CONN_COMPLETE:
1399 hci_conn_complete_evt(hdev, skb);
21d9e30e
MH
1400 break;
1401
1da177e4
LT
1402 case HCI_EV_CONN_REQUEST:
1403 hci_conn_request_evt(hdev, skb);
1404 break;
1405
1da177e4
LT
1406 case HCI_EV_DISCONN_COMPLETE:
1407 hci_disconn_complete_evt(hdev, skb);
1408 break;
1409
1da177e4
LT
1410 case HCI_EV_AUTH_COMPLETE:
1411 hci_auth_complete_evt(hdev, skb);
1412 break;
1413
a9de9248
MH
1414 case HCI_EV_REMOTE_NAME:
1415 hci_remote_name_evt(hdev, skb);
1416 break;
1417
1da177e4
LT
1418 case HCI_EV_ENCRYPT_CHANGE:
1419 hci_encrypt_change_evt(hdev, skb);
1420 break;
1421
a9de9248
MH
1422 case HCI_EV_CHANGE_LINK_KEY_COMPLETE:
1423 hci_change_link_key_complete_evt(hdev, skb);
1424 break;
1425
1426 case HCI_EV_REMOTE_FEATURES:
1427 hci_remote_features_evt(hdev, skb);
1428 break;
1429
1430 case HCI_EV_REMOTE_VERSION:
1431 hci_remote_version_evt(hdev, skb);
1432 break;
1433
1434 case HCI_EV_QOS_SETUP_COMPLETE:
1435 hci_qos_setup_complete_evt(hdev, skb);
1436 break;
1437
1438 case HCI_EV_CMD_COMPLETE:
1439 hci_cmd_complete_evt(hdev, skb);
1440 break;
1441
1442 case HCI_EV_CMD_STATUS:
1443 hci_cmd_status_evt(hdev, skb);
1444 break;
1445
1446 case HCI_EV_ROLE_CHANGE:
1447 hci_role_change_evt(hdev, skb);
1448 break;
1449
1450 case HCI_EV_NUM_COMP_PKTS:
1451 hci_num_comp_pkts_evt(hdev, skb);
1452 break;
1453
1454 case HCI_EV_MODE_CHANGE:
1455 hci_mode_change_evt(hdev, skb);
1da177e4
LT
1456 break;
1457
1458 case HCI_EV_PIN_CODE_REQ:
1459 hci_pin_code_request_evt(hdev, skb);
1460 break;
1461
1462 case HCI_EV_LINK_KEY_REQ:
1463 hci_link_key_request_evt(hdev, skb);
1464 break;
1465
1466 case HCI_EV_LINK_KEY_NOTIFY:
1467 hci_link_key_notify_evt(hdev, skb);
1468 break;
1469
1470 case HCI_EV_CLOCK_OFFSET:
1471 hci_clock_offset_evt(hdev, skb);
1472 break;
1473
85a1e930
MH
1474 case HCI_EV_PSCAN_REP_MODE:
1475 hci_pscan_rep_mode_evt(hdev, skb);
1476 break;
1477
a9de9248
MH
1478 case HCI_EV_INQUIRY_RESULT_WITH_RSSI:
1479 hci_inquiry_result_with_rssi_evt(hdev, skb);
04837f64
MH
1480 break;
1481
a9de9248
MH
1482 case HCI_EV_REMOTE_EXT_FEATURES:
1483 hci_remote_ext_features_evt(hdev, skb);
1da177e4
LT
1484 break;
1485
a9de9248
MH
1486 case HCI_EV_SYNC_CONN_COMPLETE:
1487 hci_sync_conn_complete_evt(hdev, skb);
1488 break;
1da177e4 1489
a9de9248
MH
1490 case HCI_EV_SYNC_CONN_CHANGED:
1491 hci_sync_conn_changed_evt(hdev, skb);
1492 break;
1da177e4 1493
a9de9248
MH
1494 case HCI_EV_SNIFF_SUBRATE:
1495 hci_sniff_subrate_evt(hdev, skb);
1496 break;
1da177e4 1497
a9de9248
MH
1498 case HCI_EV_EXTENDED_INQUIRY_RESULT:
1499 hci_extended_inquiry_result_evt(hdev, skb);
1500 break;
1da177e4 1501
a9de9248
MH
1502 default:
1503 BT_DBG("%s event 0x%x", hdev->name, event);
1da177e4
LT
1504 break;
1505 }
1506
1507 kfree_skb(skb);
1508 hdev->stat.evt_rx++;
1509}
1510
1511/* Generate internal stack event */
1512void hci_si_event(struct hci_dev *hdev, int type, int dlen, void *data)
1513{
1514 struct hci_event_hdr *hdr;
1515 struct hci_ev_stack_internal *ev;
1516 struct sk_buff *skb;
1517
1518 skb = bt_skb_alloc(HCI_EVENT_HDR_SIZE + sizeof(*ev) + dlen, GFP_ATOMIC);
1519 if (!skb)
1520 return;
1521
1522 hdr = (void *) skb_put(skb, HCI_EVENT_HDR_SIZE);
1523 hdr->evt = HCI_EV_STACK_INTERNAL;
1524 hdr->plen = sizeof(*ev) + dlen;
1525
1526 ev = (void *) skb_put(skb, sizeof(*ev) + dlen);
1527 ev->type = type;
1528 memcpy(ev->data, data, dlen);
1529
576c7d85 1530 bt_cb(skb)->incoming = 1;
a61bbcf2 1531 __net_timestamp(skb);
576c7d85 1532
0d48d939 1533 bt_cb(skb)->pkt_type = HCI_EVENT_PKT;
1da177e4
LT
1534 skb->dev = (void *) hdev;
1535 hci_send_to_sock(hdev, skb);
1536 kfree_skb(skb);
1537}