blob: 9e0368b02a1165f499cb0a2106175e1da6a8c022 [file] [log] [blame]
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09001/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07002 BlueZ - Bluetooth protocol stack for Linux
3 Copyright (C) 2000-2001 Qualcomm Incorporated
Gustavo F. Padovan590051d2011-12-18 13:39:33 -02004 Copyright (C) 2011 ProFUSION Embedded Systems
Linus Torvalds1da177e2005-04-16 15:20:36 -07005
6 Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com>
7
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License version 2 as
10 published by the Free Software Foundation;
11
12 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
13 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
14 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
15 IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +090016 CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
17 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
18 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
Linus Torvalds1da177e2005-04-16 15:20:36 -070019 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
20
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +090021 ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
22 COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
Linus Torvalds1da177e2005-04-16 15:20:36 -070023 SOFTWARE IS DISCLAIMED.
24*/
25
26/* Bluetooth HCI core. */
27
Gustavo Padovan8c520a52012-05-23 04:04:22 -030028#include <linux/export.h>
Sasha Levin3df92b32012-05-27 22:36:56 +020029#include <linux/idr.h>
Marcel Holtmann611b30f2009-06-08 14:41:38 +020030#include <linux/rfkill.h>
Marcel Holtmannbaf27f62013-10-16 03:28:55 -070031#include <linux/debugfs.h>
Johan Hedberg99780a72014-02-18 10:40:07 +020032#include <linux/crypto.h>
Marcel Holtmann47219832013-10-17 17:24:15 -070033#include <asm/unaligned.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070034
35#include <net/bluetooth/bluetooth.h>
36#include <net/bluetooth/hci_core.h>
Johan Hedberg4bc58f52014-05-20 09:45:47 +030037#include <net/bluetooth/l2cap.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070038
Johan Hedberg970c4e42014-02-18 10:19:33 +020039#include "smp.h"
40
Marcel Holtmannb78752c2010-08-08 23:06:53 -040041static void hci_rx_work(struct work_struct *work);
Gustavo F. Padovanc347b762011-12-14 23:53:47 -020042static void hci_cmd_work(struct work_struct *work);
Gustavo F. Padovan3eff45e2011-12-15 00:50:02 -020043static void hci_tx_work(struct work_struct *work);
Linus Torvalds1da177e2005-04-16 15:20:36 -070044
Linus Torvalds1da177e2005-04-16 15:20:36 -070045/* HCI device list */
46LIST_HEAD(hci_dev_list);
47DEFINE_RWLOCK(hci_dev_list_lock);
48
49/* HCI callback list */
50LIST_HEAD(hci_cb_list);
51DEFINE_RWLOCK(hci_cb_list_lock);
52
Sasha Levin3df92b32012-05-27 22:36:56 +020053/* HCI ID Numbering */
54static DEFINE_IDA(hci_index_ida);
55
Linus Torvalds1da177e2005-04-16 15:20:36 -070056/* ---- HCI notifications ---- */
57
Marcel Holtmann65164552005-10-28 19:20:48 +020058static void hci_notify(struct hci_dev *hdev, int event)
Linus Torvalds1da177e2005-04-16 15:20:36 -070059{
Marcel Holtmann040030e2012-02-20 14:50:37 +010060 hci_sock_dev_event(hdev, event);
Linus Torvalds1da177e2005-04-16 15:20:36 -070061}
62
Marcel Holtmannbaf27f62013-10-16 03:28:55 -070063/* ---- HCI debugfs entries ---- */
64
Marcel Holtmann4b4148e2013-10-19 07:09:12 -070065static ssize_t dut_mode_read(struct file *file, char __user *user_buf,
66 size_t count, loff_t *ppos)
67{
68 struct hci_dev *hdev = file->private_data;
69 char buf[3];
70
71 buf[0] = test_bit(HCI_DUT_MODE, &hdev->dev_flags) ? 'Y': 'N';
72 buf[1] = '\n';
73 buf[2] = '\0';
74 return simple_read_from_buffer(user_buf, count, ppos, buf, 2);
75}
76
77static ssize_t dut_mode_write(struct file *file, const char __user *user_buf,
78 size_t count, loff_t *ppos)
79{
80 struct hci_dev *hdev = file->private_data;
81 struct sk_buff *skb;
82 char buf[32];
83 size_t buf_size = min(count, (sizeof(buf)-1));
84 bool enable;
85 int err;
86
87 if (!test_bit(HCI_UP, &hdev->flags))
88 return -ENETDOWN;
89
90 if (copy_from_user(buf, user_buf, buf_size))
91 return -EFAULT;
92
93 buf[buf_size] = '\0';
94 if (strtobool(buf, &enable))
95 return -EINVAL;
96
97 if (enable == test_bit(HCI_DUT_MODE, &hdev->dev_flags))
98 return -EALREADY;
99
100 hci_req_lock(hdev);
101 if (enable)
102 skb = __hci_cmd_sync(hdev, HCI_OP_ENABLE_DUT_MODE, 0, NULL,
103 HCI_CMD_TIMEOUT);
104 else
105 skb = __hci_cmd_sync(hdev, HCI_OP_RESET, 0, NULL,
106 HCI_CMD_TIMEOUT);
107 hci_req_unlock(hdev);
108
109 if (IS_ERR(skb))
110 return PTR_ERR(skb);
111
112 err = -bt_to_errno(skb->data[0]);
113 kfree_skb(skb);
114
115 if (err < 0)
116 return err;
117
118 change_bit(HCI_DUT_MODE, &hdev->dev_flags);
119
120 return count;
121}
122
123static const struct file_operations dut_mode_fops = {
124 .open = simple_open,
125 .read = dut_mode_read,
126 .write = dut_mode_write,
127 .llseek = default_llseek,
128};
129
Marcel Holtmanndfb826a2013-10-18 12:04:46 -0700130static int features_show(struct seq_file *f, void *ptr)
131{
132 struct hci_dev *hdev = f->private;
133 u8 p;
134
135 hci_dev_lock(hdev);
136 for (p = 0; p < HCI_MAX_PAGES && p <= hdev->max_page; p++) {
Marcel Holtmanncfbb2b52013-10-19 02:25:33 -0700137 seq_printf(f, "%2u: 0x%2.2x 0x%2.2x 0x%2.2x 0x%2.2x "
Marcel Holtmanndfb826a2013-10-18 12:04:46 -0700138 "0x%2.2x 0x%2.2x 0x%2.2x 0x%2.2x\n", p,
139 hdev->features[p][0], hdev->features[p][1],
140 hdev->features[p][2], hdev->features[p][3],
141 hdev->features[p][4], hdev->features[p][5],
142 hdev->features[p][6], hdev->features[p][7]);
143 }
Marcel Holtmanncfbb2b52013-10-19 02:25:33 -0700144 if (lmp_le_capable(hdev))
145 seq_printf(f, "LE: 0x%2.2x 0x%2.2x 0x%2.2x 0x%2.2x "
146 "0x%2.2x 0x%2.2x 0x%2.2x 0x%2.2x\n",
147 hdev->le_features[0], hdev->le_features[1],
148 hdev->le_features[2], hdev->le_features[3],
149 hdev->le_features[4], hdev->le_features[5],
150 hdev->le_features[6], hdev->le_features[7]);
Marcel Holtmanndfb826a2013-10-18 12:04:46 -0700151 hci_dev_unlock(hdev);
152
153 return 0;
154}
155
156static int features_open(struct inode *inode, struct file *file)
157{
158 return single_open(file, features_show, inode->i_private);
159}
160
161static const struct file_operations features_fops = {
162 .open = features_open,
163 .read = seq_read,
164 .llseek = seq_lseek,
165 .release = single_release,
166};
167
Marcel Holtmann70afe0b2013-10-17 17:24:14 -0700168static int blacklist_show(struct seq_file *f, void *p)
169{
170 struct hci_dev *hdev = f->private;
171 struct bdaddr_list *b;
172
173 hci_dev_lock(hdev);
174 list_for_each_entry(b, &hdev->blacklist, list)
Marcel Holtmannb25f0782013-10-17 17:24:20 -0700175 seq_printf(f, "%pMR (type %u)\n", &b->bdaddr, b->bdaddr_type);
Marcel Holtmann70afe0b2013-10-17 17:24:14 -0700176 hci_dev_unlock(hdev);
177
178 return 0;
179}
180
181static int blacklist_open(struct inode *inode, struct file *file)
182{
183 return single_open(file, blacklist_show, inode->i_private);
184}
185
186static const struct file_operations blacklist_fops = {
187 .open = blacklist_open,
188 .read = seq_read,
189 .llseek = seq_lseek,
190 .release = single_release,
191};
192
Marcel Holtmann47219832013-10-17 17:24:15 -0700193static int uuids_show(struct seq_file *f, void *p)
194{
195 struct hci_dev *hdev = f->private;
196 struct bt_uuid *uuid;
197
198 hci_dev_lock(hdev);
199 list_for_each_entry(uuid, &hdev->uuids, list) {
Marcel Holtmann58f01aa2013-10-19 09:31:59 -0700200 u8 i, val[16];
Marcel Holtmann47219832013-10-17 17:24:15 -0700201
Marcel Holtmann58f01aa2013-10-19 09:31:59 -0700202 /* The Bluetooth UUID values are stored in big endian,
203 * but with reversed byte order. So convert them into
204 * the right order for the %pUb modifier.
205 */
206 for (i = 0; i < 16; i++)
207 val[i] = uuid->uuid[15 - i];
Marcel Holtmann47219832013-10-17 17:24:15 -0700208
Marcel Holtmann58f01aa2013-10-19 09:31:59 -0700209 seq_printf(f, "%pUb\n", val);
Marcel Holtmann47219832013-10-17 17:24:15 -0700210 }
211 hci_dev_unlock(hdev);
212
213 return 0;
214}
215
216static int uuids_open(struct inode *inode, struct file *file)
217{
218 return single_open(file, uuids_show, inode->i_private);
219}
220
221static const struct file_operations uuids_fops = {
222 .open = uuids_open,
223 .read = seq_read,
224 .llseek = seq_lseek,
225 .release = single_release,
226};
227
Marcel Holtmannbaf27f62013-10-16 03:28:55 -0700228static int inquiry_cache_show(struct seq_file *f, void *p)
229{
230 struct hci_dev *hdev = f->private;
231 struct discovery_state *cache = &hdev->discovery;
232 struct inquiry_entry *e;
233
234 hci_dev_lock(hdev);
235
236 list_for_each_entry(e, &cache->all, all) {
237 struct inquiry_data *data = &e->data;
238 seq_printf(f, "%pMR %d %d %d 0x%.2x%.2x%.2x 0x%.4x %d %d %u\n",
239 &data->bdaddr,
240 data->pscan_rep_mode, data->pscan_period_mode,
241 data->pscan_mode, data->dev_class[2],
242 data->dev_class[1], data->dev_class[0],
243 __le16_to_cpu(data->clock_offset),
244 data->rssi, data->ssp_mode, e->timestamp);
245 }
246
247 hci_dev_unlock(hdev);
248
249 return 0;
250}
251
252static int inquiry_cache_open(struct inode *inode, struct file *file)
253{
254 return single_open(file, inquiry_cache_show, inode->i_private);
255}
256
257static const struct file_operations inquiry_cache_fops = {
258 .open = inquiry_cache_open,
259 .read = seq_read,
260 .llseek = seq_lseek,
261 .release = single_release,
262};
263
Marcel Holtmann02d08d12013-10-18 12:04:52 -0700264static int link_keys_show(struct seq_file *f, void *ptr)
265{
266 struct hci_dev *hdev = f->private;
267 struct list_head *p, *n;
268
269 hci_dev_lock(hdev);
270 list_for_each_safe(p, n, &hdev->link_keys) {
271 struct link_key *key = list_entry(p, struct link_key, list);
272 seq_printf(f, "%pMR %u %*phN %u\n", &key->bdaddr, key->type,
273 HCI_LINK_KEY_SIZE, key->val, key->pin_len);
274 }
275 hci_dev_unlock(hdev);
276
277 return 0;
278}
279
280static int link_keys_open(struct inode *inode, struct file *file)
281{
282 return single_open(file, link_keys_show, inode->i_private);
283}
284
285static const struct file_operations link_keys_fops = {
286 .open = link_keys_open,
287 .read = seq_read,
288 .llseek = seq_lseek,
289 .release = single_release,
290};
291
Marcel Holtmannbabdbb32013-10-18 12:04:51 -0700292static int dev_class_show(struct seq_file *f, void *ptr)
293{
294 struct hci_dev *hdev = f->private;
295
296 hci_dev_lock(hdev);
297 seq_printf(f, "0x%.2x%.2x%.2x\n", hdev->dev_class[2],
298 hdev->dev_class[1], hdev->dev_class[0]);
299 hci_dev_unlock(hdev);
300
301 return 0;
302}
303
304static int dev_class_open(struct inode *inode, struct file *file)
305{
306 return single_open(file, dev_class_show, inode->i_private);
307}
308
309static const struct file_operations dev_class_fops = {
310 .open = dev_class_open,
311 .read = seq_read,
312 .llseek = seq_lseek,
313 .release = single_release,
314};
315
Marcel Holtmann041000b2013-10-17 12:02:31 -0700316static int voice_setting_get(void *data, u64 *val)
317{
318 struct hci_dev *hdev = data;
319
320 hci_dev_lock(hdev);
321 *val = hdev->voice_setting;
322 hci_dev_unlock(hdev);
323
324 return 0;
325}
326
327DEFINE_SIMPLE_ATTRIBUTE(voice_setting_fops, voice_setting_get,
328 NULL, "0x%4.4llx\n");
329
Marcel Holtmannebd1e332013-10-17 10:54:46 -0700330static int auto_accept_delay_set(void *data, u64 val)
331{
332 struct hci_dev *hdev = data;
333
334 hci_dev_lock(hdev);
335 hdev->auto_accept_delay = val;
336 hci_dev_unlock(hdev);
337
338 return 0;
339}
340
341static int auto_accept_delay_get(void *data, u64 *val)
342{
343 struct hci_dev *hdev = data;
344
345 hci_dev_lock(hdev);
346 *val = hdev->auto_accept_delay;
347 hci_dev_unlock(hdev);
348
349 return 0;
350}
351
352DEFINE_SIMPLE_ATTRIBUTE(auto_accept_delay_fops, auto_accept_delay_get,
353 auto_accept_delay_set, "%llu\n");
354
Marcel Holtmann06f5b772013-10-19 07:09:11 -0700355static int ssp_debug_mode_set(void *data, u64 val)
356{
357 struct hci_dev *hdev = data;
358 struct sk_buff *skb;
359 __u8 mode;
360 int err;
361
362 if (val != 0 && val != 1)
363 return -EINVAL;
364
365 if (!test_bit(HCI_UP, &hdev->flags))
366 return -ENETDOWN;
367
368 hci_req_lock(hdev);
369 mode = val;
370 skb = __hci_cmd_sync(hdev, HCI_OP_WRITE_SSP_DEBUG_MODE, sizeof(mode),
371 &mode, HCI_CMD_TIMEOUT);
372 hci_req_unlock(hdev);
373
374 if (IS_ERR(skb))
375 return PTR_ERR(skb);
376
377 err = -bt_to_errno(skb->data[0]);
378 kfree_skb(skb);
379
380 if (err < 0)
381 return err;
382
383 hci_dev_lock(hdev);
384 hdev->ssp_debug_mode = val;
385 hci_dev_unlock(hdev);
386
387 return 0;
388}
389
390static int ssp_debug_mode_get(void *data, u64 *val)
391{
392 struct hci_dev *hdev = data;
393
394 hci_dev_lock(hdev);
395 *val = hdev->ssp_debug_mode;
396 hci_dev_unlock(hdev);
397
398 return 0;
399}
400
401DEFINE_SIMPLE_ATTRIBUTE(ssp_debug_mode_fops, ssp_debug_mode_get,
402 ssp_debug_mode_set, "%llu\n");
403
Marcel Holtmann5afeac142014-01-10 02:07:27 -0800404static ssize_t force_sc_support_read(struct file *file, char __user *user_buf,
405 size_t count, loff_t *ppos)
406{
407 struct hci_dev *hdev = file->private_data;
408 char buf[3];
409
410 buf[0] = test_bit(HCI_FORCE_SC, &hdev->dev_flags) ? 'Y': 'N';
411 buf[1] = '\n';
412 buf[2] = '\0';
413 return simple_read_from_buffer(user_buf, count, ppos, buf, 2);
414}
415
416static ssize_t force_sc_support_write(struct file *file,
417 const char __user *user_buf,
418 size_t count, loff_t *ppos)
419{
420 struct hci_dev *hdev = file->private_data;
421 char buf[32];
422 size_t buf_size = min(count, (sizeof(buf)-1));
423 bool enable;
424
425 if (test_bit(HCI_UP, &hdev->flags))
426 return -EBUSY;
427
428 if (copy_from_user(buf, user_buf, buf_size))
429 return -EFAULT;
430
431 buf[buf_size] = '\0';
432 if (strtobool(buf, &enable))
433 return -EINVAL;
434
435 if (enable == test_bit(HCI_FORCE_SC, &hdev->dev_flags))
436 return -EALREADY;
437
438 change_bit(HCI_FORCE_SC, &hdev->dev_flags);
439
440 return count;
441}
442
443static const struct file_operations force_sc_support_fops = {
444 .open = simple_open,
445 .read = force_sc_support_read,
446 .write = force_sc_support_write,
447 .llseek = default_llseek,
448};
449
Marcel Holtmann134c2a82014-01-15 22:37:42 -0800450static ssize_t sc_only_mode_read(struct file *file, char __user *user_buf,
451 size_t count, loff_t *ppos)
452{
453 struct hci_dev *hdev = file->private_data;
454 char buf[3];
455
456 buf[0] = test_bit(HCI_SC_ONLY, &hdev->dev_flags) ? 'Y': 'N';
457 buf[1] = '\n';
458 buf[2] = '\0';
459 return simple_read_from_buffer(user_buf, count, ppos, buf, 2);
460}
461
462static const struct file_operations sc_only_mode_fops = {
463 .open = simple_open,
464 .read = sc_only_mode_read,
465 .llseek = default_llseek,
466};
467
Marcel Holtmann2bfa3532013-10-17 19:16:02 -0700468static int idle_timeout_set(void *data, u64 val)
469{
470 struct hci_dev *hdev = data;
471
472 if (val != 0 && (val < 500 || val > 3600000))
473 return -EINVAL;
474
475 hci_dev_lock(hdev);
Marcel Holtmann2be48b62013-10-19 10:19:15 -0700476 hdev->idle_timeout = val;
Marcel Holtmann2bfa3532013-10-17 19:16:02 -0700477 hci_dev_unlock(hdev);
478
479 return 0;
480}
481
482static int idle_timeout_get(void *data, u64 *val)
483{
484 struct hci_dev *hdev = data;
485
486 hci_dev_lock(hdev);
487 *val = hdev->idle_timeout;
488 hci_dev_unlock(hdev);
489
490 return 0;
491}
492
493DEFINE_SIMPLE_ATTRIBUTE(idle_timeout_fops, idle_timeout_get,
494 idle_timeout_set, "%llu\n");
495
Johan Hedbergc982b2e2014-02-23 19:42:26 +0200496static int rpa_timeout_set(void *data, u64 val)
497{
498 struct hci_dev *hdev = data;
499
500 /* Require the RPA timeout to be at least 30 seconds and at most
501 * 24 hours.
502 */
503 if (val < 30 || val > (60 * 60 * 24))
504 return -EINVAL;
505
506 hci_dev_lock(hdev);
507 hdev->rpa_timeout = val;
508 hci_dev_unlock(hdev);
509
510 return 0;
511}
512
513static int rpa_timeout_get(void *data, u64 *val)
514{
515 struct hci_dev *hdev = data;
516
517 hci_dev_lock(hdev);
518 *val = hdev->rpa_timeout;
519 hci_dev_unlock(hdev);
520
521 return 0;
522}
523
524DEFINE_SIMPLE_ATTRIBUTE(rpa_timeout_fops, rpa_timeout_get,
525 rpa_timeout_set, "%llu\n");
526
Marcel Holtmann2bfa3532013-10-17 19:16:02 -0700527static int sniff_min_interval_set(void *data, u64 val)
528{
529 struct hci_dev *hdev = data;
530
531 if (val == 0 || val % 2 || val > hdev->sniff_max_interval)
532 return -EINVAL;
533
534 hci_dev_lock(hdev);
Marcel Holtmann2be48b62013-10-19 10:19:15 -0700535 hdev->sniff_min_interval = val;
Marcel Holtmann2bfa3532013-10-17 19:16:02 -0700536 hci_dev_unlock(hdev);
537
538 return 0;
539}
540
541static int sniff_min_interval_get(void *data, u64 *val)
542{
543 struct hci_dev *hdev = data;
544
545 hci_dev_lock(hdev);
546 *val = hdev->sniff_min_interval;
547 hci_dev_unlock(hdev);
548
549 return 0;
550}
551
552DEFINE_SIMPLE_ATTRIBUTE(sniff_min_interval_fops, sniff_min_interval_get,
553 sniff_min_interval_set, "%llu\n");
554
555static int sniff_max_interval_set(void *data, u64 val)
556{
557 struct hci_dev *hdev = data;
558
559 if (val == 0 || val % 2 || val < hdev->sniff_min_interval)
560 return -EINVAL;
561
562 hci_dev_lock(hdev);
Marcel Holtmann2be48b62013-10-19 10:19:15 -0700563 hdev->sniff_max_interval = val;
Marcel Holtmann2bfa3532013-10-17 19:16:02 -0700564 hci_dev_unlock(hdev);
565
566 return 0;
567}
568
569static int sniff_max_interval_get(void *data, u64 *val)
570{
571 struct hci_dev *hdev = data;
572
573 hci_dev_lock(hdev);
574 *val = hdev->sniff_max_interval;
575 hci_dev_unlock(hdev);
576
577 return 0;
578}
579
580DEFINE_SIMPLE_ATTRIBUTE(sniff_max_interval_fops, sniff_max_interval_get,
581 sniff_max_interval_set, "%llu\n");
582
Andrzej Kaczmarek31ad1692014-05-14 13:43:02 +0200583static int conn_info_min_age_set(void *data, u64 val)
584{
585 struct hci_dev *hdev = data;
586
587 if (val == 0 || val > hdev->conn_info_max_age)
588 return -EINVAL;
589
590 hci_dev_lock(hdev);
591 hdev->conn_info_min_age = val;
592 hci_dev_unlock(hdev);
593
594 return 0;
595}
596
597static int conn_info_min_age_get(void *data, u64 *val)
598{
599 struct hci_dev *hdev = data;
600
601 hci_dev_lock(hdev);
602 *val = hdev->conn_info_min_age;
603 hci_dev_unlock(hdev);
604
605 return 0;
606}
607
608DEFINE_SIMPLE_ATTRIBUTE(conn_info_min_age_fops, conn_info_min_age_get,
609 conn_info_min_age_set, "%llu\n");
610
611static int conn_info_max_age_set(void *data, u64 val)
612{
613 struct hci_dev *hdev = data;
614
615 if (val == 0 || val < hdev->conn_info_min_age)
616 return -EINVAL;
617
618 hci_dev_lock(hdev);
619 hdev->conn_info_max_age = val;
620 hci_dev_unlock(hdev);
621
622 return 0;
623}
624
625static int conn_info_max_age_get(void *data, u64 *val)
626{
627 struct hci_dev *hdev = data;
628
629 hci_dev_lock(hdev);
630 *val = hdev->conn_info_max_age;
631 hci_dev_unlock(hdev);
632
633 return 0;
634}
635
636DEFINE_SIMPLE_ATTRIBUTE(conn_info_max_age_fops, conn_info_max_age_get,
637 conn_info_max_age_set, "%llu\n");
638
Marcel Holtmannac345812014-02-23 12:44:25 -0800639static int identity_show(struct seq_file *f, void *p)
640{
641 struct hci_dev *hdev = f->private;
Johan Hedberga1f4c312014-02-27 14:05:41 +0200642 bdaddr_t addr;
Marcel Holtmannac345812014-02-23 12:44:25 -0800643 u8 addr_type;
644
645 hci_dev_lock(hdev);
646
Johan Hedberga1f4c312014-02-27 14:05:41 +0200647 hci_copy_identity_address(hdev, &addr, &addr_type);
Marcel Holtmannac345812014-02-23 12:44:25 -0800648
Johan Hedberga1f4c312014-02-27 14:05:41 +0200649 seq_printf(f, "%pMR (type %u) %*phN %pMR\n", &addr, addr_type,
Marcel Holtmann473deef2c92014-02-23 20:39:23 -0800650 16, hdev->irk, &hdev->rpa);
Marcel Holtmannac345812014-02-23 12:44:25 -0800651
652 hci_dev_unlock(hdev);
653
654 return 0;
655}
656
657static int identity_open(struct inode *inode, struct file *file)
658{
659 return single_open(file, identity_show, inode->i_private);
660}
661
662static const struct file_operations identity_fops = {
663 .open = identity_open,
664 .read = seq_read,
665 .llseek = seq_lseek,
666 .release = single_release,
667};
668
Marcel Holtmann7a4cd512014-02-19 19:52:13 -0800669static int random_address_show(struct seq_file *f, void *p)
670{
671 struct hci_dev *hdev = f->private;
672
673 hci_dev_lock(hdev);
674 seq_printf(f, "%pMR\n", &hdev->random_addr);
675 hci_dev_unlock(hdev);
676
677 return 0;
678}
679
680static int random_address_open(struct inode *inode, struct file *file)
681{
682 return single_open(file, random_address_show, inode->i_private);
683}
684
685static const struct file_operations random_address_fops = {
686 .open = random_address_open,
687 .read = seq_read,
688 .llseek = seq_lseek,
689 .release = single_release,
690};
691
Marcel Holtmanne7b8fc92013-10-17 11:45:09 -0700692static int static_address_show(struct seq_file *f, void *p)
693{
694 struct hci_dev *hdev = f->private;
695
696 hci_dev_lock(hdev);
697 seq_printf(f, "%pMR\n", &hdev->static_addr);
698 hci_dev_unlock(hdev);
699
700 return 0;
701}
702
703static int static_address_open(struct inode *inode, struct file *file)
704{
705 return single_open(file, static_address_show, inode->i_private);
706}
707
708static const struct file_operations static_address_fops = {
709 .open = static_address_open,
710 .read = seq_read,
711 .llseek = seq_lseek,
712 .release = single_release,
713};
714
Marcel Holtmannb32bba62014-02-19 19:31:26 -0800715static ssize_t force_static_address_read(struct file *file,
716 char __user *user_buf,
717 size_t count, loff_t *ppos)
Marcel Holtmann92202182013-10-18 16:38:10 -0700718{
Marcel Holtmannb32bba62014-02-19 19:31:26 -0800719 struct hci_dev *hdev = file->private_data;
720 char buf[3];
Marcel Holtmann92202182013-10-18 16:38:10 -0700721
Marcel Holtmannb32bba62014-02-19 19:31:26 -0800722 buf[0] = test_bit(HCI_FORCE_STATIC_ADDR, &hdev->dev_flags) ? 'Y': 'N';
723 buf[1] = '\n';
724 buf[2] = '\0';
725 return simple_read_from_buffer(user_buf, count, ppos, buf, 2);
726}
727
728static ssize_t force_static_address_write(struct file *file,
729 const char __user *user_buf,
730 size_t count, loff_t *ppos)
731{
732 struct hci_dev *hdev = file->private_data;
733 char buf[32];
734 size_t buf_size = min(count, (sizeof(buf)-1));
735 bool enable;
736
737 if (test_bit(HCI_UP, &hdev->flags))
738 return -EBUSY;
739
740 if (copy_from_user(buf, user_buf, buf_size))
741 return -EFAULT;
742
743 buf[buf_size] = '\0';
744 if (strtobool(buf, &enable))
Marcel Holtmann92202182013-10-18 16:38:10 -0700745 return -EINVAL;
746
Marcel Holtmannb32bba62014-02-19 19:31:26 -0800747 if (enable == test_bit(HCI_FORCE_STATIC_ADDR, &hdev->dev_flags))
748 return -EALREADY;
Marcel Holtmann92202182013-10-18 16:38:10 -0700749
Marcel Holtmannb32bba62014-02-19 19:31:26 -0800750 change_bit(HCI_FORCE_STATIC_ADDR, &hdev->dev_flags);
751
752 return count;
Marcel Holtmann92202182013-10-18 16:38:10 -0700753}
754
Marcel Holtmannb32bba62014-02-19 19:31:26 -0800755static const struct file_operations force_static_address_fops = {
756 .open = simple_open,
757 .read = force_static_address_read,
758 .write = force_static_address_write,
759 .llseek = default_llseek,
760};
Marcel Holtmann92202182013-10-18 16:38:10 -0700761
Marcel Holtmannd2ab0ac2014-02-27 20:37:30 -0800762static int white_list_show(struct seq_file *f, void *ptr)
763{
764 struct hci_dev *hdev = f->private;
765 struct bdaddr_list *b;
766
767 hci_dev_lock(hdev);
768 list_for_each_entry(b, &hdev->le_white_list, list)
769 seq_printf(f, "%pMR (type %u)\n", &b->bdaddr, b->bdaddr_type);
770 hci_dev_unlock(hdev);
771
772 return 0;
773}
774
775static int white_list_open(struct inode *inode, struct file *file)
776{
777 return single_open(file, white_list_show, inode->i_private);
778}
779
780static const struct file_operations white_list_fops = {
781 .open = white_list_open,
782 .read = seq_read,
783 .llseek = seq_lseek,
784 .release = single_release,
785};
786
Marcel Holtmann3698d702014-02-18 21:54:49 -0800787static int identity_resolving_keys_show(struct seq_file *f, void *ptr)
788{
789 struct hci_dev *hdev = f->private;
790 struct list_head *p, *n;
791
792 hci_dev_lock(hdev);
793 list_for_each_safe(p, n, &hdev->identity_resolving_keys) {
794 struct smp_irk *irk = list_entry(p, struct smp_irk, list);
795 seq_printf(f, "%pMR (type %u) %*phN %pMR\n",
796 &irk->bdaddr, irk->addr_type,
797 16, irk->val, &irk->rpa);
798 }
799 hci_dev_unlock(hdev);
800
801 return 0;
802}
803
804static int identity_resolving_keys_open(struct inode *inode, struct file *file)
805{
806 return single_open(file, identity_resolving_keys_show,
807 inode->i_private);
808}
809
810static const struct file_operations identity_resolving_keys_fops = {
811 .open = identity_resolving_keys_open,
812 .read = seq_read,
813 .llseek = seq_lseek,
814 .release = single_release,
815};
816
Marcel Holtmann8f8625c2013-10-18 15:56:57 -0700817static int long_term_keys_show(struct seq_file *f, void *ptr)
818{
819 struct hci_dev *hdev = f->private;
820 struct list_head *p, *n;
821
822 hci_dev_lock(hdev);
Johan Hedbergf813f1b2014-01-30 19:39:57 -0800823 list_for_each_safe(p, n, &hdev->long_term_keys) {
Marcel Holtmann8f8625c2013-10-18 15:56:57 -0700824 struct smp_ltk *ltk = list_entry(p, struct smp_ltk, list);
Marcel Holtmannfe39c7b2014-02-27 16:00:28 -0800825 seq_printf(f, "%pMR (type %u) %u 0x%02x %u %.4x %.16llx %*phN\n",
Marcel Holtmann8f8625c2013-10-18 15:56:57 -0700826 &ltk->bdaddr, ltk->bdaddr_type, ltk->authenticated,
827 ltk->type, ltk->enc_size, __le16_to_cpu(ltk->ediv),
Marcel Holtmannfe39c7b2014-02-27 16:00:28 -0800828 __le64_to_cpu(ltk->rand), 16, ltk->val);
Marcel Holtmann8f8625c2013-10-18 15:56:57 -0700829 }
830 hci_dev_unlock(hdev);
831
832 return 0;
833}
834
835static int long_term_keys_open(struct inode *inode, struct file *file)
836{
837 return single_open(file, long_term_keys_show, inode->i_private);
838}
839
840static const struct file_operations long_term_keys_fops = {
841 .open = long_term_keys_open,
842 .read = seq_read,
843 .llseek = seq_lseek,
844 .release = single_release,
845};
846
Marcel Holtmann4e70c7e2013-10-19 07:09:13 -0700847static int conn_min_interval_set(void *data, u64 val)
848{
849 struct hci_dev *hdev = data;
850
851 if (val < 0x0006 || val > 0x0c80 || val > hdev->le_conn_max_interval)
852 return -EINVAL;
853
854 hci_dev_lock(hdev);
Marcel Holtmann2be48b62013-10-19 10:19:15 -0700855 hdev->le_conn_min_interval = val;
Marcel Holtmann4e70c7e2013-10-19 07:09:13 -0700856 hci_dev_unlock(hdev);
857
858 return 0;
859}
860
861static int conn_min_interval_get(void *data, u64 *val)
862{
863 struct hci_dev *hdev = data;
864
865 hci_dev_lock(hdev);
866 *val = hdev->le_conn_min_interval;
867 hci_dev_unlock(hdev);
868
869 return 0;
870}
871
872DEFINE_SIMPLE_ATTRIBUTE(conn_min_interval_fops, conn_min_interval_get,
873 conn_min_interval_set, "%llu\n");
874
875static int conn_max_interval_set(void *data, u64 val)
876{
877 struct hci_dev *hdev = data;
878
879 if (val < 0x0006 || val > 0x0c80 || val < hdev->le_conn_min_interval)
880 return -EINVAL;
881
882 hci_dev_lock(hdev);
Marcel Holtmann2be48b62013-10-19 10:19:15 -0700883 hdev->le_conn_max_interval = val;
Marcel Holtmann4e70c7e2013-10-19 07:09:13 -0700884 hci_dev_unlock(hdev);
885
886 return 0;
887}
888
889static int conn_max_interval_get(void *data, u64 *val)
890{
891 struct hci_dev *hdev = data;
892
893 hci_dev_lock(hdev);
894 *val = hdev->le_conn_max_interval;
895 hci_dev_unlock(hdev);
896
897 return 0;
898}
899
900DEFINE_SIMPLE_ATTRIBUTE(conn_max_interval_fops, conn_max_interval_get,
901 conn_max_interval_set, "%llu\n");
902
Marcel Holtmann3f959d42014-02-20 11:55:56 -0800903static int adv_channel_map_set(void *data, u64 val)
904{
905 struct hci_dev *hdev = data;
906
907 if (val < 0x01 || val > 0x07)
908 return -EINVAL;
909
910 hci_dev_lock(hdev);
911 hdev->le_adv_channel_map = val;
912 hci_dev_unlock(hdev);
913
914 return 0;
915}
916
917static int adv_channel_map_get(void *data, u64 *val)
918{
919 struct hci_dev *hdev = data;
920
921 hci_dev_lock(hdev);
922 *val = hdev->le_adv_channel_map;
923 hci_dev_unlock(hdev);
924
925 return 0;
926}
927
928DEFINE_SIMPLE_ATTRIBUTE(adv_channel_map_fops, adv_channel_map_get,
929 adv_channel_map_set, "%llu\n");
930
Jukka Rissanen89863102013-12-11 17:05:38 +0200931static ssize_t lowpan_read(struct file *file, char __user *user_buf,
932 size_t count, loff_t *ppos)
933{
934 struct hci_dev *hdev = file->private_data;
935 char buf[3];
936
937 buf[0] = test_bit(HCI_6LOWPAN_ENABLED, &hdev->dev_flags) ? 'Y' : 'N';
938 buf[1] = '\n';
939 buf[2] = '\0';
940 return simple_read_from_buffer(user_buf, count, ppos, buf, 2);
941}
942
943static ssize_t lowpan_write(struct file *fp, const char __user *user_buffer,
944 size_t count, loff_t *position)
945{
946 struct hci_dev *hdev = fp->private_data;
947 bool enable;
948 char buf[32];
949 size_t buf_size = min(count, (sizeof(buf)-1));
950
951 if (copy_from_user(buf, user_buffer, buf_size))
952 return -EFAULT;
953
954 buf[buf_size] = '\0';
955
956 if (strtobool(buf, &enable) < 0)
957 return -EINVAL;
958
959 if (enable == test_bit(HCI_6LOWPAN_ENABLED, &hdev->dev_flags))
960 return -EALREADY;
961
962 change_bit(HCI_6LOWPAN_ENABLED, &hdev->dev_flags);
963
964 return count;
965}
966
967static const struct file_operations lowpan_debugfs_fops = {
968 .open = simple_open,
969 .read = lowpan_read,
970 .write = lowpan_write,
971 .llseek = default_llseek,
972};
973
Andre Guedes7d474e02014-02-26 20:21:54 -0300974static int le_auto_conn_show(struct seq_file *sf, void *ptr)
975{
976 struct hci_dev *hdev = sf->private;
977 struct hci_conn_params *p;
978
979 hci_dev_lock(hdev);
980
981 list_for_each_entry(p, &hdev->le_conn_params, list) {
982 seq_printf(sf, "%pMR %u %u\n", &p->addr, p->addr_type,
983 p->auto_connect);
984 }
985
986 hci_dev_unlock(hdev);
987
988 return 0;
989}
990
991static int le_auto_conn_open(struct inode *inode, struct file *file)
992{
993 return single_open(file, le_auto_conn_show, inode->i_private);
994}
995
996static ssize_t le_auto_conn_write(struct file *file, const char __user *data,
997 size_t count, loff_t *offset)
998{
999 struct seq_file *sf = file->private_data;
1000 struct hci_dev *hdev = sf->private;
1001 u8 auto_connect = 0;
1002 bdaddr_t addr;
1003 u8 addr_type;
1004 char *buf;
1005 int err = 0;
1006 int n;
1007
1008 /* Don't allow partial write */
1009 if (*offset != 0)
1010 return -EINVAL;
1011
1012 if (count < 3)
1013 return -EINVAL;
1014
Andre Guedes4408dd12014-03-24 16:08:48 -03001015 buf = memdup_user(data, count);
1016 if (IS_ERR(buf))
1017 return PTR_ERR(buf);
Andre Guedes7d474e02014-02-26 20:21:54 -03001018
1019 if (memcmp(buf, "add", 3) == 0) {
1020 n = sscanf(&buf[4], "%hhx:%hhx:%hhx:%hhx:%hhx:%hhx %hhu %hhu",
1021 &addr.b[5], &addr.b[4], &addr.b[3], &addr.b[2],
1022 &addr.b[1], &addr.b[0], &addr_type,
1023 &auto_connect);
1024
1025 if (n < 7) {
1026 err = -EINVAL;
1027 goto done;
1028 }
1029
1030 hci_dev_lock(hdev);
1031 err = hci_conn_params_add(hdev, &addr, addr_type, auto_connect,
1032 hdev->le_conn_min_interval,
1033 hdev->le_conn_max_interval);
1034 hci_dev_unlock(hdev);
1035
1036 if (err)
1037 goto done;
1038 } else if (memcmp(buf, "del", 3) == 0) {
1039 n = sscanf(&buf[4], "%hhx:%hhx:%hhx:%hhx:%hhx:%hhx %hhu",
1040 &addr.b[5], &addr.b[4], &addr.b[3], &addr.b[2],
1041 &addr.b[1], &addr.b[0], &addr_type);
1042
1043 if (n < 7) {
1044 err = -EINVAL;
1045 goto done;
1046 }
1047
1048 hci_dev_lock(hdev);
1049 hci_conn_params_del(hdev, &addr, addr_type);
1050 hci_dev_unlock(hdev);
1051 } else if (memcmp(buf, "clr", 3) == 0) {
1052 hci_dev_lock(hdev);
1053 hci_conn_params_clear(hdev);
1054 hci_pend_le_conns_clear(hdev);
1055 hci_update_background_scan(hdev);
1056 hci_dev_unlock(hdev);
1057 } else {
1058 err = -EINVAL;
1059 }
1060
1061done:
1062 kfree(buf);
1063
1064 if (err)
1065 return err;
1066 else
1067 return count;
1068}
1069
1070static const struct file_operations le_auto_conn_fops = {
1071 .open = le_auto_conn_open,
1072 .read = seq_read,
1073 .write = le_auto_conn_write,
1074 .llseek = seq_lseek,
1075 .release = single_release,
1076};
1077
Linus Torvalds1da177e2005-04-16 15:20:36 -07001078/* ---- HCI requests ---- */
1079
Johan Hedberg42c6b122013-03-05 20:37:49 +02001080static void hci_req_sync_complete(struct hci_dev *hdev, u8 result)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001081{
Johan Hedberg42c6b122013-03-05 20:37:49 +02001082 BT_DBG("%s result 0x%2.2x", hdev->name, result);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001083
1084 if (hdev->req_status == HCI_REQ_PEND) {
1085 hdev->req_result = result;
1086 hdev->req_status = HCI_REQ_DONE;
1087 wake_up_interruptible(&hdev->req_wait_q);
1088 }
1089}
1090
1091static void hci_req_cancel(struct hci_dev *hdev, int err)
1092{
1093 BT_DBG("%s err 0x%2.2x", hdev->name, err);
1094
1095 if (hdev->req_status == HCI_REQ_PEND) {
1096 hdev->req_result = err;
1097 hdev->req_status = HCI_REQ_CANCELED;
1098 wake_up_interruptible(&hdev->req_wait_q);
1099 }
1100}
1101
Fengguang Wu77a63e02013-04-20 16:24:31 +03001102static struct sk_buff *hci_get_cmd_complete(struct hci_dev *hdev, u16 opcode,
1103 u8 event)
Johan Hedberg75e84b72013-04-02 13:35:04 +03001104{
1105 struct hci_ev_cmd_complete *ev;
1106 struct hci_event_hdr *hdr;
1107 struct sk_buff *skb;
1108
1109 hci_dev_lock(hdev);
1110
1111 skb = hdev->recv_evt;
1112 hdev->recv_evt = NULL;
1113
1114 hci_dev_unlock(hdev);
1115
1116 if (!skb)
1117 return ERR_PTR(-ENODATA);
1118
1119 if (skb->len < sizeof(*hdr)) {
1120 BT_ERR("Too short HCI event");
1121 goto failed;
1122 }
1123
1124 hdr = (void *) skb->data;
1125 skb_pull(skb, HCI_EVENT_HDR_SIZE);
1126
Johan Hedberg7b1abbb2013-04-03 21:54:47 +03001127 if (event) {
1128 if (hdr->evt != event)
1129 goto failed;
1130 return skb;
1131 }
1132
Johan Hedberg75e84b72013-04-02 13:35:04 +03001133 if (hdr->evt != HCI_EV_CMD_COMPLETE) {
1134 BT_DBG("Last event is not cmd complete (0x%2.2x)", hdr->evt);
1135 goto failed;
1136 }
1137
1138 if (skb->len < sizeof(*ev)) {
1139 BT_ERR("Too short cmd_complete event");
1140 goto failed;
1141 }
1142
1143 ev = (void *) skb->data;
1144 skb_pull(skb, sizeof(*ev));
1145
1146 if (opcode == __le16_to_cpu(ev->opcode))
1147 return skb;
1148
1149 BT_DBG("opcode doesn't match (0x%2.2x != 0x%2.2x)", opcode,
1150 __le16_to_cpu(ev->opcode));
1151
1152failed:
1153 kfree_skb(skb);
1154 return ERR_PTR(-ENODATA);
1155}
1156
Johan Hedberg7b1abbb2013-04-03 21:54:47 +03001157struct sk_buff *__hci_cmd_sync_ev(struct hci_dev *hdev, u16 opcode, u32 plen,
Johan Hedberg07dc93d2013-04-19 10:14:51 +03001158 const void *param, u8 event, u32 timeout)
Johan Hedberg75e84b72013-04-02 13:35:04 +03001159{
1160 DECLARE_WAITQUEUE(wait, current);
1161 struct hci_request req;
1162 int err = 0;
1163
1164 BT_DBG("%s", hdev->name);
1165
1166 hci_req_init(&req, hdev);
1167
Johan Hedberg7b1abbb2013-04-03 21:54:47 +03001168 hci_req_add_ev(&req, opcode, plen, param, event);
Johan Hedberg75e84b72013-04-02 13:35:04 +03001169
1170 hdev->req_status = HCI_REQ_PEND;
1171
1172 err = hci_req_run(&req, hci_req_sync_complete);
1173 if (err < 0)
1174 return ERR_PTR(err);
1175
1176 add_wait_queue(&hdev->req_wait_q, &wait);
1177 set_current_state(TASK_INTERRUPTIBLE);
1178
1179 schedule_timeout(timeout);
1180
1181 remove_wait_queue(&hdev->req_wait_q, &wait);
1182
1183 if (signal_pending(current))
1184 return ERR_PTR(-EINTR);
1185
1186 switch (hdev->req_status) {
1187 case HCI_REQ_DONE:
1188 err = -bt_to_errno(hdev->req_result);
1189 break;
1190
1191 case HCI_REQ_CANCELED:
1192 err = -hdev->req_result;
1193 break;
1194
1195 default:
1196 err = -ETIMEDOUT;
1197 break;
1198 }
1199
1200 hdev->req_status = hdev->req_result = 0;
1201
1202 BT_DBG("%s end: err %d", hdev->name, err);
1203
1204 if (err < 0)
1205 return ERR_PTR(err);
1206
Johan Hedberg7b1abbb2013-04-03 21:54:47 +03001207 return hci_get_cmd_complete(hdev, opcode, event);
1208}
1209EXPORT_SYMBOL(__hci_cmd_sync_ev);
1210
1211struct sk_buff *__hci_cmd_sync(struct hci_dev *hdev, u16 opcode, u32 plen,
Johan Hedberg07dc93d2013-04-19 10:14:51 +03001212 const void *param, u32 timeout)
Johan Hedberg7b1abbb2013-04-03 21:54:47 +03001213{
1214 return __hci_cmd_sync_ev(hdev, opcode, plen, param, 0, timeout);
Johan Hedberg75e84b72013-04-02 13:35:04 +03001215}
1216EXPORT_SYMBOL(__hci_cmd_sync);
1217
Linus Torvalds1da177e2005-04-16 15:20:36 -07001218/* Execute request and wait for completion. */
Johan Hedberg01178cd2013-03-05 20:37:41 +02001219static int __hci_req_sync(struct hci_dev *hdev,
Johan Hedberg42c6b122013-03-05 20:37:49 +02001220 void (*func)(struct hci_request *req,
1221 unsigned long opt),
Johan Hedberg01178cd2013-03-05 20:37:41 +02001222 unsigned long opt, __u32 timeout)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001223{
Johan Hedberg42c6b122013-03-05 20:37:49 +02001224 struct hci_request req;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001225 DECLARE_WAITQUEUE(wait, current);
1226 int err = 0;
1227
1228 BT_DBG("%s start", hdev->name);
1229
Johan Hedberg42c6b122013-03-05 20:37:49 +02001230 hci_req_init(&req, hdev);
1231
Linus Torvalds1da177e2005-04-16 15:20:36 -07001232 hdev->req_status = HCI_REQ_PEND;
1233
Johan Hedberg42c6b122013-03-05 20:37:49 +02001234 func(&req, opt);
Johan Hedberg53cce222013-03-05 20:37:42 +02001235
Johan Hedberg42c6b122013-03-05 20:37:49 +02001236 err = hci_req_run(&req, hci_req_sync_complete);
1237 if (err < 0) {
Johan Hedberg53cce222013-03-05 20:37:42 +02001238 hdev->req_status = 0;
Andre Guedes920c8302013-03-08 11:20:15 -03001239
1240 /* ENODATA means the HCI request command queue is empty.
1241 * This can happen when a request with conditionals doesn't
1242 * trigger any commands to be sent. This is normal behavior
1243 * and should not trigger an error return.
Johan Hedberg42c6b122013-03-05 20:37:49 +02001244 */
Andre Guedes920c8302013-03-08 11:20:15 -03001245 if (err == -ENODATA)
1246 return 0;
1247
1248 return err;
Johan Hedberg53cce222013-03-05 20:37:42 +02001249 }
1250
Andre Guedesbc4445c2013-03-08 11:20:13 -03001251 add_wait_queue(&hdev->req_wait_q, &wait);
1252 set_current_state(TASK_INTERRUPTIBLE);
1253
Linus Torvalds1da177e2005-04-16 15:20:36 -07001254 schedule_timeout(timeout);
1255
1256 remove_wait_queue(&hdev->req_wait_q, &wait);
1257
1258 if (signal_pending(current))
1259 return -EINTR;
1260
1261 switch (hdev->req_status) {
1262 case HCI_REQ_DONE:
Joe Perchese1750722011-06-29 18:18:29 -07001263 err = -bt_to_errno(hdev->req_result);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001264 break;
1265
1266 case HCI_REQ_CANCELED:
1267 err = -hdev->req_result;
1268 break;
1269
1270 default:
1271 err = -ETIMEDOUT;
1272 break;
Stephen Hemminger3ff50b72007-04-20 17:09:22 -07001273 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001274
Johan Hedberga5040ef2011-01-10 13:28:59 +02001275 hdev->req_status = hdev->req_result = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001276
1277 BT_DBG("%s end: err %d", hdev->name, err);
1278
1279 return err;
1280}
1281
Johan Hedberg01178cd2013-03-05 20:37:41 +02001282static int hci_req_sync(struct hci_dev *hdev,
Johan Hedberg42c6b122013-03-05 20:37:49 +02001283 void (*req)(struct hci_request *req,
1284 unsigned long opt),
Johan Hedberg01178cd2013-03-05 20:37:41 +02001285 unsigned long opt, __u32 timeout)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001286{
1287 int ret;
1288
Marcel Holtmann7c6a3292008-09-12 03:11:54 +02001289 if (!test_bit(HCI_UP, &hdev->flags))
1290 return -ENETDOWN;
1291
Linus Torvalds1da177e2005-04-16 15:20:36 -07001292 /* Serialize all requests */
1293 hci_req_lock(hdev);
Johan Hedberg01178cd2013-03-05 20:37:41 +02001294 ret = __hci_req_sync(hdev, req, opt, timeout);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001295 hci_req_unlock(hdev);
1296
1297 return ret;
1298}
1299
Johan Hedberg42c6b122013-03-05 20:37:49 +02001300static void hci_reset_req(struct hci_request *req, unsigned long opt)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001301{
Johan Hedberg42c6b122013-03-05 20:37:49 +02001302 BT_DBG("%s %ld", req->hdev->name, opt);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001303
1304 /* Reset device */
Johan Hedberg42c6b122013-03-05 20:37:49 +02001305 set_bit(HCI_RESET, &req->hdev->flags);
1306 hci_req_add(req, HCI_OP_RESET, 0, NULL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001307}
1308
Johan Hedberg42c6b122013-03-05 20:37:49 +02001309static void bredr_init(struct hci_request *req)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001310{
Johan Hedberg42c6b122013-03-05 20:37:49 +02001311 req->hdev->flow_ctl_mode = HCI_FLOW_CTL_MODE_PACKET_BASED;
Andrei Emeltchenko2455a3e2011-12-19 16:31:28 +02001312
Linus Torvalds1da177e2005-04-16 15:20:36 -07001313 /* Read Local Supported Features */
Johan Hedberg42c6b122013-03-05 20:37:49 +02001314 hci_req_add(req, HCI_OP_READ_LOCAL_FEATURES, 0, NULL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001315
Marcel Holtmann1143e5a2006-09-23 09:57:20 +02001316 /* Read Local Version */
Johan Hedberg42c6b122013-03-05 20:37:49 +02001317 hci_req_add(req, HCI_OP_READ_LOCAL_VERSION, 0, NULL);
Johan Hedberg2177bab2013-03-05 20:37:43 +02001318
1319 /* Read BD Address */
Johan Hedberg42c6b122013-03-05 20:37:49 +02001320 hci_req_add(req, HCI_OP_READ_BD_ADDR, 0, NULL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001321}
1322
Johan Hedberg42c6b122013-03-05 20:37:49 +02001323static void amp_init(struct hci_request *req)
Andrei Emeltchenkoe61ef4992011-12-19 16:31:27 +02001324{
Johan Hedberg42c6b122013-03-05 20:37:49 +02001325 req->hdev->flow_ctl_mode = HCI_FLOW_CTL_MODE_BLOCK_BASED;
Andrei Emeltchenko2455a3e2011-12-19 16:31:28 +02001326
Andrei Emeltchenkoe61ef4992011-12-19 16:31:27 +02001327 /* Read Local Version */
Johan Hedberg42c6b122013-03-05 20:37:49 +02001328 hci_req_add(req, HCI_OP_READ_LOCAL_VERSION, 0, NULL);
Andrei Emeltchenko6bcbc482012-03-28 16:31:24 +03001329
Marcel Holtmannf6996cf2013-10-07 02:31:39 -07001330 /* Read Local Supported Commands */
1331 hci_req_add(req, HCI_OP_READ_LOCAL_COMMANDS, 0, NULL);
1332
1333 /* Read Local Supported Features */
1334 hci_req_add(req, HCI_OP_READ_LOCAL_FEATURES, 0, NULL);
1335
Andrei Emeltchenko6bcbc482012-03-28 16:31:24 +03001336 /* Read Local AMP Info */
Johan Hedberg42c6b122013-03-05 20:37:49 +02001337 hci_req_add(req, HCI_OP_READ_LOCAL_AMP_INFO, 0, NULL);
Andrei Emeltchenkoe71dfab2012-09-06 15:05:46 +03001338
1339 /* Read Data Blk size */
Johan Hedberg42c6b122013-03-05 20:37:49 +02001340 hci_req_add(req, HCI_OP_READ_DATA_BLOCK_SIZE, 0, NULL);
Marcel Holtmann7528ca12013-10-07 03:55:52 -07001341
Marcel Holtmannf38ba942013-10-07 03:55:53 -07001342 /* Read Flow Control Mode */
1343 hci_req_add(req, HCI_OP_READ_FLOW_CONTROL_MODE, 0, NULL);
1344
Marcel Holtmann7528ca12013-10-07 03:55:52 -07001345 /* Read Location Data */
1346 hci_req_add(req, HCI_OP_READ_LOCATION_DATA, 0, NULL);
Andrei Emeltchenkoe61ef4992011-12-19 16:31:27 +02001347}
1348
Johan Hedberg42c6b122013-03-05 20:37:49 +02001349static void hci_init1_req(struct hci_request *req, unsigned long opt)
Andrei Emeltchenkoe61ef4992011-12-19 16:31:27 +02001350{
Johan Hedberg42c6b122013-03-05 20:37:49 +02001351 struct hci_dev *hdev = req->hdev;
Andrei Emeltchenkoe61ef4992011-12-19 16:31:27 +02001352
1353 BT_DBG("%s %ld", hdev->name, opt);
1354
Andrei Emeltchenko11778712012-06-11 11:13:10 +03001355 /* Reset */
1356 if (!test_bit(HCI_QUIRK_RESET_ON_CLOSE, &hdev->quirks))
Johan Hedberg42c6b122013-03-05 20:37:49 +02001357 hci_reset_req(req, 0);
Andrei Emeltchenko11778712012-06-11 11:13:10 +03001358
Andrei Emeltchenkoe61ef4992011-12-19 16:31:27 +02001359 switch (hdev->dev_type) {
1360 case HCI_BREDR:
Johan Hedberg42c6b122013-03-05 20:37:49 +02001361 bredr_init(req);
Andrei Emeltchenkoe61ef4992011-12-19 16:31:27 +02001362 break;
1363
1364 case HCI_AMP:
Johan Hedberg42c6b122013-03-05 20:37:49 +02001365 amp_init(req);
Andrei Emeltchenkoe61ef4992011-12-19 16:31:27 +02001366 break;
1367
1368 default:
1369 BT_ERR("Unknown device type %d", hdev->dev_type);
1370 break;
1371 }
Andrei Emeltchenkoe61ef4992011-12-19 16:31:27 +02001372}
1373
Johan Hedberg42c6b122013-03-05 20:37:49 +02001374static void bredr_setup(struct hci_request *req)
Johan Hedberg2177bab2013-03-05 20:37:43 +02001375{
Marcel Holtmann4ca048e2013-10-11 16:42:07 -07001376 struct hci_dev *hdev = req->hdev;
1377
Johan Hedberg2177bab2013-03-05 20:37:43 +02001378 __le16 param;
1379 __u8 flt_type;
1380
1381 /* Read Buffer Size (ACL mtu, max pkt, etc.) */
Johan Hedberg42c6b122013-03-05 20:37:49 +02001382 hci_req_add(req, HCI_OP_READ_BUFFER_SIZE, 0, NULL);
Johan Hedberg2177bab2013-03-05 20:37:43 +02001383
1384 /* Read Class of Device */
Johan Hedberg42c6b122013-03-05 20:37:49 +02001385 hci_req_add(req, HCI_OP_READ_CLASS_OF_DEV, 0, NULL);
Johan Hedberg2177bab2013-03-05 20:37:43 +02001386
1387 /* Read Local Name */
Johan Hedberg42c6b122013-03-05 20:37:49 +02001388 hci_req_add(req, HCI_OP_READ_LOCAL_NAME, 0, NULL);
Johan Hedberg2177bab2013-03-05 20:37:43 +02001389
1390 /* Read Voice Setting */
Johan Hedberg42c6b122013-03-05 20:37:49 +02001391 hci_req_add(req, HCI_OP_READ_VOICE_SETTING, 0, NULL);
Johan Hedberg2177bab2013-03-05 20:37:43 +02001392
Marcel Holtmannb4cb9fb2013-10-14 13:56:16 -07001393 /* Read Number of Supported IAC */
1394 hci_req_add(req, HCI_OP_READ_NUM_SUPPORTED_IAC, 0, NULL);
1395
Marcel Holtmann4b836f32013-10-14 14:06:36 -07001396 /* Read Current IAC LAP */
1397 hci_req_add(req, HCI_OP_READ_CURRENT_IAC_LAP, 0, NULL);
1398
Johan Hedberg2177bab2013-03-05 20:37:43 +02001399 /* Clear Event Filters */
1400 flt_type = HCI_FLT_CLEAR_ALL;
Johan Hedberg42c6b122013-03-05 20:37:49 +02001401 hci_req_add(req, HCI_OP_SET_EVENT_FLT, 1, &flt_type);
Johan Hedberg2177bab2013-03-05 20:37:43 +02001402
1403 /* Connection accept timeout ~20 secs */
Joe Perchesdcf4adb2014-03-12 10:52:35 -07001404 param = cpu_to_le16(0x7d00);
Johan Hedberg42c6b122013-03-05 20:37:49 +02001405 hci_req_add(req, HCI_OP_WRITE_CA_TIMEOUT, 2, &param);
Johan Hedberg2177bab2013-03-05 20:37:43 +02001406
Marcel Holtmann4ca048e2013-10-11 16:42:07 -07001407 /* AVM Berlin (31), aka "BlueFRITZ!", reports version 1.2,
1408 * but it does not support page scan related HCI commands.
1409 */
1410 if (hdev->manufacturer != 31 && hdev->hci_ver > BLUETOOTH_VER_1_1) {
Johan Hedbergf332ec62013-03-15 17:07:11 -05001411 hci_req_add(req, HCI_OP_READ_PAGE_SCAN_ACTIVITY, 0, NULL);
1412 hci_req_add(req, HCI_OP_READ_PAGE_SCAN_TYPE, 0, NULL);
1413 }
Johan Hedberg2177bab2013-03-05 20:37:43 +02001414}
1415
Johan Hedberg42c6b122013-03-05 20:37:49 +02001416static void le_setup(struct hci_request *req)
Johan Hedberg2177bab2013-03-05 20:37:43 +02001417{
Johan Hedbergc73eee92013-04-19 18:35:21 +03001418 struct hci_dev *hdev = req->hdev;
1419
Johan Hedberg2177bab2013-03-05 20:37:43 +02001420 /* Read LE Buffer Size */
Johan Hedberg42c6b122013-03-05 20:37:49 +02001421 hci_req_add(req, HCI_OP_LE_READ_BUFFER_SIZE, 0, NULL);
Johan Hedberg2177bab2013-03-05 20:37:43 +02001422
1423 /* Read LE Local Supported Features */
Johan Hedberg42c6b122013-03-05 20:37:49 +02001424 hci_req_add(req, HCI_OP_LE_READ_LOCAL_FEATURES, 0, NULL);
Johan Hedberg2177bab2013-03-05 20:37:43 +02001425
Marcel Holtmann747d3f02014-02-27 20:37:29 -08001426 /* Read LE Supported States */
1427 hci_req_add(req, HCI_OP_LE_READ_SUPPORTED_STATES, 0, NULL);
1428
Johan Hedberg2177bab2013-03-05 20:37:43 +02001429 /* Read LE Advertising Channel TX Power */
Johan Hedberg42c6b122013-03-05 20:37:49 +02001430 hci_req_add(req, HCI_OP_LE_READ_ADV_TX_POWER, 0, NULL);
Johan Hedberg2177bab2013-03-05 20:37:43 +02001431
1432 /* Read LE White List Size */
Johan Hedberg42c6b122013-03-05 20:37:49 +02001433 hci_req_add(req, HCI_OP_LE_READ_WHITE_LIST_SIZE, 0, NULL);
Johan Hedberg2177bab2013-03-05 20:37:43 +02001434
Marcel Holtmann747d3f02014-02-27 20:37:29 -08001435 /* Clear LE White List */
1436 hci_req_add(req, HCI_OP_LE_CLEAR_WHITE_LIST, 0, NULL);
Johan Hedbergc73eee92013-04-19 18:35:21 +03001437
1438 /* LE-only controllers have LE implicitly enabled */
1439 if (!lmp_bredr_capable(hdev))
1440 set_bit(HCI_LE_ENABLED, &hdev->dev_flags);
Johan Hedberg2177bab2013-03-05 20:37:43 +02001441}
1442
1443static u8 hci_get_inquiry_mode(struct hci_dev *hdev)
1444{
1445 if (lmp_ext_inq_capable(hdev))
1446 return 0x02;
1447
1448 if (lmp_inq_rssi_capable(hdev))
1449 return 0x01;
1450
1451 if (hdev->manufacturer == 11 && hdev->hci_rev == 0x00 &&
1452 hdev->lmp_subver == 0x0757)
1453 return 0x01;
1454
1455 if (hdev->manufacturer == 15) {
1456 if (hdev->hci_rev == 0x03 && hdev->lmp_subver == 0x6963)
1457 return 0x01;
1458 if (hdev->hci_rev == 0x09 && hdev->lmp_subver == 0x6963)
1459 return 0x01;
1460 if (hdev->hci_rev == 0x00 && hdev->lmp_subver == 0x6965)
1461 return 0x01;
1462 }
1463
1464 if (hdev->manufacturer == 31 && hdev->hci_rev == 0x2005 &&
1465 hdev->lmp_subver == 0x1805)
1466 return 0x01;
1467
1468 return 0x00;
1469}
1470
Johan Hedberg42c6b122013-03-05 20:37:49 +02001471static void hci_setup_inquiry_mode(struct hci_request *req)
Johan Hedberg2177bab2013-03-05 20:37:43 +02001472{
1473 u8 mode;
1474
Johan Hedberg42c6b122013-03-05 20:37:49 +02001475 mode = hci_get_inquiry_mode(req->hdev);
Johan Hedberg2177bab2013-03-05 20:37:43 +02001476
Johan Hedberg42c6b122013-03-05 20:37:49 +02001477 hci_req_add(req, HCI_OP_WRITE_INQUIRY_MODE, 1, &mode);
Johan Hedberg2177bab2013-03-05 20:37:43 +02001478}
1479
Johan Hedberg42c6b122013-03-05 20:37:49 +02001480static void hci_setup_event_mask(struct hci_request *req)
Johan Hedberg2177bab2013-03-05 20:37:43 +02001481{
Johan Hedberg42c6b122013-03-05 20:37:49 +02001482 struct hci_dev *hdev = req->hdev;
1483
Johan Hedberg2177bab2013-03-05 20:37:43 +02001484 /* The second byte is 0xff instead of 0x9f (two reserved bits
1485 * disabled) since a Broadcom 1.2 dongle doesn't respond to the
1486 * command otherwise.
1487 */
1488 u8 events[8] = { 0xff, 0xff, 0xfb, 0xff, 0x00, 0x00, 0x00, 0x00 };
1489
1490 /* CSR 1.1 dongles does not accept any bitfield so don't try to set
1491 * any event mask for pre 1.2 devices.
1492 */
1493 if (hdev->hci_ver < BLUETOOTH_VER_1_2)
1494 return;
1495
1496 if (lmp_bredr_capable(hdev)) {
1497 events[4] |= 0x01; /* Flow Specification Complete */
1498 events[4] |= 0x02; /* Inquiry Result with RSSI */
1499 events[4] |= 0x04; /* Read Remote Extended Features Complete */
1500 events[5] |= 0x08; /* Synchronous Connection Complete */
1501 events[5] |= 0x10; /* Synchronous Connection Changed */
Marcel Holtmannc7882cb2013-08-13 10:00:54 -07001502 } else {
1503 /* Use a different default for LE-only devices */
1504 memset(events, 0, sizeof(events));
1505 events[0] |= 0x10; /* Disconnection Complete */
1506 events[0] |= 0x80; /* Encryption Change */
1507 events[1] |= 0x08; /* Read Remote Version Information Complete */
1508 events[1] |= 0x20; /* Command Complete */
1509 events[1] |= 0x40; /* Command Status */
1510 events[1] |= 0x80; /* Hardware Error */
1511 events[2] |= 0x04; /* Number of Completed Packets */
1512 events[3] |= 0x02; /* Data Buffer Overflow */
1513 events[5] |= 0x80; /* Encryption Key Refresh Complete */
Johan Hedberg2177bab2013-03-05 20:37:43 +02001514 }
1515
1516 if (lmp_inq_rssi_capable(hdev))
1517 events[4] |= 0x02; /* Inquiry Result with RSSI */
1518
1519 if (lmp_sniffsubr_capable(hdev))
1520 events[5] |= 0x20; /* Sniff Subrating */
1521
1522 if (lmp_pause_enc_capable(hdev))
1523 events[5] |= 0x80; /* Encryption Key Refresh Complete */
1524
1525 if (lmp_ext_inq_capable(hdev))
1526 events[5] |= 0x40; /* Extended Inquiry Result */
1527
1528 if (lmp_no_flush_capable(hdev))
1529 events[7] |= 0x01; /* Enhanced Flush Complete */
1530
1531 if (lmp_lsto_capable(hdev))
1532 events[6] |= 0x80; /* Link Supervision Timeout Changed */
1533
1534 if (lmp_ssp_capable(hdev)) {
1535 events[6] |= 0x01; /* IO Capability Request */
1536 events[6] |= 0x02; /* IO Capability Response */
1537 events[6] |= 0x04; /* User Confirmation Request */
1538 events[6] |= 0x08; /* User Passkey Request */
1539 events[6] |= 0x10; /* Remote OOB Data Request */
1540 events[6] |= 0x20; /* Simple Pairing Complete */
1541 events[7] |= 0x04; /* User Passkey Notification */
1542 events[7] |= 0x08; /* Keypress Notification */
1543 events[7] |= 0x10; /* Remote Host Supported
1544 * Features Notification
1545 */
1546 }
1547
1548 if (lmp_le_capable(hdev))
1549 events[7] |= 0x20; /* LE Meta-Event */
1550
Johan Hedberg42c6b122013-03-05 20:37:49 +02001551 hci_req_add(req, HCI_OP_SET_EVENT_MASK, sizeof(events), events);
Johan Hedberg2177bab2013-03-05 20:37:43 +02001552
1553 if (lmp_le_capable(hdev)) {
1554 memset(events, 0, sizeof(events));
1555 events[0] = 0x1f;
Johan Hedberg42c6b122013-03-05 20:37:49 +02001556 hci_req_add(req, HCI_OP_LE_SET_EVENT_MASK,
1557 sizeof(events), events);
Johan Hedberg2177bab2013-03-05 20:37:43 +02001558 }
1559}
1560
Johan Hedberg42c6b122013-03-05 20:37:49 +02001561static void hci_init2_req(struct hci_request *req, unsigned long opt)
Johan Hedberg2177bab2013-03-05 20:37:43 +02001562{
Johan Hedberg42c6b122013-03-05 20:37:49 +02001563 struct hci_dev *hdev = req->hdev;
1564
Johan Hedberg2177bab2013-03-05 20:37:43 +02001565 if (lmp_bredr_capable(hdev))
Johan Hedberg42c6b122013-03-05 20:37:49 +02001566 bredr_setup(req);
Johan Hedberg56f87902013-10-02 13:43:13 +03001567 else
1568 clear_bit(HCI_BREDR_ENABLED, &hdev->dev_flags);
Johan Hedberg2177bab2013-03-05 20:37:43 +02001569
1570 if (lmp_le_capable(hdev))
Johan Hedberg42c6b122013-03-05 20:37:49 +02001571 le_setup(req);
Johan Hedberg2177bab2013-03-05 20:37:43 +02001572
Johan Hedberg42c6b122013-03-05 20:37:49 +02001573 hci_setup_event_mask(req);
Johan Hedberg2177bab2013-03-05 20:37:43 +02001574
Johan Hedberg3f8e2d72013-07-24 02:32:46 +03001575 /* AVM Berlin (31), aka "BlueFRITZ!", doesn't support the read
1576 * local supported commands HCI command.
1577 */
1578 if (hdev->manufacturer != 31 && hdev->hci_ver > BLUETOOTH_VER_1_1)
Johan Hedberg42c6b122013-03-05 20:37:49 +02001579 hci_req_add(req, HCI_OP_READ_LOCAL_COMMANDS, 0, NULL);
Johan Hedberg2177bab2013-03-05 20:37:43 +02001580
1581 if (lmp_ssp_capable(hdev)) {
Marcel Holtmann57af75a2013-10-18 12:04:47 -07001582 /* When SSP is available, then the host features page
1583 * should also be available as well. However some
1584 * controllers list the max_page as 0 as long as SSP
1585 * has not been enabled. To achieve proper debugging
1586 * output, force the minimum max_page to 1 at least.
1587 */
1588 hdev->max_page = 0x01;
1589
Johan Hedberg2177bab2013-03-05 20:37:43 +02001590 if (test_bit(HCI_SSP_ENABLED, &hdev->dev_flags)) {
1591 u8 mode = 0x01;
Johan Hedberg42c6b122013-03-05 20:37:49 +02001592 hci_req_add(req, HCI_OP_WRITE_SSP_MODE,
1593 sizeof(mode), &mode);
Johan Hedberg2177bab2013-03-05 20:37:43 +02001594 } else {
1595 struct hci_cp_write_eir cp;
1596
1597 memset(hdev->eir, 0, sizeof(hdev->eir));
1598 memset(&cp, 0, sizeof(cp));
1599
Johan Hedberg42c6b122013-03-05 20:37:49 +02001600 hci_req_add(req, HCI_OP_WRITE_EIR, sizeof(cp), &cp);
Johan Hedberg2177bab2013-03-05 20:37:43 +02001601 }
1602 }
1603
1604 if (lmp_inq_rssi_capable(hdev))
Johan Hedberg42c6b122013-03-05 20:37:49 +02001605 hci_setup_inquiry_mode(req);
Johan Hedberg2177bab2013-03-05 20:37:43 +02001606
1607 if (lmp_inq_tx_pwr_capable(hdev))
Johan Hedberg42c6b122013-03-05 20:37:49 +02001608 hci_req_add(req, HCI_OP_READ_INQ_RSP_TX_POWER, 0, NULL);
Johan Hedberg2177bab2013-03-05 20:37:43 +02001609
1610 if (lmp_ext_feat_capable(hdev)) {
1611 struct hci_cp_read_local_ext_features cp;
1612
1613 cp.page = 0x01;
Johan Hedberg42c6b122013-03-05 20:37:49 +02001614 hci_req_add(req, HCI_OP_READ_LOCAL_EXT_FEATURES,
1615 sizeof(cp), &cp);
Johan Hedberg2177bab2013-03-05 20:37:43 +02001616 }
1617
1618 if (test_bit(HCI_LINK_SECURITY, &hdev->dev_flags)) {
1619 u8 enable = 1;
Johan Hedberg42c6b122013-03-05 20:37:49 +02001620 hci_req_add(req, HCI_OP_WRITE_AUTH_ENABLE, sizeof(enable),
1621 &enable);
Johan Hedberg2177bab2013-03-05 20:37:43 +02001622 }
1623}
1624
Johan Hedberg42c6b122013-03-05 20:37:49 +02001625static void hci_setup_link_policy(struct hci_request *req)
Johan Hedberg2177bab2013-03-05 20:37:43 +02001626{
Johan Hedberg42c6b122013-03-05 20:37:49 +02001627 struct hci_dev *hdev = req->hdev;
Johan Hedberg2177bab2013-03-05 20:37:43 +02001628 struct hci_cp_write_def_link_policy cp;
1629 u16 link_policy = 0;
1630
1631 if (lmp_rswitch_capable(hdev))
1632 link_policy |= HCI_LP_RSWITCH;
1633 if (lmp_hold_capable(hdev))
1634 link_policy |= HCI_LP_HOLD;
1635 if (lmp_sniff_capable(hdev))
1636 link_policy |= HCI_LP_SNIFF;
1637 if (lmp_park_capable(hdev))
1638 link_policy |= HCI_LP_PARK;
1639
1640 cp.policy = cpu_to_le16(link_policy);
Johan Hedberg42c6b122013-03-05 20:37:49 +02001641 hci_req_add(req, HCI_OP_WRITE_DEF_LINK_POLICY, sizeof(cp), &cp);
Johan Hedberg2177bab2013-03-05 20:37:43 +02001642}
1643
Johan Hedberg42c6b122013-03-05 20:37:49 +02001644static void hci_set_le_support(struct hci_request *req)
Johan Hedberg2177bab2013-03-05 20:37:43 +02001645{
Johan Hedberg42c6b122013-03-05 20:37:49 +02001646 struct hci_dev *hdev = req->hdev;
Johan Hedberg2177bab2013-03-05 20:37:43 +02001647 struct hci_cp_write_le_host_supported cp;
1648
Johan Hedbergc73eee92013-04-19 18:35:21 +03001649 /* LE-only devices do not support explicit enablement */
1650 if (!lmp_bredr_capable(hdev))
1651 return;
1652
Johan Hedberg2177bab2013-03-05 20:37:43 +02001653 memset(&cp, 0, sizeof(cp));
1654
1655 if (test_bit(HCI_LE_ENABLED, &hdev->dev_flags)) {
1656 cp.le = 0x01;
1657 cp.simul = lmp_le_br_capable(hdev);
1658 }
1659
1660 if (cp.le != lmp_host_le_capable(hdev))
Johan Hedberg42c6b122013-03-05 20:37:49 +02001661 hci_req_add(req, HCI_OP_WRITE_LE_HOST_SUPPORTED, sizeof(cp),
1662 &cp);
Johan Hedberg2177bab2013-03-05 20:37:43 +02001663}
1664
Johan Hedbergd62e6d62013-09-13 11:40:02 +03001665static void hci_set_event_mask_page_2(struct hci_request *req)
1666{
1667 struct hci_dev *hdev = req->hdev;
1668 u8 events[8] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
1669
1670 /* If Connectionless Slave Broadcast master role is supported
1671 * enable all necessary events for it.
1672 */
Marcel Holtmann53b834d22013-12-08 11:55:33 -08001673 if (lmp_csb_master_capable(hdev)) {
Johan Hedbergd62e6d62013-09-13 11:40:02 +03001674 events[1] |= 0x40; /* Triggered Clock Capture */
1675 events[1] |= 0x80; /* Synchronization Train Complete */
1676 events[2] |= 0x10; /* Slave Page Response Timeout */
1677 events[2] |= 0x20; /* CSB Channel Map Change */
1678 }
1679
1680 /* If Connectionless Slave Broadcast slave role is supported
1681 * enable all necessary events for it.
1682 */
Marcel Holtmann53b834d22013-12-08 11:55:33 -08001683 if (lmp_csb_slave_capable(hdev)) {
Johan Hedbergd62e6d62013-09-13 11:40:02 +03001684 events[2] |= 0x01; /* Synchronization Train Received */
1685 events[2] |= 0x02; /* CSB Receive */
1686 events[2] |= 0x04; /* CSB Timeout */
1687 events[2] |= 0x08; /* Truncated Page Complete */
1688 }
1689
Marcel Holtmann40c59fc2014-01-10 02:07:21 -08001690 /* Enable Authenticated Payload Timeout Expired event if supported */
1691 if (lmp_ping_capable(hdev))
1692 events[2] |= 0x80;
1693
Johan Hedbergd62e6d62013-09-13 11:40:02 +03001694 hci_req_add(req, HCI_OP_SET_EVENT_MASK_PAGE_2, sizeof(events), events);
1695}
1696
Johan Hedberg42c6b122013-03-05 20:37:49 +02001697static void hci_init3_req(struct hci_request *req, unsigned long opt)
Johan Hedberg2177bab2013-03-05 20:37:43 +02001698{
Johan Hedberg42c6b122013-03-05 20:37:49 +02001699 struct hci_dev *hdev = req->hdev;
Johan Hedbergd2c5d772013-04-17 15:00:52 +03001700 u8 p;
Johan Hedberg42c6b122013-03-05 20:37:49 +02001701
Gustavo Padovanb8f4e062013-06-13 12:34:31 +01001702 /* Some Broadcom based Bluetooth controllers do not support the
1703 * Delete Stored Link Key command. They are clearly indicating its
1704 * absence in the bit mask of supported commands.
1705 *
1706 * Check the supported commands and only if the the command is marked
1707 * as supported send it. If not supported assume that the controller
1708 * does not have actual support for stored link keys which makes this
1709 * command redundant anyway.
Marcel Holtmannf9f462f2014-01-03 03:02:35 -08001710 *
1711 * Some controllers indicate that they support handling deleting
1712 * stored link keys, but they don't. The quirk lets a driver
1713 * just disable this command.
Marcel Holtmann637b4ca2013-07-01 14:14:46 -07001714 */
Marcel Holtmannf9f462f2014-01-03 03:02:35 -08001715 if (hdev->commands[6] & 0x80 &&
1716 !test_bit(HCI_QUIRK_BROKEN_STORED_LINK_KEY, &hdev->quirks)) {
Johan Hedberg59f45d52013-06-13 11:01:13 +03001717 struct hci_cp_delete_stored_link_key cp;
1718
1719 bacpy(&cp.bdaddr, BDADDR_ANY);
1720 cp.delete_all = 0x01;
1721 hci_req_add(req, HCI_OP_DELETE_STORED_LINK_KEY,
1722 sizeof(cp), &cp);
1723 }
1724
Johan Hedberg2177bab2013-03-05 20:37:43 +02001725 if (hdev->commands[5] & 0x10)
Johan Hedberg42c6b122013-03-05 20:37:49 +02001726 hci_setup_link_policy(req);
Johan Hedberg2177bab2013-03-05 20:37:43 +02001727
Johan Hedberg7bf32042014-02-23 19:42:29 +02001728 if (lmp_le_capable(hdev))
Johan Hedberg42c6b122013-03-05 20:37:49 +02001729 hci_set_le_support(req);
Johan Hedbergd2c5d772013-04-17 15:00:52 +03001730
1731 /* Read features beyond page 1 if available */
1732 for (p = 2; p < HCI_MAX_PAGES && p <= hdev->max_page; p++) {
1733 struct hci_cp_read_local_ext_features cp;
1734
1735 cp.page = p;
1736 hci_req_add(req, HCI_OP_READ_LOCAL_EXT_FEATURES,
1737 sizeof(cp), &cp);
1738 }
Johan Hedberg2177bab2013-03-05 20:37:43 +02001739}
1740
Johan Hedberg5d4e7e82013-09-13 11:40:01 +03001741static void hci_init4_req(struct hci_request *req, unsigned long opt)
1742{
1743 struct hci_dev *hdev = req->hdev;
1744
Johan Hedbergd62e6d62013-09-13 11:40:02 +03001745 /* Set event mask page 2 if the HCI command for it is supported */
1746 if (hdev->commands[22] & 0x04)
1747 hci_set_event_mask_page_2(req);
1748
Johan Hedberg5d4e7e82013-09-13 11:40:01 +03001749 /* Check for Synchronization Train support */
Marcel Holtmann53b834d22013-12-08 11:55:33 -08001750 if (lmp_sync_train_capable(hdev))
Johan Hedberg5d4e7e82013-09-13 11:40:01 +03001751 hci_req_add(req, HCI_OP_READ_SYNC_TRAIN_PARAMS, 0, NULL);
Marcel Holtmanna6d0d692014-01-10 02:07:24 -08001752
1753 /* Enable Secure Connections if supported and configured */
Marcel Holtmann5afeac142014-01-10 02:07:27 -08001754 if ((lmp_sc_capable(hdev) ||
1755 test_bit(HCI_FORCE_SC, &hdev->dev_flags)) &&
Marcel Holtmanna6d0d692014-01-10 02:07:24 -08001756 test_bit(HCI_SC_ENABLED, &hdev->dev_flags)) {
1757 u8 support = 0x01;
1758 hci_req_add(req, HCI_OP_WRITE_SC_SUPPORT,
1759 sizeof(support), &support);
1760 }
Johan Hedberg5d4e7e82013-09-13 11:40:01 +03001761}
1762
Johan Hedberg2177bab2013-03-05 20:37:43 +02001763static int __hci_init(struct hci_dev *hdev)
1764{
1765 int err;
1766
1767 err = __hci_req_sync(hdev, hci_init1_req, 0, HCI_INIT_TIMEOUT);
1768 if (err < 0)
1769 return err;
1770
Marcel Holtmann4b4148e2013-10-19 07:09:12 -07001771 /* The Device Under Test (DUT) mode is special and available for
1772 * all controller types. So just create it early on.
1773 */
1774 if (test_bit(HCI_SETUP, &hdev->dev_flags)) {
1775 debugfs_create_file("dut_mode", 0644, hdev->debugfs, hdev,
1776 &dut_mode_fops);
1777 }
1778
Johan Hedberg2177bab2013-03-05 20:37:43 +02001779 /* HCI_BREDR covers both single-mode LE, BR/EDR and dual-mode
1780 * BR/EDR/LE type controllers. AMP controllers only need the
1781 * first stage init.
1782 */
1783 if (hdev->dev_type != HCI_BREDR)
1784 return 0;
1785
1786 err = __hci_req_sync(hdev, hci_init2_req, 0, HCI_INIT_TIMEOUT);
1787 if (err < 0)
1788 return err;
1789
Johan Hedberg5d4e7e82013-09-13 11:40:01 +03001790 err = __hci_req_sync(hdev, hci_init3_req, 0, HCI_INIT_TIMEOUT);
1791 if (err < 0)
1792 return err;
1793
Marcel Holtmannbaf27f62013-10-16 03:28:55 -07001794 err = __hci_req_sync(hdev, hci_init4_req, 0, HCI_INIT_TIMEOUT);
1795 if (err < 0)
1796 return err;
1797
1798 /* Only create debugfs entries during the initial setup
1799 * phase and not every time the controller gets powered on.
1800 */
1801 if (!test_bit(HCI_SETUP, &hdev->dev_flags))
1802 return 0;
1803
Marcel Holtmanndfb826a2013-10-18 12:04:46 -07001804 debugfs_create_file("features", 0444, hdev->debugfs, hdev,
1805 &features_fops);
Marcel Holtmannceeb3bc2013-10-18 12:04:49 -07001806 debugfs_create_u16("manufacturer", 0444, hdev->debugfs,
1807 &hdev->manufacturer);
1808 debugfs_create_u8("hci_version", 0444, hdev->debugfs, &hdev->hci_ver);
1809 debugfs_create_u16("hci_revision", 0444, hdev->debugfs, &hdev->hci_rev);
Marcel Holtmann70afe0b2013-10-17 17:24:14 -07001810 debugfs_create_file("blacklist", 0444, hdev->debugfs, hdev,
1811 &blacklist_fops);
Marcel Holtmann47219832013-10-17 17:24:15 -07001812 debugfs_create_file("uuids", 0444, hdev->debugfs, hdev, &uuids_fops);
1813
Andrzej Kaczmarek31ad1692014-05-14 13:43:02 +02001814 debugfs_create_file("conn_info_min_age", 0644, hdev->debugfs, hdev,
1815 &conn_info_min_age_fops);
1816 debugfs_create_file("conn_info_max_age", 0644, hdev->debugfs, hdev,
1817 &conn_info_max_age_fops);
1818
Marcel Holtmannbaf27f62013-10-16 03:28:55 -07001819 if (lmp_bredr_capable(hdev)) {
1820 debugfs_create_file("inquiry_cache", 0444, hdev->debugfs,
1821 hdev, &inquiry_cache_fops);
Marcel Holtmann02d08d12013-10-18 12:04:52 -07001822 debugfs_create_file("link_keys", 0400, hdev->debugfs,
1823 hdev, &link_keys_fops);
Marcel Holtmannbabdbb32013-10-18 12:04:51 -07001824 debugfs_create_file("dev_class", 0444, hdev->debugfs,
1825 hdev, &dev_class_fops);
Marcel Holtmann041000b2013-10-17 12:02:31 -07001826 debugfs_create_file("voice_setting", 0444, hdev->debugfs,
1827 hdev, &voice_setting_fops);
Marcel Holtmannbaf27f62013-10-16 03:28:55 -07001828 }
1829
Marcel Holtmann06f5b772013-10-19 07:09:11 -07001830 if (lmp_ssp_capable(hdev)) {
Marcel Holtmannebd1e332013-10-17 10:54:46 -07001831 debugfs_create_file("auto_accept_delay", 0644, hdev->debugfs,
1832 hdev, &auto_accept_delay_fops);
Marcel Holtmann06f5b772013-10-19 07:09:11 -07001833 debugfs_create_file("ssp_debug_mode", 0644, hdev->debugfs,
1834 hdev, &ssp_debug_mode_fops);
Marcel Holtmann5afeac142014-01-10 02:07:27 -08001835 debugfs_create_file("force_sc_support", 0644, hdev->debugfs,
1836 hdev, &force_sc_support_fops);
Marcel Holtmann134c2a82014-01-15 22:37:42 -08001837 debugfs_create_file("sc_only_mode", 0444, hdev->debugfs,
1838 hdev, &sc_only_mode_fops);
Marcel Holtmann06f5b772013-10-19 07:09:11 -07001839 }
Marcel Holtmannebd1e332013-10-17 10:54:46 -07001840
Marcel Holtmann2bfa3532013-10-17 19:16:02 -07001841 if (lmp_sniff_capable(hdev)) {
1842 debugfs_create_file("idle_timeout", 0644, hdev->debugfs,
1843 hdev, &idle_timeout_fops);
1844 debugfs_create_file("sniff_min_interval", 0644, hdev->debugfs,
1845 hdev, &sniff_min_interval_fops);
1846 debugfs_create_file("sniff_max_interval", 0644, hdev->debugfs,
1847 hdev, &sniff_max_interval_fops);
1848 }
1849
Marcel Holtmannd0f729b2013-10-18 15:23:46 -07001850 if (lmp_le_capable(hdev)) {
Marcel Holtmannac345812014-02-23 12:44:25 -08001851 debugfs_create_file("identity", 0400, hdev->debugfs,
1852 hdev, &identity_fops);
1853 debugfs_create_file("rpa_timeout", 0644, hdev->debugfs,
1854 hdev, &rpa_timeout_fops);
Marcel Holtmann7a4cd512014-02-19 19:52:13 -08001855 debugfs_create_file("random_address", 0444, hdev->debugfs,
1856 hdev, &random_address_fops);
Marcel Holtmannb32bba62014-02-19 19:31:26 -08001857 debugfs_create_file("static_address", 0444, hdev->debugfs,
1858 hdev, &static_address_fops);
1859
1860 /* For controllers with a public address, provide a debug
1861 * option to force the usage of the configured static
1862 * address. By default the public address is used.
1863 */
1864 if (bacmp(&hdev->bdaddr, BDADDR_ANY))
1865 debugfs_create_file("force_static_address", 0644,
1866 hdev->debugfs, hdev,
1867 &force_static_address_fops);
1868
Marcel Holtmannd0f729b2013-10-18 15:23:46 -07001869 debugfs_create_u8("white_list_size", 0444, hdev->debugfs,
1870 &hdev->le_white_list_size);
Marcel Holtmannd2ab0ac2014-02-27 20:37:30 -08001871 debugfs_create_file("white_list", 0444, hdev->debugfs, hdev,
1872 &white_list_fops);
Marcel Holtmann3698d702014-02-18 21:54:49 -08001873 debugfs_create_file("identity_resolving_keys", 0400,
1874 hdev->debugfs, hdev,
1875 &identity_resolving_keys_fops);
Marcel Holtmann8f8625c2013-10-18 15:56:57 -07001876 debugfs_create_file("long_term_keys", 0400, hdev->debugfs,
1877 hdev, &long_term_keys_fops);
Marcel Holtmann4e70c7e2013-10-19 07:09:13 -07001878 debugfs_create_file("conn_min_interval", 0644, hdev->debugfs,
1879 hdev, &conn_min_interval_fops);
1880 debugfs_create_file("conn_max_interval", 0644, hdev->debugfs,
1881 hdev, &conn_max_interval_fops);
Marcel Holtmann3f959d42014-02-20 11:55:56 -08001882 debugfs_create_file("adv_channel_map", 0644, hdev->debugfs,
1883 hdev, &adv_channel_map_fops);
Jukka Rissanen89863102013-12-11 17:05:38 +02001884 debugfs_create_file("6lowpan", 0644, hdev->debugfs, hdev,
1885 &lowpan_debugfs_fops);
Andre Guedes7d474e02014-02-26 20:21:54 -03001886 debugfs_create_file("le_auto_conn", 0644, hdev->debugfs, hdev,
1887 &le_auto_conn_fops);
Lukasz Rymanowskib9a7a612014-03-27 20:55:20 +01001888 debugfs_create_u16("discov_interleaved_timeout", 0644,
1889 hdev->debugfs,
1890 &hdev->discov_interleaved_timeout);
Marcel Holtmannd0f729b2013-10-18 15:23:46 -07001891 }
Marcel Holtmanne7b8fc92013-10-17 11:45:09 -07001892
Marcel Holtmannbaf27f62013-10-16 03:28:55 -07001893 return 0;
Johan Hedberg2177bab2013-03-05 20:37:43 +02001894}
1895
Johan Hedberg42c6b122013-03-05 20:37:49 +02001896static void hci_scan_req(struct hci_request *req, unsigned long opt)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001897{
1898 __u8 scan = opt;
1899
Johan Hedberg42c6b122013-03-05 20:37:49 +02001900 BT_DBG("%s %x", req->hdev->name, scan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001901
1902 /* Inquiry and Page scans */
Johan Hedberg42c6b122013-03-05 20:37:49 +02001903 hci_req_add(req, HCI_OP_WRITE_SCAN_ENABLE, 1, &scan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001904}
1905
Johan Hedberg42c6b122013-03-05 20:37:49 +02001906static void hci_auth_req(struct hci_request *req, unsigned long opt)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001907{
1908 __u8 auth = opt;
1909
Johan Hedberg42c6b122013-03-05 20:37:49 +02001910 BT_DBG("%s %x", req->hdev->name, auth);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001911
1912 /* Authentication */
Johan Hedberg42c6b122013-03-05 20:37:49 +02001913 hci_req_add(req, HCI_OP_WRITE_AUTH_ENABLE, 1, &auth);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001914}
1915
Johan Hedberg42c6b122013-03-05 20:37:49 +02001916static void hci_encrypt_req(struct hci_request *req, unsigned long opt)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001917{
1918 __u8 encrypt = opt;
1919
Johan Hedberg42c6b122013-03-05 20:37:49 +02001920 BT_DBG("%s %x", req->hdev->name, encrypt);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001921
Marcel Holtmanne4e8e372008-07-14 20:13:47 +02001922 /* Encryption */
Johan Hedberg42c6b122013-03-05 20:37:49 +02001923 hci_req_add(req, HCI_OP_WRITE_ENCRYPT_MODE, 1, &encrypt);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001924}
1925
Johan Hedberg42c6b122013-03-05 20:37:49 +02001926static void hci_linkpol_req(struct hci_request *req, unsigned long opt)
Marcel Holtmanne4e8e372008-07-14 20:13:47 +02001927{
1928 __le16 policy = cpu_to_le16(opt);
1929
Johan Hedberg42c6b122013-03-05 20:37:49 +02001930 BT_DBG("%s %x", req->hdev->name, policy);
Marcel Holtmanne4e8e372008-07-14 20:13:47 +02001931
1932 /* Default link policy */
Johan Hedberg42c6b122013-03-05 20:37:49 +02001933 hci_req_add(req, HCI_OP_WRITE_DEF_LINK_POLICY, 2, &policy);
Marcel Holtmanne4e8e372008-07-14 20:13:47 +02001934}
1935
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09001936/* Get HCI device by index.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001937 * Device is held on return. */
1938struct hci_dev *hci_dev_get(int index)
1939{
Luiz Augusto von Dentz8035ded2011-11-01 10:58:56 +02001940 struct hci_dev *hdev = NULL, *d;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001941
1942 BT_DBG("%d", index);
1943
1944 if (index < 0)
1945 return NULL;
1946
1947 read_lock(&hci_dev_list_lock);
Luiz Augusto von Dentz8035ded2011-11-01 10:58:56 +02001948 list_for_each_entry(d, &hci_dev_list, list) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001949 if (d->id == index) {
1950 hdev = hci_dev_hold(d);
1951 break;
1952 }
1953 }
1954 read_unlock(&hci_dev_list_lock);
1955 return hdev;
1956}
Linus Torvalds1da177e2005-04-16 15:20:36 -07001957
1958/* ---- Inquiry support ---- */
Johan Hedbergff9ef572012-01-04 14:23:45 +02001959
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001960bool hci_discovery_active(struct hci_dev *hdev)
1961{
1962 struct discovery_state *discov = &hdev->discovery;
1963
Andre Guedes6fbe1952012-02-03 17:47:58 -03001964 switch (discov->state) {
Andre Guedes343f9352012-02-17 20:39:37 -03001965 case DISCOVERY_FINDING:
Andre Guedes6fbe1952012-02-03 17:47:58 -03001966 case DISCOVERY_RESOLVING:
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001967 return true;
1968
Andre Guedes6fbe1952012-02-03 17:47:58 -03001969 default:
1970 return false;
1971 }
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001972}
1973
Johan Hedbergff9ef572012-01-04 14:23:45 +02001974void hci_discovery_set_state(struct hci_dev *hdev, int state)
1975{
1976 BT_DBG("%s state %u -> %u", hdev->name, hdev->discovery.state, state);
1977
1978 if (hdev->discovery.state == state)
1979 return;
1980
1981 switch (state) {
1982 case DISCOVERY_STOPPED:
Andre Guedesc54c3862014-02-26 20:21:50 -03001983 hci_update_background_scan(hdev);
1984
Andre Guedes7b99b652012-02-13 15:41:02 -03001985 if (hdev->discovery.state != DISCOVERY_STARTING)
1986 mgmt_discovering(hdev, 0);
Johan Hedbergff9ef572012-01-04 14:23:45 +02001987 break;
1988 case DISCOVERY_STARTING:
1989 break;
Andre Guedes343f9352012-02-17 20:39:37 -03001990 case DISCOVERY_FINDING:
Johan Hedbergff9ef572012-01-04 14:23:45 +02001991 mgmt_discovering(hdev, 1);
1992 break;
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001993 case DISCOVERY_RESOLVING:
1994 break;
Johan Hedbergff9ef572012-01-04 14:23:45 +02001995 case DISCOVERY_STOPPING:
1996 break;
1997 }
1998
1999 hdev->discovery.state = state;
2000}
2001
Andre Guedes1f9b9a52013-04-30 15:29:27 -03002002void hci_inquiry_cache_flush(struct hci_dev *hdev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002003{
Johan Hedberg30883512012-01-04 14:16:21 +02002004 struct discovery_state *cache = &hdev->discovery;
Johan Hedbergb57c1a52012-01-03 16:03:00 +02002005 struct inquiry_entry *p, *n;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002006
Johan Hedberg561aafb2012-01-04 13:31:59 +02002007 list_for_each_entry_safe(p, n, &cache->all, all) {
2008 list_del(&p->all);
Johan Hedbergb57c1a52012-01-03 16:03:00 +02002009 kfree(p);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002010 }
Johan Hedberg561aafb2012-01-04 13:31:59 +02002011
2012 INIT_LIST_HEAD(&cache->unknown);
2013 INIT_LIST_HEAD(&cache->resolve);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002014}
2015
Gustavo Padovana8c5fb12012-05-17 00:36:26 -03002016struct inquiry_entry *hci_inquiry_cache_lookup(struct hci_dev *hdev,
2017 bdaddr_t *bdaddr)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002018{
Johan Hedberg30883512012-01-04 14:16:21 +02002019 struct discovery_state *cache = &hdev->discovery;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002020 struct inquiry_entry *e;
2021
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03002022 BT_DBG("cache %p, %pMR", cache, bdaddr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002023
Johan Hedberg561aafb2012-01-04 13:31:59 +02002024 list_for_each_entry(e, &cache->all, all) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002025 if (!bacmp(&e->data.bdaddr, bdaddr))
Johan Hedbergb57c1a52012-01-03 16:03:00 +02002026 return e;
2027 }
2028
2029 return NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002030}
2031
Johan Hedberg561aafb2012-01-04 13:31:59 +02002032struct inquiry_entry *hci_inquiry_cache_lookup_unknown(struct hci_dev *hdev,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002033 bdaddr_t *bdaddr)
Johan Hedberg561aafb2012-01-04 13:31:59 +02002034{
Johan Hedberg30883512012-01-04 14:16:21 +02002035 struct discovery_state *cache = &hdev->discovery;
Johan Hedberg561aafb2012-01-04 13:31:59 +02002036 struct inquiry_entry *e;
2037
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03002038 BT_DBG("cache %p, %pMR", cache, bdaddr);
Johan Hedberg561aafb2012-01-04 13:31:59 +02002039
2040 list_for_each_entry(e, &cache->unknown, list) {
2041 if (!bacmp(&e->data.bdaddr, bdaddr))
2042 return e;
2043 }
2044
2045 return NULL;
2046}
2047
Johan Hedberg30dc78e2012-01-04 15:44:20 +02002048struct inquiry_entry *hci_inquiry_cache_lookup_resolve(struct hci_dev *hdev,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002049 bdaddr_t *bdaddr,
2050 int state)
Johan Hedberg30dc78e2012-01-04 15:44:20 +02002051{
2052 struct discovery_state *cache = &hdev->discovery;
2053 struct inquiry_entry *e;
2054
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03002055 BT_DBG("cache %p bdaddr %pMR state %d", cache, bdaddr, state);
Johan Hedberg30dc78e2012-01-04 15:44:20 +02002056
2057 list_for_each_entry(e, &cache->resolve, list) {
2058 if (!bacmp(bdaddr, BDADDR_ANY) && e->name_state == state)
2059 return e;
2060 if (!bacmp(&e->data.bdaddr, bdaddr))
2061 return e;
2062 }
2063
2064 return NULL;
2065}
2066
Johan Hedberga3d4e202012-01-09 00:53:02 +02002067void hci_inquiry_cache_update_resolve(struct hci_dev *hdev,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002068 struct inquiry_entry *ie)
Johan Hedberga3d4e202012-01-09 00:53:02 +02002069{
2070 struct discovery_state *cache = &hdev->discovery;
2071 struct list_head *pos = &cache->resolve;
2072 struct inquiry_entry *p;
2073
2074 list_del(&ie->list);
2075
2076 list_for_each_entry(p, &cache->resolve, list) {
2077 if (p->name_state != NAME_PENDING &&
Gustavo Padovana8c5fb12012-05-17 00:36:26 -03002078 abs(p->data.rssi) >= abs(ie->data.rssi))
Johan Hedberga3d4e202012-01-09 00:53:02 +02002079 break;
2080 pos = &p->list;
2081 }
2082
2083 list_add(&ie->list, pos);
2084}
2085
Johan Hedberg31754052012-01-04 13:39:52 +02002086bool hci_inquiry_cache_update(struct hci_dev *hdev, struct inquiry_data *data,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002087 bool name_known, bool *ssp)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002088{
Johan Hedberg30883512012-01-04 14:16:21 +02002089 struct discovery_state *cache = &hdev->discovery;
Andrei Emeltchenko70f230202010-12-01 16:58:25 +02002090 struct inquiry_entry *ie;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002091
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03002092 BT_DBG("cache %p, %pMR", cache, &data->bdaddr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002093
Szymon Janc2b2fec42012-11-20 11:38:54 +01002094 hci_remove_remote_oob_data(hdev, &data->bdaddr);
2095
Johan Hedberg01735bb2014-03-25 12:06:18 +02002096 *ssp = data->ssp_mode;
Johan Hedberg388fc8f2012-02-23 00:38:59 +02002097
Andrei Emeltchenko70f230202010-12-01 16:58:25 +02002098 ie = hci_inquiry_cache_lookup(hdev, &data->bdaddr);
Johan Hedberga3d4e202012-01-09 00:53:02 +02002099 if (ie) {
Johan Hedberg8002d772014-03-27 13:51:24 +02002100 if (ie->data.ssp_mode)
Johan Hedberg388fc8f2012-02-23 00:38:59 +02002101 *ssp = true;
2102
Johan Hedberga3d4e202012-01-09 00:53:02 +02002103 if (ie->name_state == NAME_NEEDED &&
Gustavo Padovana8c5fb12012-05-17 00:36:26 -03002104 data->rssi != ie->data.rssi) {
Johan Hedberga3d4e202012-01-09 00:53:02 +02002105 ie->data.rssi = data->rssi;
2106 hci_inquiry_cache_update_resolve(hdev, ie);
2107 }
2108
Johan Hedberg561aafb2012-01-04 13:31:59 +02002109 goto update;
Johan Hedberga3d4e202012-01-09 00:53:02 +02002110 }
Andrei Emeltchenko70f230202010-12-01 16:58:25 +02002111
Johan Hedberg561aafb2012-01-04 13:31:59 +02002112 /* Entry not in the cache. Add new one. */
2113 ie = kzalloc(sizeof(struct inquiry_entry), GFP_ATOMIC);
2114 if (!ie)
Johan Hedberg31754052012-01-04 13:39:52 +02002115 return false;
Johan Hedberg561aafb2012-01-04 13:31:59 +02002116
2117 list_add(&ie->all, &cache->all);
2118
2119 if (name_known) {
2120 ie->name_state = NAME_KNOWN;
2121 } else {
2122 ie->name_state = NAME_NOT_KNOWN;
2123 list_add(&ie->list, &cache->unknown);
2124 }
2125
2126update:
2127 if (name_known && ie->name_state != NAME_KNOWN &&
Gustavo Padovana8c5fb12012-05-17 00:36:26 -03002128 ie->name_state != NAME_PENDING) {
Johan Hedberg561aafb2012-01-04 13:31:59 +02002129 ie->name_state = NAME_KNOWN;
2130 list_del(&ie->list);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002131 }
2132
Andrei Emeltchenko70f230202010-12-01 16:58:25 +02002133 memcpy(&ie->data, data, sizeof(*data));
2134 ie->timestamp = jiffies;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002135 cache->timestamp = jiffies;
Johan Hedberg31754052012-01-04 13:39:52 +02002136
2137 if (ie->name_state == NAME_NOT_KNOWN)
2138 return false;
2139
2140 return true;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002141}
2142
2143static int inquiry_cache_dump(struct hci_dev *hdev, int num, __u8 *buf)
2144{
Johan Hedberg30883512012-01-04 14:16:21 +02002145 struct discovery_state *cache = &hdev->discovery;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002146 struct inquiry_info *info = (struct inquiry_info *) buf;
2147 struct inquiry_entry *e;
2148 int copied = 0;
2149
Johan Hedberg561aafb2012-01-04 13:31:59 +02002150 list_for_each_entry(e, &cache->all, all) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002151 struct inquiry_data *data = &e->data;
Johan Hedbergb57c1a52012-01-03 16:03:00 +02002152
2153 if (copied >= num)
2154 break;
2155
Linus Torvalds1da177e2005-04-16 15:20:36 -07002156 bacpy(&info->bdaddr, &data->bdaddr);
2157 info->pscan_rep_mode = data->pscan_rep_mode;
2158 info->pscan_period_mode = data->pscan_period_mode;
2159 info->pscan_mode = data->pscan_mode;
2160 memcpy(info->dev_class, data->dev_class, 3);
2161 info->clock_offset = data->clock_offset;
Johan Hedbergb57c1a52012-01-03 16:03:00 +02002162
Linus Torvalds1da177e2005-04-16 15:20:36 -07002163 info++;
Johan Hedbergb57c1a52012-01-03 16:03:00 +02002164 copied++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002165 }
2166
2167 BT_DBG("cache %p, copied %d", cache, copied);
2168 return copied;
2169}
2170
Johan Hedberg42c6b122013-03-05 20:37:49 +02002171static void hci_inq_req(struct hci_request *req, unsigned long opt)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002172{
2173 struct hci_inquiry_req *ir = (struct hci_inquiry_req *) opt;
Johan Hedberg42c6b122013-03-05 20:37:49 +02002174 struct hci_dev *hdev = req->hdev;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002175 struct hci_cp_inquiry cp;
2176
2177 BT_DBG("%s", hdev->name);
2178
2179 if (test_bit(HCI_INQUIRY, &hdev->flags))
2180 return;
2181
2182 /* Start Inquiry */
2183 memcpy(&cp.lap, &ir->lap, 3);
2184 cp.length = ir->length;
2185 cp.num_rsp = ir->num_rsp;
Johan Hedberg42c6b122013-03-05 20:37:49 +02002186 hci_req_add(req, HCI_OP_INQUIRY, sizeof(cp), &cp);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002187}
2188
Andre Guedes3e13fa12013-03-27 20:04:56 -03002189static int wait_inquiry(void *word)
2190{
2191 schedule();
2192 return signal_pending(current);
2193}
2194
Linus Torvalds1da177e2005-04-16 15:20:36 -07002195int hci_inquiry(void __user *arg)
2196{
2197 __u8 __user *ptr = arg;
2198 struct hci_inquiry_req ir;
2199 struct hci_dev *hdev;
2200 int err = 0, do_inquiry = 0, max_rsp;
2201 long timeo;
2202 __u8 *buf;
2203
2204 if (copy_from_user(&ir, ptr, sizeof(ir)))
2205 return -EFAULT;
2206
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02002207 hdev = hci_dev_get(ir.dev_id);
2208 if (!hdev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002209 return -ENODEV;
2210
Marcel Holtmann0736cfa2013-08-26 21:40:51 -07002211 if (test_bit(HCI_USER_CHANNEL, &hdev->dev_flags)) {
2212 err = -EBUSY;
2213 goto done;
2214 }
2215
Marcel Holtmann5b69bef52013-10-10 10:02:08 -07002216 if (hdev->dev_type != HCI_BREDR) {
2217 err = -EOPNOTSUPP;
2218 goto done;
2219 }
2220
Johan Hedberg56f87902013-10-02 13:43:13 +03002221 if (!test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags)) {
2222 err = -EOPNOTSUPP;
2223 goto done;
2224 }
2225
Gustavo F. Padovan09fd0de2011-06-17 13:03:21 -03002226 hci_dev_lock(hdev);
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09002227 if (inquiry_cache_age(hdev) > INQUIRY_CACHE_AGE_MAX ||
Gustavo Padovana8c5fb12012-05-17 00:36:26 -03002228 inquiry_cache_empty(hdev) || ir.flags & IREQ_CACHE_FLUSH) {
Andre Guedes1f9b9a52013-04-30 15:29:27 -03002229 hci_inquiry_cache_flush(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002230 do_inquiry = 1;
2231 }
Gustavo F. Padovan09fd0de2011-06-17 13:03:21 -03002232 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002233
Marcel Holtmann04837f62006-07-03 10:02:33 +02002234 timeo = ir.length * msecs_to_jiffies(2000);
Andrei Emeltchenko70f230202010-12-01 16:58:25 +02002235
2236 if (do_inquiry) {
Johan Hedberg01178cd2013-03-05 20:37:41 +02002237 err = hci_req_sync(hdev, hci_inq_req, (unsigned long) &ir,
2238 timeo);
Andrei Emeltchenko70f230202010-12-01 16:58:25 +02002239 if (err < 0)
2240 goto done;
Andre Guedes3e13fa12013-03-27 20:04:56 -03002241
2242 /* Wait until Inquiry procedure finishes (HCI_INQUIRY flag is
2243 * cleared). If it is interrupted by a signal, return -EINTR.
2244 */
2245 if (wait_on_bit(&hdev->flags, HCI_INQUIRY, wait_inquiry,
2246 TASK_INTERRUPTIBLE))
2247 return -EINTR;
Andrei Emeltchenko70f230202010-12-01 16:58:25 +02002248 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002249
Gustavo Padovan8fc9ced2012-05-23 04:04:21 -03002250 /* for unlimited number of responses we will use buffer with
2251 * 255 entries
2252 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002253 max_rsp = (ir.num_rsp == 0) ? 255 : ir.num_rsp;
2254
2255 /* cache_dump can't sleep. Therefore we allocate temp buffer and then
2256 * copy it to the user space.
2257 */
Szymon Janc01df8c32011-02-17 16:46:47 +01002258 buf = kmalloc(sizeof(struct inquiry_info) * max_rsp, GFP_KERNEL);
Andrei Emeltchenko70f230202010-12-01 16:58:25 +02002259 if (!buf) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002260 err = -ENOMEM;
2261 goto done;
2262 }
2263
Gustavo F. Padovan09fd0de2011-06-17 13:03:21 -03002264 hci_dev_lock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002265 ir.num_rsp = inquiry_cache_dump(hdev, max_rsp, buf);
Gustavo F. Padovan09fd0de2011-06-17 13:03:21 -03002266 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002267
2268 BT_DBG("num_rsp %d", ir.num_rsp);
2269
2270 if (!copy_to_user(ptr, &ir, sizeof(ir))) {
2271 ptr += sizeof(ir);
2272 if (copy_to_user(ptr, buf, sizeof(struct inquiry_info) *
Gustavo Padovana8c5fb12012-05-17 00:36:26 -03002273 ir.num_rsp))
Linus Torvalds1da177e2005-04-16 15:20:36 -07002274 err = -EFAULT;
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09002275 } else
Linus Torvalds1da177e2005-04-16 15:20:36 -07002276 err = -EFAULT;
2277
2278 kfree(buf);
2279
2280done:
2281 hci_dev_put(hdev);
2282 return err;
2283}
2284
Johan Hedbergcbed0ca2013-10-01 22:44:49 +03002285static int hci_dev_do_open(struct hci_dev *hdev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002286{
Linus Torvalds1da177e2005-04-16 15:20:36 -07002287 int ret = 0;
2288
Linus Torvalds1da177e2005-04-16 15:20:36 -07002289 BT_DBG("%s %p", hdev->name, hdev);
2290
2291 hci_req_lock(hdev);
2292
Johan Hovold94324962012-03-15 14:48:41 +01002293 if (test_bit(HCI_UNREGISTER, &hdev->dev_flags)) {
2294 ret = -ENODEV;
2295 goto done;
2296 }
2297
Marcel Holtmanna5c8f272013-10-06 01:08:57 -07002298 if (!test_bit(HCI_SETUP, &hdev->dev_flags)) {
2299 /* Check for rfkill but allow the HCI setup stage to
2300 * proceed (which in itself doesn't cause any RF activity).
2301 */
2302 if (test_bit(HCI_RFKILLED, &hdev->dev_flags)) {
2303 ret = -ERFKILL;
2304 goto done;
2305 }
2306
2307 /* Check for valid public address or a configured static
2308 * random adddress, but let the HCI setup proceed to
2309 * be able to determine if there is a public address
2310 * or not.
2311 *
Marcel Holtmannc6beca02014-02-17 09:21:19 -08002312 * In case of user channel usage, it is not important
2313 * if a public address or static random address is
2314 * available.
2315 *
Marcel Holtmanna5c8f272013-10-06 01:08:57 -07002316 * This check is only valid for BR/EDR controllers
2317 * since AMP controllers do not have an address.
2318 */
Marcel Holtmannc6beca02014-02-17 09:21:19 -08002319 if (!test_bit(HCI_USER_CHANNEL, &hdev->dev_flags) &&
2320 hdev->dev_type == HCI_BREDR &&
Marcel Holtmanna5c8f272013-10-06 01:08:57 -07002321 !bacmp(&hdev->bdaddr, BDADDR_ANY) &&
2322 !bacmp(&hdev->static_addr, BDADDR_ANY)) {
2323 ret = -EADDRNOTAVAIL;
2324 goto done;
2325 }
Marcel Holtmann611b30f2009-06-08 14:41:38 +02002326 }
2327
Linus Torvalds1da177e2005-04-16 15:20:36 -07002328 if (test_bit(HCI_UP, &hdev->flags)) {
2329 ret = -EALREADY;
2330 goto done;
2331 }
2332
Linus Torvalds1da177e2005-04-16 15:20:36 -07002333 if (hdev->open(hdev)) {
2334 ret = -EIO;
2335 goto done;
2336 }
2337
Marcel Holtmannf41c70c2012-11-12 14:02:14 +09002338 atomic_set(&hdev->cmd_cnt, 1);
2339 set_bit(HCI_INIT, &hdev->flags);
2340
2341 if (hdev->setup && test_bit(HCI_SETUP, &hdev->dev_flags))
2342 ret = hdev->setup(hdev);
2343
2344 if (!ret) {
Marcel Holtmannf41c70c2012-11-12 14:02:14 +09002345 if (test_bit(HCI_QUIRK_RAW_DEVICE, &hdev->quirks))
2346 set_bit(HCI_RAW, &hdev->flags);
2347
Marcel Holtmann0736cfa2013-08-26 21:40:51 -07002348 if (!test_bit(HCI_RAW, &hdev->flags) &&
2349 !test_bit(HCI_USER_CHANNEL, &hdev->dev_flags))
Marcel Holtmannf41c70c2012-11-12 14:02:14 +09002350 ret = __hci_init(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002351 }
2352
Marcel Holtmannf41c70c2012-11-12 14:02:14 +09002353 clear_bit(HCI_INIT, &hdev->flags);
2354
Linus Torvalds1da177e2005-04-16 15:20:36 -07002355 if (!ret) {
2356 hci_dev_hold(hdev);
Johan Hedbergd6bfd592014-02-23 19:42:20 +02002357 set_bit(HCI_RPA_EXPIRED, &hdev->dev_flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002358 set_bit(HCI_UP, &hdev->flags);
2359 hci_notify(hdev, HCI_DEV_UP);
Andrei Emeltchenkobb4b2a92012-07-19 17:03:40 +03002360 if (!test_bit(HCI_SETUP, &hdev->dev_flags) &&
Marcel Holtmann0736cfa2013-08-26 21:40:51 -07002361 !test_bit(HCI_USER_CHANNEL, &hdev->dev_flags) &&
Marcel Holtmann1514b892013-10-06 08:25:01 -07002362 hdev->dev_type == HCI_BREDR) {
Gustavo F. Padovan09fd0de2011-06-17 13:03:21 -03002363 hci_dev_lock(hdev);
Johan Hedberg744cf192011-11-08 20:40:14 +02002364 mgmt_powered(hdev, 1);
Gustavo F. Padovan09fd0de2011-06-17 13:03:21 -03002365 hci_dev_unlock(hdev);
Johan Hedberg56e5cb82011-11-08 20:40:16 +02002366 }
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09002367 } else {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002368 /* Init failed, cleanup */
Gustavo F. Padovan3eff45e2011-12-15 00:50:02 -02002369 flush_work(&hdev->tx_work);
Gustavo F. Padovanc347b762011-12-14 23:53:47 -02002370 flush_work(&hdev->cmd_work);
Marcel Holtmannb78752c2010-08-08 23:06:53 -04002371 flush_work(&hdev->rx_work);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002372
2373 skb_queue_purge(&hdev->cmd_q);
2374 skb_queue_purge(&hdev->rx_q);
2375
2376 if (hdev->flush)
2377 hdev->flush(hdev);
2378
2379 if (hdev->sent_cmd) {
2380 kfree_skb(hdev->sent_cmd);
2381 hdev->sent_cmd = NULL;
2382 }
2383
2384 hdev->close(hdev);
2385 hdev->flags = 0;
2386 }
2387
2388done:
2389 hci_req_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002390 return ret;
2391}
2392
Johan Hedbergcbed0ca2013-10-01 22:44:49 +03002393/* ---- HCI ioctl helpers ---- */
2394
2395int hci_dev_open(__u16 dev)
2396{
2397 struct hci_dev *hdev;
2398 int err;
2399
2400 hdev = hci_dev_get(dev);
2401 if (!hdev)
2402 return -ENODEV;
2403
Johan Hedberge1d08f42013-10-01 22:44:50 +03002404 /* We need to ensure that no other power on/off work is pending
2405 * before proceeding to call hci_dev_do_open. This is
2406 * particularly important if the setup procedure has not yet
2407 * completed.
2408 */
2409 if (test_and_clear_bit(HCI_AUTO_OFF, &hdev->dev_flags))
2410 cancel_delayed_work(&hdev->power_off);
2411
Marcel Holtmanna5c8f272013-10-06 01:08:57 -07002412 /* After this call it is guaranteed that the setup procedure
2413 * has finished. This means that error conditions like RFKILL
2414 * or no valid public or static random address apply.
2415 */
Johan Hedberge1d08f42013-10-01 22:44:50 +03002416 flush_workqueue(hdev->req_workqueue);
2417
Johan Hedbergcbed0ca2013-10-01 22:44:49 +03002418 err = hci_dev_do_open(hdev);
2419
2420 hci_dev_put(hdev);
2421
2422 return err;
2423}
2424
Linus Torvalds1da177e2005-04-16 15:20:36 -07002425static int hci_dev_do_close(struct hci_dev *hdev)
2426{
2427 BT_DBG("%s %p", hdev->name, hdev);
2428
Vinicius Costa Gomes78c04c02012-09-14 16:34:46 -03002429 cancel_delayed_work(&hdev->power_off);
2430
Linus Torvalds1da177e2005-04-16 15:20:36 -07002431 hci_req_cancel(hdev, ENODEV);
2432 hci_req_lock(hdev);
2433
2434 if (!test_and_clear_bit(HCI_UP, &hdev->flags)) {
Marcel Holtmann65cc2b42014-06-16 12:30:56 +02002435 cancel_delayed_work_sync(&hdev->cmd_timer);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002436 hci_req_unlock(hdev);
2437 return 0;
2438 }
2439
Gustavo F. Padovan3eff45e2011-12-15 00:50:02 -02002440 /* Flush RX and TX works */
2441 flush_work(&hdev->tx_work);
Marcel Holtmannb78752c2010-08-08 23:06:53 -04002442 flush_work(&hdev->rx_work);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002443
Johan Hedberg16ab91a2011-11-07 22:16:02 +02002444 if (hdev->discov_timeout > 0) {
Johan Hedberge0f93092011-11-09 01:44:22 +02002445 cancel_delayed_work(&hdev->discov_off);
Johan Hedberg16ab91a2011-11-07 22:16:02 +02002446 hdev->discov_timeout = 0;
Johan Hedberg5e5282b2012-02-21 16:01:30 +02002447 clear_bit(HCI_DISCOVERABLE, &hdev->dev_flags);
Marcel Holtmann310a3d42013-10-15 09:13:39 -07002448 clear_bit(HCI_LIMITED_DISCOVERABLE, &hdev->dev_flags);
Johan Hedberg16ab91a2011-11-07 22:16:02 +02002449 }
2450
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02002451 if (test_and_clear_bit(HCI_SERVICE_CACHE, &hdev->dev_flags))
Johan Hedberg7d785252011-12-15 00:47:39 +02002452 cancel_delayed_work(&hdev->service_cache);
2453
Andre Guedes7ba8b4b2012-02-03 17:47:59 -03002454 cancel_delayed_work_sync(&hdev->le_scan_disable);
Johan Hedberg4518bb02014-02-24 20:35:07 +02002455
2456 if (test_bit(HCI_MGMT, &hdev->dev_flags))
2457 cancel_delayed_work_sync(&hdev->rpa_expired);
Andre Guedes7ba8b4b2012-02-03 17:47:59 -03002458
Gustavo F. Padovan09fd0de2011-06-17 13:03:21 -03002459 hci_dev_lock(hdev);
Andre Guedes1f9b9a52013-04-30 15:29:27 -03002460 hci_inquiry_cache_flush(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002461 hci_conn_hash_flush(hdev);
Andre Guedes6046dc32014-02-26 20:21:51 -03002462 hci_pend_le_conns_clear(hdev);
Gustavo F. Padovan09fd0de2011-06-17 13:03:21 -03002463 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002464
2465 hci_notify(hdev, HCI_DEV_DOWN);
2466
2467 if (hdev->flush)
2468 hdev->flush(hdev);
2469
2470 /* Reset device */
2471 skb_queue_purge(&hdev->cmd_q);
2472 atomic_set(&hdev->cmd_cnt, 1);
Johan Hedberg8af59462012-02-03 21:29:40 +02002473 if (!test_bit(HCI_RAW, &hdev->flags) &&
Marcel Holtmann3a6afbd2013-10-11 09:44:12 -07002474 !test_bit(HCI_AUTO_OFF, &hdev->dev_flags) &&
Szymon Janca6c511c2012-05-23 12:35:46 +02002475 test_bit(HCI_QUIRK_RESET_ON_CLOSE, &hdev->quirks)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002476 set_bit(HCI_INIT, &hdev->flags);
Johan Hedberg01178cd2013-03-05 20:37:41 +02002477 __hci_req_sync(hdev, hci_reset_req, 0, HCI_CMD_TIMEOUT);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002478 clear_bit(HCI_INIT, &hdev->flags);
2479 }
2480
Gustavo F. Padovanc347b762011-12-14 23:53:47 -02002481 /* flush cmd work */
2482 flush_work(&hdev->cmd_work);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002483
2484 /* Drop queues */
2485 skb_queue_purge(&hdev->rx_q);
2486 skb_queue_purge(&hdev->cmd_q);
2487 skb_queue_purge(&hdev->raw_q);
2488
2489 /* Drop last sent command */
2490 if (hdev->sent_cmd) {
Marcel Holtmann65cc2b42014-06-16 12:30:56 +02002491 cancel_delayed_work_sync(&hdev->cmd_timer);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002492 kfree_skb(hdev->sent_cmd);
2493 hdev->sent_cmd = NULL;
2494 }
2495
Johan Hedbergb6ddb632013-04-02 13:34:31 +03002496 kfree_skb(hdev->recv_evt);
2497 hdev->recv_evt = NULL;
2498
Linus Torvalds1da177e2005-04-16 15:20:36 -07002499 /* After this point our queues are empty
2500 * and no tasks are scheduled. */
2501 hdev->close(hdev);
2502
Johan Hedberg35b973c2013-03-15 17:06:59 -05002503 /* Clear flags */
2504 hdev->flags = 0;
2505 hdev->dev_flags &= ~HCI_PERSISTENT_MASK;
2506
Marcel Holtmann93c311a2013-10-07 00:58:33 -07002507 if (!test_and_clear_bit(HCI_AUTO_OFF, &hdev->dev_flags)) {
2508 if (hdev->dev_type == HCI_BREDR) {
2509 hci_dev_lock(hdev);
2510 mgmt_powered(hdev, 0);
2511 hci_dev_unlock(hdev);
2512 }
Marcel Holtmann8ee56542012-02-21 12:33:48 +01002513 }
Johan Hedberg5add6af2010-12-16 10:00:37 +02002514
Andrei Emeltchenkoced5c332012-11-28 17:59:42 +02002515 /* Controller radio is available but is currently powered down */
Marcel Holtmann536619e2013-10-05 11:47:45 -07002516 hdev->amp_status = AMP_STATUS_POWERED_DOWN;
Andrei Emeltchenkoced5c332012-11-28 17:59:42 +02002517
Johan Hedberge59fda82012-02-22 18:11:53 +02002518 memset(hdev->eir, 0, sizeof(hdev->eir));
Johan Hedberg09b3c3f2012-02-22 22:01:41 +02002519 memset(hdev->dev_class, 0, sizeof(hdev->dev_class));
Marcel Holtmann7a4cd512014-02-19 19:52:13 -08002520 bacpy(&hdev->random_addr, BDADDR_ANY);
Johan Hedberge59fda82012-02-22 18:11:53 +02002521
Linus Torvalds1da177e2005-04-16 15:20:36 -07002522 hci_req_unlock(hdev);
2523
2524 hci_dev_put(hdev);
2525 return 0;
2526}
2527
2528int hci_dev_close(__u16 dev)
2529{
2530 struct hci_dev *hdev;
2531 int err;
2532
Andrei Emeltchenko70f230202010-12-01 16:58:25 +02002533 hdev = hci_dev_get(dev);
2534 if (!hdev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002535 return -ENODEV;
Marcel Holtmann8ee56542012-02-21 12:33:48 +01002536
Marcel Holtmann0736cfa2013-08-26 21:40:51 -07002537 if (test_bit(HCI_USER_CHANNEL, &hdev->dev_flags)) {
2538 err = -EBUSY;
2539 goto done;
2540 }
2541
Marcel Holtmann8ee56542012-02-21 12:33:48 +01002542 if (test_and_clear_bit(HCI_AUTO_OFF, &hdev->dev_flags))
2543 cancel_delayed_work(&hdev->power_off);
2544
Linus Torvalds1da177e2005-04-16 15:20:36 -07002545 err = hci_dev_do_close(hdev);
Marcel Holtmann8ee56542012-02-21 12:33:48 +01002546
Marcel Holtmann0736cfa2013-08-26 21:40:51 -07002547done:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002548 hci_dev_put(hdev);
2549 return err;
2550}
2551
2552int hci_dev_reset(__u16 dev)
2553{
2554 struct hci_dev *hdev;
2555 int ret = 0;
2556
Andrei Emeltchenko70f230202010-12-01 16:58:25 +02002557 hdev = hci_dev_get(dev);
2558 if (!hdev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002559 return -ENODEV;
2560
2561 hci_req_lock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002562
Marcel Holtmann808a0492013-08-26 20:57:58 -07002563 if (!test_bit(HCI_UP, &hdev->flags)) {
2564 ret = -ENETDOWN;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002565 goto done;
Marcel Holtmann808a0492013-08-26 20:57:58 -07002566 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002567
Marcel Holtmann0736cfa2013-08-26 21:40:51 -07002568 if (test_bit(HCI_USER_CHANNEL, &hdev->dev_flags)) {
2569 ret = -EBUSY;
2570 goto done;
2571 }
2572
Linus Torvalds1da177e2005-04-16 15:20:36 -07002573 /* Drop queues */
2574 skb_queue_purge(&hdev->rx_q);
2575 skb_queue_purge(&hdev->cmd_q);
2576
Gustavo F. Padovan09fd0de2011-06-17 13:03:21 -03002577 hci_dev_lock(hdev);
Andre Guedes1f9b9a52013-04-30 15:29:27 -03002578 hci_inquiry_cache_flush(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002579 hci_conn_hash_flush(hdev);
Gustavo F. Padovan09fd0de2011-06-17 13:03:21 -03002580 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002581
2582 if (hdev->flush)
2583 hdev->flush(hdev);
2584
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09002585 atomic_set(&hdev->cmd_cnt, 1);
Ville Tervo6ed58ec2011-02-10 22:38:48 -03002586 hdev->acl_cnt = 0; hdev->sco_cnt = 0; hdev->le_cnt = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002587
2588 if (!test_bit(HCI_RAW, &hdev->flags))
Johan Hedberg01178cd2013-03-05 20:37:41 +02002589 ret = __hci_req_sync(hdev, hci_reset_req, 0, HCI_INIT_TIMEOUT);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002590
2591done:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002592 hci_req_unlock(hdev);
2593 hci_dev_put(hdev);
2594 return ret;
2595}
2596
2597int hci_dev_reset_stat(__u16 dev)
2598{
2599 struct hci_dev *hdev;
2600 int ret = 0;
2601
Andrei Emeltchenko70f230202010-12-01 16:58:25 +02002602 hdev = hci_dev_get(dev);
2603 if (!hdev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002604 return -ENODEV;
2605
Marcel Holtmann0736cfa2013-08-26 21:40:51 -07002606 if (test_bit(HCI_USER_CHANNEL, &hdev->dev_flags)) {
2607 ret = -EBUSY;
2608 goto done;
2609 }
2610
Linus Torvalds1da177e2005-04-16 15:20:36 -07002611 memset(&hdev->stat, 0, sizeof(struct hci_dev_stats));
2612
Marcel Holtmann0736cfa2013-08-26 21:40:51 -07002613done:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002614 hci_dev_put(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002615 return ret;
2616}
2617
2618int hci_dev_cmd(unsigned int cmd, void __user *arg)
2619{
2620 struct hci_dev *hdev;
2621 struct hci_dev_req dr;
2622 int err = 0;
2623
2624 if (copy_from_user(&dr, arg, sizeof(dr)))
2625 return -EFAULT;
2626
Andrei Emeltchenko70f230202010-12-01 16:58:25 +02002627 hdev = hci_dev_get(dr.dev_id);
2628 if (!hdev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002629 return -ENODEV;
2630
Marcel Holtmann0736cfa2013-08-26 21:40:51 -07002631 if (test_bit(HCI_USER_CHANNEL, &hdev->dev_flags)) {
2632 err = -EBUSY;
2633 goto done;
2634 }
2635
Marcel Holtmann5b69bef52013-10-10 10:02:08 -07002636 if (hdev->dev_type != HCI_BREDR) {
2637 err = -EOPNOTSUPP;
2638 goto done;
2639 }
2640
Johan Hedberg56f87902013-10-02 13:43:13 +03002641 if (!test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags)) {
2642 err = -EOPNOTSUPP;
2643 goto done;
2644 }
2645
Linus Torvalds1da177e2005-04-16 15:20:36 -07002646 switch (cmd) {
2647 case HCISETAUTH:
Johan Hedberg01178cd2013-03-05 20:37:41 +02002648 err = hci_req_sync(hdev, hci_auth_req, dr.dev_opt,
2649 HCI_INIT_TIMEOUT);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002650 break;
2651
2652 case HCISETENCRYPT:
2653 if (!lmp_encrypt_capable(hdev)) {
2654 err = -EOPNOTSUPP;
2655 break;
2656 }
2657
2658 if (!test_bit(HCI_AUTH, &hdev->flags)) {
2659 /* Auth must be enabled first */
Johan Hedberg01178cd2013-03-05 20:37:41 +02002660 err = hci_req_sync(hdev, hci_auth_req, dr.dev_opt,
2661 HCI_INIT_TIMEOUT);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002662 if (err)
2663 break;
2664 }
2665
Johan Hedberg01178cd2013-03-05 20:37:41 +02002666 err = hci_req_sync(hdev, hci_encrypt_req, dr.dev_opt,
2667 HCI_INIT_TIMEOUT);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002668 break;
2669
2670 case HCISETSCAN:
Johan Hedberg01178cd2013-03-05 20:37:41 +02002671 err = hci_req_sync(hdev, hci_scan_req, dr.dev_opt,
2672 HCI_INIT_TIMEOUT);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002673 break;
2674
Marcel Holtmanne4e8e372008-07-14 20:13:47 +02002675 case HCISETLINKPOL:
Johan Hedberg01178cd2013-03-05 20:37:41 +02002676 err = hci_req_sync(hdev, hci_linkpol_req, dr.dev_opt,
2677 HCI_INIT_TIMEOUT);
Marcel Holtmanne4e8e372008-07-14 20:13:47 +02002678 break;
2679
2680 case HCISETLINKMODE:
2681 hdev->link_mode = ((__u16) dr.dev_opt) &
2682 (HCI_LM_MASTER | HCI_LM_ACCEPT);
2683 break;
2684
Linus Torvalds1da177e2005-04-16 15:20:36 -07002685 case HCISETPTYPE:
2686 hdev->pkt_type = (__u16) dr.dev_opt;
2687 break;
2688
Linus Torvalds1da177e2005-04-16 15:20:36 -07002689 case HCISETACLMTU:
Marcel Holtmanne4e8e372008-07-14 20:13:47 +02002690 hdev->acl_mtu = *((__u16 *) &dr.dev_opt + 1);
2691 hdev->acl_pkts = *((__u16 *) &dr.dev_opt + 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002692 break;
2693
2694 case HCISETSCOMTU:
Marcel Holtmanne4e8e372008-07-14 20:13:47 +02002695 hdev->sco_mtu = *((__u16 *) &dr.dev_opt + 1);
2696 hdev->sco_pkts = *((__u16 *) &dr.dev_opt + 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002697 break;
2698
2699 default:
2700 err = -EINVAL;
2701 break;
2702 }
Marcel Holtmanne4e8e372008-07-14 20:13:47 +02002703
Marcel Holtmann0736cfa2013-08-26 21:40:51 -07002704done:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002705 hci_dev_put(hdev);
2706 return err;
2707}
2708
2709int hci_get_dev_list(void __user *arg)
2710{
Luiz Augusto von Dentz8035ded2011-11-01 10:58:56 +02002711 struct hci_dev *hdev;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002712 struct hci_dev_list_req *dl;
2713 struct hci_dev_req *dr;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002714 int n = 0, size, err;
2715 __u16 dev_num;
2716
2717 if (get_user(dev_num, (__u16 __user *) arg))
2718 return -EFAULT;
2719
2720 if (!dev_num || dev_num > (PAGE_SIZE * 2) / sizeof(*dr))
2721 return -EINVAL;
2722
2723 size = sizeof(*dl) + dev_num * sizeof(*dr);
2724
Andrei Emeltchenko70f230202010-12-01 16:58:25 +02002725 dl = kzalloc(size, GFP_KERNEL);
2726 if (!dl)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002727 return -ENOMEM;
2728
2729 dr = dl->dev_req;
2730
Gustavo F. Padovanf20d09d2011-12-22 16:30:27 -02002731 read_lock(&hci_dev_list_lock);
Luiz Augusto von Dentz8035ded2011-11-01 10:58:56 +02002732 list_for_each_entry(hdev, &hci_dev_list, list) {
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02002733 if (test_and_clear_bit(HCI_AUTO_OFF, &hdev->dev_flags))
Johan Hedberge0f93092011-11-09 01:44:22 +02002734 cancel_delayed_work(&hdev->power_off);
Johan Hedbergc542a062011-01-26 13:11:03 +02002735
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02002736 if (!test_bit(HCI_MGMT, &hdev->dev_flags))
2737 set_bit(HCI_PAIRABLE, &hdev->dev_flags);
Johan Hedbergc542a062011-01-26 13:11:03 +02002738
Linus Torvalds1da177e2005-04-16 15:20:36 -07002739 (dr + n)->dev_id = hdev->id;
2740 (dr + n)->dev_opt = hdev->flags;
Johan Hedbergc542a062011-01-26 13:11:03 +02002741
Linus Torvalds1da177e2005-04-16 15:20:36 -07002742 if (++n >= dev_num)
2743 break;
2744 }
Gustavo F. Padovanf20d09d2011-12-22 16:30:27 -02002745 read_unlock(&hci_dev_list_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002746
2747 dl->dev_num = n;
2748 size = sizeof(*dl) + n * sizeof(*dr);
2749
2750 err = copy_to_user(arg, dl, size);
2751 kfree(dl);
2752
2753 return err ? -EFAULT : 0;
2754}
2755
2756int hci_get_dev_info(void __user *arg)
2757{
2758 struct hci_dev *hdev;
2759 struct hci_dev_info di;
2760 int err = 0;
2761
2762 if (copy_from_user(&di, arg, sizeof(di)))
2763 return -EFAULT;
2764
Andrei Emeltchenko70f230202010-12-01 16:58:25 +02002765 hdev = hci_dev_get(di.dev_id);
2766 if (!hdev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002767 return -ENODEV;
2768
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02002769 if (test_and_clear_bit(HCI_AUTO_OFF, &hdev->dev_flags))
Johan Hedberg32435532011-11-07 22:16:04 +02002770 cancel_delayed_work_sync(&hdev->power_off);
Johan Hedbergab81cbf2010-12-15 13:53:18 +02002771
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02002772 if (!test_bit(HCI_MGMT, &hdev->dev_flags))
2773 set_bit(HCI_PAIRABLE, &hdev->dev_flags);
Johan Hedbergc542a062011-01-26 13:11:03 +02002774
Linus Torvalds1da177e2005-04-16 15:20:36 -07002775 strcpy(di.name, hdev->name);
2776 di.bdaddr = hdev->bdaddr;
Marcel Holtmann60f2a3e2013-10-01 22:59:20 -07002777 di.type = (hdev->bus & 0x0f) | ((hdev->dev_type & 0x03) << 4);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002778 di.flags = hdev->flags;
2779 di.pkt_type = hdev->pkt_type;
Johan Hedberg572c7f82012-10-19 20:57:46 +03002780 if (lmp_bredr_capable(hdev)) {
2781 di.acl_mtu = hdev->acl_mtu;
2782 di.acl_pkts = hdev->acl_pkts;
2783 di.sco_mtu = hdev->sco_mtu;
2784 di.sco_pkts = hdev->sco_pkts;
2785 } else {
2786 di.acl_mtu = hdev->le_mtu;
2787 di.acl_pkts = hdev->le_pkts;
2788 di.sco_mtu = 0;
2789 di.sco_pkts = 0;
2790 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002791 di.link_policy = hdev->link_policy;
2792 di.link_mode = hdev->link_mode;
2793
2794 memcpy(&di.stat, &hdev->stat, sizeof(di.stat));
2795 memcpy(&di.features, &hdev->features, sizeof(di.features));
2796
2797 if (copy_to_user(arg, &di, sizeof(di)))
2798 err = -EFAULT;
2799
2800 hci_dev_put(hdev);
2801
2802 return err;
2803}
2804
2805/* ---- Interface to HCI drivers ---- */
2806
Marcel Holtmann611b30f2009-06-08 14:41:38 +02002807static int hci_rfkill_set_block(void *data, bool blocked)
2808{
2809 struct hci_dev *hdev = data;
2810
2811 BT_DBG("%p name %s blocked %d", hdev, hdev->name, blocked);
2812
Marcel Holtmann0736cfa2013-08-26 21:40:51 -07002813 if (test_bit(HCI_USER_CHANNEL, &hdev->dev_flags))
2814 return -EBUSY;
2815
Johan Hedberg5e130362013-09-13 08:58:17 +03002816 if (blocked) {
2817 set_bit(HCI_RFKILLED, &hdev->dev_flags);
Johan Hedbergbf543032013-09-13 08:58:18 +03002818 if (!test_bit(HCI_SETUP, &hdev->dev_flags))
2819 hci_dev_do_close(hdev);
Johan Hedberg5e130362013-09-13 08:58:17 +03002820 } else {
2821 clear_bit(HCI_RFKILLED, &hdev->dev_flags);
Gustavo Padovan1025c042013-09-27 11:56:14 -03002822 }
Marcel Holtmann611b30f2009-06-08 14:41:38 +02002823
2824 return 0;
2825}
2826
2827static const struct rfkill_ops hci_rfkill_ops = {
2828 .set_block = hci_rfkill_set_block,
2829};
2830
Johan Hedbergab81cbf2010-12-15 13:53:18 +02002831static void hci_power_on(struct work_struct *work)
2832{
2833 struct hci_dev *hdev = container_of(work, struct hci_dev, power_on);
Johan Hedberg96570ff2013-05-29 09:51:29 +03002834 int err;
Johan Hedbergab81cbf2010-12-15 13:53:18 +02002835
2836 BT_DBG("%s", hdev->name);
2837
Johan Hedbergcbed0ca2013-10-01 22:44:49 +03002838 err = hci_dev_do_open(hdev);
Johan Hedberg96570ff2013-05-29 09:51:29 +03002839 if (err < 0) {
2840 mgmt_set_powered_failed(hdev, err);
Johan Hedbergab81cbf2010-12-15 13:53:18 +02002841 return;
Johan Hedberg96570ff2013-05-29 09:51:29 +03002842 }
Johan Hedbergab81cbf2010-12-15 13:53:18 +02002843
Marcel Holtmanna5c8f272013-10-06 01:08:57 -07002844 /* During the HCI setup phase, a few error conditions are
2845 * ignored and they need to be checked now. If they are still
2846 * valid, it is important to turn the device back off.
2847 */
2848 if (test_bit(HCI_RFKILLED, &hdev->dev_flags) ||
2849 (hdev->dev_type == HCI_BREDR &&
2850 !bacmp(&hdev->bdaddr, BDADDR_ANY) &&
2851 !bacmp(&hdev->static_addr, BDADDR_ANY))) {
Johan Hedbergbf543032013-09-13 08:58:18 +03002852 clear_bit(HCI_AUTO_OFF, &hdev->dev_flags);
2853 hci_dev_do_close(hdev);
2854 } else if (test_bit(HCI_AUTO_OFF, &hdev->dev_flags)) {
Johan Hedberg19202572013-01-14 22:33:51 +02002855 queue_delayed_work(hdev->req_workqueue, &hdev->power_off,
2856 HCI_AUTO_OFF_TIMEOUT);
Johan Hedbergbf543032013-09-13 08:58:18 +03002857 }
Johan Hedbergab81cbf2010-12-15 13:53:18 +02002858
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02002859 if (test_and_clear_bit(HCI_SETUP, &hdev->dev_flags))
Johan Hedberg744cf192011-11-08 20:40:14 +02002860 mgmt_index_added(hdev);
Johan Hedbergab81cbf2010-12-15 13:53:18 +02002861}
2862
2863static void hci_power_off(struct work_struct *work)
2864{
Johan Hedberg32435532011-11-07 22:16:04 +02002865 struct hci_dev *hdev = container_of(work, struct hci_dev,
Gustavo Padovana8c5fb12012-05-17 00:36:26 -03002866 power_off.work);
Johan Hedbergab81cbf2010-12-15 13:53:18 +02002867
2868 BT_DBG("%s", hdev->name);
2869
Marcel Holtmann8ee56542012-02-21 12:33:48 +01002870 hci_dev_do_close(hdev);
Johan Hedbergab81cbf2010-12-15 13:53:18 +02002871}
2872
Johan Hedberg16ab91a2011-11-07 22:16:02 +02002873static void hci_discov_off(struct work_struct *work)
2874{
2875 struct hci_dev *hdev;
Johan Hedberg16ab91a2011-11-07 22:16:02 +02002876
2877 hdev = container_of(work, struct hci_dev, discov_off.work);
2878
2879 BT_DBG("%s", hdev->name);
2880
Marcel Holtmannd1967ff2013-10-15 10:57:40 -07002881 mgmt_discoverable_timeout(hdev);
Johan Hedberg16ab91a2011-11-07 22:16:02 +02002882}
2883
Johan Hedberg35f74982014-02-18 17:14:32 +02002884void hci_uuids_clear(struct hci_dev *hdev)
Johan Hedberg2aeb9a12011-01-04 12:08:51 +02002885{
Johan Hedberg48210022013-01-27 00:31:28 +02002886 struct bt_uuid *uuid, *tmp;
Johan Hedberg2aeb9a12011-01-04 12:08:51 +02002887
Johan Hedberg48210022013-01-27 00:31:28 +02002888 list_for_each_entry_safe(uuid, tmp, &hdev->uuids, list) {
2889 list_del(&uuid->list);
Johan Hedberg2aeb9a12011-01-04 12:08:51 +02002890 kfree(uuid);
2891 }
Johan Hedberg2aeb9a12011-01-04 12:08:51 +02002892}
2893
Johan Hedberg35f74982014-02-18 17:14:32 +02002894void hci_link_keys_clear(struct hci_dev *hdev)
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02002895{
2896 struct list_head *p, *n;
2897
2898 list_for_each_safe(p, n, &hdev->link_keys) {
2899 struct link_key *key;
2900
2901 key = list_entry(p, struct link_key, list);
2902
2903 list_del(p);
2904 kfree(key);
2905 }
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02002906}
2907
Johan Hedberg35f74982014-02-18 17:14:32 +02002908void hci_smp_ltks_clear(struct hci_dev *hdev)
Vinicius Costa Gomesb899efa2012-02-02 21:08:00 -03002909{
2910 struct smp_ltk *k, *tmp;
2911
2912 list_for_each_entry_safe(k, tmp, &hdev->long_term_keys, list) {
2913 list_del(&k->list);
2914 kfree(k);
2915 }
Vinicius Costa Gomesb899efa2012-02-02 21:08:00 -03002916}
2917
Johan Hedberg970c4e42014-02-18 10:19:33 +02002918void hci_smp_irks_clear(struct hci_dev *hdev)
2919{
2920 struct smp_irk *k, *tmp;
2921
2922 list_for_each_entry_safe(k, tmp, &hdev->identity_resolving_keys, list) {
2923 list_del(&k->list);
2924 kfree(k);
2925 }
2926}
2927
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02002928struct link_key *hci_find_link_key(struct hci_dev *hdev, bdaddr_t *bdaddr)
2929{
Luiz Augusto von Dentz8035ded2011-11-01 10:58:56 +02002930 struct link_key *k;
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02002931
Luiz Augusto von Dentz8035ded2011-11-01 10:58:56 +02002932 list_for_each_entry(k, &hdev->link_keys, list)
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02002933 if (bacmp(bdaddr, &k->bdaddr) == 0)
2934 return k;
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02002935
2936 return NULL;
2937}
2938
Vishal Agarwal745c0ce2012-04-13 17:43:22 +05302939static bool hci_persistent_key(struct hci_dev *hdev, struct hci_conn *conn,
Gustavo Padovana8c5fb12012-05-17 00:36:26 -03002940 u8 key_type, u8 old_key_type)
Johan Hedbergd25e28a2011-04-28 11:28:59 -07002941{
2942 /* Legacy key */
2943 if (key_type < 0x03)
Vishal Agarwal745c0ce2012-04-13 17:43:22 +05302944 return true;
Johan Hedbergd25e28a2011-04-28 11:28:59 -07002945
2946 /* Debug keys are insecure so don't store them persistently */
2947 if (key_type == HCI_LK_DEBUG_COMBINATION)
Vishal Agarwal745c0ce2012-04-13 17:43:22 +05302948 return false;
Johan Hedbergd25e28a2011-04-28 11:28:59 -07002949
2950 /* Changed combination key and there's no previous one */
2951 if (key_type == HCI_LK_CHANGED_COMBINATION && old_key_type == 0xff)
Vishal Agarwal745c0ce2012-04-13 17:43:22 +05302952 return false;
Johan Hedbergd25e28a2011-04-28 11:28:59 -07002953
2954 /* Security mode 3 case */
2955 if (!conn)
Vishal Agarwal745c0ce2012-04-13 17:43:22 +05302956 return true;
Johan Hedbergd25e28a2011-04-28 11:28:59 -07002957
2958 /* Neither local nor remote side had no-bonding as requirement */
2959 if (conn->auth_type > 0x01 && conn->remote_auth > 0x01)
Vishal Agarwal745c0ce2012-04-13 17:43:22 +05302960 return true;
Johan Hedbergd25e28a2011-04-28 11:28:59 -07002961
2962 /* Local side had dedicated bonding as requirement */
2963 if (conn->auth_type == 0x02 || conn->auth_type == 0x03)
Vishal Agarwal745c0ce2012-04-13 17:43:22 +05302964 return true;
Johan Hedbergd25e28a2011-04-28 11:28:59 -07002965
2966 /* Remote side had dedicated bonding as requirement */
2967 if (conn->remote_auth == 0x02 || conn->remote_auth == 0x03)
Vishal Agarwal745c0ce2012-04-13 17:43:22 +05302968 return true;
Johan Hedbergd25e28a2011-04-28 11:28:59 -07002969
2970 /* If none of the above criteria match, then don't store the key
2971 * persistently */
Vishal Agarwal745c0ce2012-04-13 17:43:22 +05302972 return false;
Johan Hedbergd25e28a2011-04-28 11:28:59 -07002973}
2974
Johan Hedberg98a0b842014-01-30 19:40:00 -08002975static bool ltk_type_master(u8 type)
2976{
2977 if (type == HCI_SMP_STK || type == HCI_SMP_LTK)
2978 return true;
2979
2980 return false;
2981}
2982
Marcel Holtmannfe39c7b2014-02-27 16:00:28 -08002983struct smp_ltk *hci_find_ltk(struct hci_dev *hdev, __le16 ediv, __le64 rand,
Johan Hedberg98a0b842014-01-30 19:40:00 -08002984 bool master)
Vinicius Costa Gomes75d262c2011-07-07 18:59:36 -03002985{
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03002986 struct smp_ltk *k;
Vinicius Costa Gomes75d262c2011-07-07 18:59:36 -03002987
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03002988 list_for_each_entry(k, &hdev->long_term_keys, list) {
Marcel Holtmannfe39c7b2014-02-27 16:00:28 -08002989 if (k->ediv != ediv || k->rand != rand)
Vinicius Costa Gomes75d262c2011-07-07 18:59:36 -03002990 continue;
2991
Johan Hedberg98a0b842014-01-30 19:40:00 -08002992 if (ltk_type_master(k->type) != master)
2993 continue;
2994
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03002995 return k;
Vinicius Costa Gomes75d262c2011-07-07 18:59:36 -03002996 }
2997
2998 return NULL;
2999}
Vinicius Costa Gomes75d262c2011-07-07 18:59:36 -03003000
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03003001struct smp_ltk *hci_find_ltk_by_addr(struct hci_dev *hdev, bdaddr_t *bdaddr,
Johan Hedberg98a0b842014-01-30 19:40:00 -08003002 u8 addr_type, bool master)
Vinicius Costa Gomes75d262c2011-07-07 18:59:36 -03003003{
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03003004 struct smp_ltk *k;
Vinicius Costa Gomes75d262c2011-07-07 18:59:36 -03003005
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03003006 list_for_each_entry(k, &hdev->long_term_keys, list)
3007 if (addr_type == k->bdaddr_type &&
Johan Hedberg98a0b842014-01-30 19:40:00 -08003008 bacmp(bdaddr, &k->bdaddr) == 0 &&
3009 ltk_type_master(k->type) == master)
Vinicius Costa Gomes75d262c2011-07-07 18:59:36 -03003010 return k;
3011
3012 return NULL;
3013}
Vinicius Costa Gomes75d262c2011-07-07 18:59:36 -03003014
Johan Hedberg970c4e42014-02-18 10:19:33 +02003015struct smp_irk *hci_find_irk_by_rpa(struct hci_dev *hdev, bdaddr_t *rpa)
3016{
3017 struct smp_irk *irk;
3018
3019 list_for_each_entry(irk, &hdev->identity_resolving_keys, list) {
3020 if (!bacmp(&irk->rpa, rpa))
3021 return irk;
3022 }
3023
3024 list_for_each_entry(irk, &hdev->identity_resolving_keys, list) {
3025 if (smp_irk_matches(hdev->tfm_aes, irk->val, rpa)) {
3026 bacpy(&irk->rpa, rpa);
3027 return irk;
3028 }
3029 }
3030
3031 return NULL;
3032}
3033
3034struct smp_irk *hci_find_irk_by_addr(struct hci_dev *hdev, bdaddr_t *bdaddr,
3035 u8 addr_type)
3036{
3037 struct smp_irk *irk;
3038
Johan Hedberg6cfc9982014-02-18 21:41:35 +02003039 /* Identity Address must be public or static random */
3040 if (addr_type == ADDR_LE_DEV_RANDOM && (bdaddr->b[5] & 0xc0) != 0xc0)
3041 return NULL;
3042
Johan Hedberg970c4e42014-02-18 10:19:33 +02003043 list_for_each_entry(irk, &hdev->identity_resolving_keys, list) {
3044 if (addr_type == irk->addr_type &&
3045 bacmp(bdaddr, &irk->bdaddr) == 0)
3046 return irk;
3047 }
3048
3049 return NULL;
3050}
3051
Johan Hedbergd25e28a2011-04-28 11:28:59 -07003052int hci_add_link_key(struct hci_dev *hdev, struct hci_conn *conn, int new_key,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03003053 bdaddr_t *bdaddr, u8 *val, u8 type, u8 pin_len)
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003054{
3055 struct link_key *key, *old_key;
Vishal Agarwal745c0ce2012-04-13 17:43:22 +05303056 u8 old_key_type;
3057 bool persistent;
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003058
3059 old_key = hci_find_link_key(hdev, bdaddr);
3060 if (old_key) {
3061 old_key_type = old_key->type;
3062 key = old_key;
3063 } else {
Johan Hedberg12adcf32011-04-28 11:29:00 -07003064 old_key_type = conn ? conn->key_type : 0xff;
Johan Hedberg0a14ab42014-02-19 14:57:43 +02003065 key = kzalloc(sizeof(*key), GFP_KERNEL);
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003066 if (!key)
3067 return -ENOMEM;
3068 list_add(&key->list, &hdev->link_keys);
3069 }
3070
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03003071 BT_DBG("%s key for %pMR type %u", hdev->name, bdaddr, type);
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003072
Johan Hedbergd25e28a2011-04-28 11:28:59 -07003073 /* Some buggy controller combinations generate a changed
3074 * combination key for legacy pairing even when there's no
3075 * previous key */
3076 if (type == HCI_LK_CHANGED_COMBINATION &&
Gustavo Padovana8c5fb12012-05-17 00:36:26 -03003077 (!conn || conn->remote_auth == 0xff) && old_key_type == 0xff) {
Johan Hedbergd25e28a2011-04-28 11:28:59 -07003078 type = HCI_LK_COMBINATION;
Johan Hedberg655fe6e2011-04-28 11:29:01 -07003079 if (conn)
3080 conn->key_type = type;
3081 }
Johan Hedbergd25e28a2011-04-28 11:28:59 -07003082
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003083 bacpy(&key->bdaddr, bdaddr);
Andrei Emeltchenko9b3b4462012-05-23 11:31:20 +03003084 memcpy(key->val, val, HCI_LINK_KEY_SIZE);
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003085 key->pin_len = pin_len;
3086
Waldemar Rymarkiewiczb6020ba2011-04-28 12:07:53 +02003087 if (type == HCI_LK_CHANGED_COMBINATION)
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003088 key->type = old_key_type;
Johan Hedberg4748fed2011-04-28 11:29:02 -07003089 else
3090 key->type = type;
3091
Johan Hedberg4df378a2011-04-28 11:29:03 -07003092 if (!new_key)
3093 return 0;
3094
3095 persistent = hci_persistent_key(hdev, conn, type, old_key_type);
3096
Johan Hedberg744cf192011-11-08 20:40:14 +02003097 mgmt_new_link_key(hdev, key, persistent);
Johan Hedberg4df378a2011-04-28 11:29:03 -07003098
Vishal Agarwal6ec5bca2012-04-16 14:44:44 +05303099 if (conn)
3100 conn->flush_key = !persistent;
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003101
3102 return 0;
3103}
3104
Johan Hedbergca9142b2014-02-19 14:57:44 +02003105struct smp_ltk *hci_add_ltk(struct hci_dev *hdev, bdaddr_t *bdaddr,
Johan Hedberg35d70272014-02-19 14:57:47 +02003106 u8 addr_type, u8 type, u8 authenticated,
Marcel Holtmannfe39c7b2014-02-27 16:00:28 -08003107 u8 tk[16], u8 enc_size, __le16 ediv, __le64 rand)
Vinicius Costa Gomes75d262c2011-07-07 18:59:36 -03003108{
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03003109 struct smp_ltk *key, *old_key;
Johan Hedberg98a0b842014-01-30 19:40:00 -08003110 bool master = ltk_type_master(type);
Vinicius Costa Gomes75d262c2011-07-07 18:59:36 -03003111
Johan Hedberg98a0b842014-01-30 19:40:00 -08003112 old_key = hci_find_ltk_by_addr(hdev, bdaddr, addr_type, master);
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03003113 if (old_key)
Vinicius Costa Gomes75d262c2011-07-07 18:59:36 -03003114 key = old_key;
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03003115 else {
Johan Hedberg0a14ab42014-02-19 14:57:43 +02003116 key = kzalloc(sizeof(*key), GFP_KERNEL);
Vinicius Costa Gomes75d262c2011-07-07 18:59:36 -03003117 if (!key)
Johan Hedbergca9142b2014-02-19 14:57:44 +02003118 return NULL;
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03003119 list_add(&key->list, &hdev->long_term_keys);
Vinicius Costa Gomes75d262c2011-07-07 18:59:36 -03003120 }
3121
Vinicius Costa Gomes75d262c2011-07-07 18:59:36 -03003122 bacpy(&key->bdaddr, bdaddr);
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03003123 key->bdaddr_type = addr_type;
3124 memcpy(key->val, tk, sizeof(key->val));
3125 key->authenticated = authenticated;
3126 key->ediv = ediv;
Marcel Holtmannfe39c7b2014-02-27 16:00:28 -08003127 key->rand = rand;
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03003128 key->enc_size = enc_size;
3129 key->type = type;
Vinicius Costa Gomes75d262c2011-07-07 18:59:36 -03003130
Johan Hedbergca9142b2014-02-19 14:57:44 +02003131 return key;
Vinicius Costa Gomes75d262c2011-07-07 18:59:36 -03003132}
3133
Johan Hedbergca9142b2014-02-19 14:57:44 +02003134struct smp_irk *hci_add_irk(struct hci_dev *hdev, bdaddr_t *bdaddr,
3135 u8 addr_type, u8 val[16], bdaddr_t *rpa)
Johan Hedberg970c4e42014-02-18 10:19:33 +02003136{
3137 struct smp_irk *irk;
3138
3139 irk = hci_find_irk_by_addr(hdev, bdaddr, addr_type);
3140 if (!irk) {
3141 irk = kzalloc(sizeof(*irk), GFP_KERNEL);
3142 if (!irk)
Johan Hedbergca9142b2014-02-19 14:57:44 +02003143 return NULL;
Johan Hedberg970c4e42014-02-18 10:19:33 +02003144
3145 bacpy(&irk->bdaddr, bdaddr);
3146 irk->addr_type = addr_type;
3147
3148 list_add(&irk->list, &hdev->identity_resolving_keys);
3149 }
3150
3151 memcpy(irk->val, val, 16);
3152 bacpy(&irk->rpa, rpa);
3153
Johan Hedbergca9142b2014-02-19 14:57:44 +02003154 return irk;
Johan Hedberg970c4e42014-02-18 10:19:33 +02003155}
3156
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003157int hci_remove_link_key(struct hci_dev *hdev, bdaddr_t *bdaddr)
3158{
3159 struct link_key *key;
3160
3161 key = hci_find_link_key(hdev, bdaddr);
3162 if (!key)
3163 return -ENOENT;
3164
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03003165 BT_DBG("%s removing %pMR", hdev->name, bdaddr);
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003166
3167 list_del(&key->list);
3168 kfree(key);
3169
3170 return 0;
3171}
3172
Johan Hedberge0b2b272014-02-18 17:14:31 +02003173int hci_remove_ltk(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 bdaddr_type)
Vinicius Costa Gomesb899efa2012-02-02 21:08:00 -03003174{
3175 struct smp_ltk *k, *tmp;
Johan Hedbergc51ffa02014-02-18 17:14:33 +02003176 int removed = 0;
Vinicius Costa Gomesb899efa2012-02-02 21:08:00 -03003177
3178 list_for_each_entry_safe(k, tmp, &hdev->long_term_keys, list) {
Johan Hedberge0b2b272014-02-18 17:14:31 +02003179 if (bacmp(bdaddr, &k->bdaddr) || k->bdaddr_type != bdaddr_type)
Vinicius Costa Gomesb899efa2012-02-02 21:08:00 -03003180 continue;
3181
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03003182 BT_DBG("%s removing %pMR", hdev->name, bdaddr);
Vinicius Costa Gomesb899efa2012-02-02 21:08:00 -03003183
3184 list_del(&k->list);
3185 kfree(k);
Johan Hedbergc51ffa02014-02-18 17:14:33 +02003186 removed++;
Vinicius Costa Gomesb899efa2012-02-02 21:08:00 -03003187 }
3188
Johan Hedbergc51ffa02014-02-18 17:14:33 +02003189 return removed ? 0 : -ENOENT;
Vinicius Costa Gomesb899efa2012-02-02 21:08:00 -03003190}
3191
Johan Hedberga7ec7332014-02-18 17:14:35 +02003192void hci_remove_irk(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 addr_type)
3193{
3194 struct smp_irk *k, *tmp;
3195
Johan Hedberg668b7b12014-02-21 16:03:31 +02003196 list_for_each_entry_safe(k, tmp, &hdev->identity_resolving_keys, list) {
Johan Hedberga7ec7332014-02-18 17:14:35 +02003197 if (bacmp(bdaddr, &k->bdaddr) || k->addr_type != addr_type)
3198 continue;
3199
3200 BT_DBG("%s removing %pMR", hdev->name, bdaddr);
3201
3202 list_del(&k->list);
3203 kfree(k);
3204 }
3205}
3206
Ville Tervo6bd32322011-02-16 16:32:41 +02003207/* HCI command timer function */
Marcel Holtmann65cc2b42014-06-16 12:30:56 +02003208static void hci_cmd_timeout(struct work_struct *work)
Ville Tervo6bd32322011-02-16 16:32:41 +02003209{
Marcel Holtmann65cc2b42014-06-16 12:30:56 +02003210 struct hci_dev *hdev = container_of(work, struct hci_dev,
3211 cmd_timer.work);
Ville Tervo6bd32322011-02-16 16:32:41 +02003212
Andrei Emeltchenkobda4f232012-06-11 11:13:08 +03003213 if (hdev->sent_cmd) {
3214 struct hci_command_hdr *sent = (void *) hdev->sent_cmd->data;
3215 u16 opcode = __le16_to_cpu(sent->opcode);
3216
3217 BT_ERR("%s command 0x%4.4x tx timeout", hdev->name, opcode);
3218 } else {
3219 BT_ERR("%s command tx timeout", hdev->name);
3220 }
3221
Ville Tervo6bd32322011-02-16 16:32:41 +02003222 atomic_set(&hdev->cmd_cnt, 1);
Gustavo F. Padovanc347b762011-12-14 23:53:47 -02003223 queue_work(hdev->workqueue, &hdev->cmd_work);
Ville Tervo6bd32322011-02-16 16:32:41 +02003224}
3225
Szymon Janc2763eda2011-03-22 13:12:22 +01003226struct oob_data *hci_find_remote_oob_data(struct hci_dev *hdev,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03003227 bdaddr_t *bdaddr)
Szymon Janc2763eda2011-03-22 13:12:22 +01003228{
3229 struct oob_data *data;
3230
3231 list_for_each_entry(data, &hdev->remote_oob_data, list)
3232 if (bacmp(bdaddr, &data->bdaddr) == 0)
3233 return data;
3234
3235 return NULL;
3236}
3237
3238int hci_remove_remote_oob_data(struct hci_dev *hdev, bdaddr_t *bdaddr)
3239{
3240 struct oob_data *data;
3241
3242 data = hci_find_remote_oob_data(hdev, bdaddr);
3243 if (!data)
3244 return -ENOENT;
3245
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03003246 BT_DBG("%s removing %pMR", hdev->name, bdaddr);
Szymon Janc2763eda2011-03-22 13:12:22 +01003247
3248 list_del(&data->list);
3249 kfree(data);
3250
3251 return 0;
3252}
3253
Johan Hedberg35f74982014-02-18 17:14:32 +02003254void hci_remote_oob_data_clear(struct hci_dev *hdev)
Szymon Janc2763eda2011-03-22 13:12:22 +01003255{
3256 struct oob_data *data, *n;
3257
3258 list_for_each_entry_safe(data, n, &hdev->remote_oob_data, list) {
3259 list_del(&data->list);
3260 kfree(data);
3261 }
Szymon Janc2763eda2011-03-22 13:12:22 +01003262}
3263
Marcel Holtmann07988722014-01-10 02:07:29 -08003264int hci_add_remote_oob_data(struct hci_dev *hdev, bdaddr_t *bdaddr,
3265 u8 *hash, u8 *randomizer)
Szymon Janc2763eda2011-03-22 13:12:22 +01003266{
3267 struct oob_data *data;
3268
3269 data = hci_find_remote_oob_data(hdev, bdaddr);
Szymon Janc2763eda2011-03-22 13:12:22 +01003270 if (!data) {
Johan Hedberg0a14ab42014-02-19 14:57:43 +02003271 data = kmalloc(sizeof(*data), GFP_KERNEL);
Szymon Janc2763eda2011-03-22 13:12:22 +01003272 if (!data)
3273 return -ENOMEM;
3274
3275 bacpy(&data->bdaddr, bdaddr);
3276 list_add(&data->list, &hdev->remote_oob_data);
3277 }
3278
Marcel Holtmann519ca9d2014-01-10 02:07:28 -08003279 memcpy(data->hash192, hash, sizeof(data->hash192));
3280 memcpy(data->randomizer192, randomizer, sizeof(data->randomizer192));
Szymon Janc2763eda2011-03-22 13:12:22 +01003281
Marcel Holtmann07988722014-01-10 02:07:29 -08003282 memset(data->hash256, 0, sizeof(data->hash256));
3283 memset(data->randomizer256, 0, sizeof(data->randomizer256));
3284
3285 BT_DBG("%s for %pMR", hdev->name, bdaddr);
3286
3287 return 0;
3288}
3289
3290int hci_add_remote_oob_ext_data(struct hci_dev *hdev, bdaddr_t *bdaddr,
3291 u8 *hash192, u8 *randomizer192,
3292 u8 *hash256, u8 *randomizer256)
3293{
3294 struct oob_data *data;
3295
3296 data = hci_find_remote_oob_data(hdev, bdaddr);
3297 if (!data) {
Johan Hedberg0a14ab42014-02-19 14:57:43 +02003298 data = kmalloc(sizeof(*data), GFP_KERNEL);
Marcel Holtmann07988722014-01-10 02:07:29 -08003299 if (!data)
3300 return -ENOMEM;
3301
3302 bacpy(&data->bdaddr, bdaddr);
3303 list_add(&data->list, &hdev->remote_oob_data);
3304 }
3305
3306 memcpy(data->hash192, hash192, sizeof(data->hash192));
3307 memcpy(data->randomizer192, randomizer192, sizeof(data->randomizer192));
3308
3309 memcpy(data->hash256, hash256, sizeof(data->hash256));
3310 memcpy(data->randomizer256, randomizer256, sizeof(data->randomizer256));
3311
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03003312 BT_DBG("%s for %pMR", hdev->name, bdaddr);
Szymon Janc2763eda2011-03-22 13:12:22 +01003313
3314 return 0;
3315}
3316
Marcel Holtmannb9ee0a72013-10-17 17:24:13 -07003317struct bdaddr_list *hci_blacklist_lookup(struct hci_dev *hdev,
3318 bdaddr_t *bdaddr, u8 type)
Antti Julkub2a66aa2011-06-15 12:01:14 +03003319{
Luiz Augusto von Dentz8035ded2011-11-01 10:58:56 +02003320 struct bdaddr_list *b;
Antti Julkub2a66aa2011-06-15 12:01:14 +03003321
Marcel Holtmannb9ee0a72013-10-17 17:24:13 -07003322 list_for_each_entry(b, &hdev->blacklist, list) {
3323 if (!bacmp(&b->bdaddr, bdaddr) && b->bdaddr_type == type)
Antti Julkub2a66aa2011-06-15 12:01:14 +03003324 return b;
Marcel Holtmannb9ee0a72013-10-17 17:24:13 -07003325 }
Antti Julkub2a66aa2011-06-15 12:01:14 +03003326
3327 return NULL;
3328}
3329
Marcel Holtmannc9507492014-02-27 19:35:54 -08003330static void hci_blacklist_clear(struct hci_dev *hdev)
Antti Julkub2a66aa2011-06-15 12:01:14 +03003331{
3332 struct list_head *p, *n;
3333
3334 list_for_each_safe(p, n, &hdev->blacklist) {
Marcel Holtmannb9ee0a72013-10-17 17:24:13 -07003335 struct bdaddr_list *b = list_entry(p, struct bdaddr_list, list);
Antti Julkub2a66aa2011-06-15 12:01:14 +03003336
3337 list_del(p);
3338 kfree(b);
3339 }
Antti Julkub2a66aa2011-06-15 12:01:14 +03003340}
3341
Johan Hedberg88c1fe42012-02-09 15:56:11 +02003342int hci_blacklist_add(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type)
Antti Julkub2a66aa2011-06-15 12:01:14 +03003343{
3344 struct bdaddr_list *entry;
Antti Julkub2a66aa2011-06-15 12:01:14 +03003345
Marcel Holtmannb9ee0a72013-10-17 17:24:13 -07003346 if (!bacmp(bdaddr, BDADDR_ANY))
Antti Julkub2a66aa2011-06-15 12:01:14 +03003347 return -EBADF;
3348
Marcel Holtmannb9ee0a72013-10-17 17:24:13 -07003349 if (hci_blacklist_lookup(hdev, bdaddr, type))
Antti Julku5e762442011-08-25 16:48:02 +03003350 return -EEXIST;
Antti Julkub2a66aa2011-06-15 12:01:14 +03003351
3352 entry = kzalloc(sizeof(struct bdaddr_list), GFP_KERNEL);
Antti Julku5e762442011-08-25 16:48:02 +03003353 if (!entry)
3354 return -ENOMEM;
Antti Julkub2a66aa2011-06-15 12:01:14 +03003355
3356 bacpy(&entry->bdaddr, bdaddr);
Marcel Holtmannb9ee0a72013-10-17 17:24:13 -07003357 entry->bdaddr_type = type;
Antti Julkub2a66aa2011-06-15 12:01:14 +03003358
3359 list_add(&entry->list, &hdev->blacklist);
3360
Johan Hedberg88c1fe42012-02-09 15:56:11 +02003361 return mgmt_device_blocked(hdev, bdaddr, type);
Antti Julkub2a66aa2011-06-15 12:01:14 +03003362}
3363
Johan Hedberg88c1fe42012-02-09 15:56:11 +02003364int hci_blacklist_del(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type)
Antti Julkub2a66aa2011-06-15 12:01:14 +03003365{
3366 struct bdaddr_list *entry;
Antti Julkub2a66aa2011-06-15 12:01:14 +03003367
Johan Hedberg35f74982014-02-18 17:14:32 +02003368 if (!bacmp(bdaddr, BDADDR_ANY)) {
3369 hci_blacklist_clear(hdev);
3370 return 0;
3371 }
Antti Julkub2a66aa2011-06-15 12:01:14 +03003372
Marcel Holtmannb9ee0a72013-10-17 17:24:13 -07003373 entry = hci_blacklist_lookup(hdev, bdaddr, type);
Szymon Janc1ec918c2011-11-16 09:32:21 +01003374 if (!entry)
Antti Julku5e762442011-08-25 16:48:02 +03003375 return -ENOENT;
Antti Julkub2a66aa2011-06-15 12:01:14 +03003376
3377 list_del(&entry->list);
3378 kfree(entry);
3379
Johan Hedberg88c1fe42012-02-09 15:56:11 +02003380 return mgmt_device_unblocked(hdev, bdaddr, type);
Antti Julkub2a66aa2011-06-15 12:01:14 +03003381}
3382
Marcel Holtmannd2ab0ac2014-02-27 20:37:30 -08003383struct bdaddr_list *hci_white_list_lookup(struct hci_dev *hdev,
3384 bdaddr_t *bdaddr, u8 type)
3385{
3386 struct bdaddr_list *b;
3387
3388 list_for_each_entry(b, &hdev->le_white_list, list) {
3389 if (!bacmp(&b->bdaddr, bdaddr) && b->bdaddr_type == type)
3390 return b;
3391 }
3392
3393 return NULL;
3394}
3395
3396void hci_white_list_clear(struct hci_dev *hdev)
3397{
3398 struct list_head *p, *n;
3399
3400 list_for_each_safe(p, n, &hdev->le_white_list) {
3401 struct bdaddr_list *b = list_entry(p, struct bdaddr_list, list);
3402
3403 list_del(p);
3404 kfree(b);
3405 }
3406}
3407
3408int hci_white_list_add(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type)
3409{
3410 struct bdaddr_list *entry;
3411
3412 if (!bacmp(bdaddr, BDADDR_ANY))
3413 return -EBADF;
3414
3415 entry = kzalloc(sizeof(struct bdaddr_list), GFP_KERNEL);
3416 if (!entry)
3417 return -ENOMEM;
3418
3419 bacpy(&entry->bdaddr, bdaddr);
3420 entry->bdaddr_type = type;
3421
3422 list_add(&entry->list, &hdev->le_white_list);
3423
3424 return 0;
3425}
3426
3427int hci_white_list_del(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type)
3428{
3429 struct bdaddr_list *entry;
3430
3431 if (!bacmp(bdaddr, BDADDR_ANY))
3432 return -EBADF;
3433
3434 entry = hci_white_list_lookup(hdev, bdaddr, type);
3435 if (!entry)
3436 return -ENOENT;
3437
3438 list_del(&entry->list);
3439 kfree(entry);
3440
3441 return 0;
3442}
3443
Andre Guedes15819a72014-02-03 13:56:18 -03003444/* This function requires the caller holds hdev->lock */
3445struct hci_conn_params *hci_conn_params_lookup(struct hci_dev *hdev,
3446 bdaddr_t *addr, u8 addr_type)
3447{
3448 struct hci_conn_params *params;
3449
3450 list_for_each_entry(params, &hdev->le_conn_params, list) {
3451 if (bacmp(&params->addr, addr) == 0 &&
3452 params->addr_type == addr_type) {
3453 return params;
3454 }
3455 }
3456
3457 return NULL;
3458}
3459
Andre Guedescef952c2014-02-26 20:21:49 -03003460static bool is_connected(struct hci_dev *hdev, bdaddr_t *addr, u8 type)
3461{
3462 struct hci_conn *conn;
3463
3464 conn = hci_conn_hash_lookup_ba(hdev, LE_LINK, addr);
3465 if (!conn)
3466 return false;
3467
3468 if (conn->dst_type != type)
3469 return false;
3470
3471 if (conn->state != BT_CONNECTED)
3472 return false;
3473
3474 return true;
3475}
3476
Andre Guedesa9b0a042014-02-26 20:21:52 -03003477static bool is_identity_address(bdaddr_t *addr, u8 addr_type)
3478{
3479 if (addr_type == ADDR_LE_DEV_PUBLIC)
3480 return true;
3481
3482 /* Check for Random Static address type */
3483 if ((addr->b[5] & 0xc0) == 0xc0)
3484 return true;
3485
3486 return false;
3487}
3488
Andre Guedes15819a72014-02-03 13:56:18 -03003489/* This function requires the caller holds hdev->lock */
Andre Guedesa9b0a042014-02-26 20:21:52 -03003490int hci_conn_params_add(struct hci_dev *hdev, bdaddr_t *addr, u8 addr_type,
3491 u8 auto_connect, u16 conn_min_interval,
3492 u16 conn_max_interval)
Andre Guedes15819a72014-02-03 13:56:18 -03003493{
3494 struct hci_conn_params *params;
3495
Andre Guedesa9b0a042014-02-26 20:21:52 -03003496 if (!is_identity_address(addr, addr_type))
3497 return -EINVAL;
3498
Andre Guedes15819a72014-02-03 13:56:18 -03003499 params = hci_conn_params_lookup(hdev, addr, addr_type);
Andre Guedescef952c2014-02-26 20:21:49 -03003500 if (params)
3501 goto update;
Andre Guedes15819a72014-02-03 13:56:18 -03003502
3503 params = kzalloc(sizeof(*params), GFP_KERNEL);
3504 if (!params) {
3505 BT_ERR("Out of memory");
Andre Guedesa9b0a042014-02-26 20:21:52 -03003506 return -ENOMEM;
Andre Guedes15819a72014-02-03 13:56:18 -03003507 }
3508
3509 bacpy(&params->addr, addr);
3510 params->addr_type = addr_type;
Andre Guedescef952c2014-02-26 20:21:49 -03003511
3512 list_add(&params->list, &hdev->le_conn_params);
3513
3514update:
Andre Guedes15819a72014-02-03 13:56:18 -03003515 params->conn_min_interval = conn_min_interval;
3516 params->conn_max_interval = conn_max_interval;
Andre Guedes9fcb18e2014-02-26 20:21:48 -03003517 params->auto_connect = auto_connect;
Andre Guedes15819a72014-02-03 13:56:18 -03003518
Andre Guedescef952c2014-02-26 20:21:49 -03003519 switch (auto_connect) {
3520 case HCI_AUTO_CONN_DISABLED:
3521 case HCI_AUTO_CONN_LINK_LOSS:
3522 hci_pend_le_conn_del(hdev, addr, addr_type);
3523 break;
3524 case HCI_AUTO_CONN_ALWAYS:
3525 if (!is_connected(hdev, addr, addr_type))
3526 hci_pend_le_conn_add(hdev, addr, addr_type);
3527 break;
3528 }
Andre Guedes15819a72014-02-03 13:56:18 -03003529
Andre Guedes9fcb18e2014-02-26 20:21:48 -03003530 BT_DBG("addr %pMR (type %u) auto_connect %u conn_min_interval 0x%.4x "
3531 "conn_max_interval 0x%.4x", addr, addr_type, auto_connect,
3532 conn_min_interval, conn_max_interval);
Andre Guedesa9b0a042014-02-26 20:21:52 -03003533
3534 return 0;
Andre Guedes15819a72014-02-03 13:56:18 -03003535}
3536
3537/* This function requires the caller holds hdev->lock */
3538void hci_conn_params_del(struct hci_dev *hdev, bdaddr_t *addr, u8 addr_type)
3539{
3540 struct hci_conn_params *params;
3541
3542 params = hci_conn_params_lookup(hdev, addr, addr_type);
3543 if (!params)
3544 return;
3545
Andre Guedescef952c2014-02-26 20:21:49 -03003546 hci_pend_le_conn_del(hdev, addr, addr_type);
3547
Andre Guedes15819a72014-02-03 13:56:18 -03003548 list_del(&params->list);
3549 kfree(params);
3550
3551 BT_DBG("addr %pMR (type %u)", addr, addr_type);
3552}
3553
3554/* This function requires the caller holds hdev->lock */
3555void hci_conn_params_clear(struct hci_dev *hdev)
3556{
3557 struct hci_conn_params *params, *tmp;
3558
3559 list_for_each_entry_safe(params, tmp, &hdev->le_conn_params, list) {
3560 list_del(&params->list);
3561 kfree(params);
3562 }
3563
3564 BT_DBG("All LE connection parameters were removed");
3565}
3566
Andre Guedes77a77a32014-02-26 20:21:46 -03003567/* This function requires the caller holds hdev->lock */
3568struct bdaddr_list *hci_pend_le_conn_lookup(struct hci_dev *hdev,
3569 bdaddr_t *addr, u8 addr_type)
3570{
3571 struct bdaddr_list *entry;
3572
3573 list_for_each_entry(entry, &hdev->pend_le_conns, list) {
3574 if (bacmp(&entry->bdaddr, addr) == 0 &&
3575 entry->bdaddr_type == addr_type)
3576 return entry;
3577 }
3578
3579 return NULL;
3580}
3581
3582/* This function requires the caller holds hdev->lock */
3583void hci_pend_le_conn_add(struct hci_dev *hdev, bdaddr_t *addr, u8 addr_type)
3584{
3585 struct bdaddr_list *entry;
3586
3587 entry = hci_pend_le_conn_lookup(hdev, addr, addr_type);
3588 if (entry)
Andre Guedesa4790db2014-02-26 20:21:47 -03003589 goto done;
Andre Guedes77a77a32014-02-26 20:21:46 -03003590
3591 entry = kzalloc(sizeof(*entry), GFP_KERNEL);
3592 if (!entry) {
3593 BT_ERR("Out of memory");
3594 return;
3595 }
3596
3597 bacpy(&entry->bdaddr, addr);
3598 entry->bdaddr_type = addr_type;
3599
3600 list_add(&entry->list, &hdev->pend_le_conns);
3601
3602 BT_DBG("addr %pMR (type %u)", addr, addr_type);
Andre Guedesa4790db2014-02-26 20:21:47 -03003603
3604done:
3605 hci_update_background_scan(hdev);
Andre Guedes77a77a32014-02-26 20:21:46 -03003606}
3607
3608/* This function requires the caller holds hdev->lock */
3609void hci_pend_le_conn_del(struct hci_dev *hdev, bdaddr_t *addr, u8 addr_type)
3610{
3611 struct bdaddr_list *entry;
3612
3613 entry = hci_pend_le_conn_lookup(hdev, addr, addr_type);
3614 if (!entry)
Andre Guedesa4790db2014-02-26 20:21:47 -03003615 goto done;
Andre Guedes77a77a32014-02-26 20:21:46 -03003616
3617 list_del(&entry->list);
3618 kfree(entry);
3619
3620 BT_DBG("addr %pMR (type %u)", addr, addr_type);
Andre Guedesa4790db2014-02-26 20:21:47 -03003621
3622done:
3623 hci_update_background_scan(hdev);
Andre Guedes77a77a32014-02-26 20:21:46 -03003624}
3625
3626/* This function requires the caller holds hdev->lock */
3627void hci_pend_le_conns_clear(struct hci_dev *hdev)
3628{
3629 struct bdaddr_list *entry, *tmp;
3630
3631 list_for_each_entry_safe(entry, tmp, &hdev->pend_le_conns, list) {
3632 list_del(&entry->list);
3633 kfree(entry);
3634 }
3635
3636 BT_DBG("All LE pending connections cleared");
3637}
3638
Andre Guedes4c87eaa2013-04-30 15:29:32 -03003639static void inquiry_complete(struct hci_dev *hdev, u8 status)
Andre Guedes7ba8b4b2012-02-03 17:47:59 -03003640{
Andre Guedes4c87eaa2013-04-30 15:29:32 -03003641 if (status) {
3642 BT_ERR("Failed to start inquiry: status %d", status);
Andre Guedes7ba8b4b2012-02-03 17:47:59 -03003643
Andre Guedes4c87eaa2013-04-30 15:29:32 -03003644 hci_dev_lock(hdev);
3645 hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
3646 hci_dev_unlock(hdev);
3647 return;
3648 }
Andre Guedes7ba8b4b2012-02-03 17:47:59 -03003649}
3650
Andre Guedes4c87eaa2013-04-30 15:29:32 -03003651static void le_scan_disable_work_complete(struct hci_dev *hdev, u8 status)
Andre Guedes7ba8b4b2012-02-03 17:47:59 -03003652{
Andre Guedes4c87eaa2013-04-30 15:29:32 -03003653 /* General inquiry access code (GIAC) */
3654 u8 lap[3] = { 0x33, 0x8b, 0x9e };
3655 struct hci_request req;
3656 struct hci_cp_inquiry cp;
Andre Guedes7ba8b4b2012-02-03 17:47:59 -03003657 int err;
3658
Andre Guedes4c87eaa2013-04-30 15:29:32 -03003659 if (status) {
3660 BT_ERR("Failed to disable LE scanning: status %d", status);
3661 return;
Andre Guedes7dbfac12012-03-15 16:52:07 -03003662 }
3663
Andre Guedes4c87eaa2013-04-30 15:29:32 -03003664 switch (hdev->discovery.type) {
3665 case DISCOV_TYPE_LE:
3666 hci_dev_lock(hdev);
3667 hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
3668 hci_dev_unlock(hdev);
3669 break;
3670
3671 case DISCOV_TYPE_INTERLEAVED:
3672 hci_req_init(&req, hdev);
3673
3674 memset(&cp, 0, sizeof(cp));
3675 memcpy(&cp.lap, lap, sizeof(cp.lap));
3676 cp.length = DISCOV_INTERLEAVED_INQUIRY_LEN;
3677 hci_req_add(&req, HCI_OP_INQUIRY, sizeof(cp), &cp);
3678
3679 hci_dev_lock(hdev);
3680
3681 hci_inquiry_cache_flush(hdev);
3682
3683 err = hci_req_run(&req, inquiry_complete);
3684 if (err) {
3685 BT_ERR("Inquiry request failed: err %d", err);
3686 hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
3687 }
3688
3689 hci_dev_unlock(hdev);
3690 break;
3691 }
Andre Guedes7dbfac12012-03-15 16:52:07 -03003692}
3693
Andre Guedes7ba8b4b2012-02-03 17:47:59 -03003694static void le_scan_disable_work(struct work_struct *work)
3695{
3696 struct hci_dev *hdev = container_of(work, struct hci_dev,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03003697 le_scan_disable.work);
Andre Guedes4c87eaa2013-04-30 15:29:32 -03003698 struct hci_request req;
3699 int err;
Andre Guedes7ba8b4b2012-02-03 17:47:59 -03003700
3701 BT_DBG("%s", hdev->name);
3702
Andre Guedes4c87eaa2013-04-30 15:29:32 -03003703 hci_req_init(&req, hdev);
Andre Guedes7ba8b4b2012-02-03 17:47:59 -03003704
Andre Guedesb1efcc22014-02-26 20:21:40 -03003705 hci_req_add_le_scan_disable(&req);
Andre Guedes7ba8b4b2012-02-03 17:47:59 -03003706
Andre Guedes4c87eaa2013-04-30 15:29:32 -03003707 err = hci_req_run(&req, le_scan_disable_work_complete);
3708 if (err)
3709 BT_ERR("Disable LE scanning request failed: err %d", err);
Andre Guedes28b75a82012-02-03 17:48:00 -03003710}
3711
Johan Hedberg8d972502014-02-28 12:54:14 +02003712static void set_random_addr(struct hci_request *req, bdaddr_t *rpa)
3713{
3714 struct hci_dev *hdev = req->hdev;
3715
3716 /* If we're advertising or initiating an LE connection we can't
3717 * go ahead and change the random address at this time. This is
3718 * because the eventual initiator address used for the
3719 * subsequently created connection will be undefined (some
3720 * controllers use the new address and others the one we had
3721 * when the operation started).
3722 *
3723 * In this kind of scenario skip the update and let the random
3724 * address be updated at the next cycle.
3725 */
3726 if (test_bit(HCI_ADVERTISING, &hdev->dev_flags) ||
3727 hci_conn_hash_lookup_state(hdev, LE_LINK, BT_CONNECT)) {
3728 BT_DBG("Deferring random address update");
3729 return;
3730 }
3731
3732 hci_req_add(req, HCI_OP_LE_SET_RANDOM_ADDR, 6, rpa);
3733}
3734
Marcel Holtmann94b1fc92014-02-23 20:25:54 -08003735int hci_update_random_address(struct hci_request *req, bool require_privacy,
3736 u8 *own_addr_type)
Johan Hedbergebd3a742014-02-23 19:42:21 +02003737{
3738 struct hci_dev *hdev = req->hdev;
3739 int err;
3740
3741 /* If privacy is enabled use a resolvable private address. If
Marcel Holtmann2b5224d2014-02-23 20:39:22 -08003742 * current RPA has expired or there is something else than
3743 * the current RPA in use, then generate a new one.
Johan Hedbergebd3a742014-02-23 19:42:21 +02003744 */
3745 if (test_bit(HCI_PRIVACY, &hdev->dev_flags)) {
Johan Hedbergebd3a742014-02-23 19:42:21 +02003746 int to;
3747
3748 *own_addr_type = ADDR_LE_DEV_RANDOM;
3749
3750 if (!test_and_clear_bit(HCI_RPA_EXPIRED, &hdev->dev_flags) &&
Marcel Holtmann2b5224d2014-02-23 20:39:22 -08003751 !bacmp(&hdev->random_addr, &hdev->rpa))
Johan Hedbergebd3a742014-02-23 19:42:21 +02003752 return 0;
3753
Marcel Holtmann2b5224d2014-02-23 20:39:22 -08003754 err = smp_generate_rpa(hdev->tfm_aes, hdev->irk, &hdev->rpa);
Johan Hedbergebd3a742014-02-23 19:42:21 +02003755 if (err < 0) {
3756 BT_ERR("%s failed to generate new RPA", hdev->name);
3757 return err;
3758 }
3759
Johan Hedberg8d972502014-02-28 12:54:14 +02003760 set_random_addr(req, &hdev->rpa);
Johan Hedbergebd3a742014-02-23 19:42:21 +02003761
3762 to = msecs_to_jiffies(hdev->rpa_timeout * 1000);
3763 queue_delayed_work(hdev->workqueue, &hdev->rpa_expired, to);
3764
3765 return 0;
3766 }
3767
Marcel Holtmann94b1fc92014-02-23 20:25:54 -08003768 /* In case of required privacy without resolvable private address,
3769 * use an unresolvable private address. This is useful for active
3770 * scanning and non-connectable advertising.
3771 */
3772 if (require_privacy) {
3773 bdaddr_t urpa;
3774
3775 get_random_bytes(&urpa, 6);
3776 urpa.b[5] &= 0x3f; /* Clear two most significant bits */
3777
3778 *own_addr_type = ADDR_LE_DEV_RANDOM;
Johan Hedberg8d972502014-02-28 12:54:14 +02003779 set_random_addr(req, &urpa);
Marcel Holtmann94b1fc92014-02-23 20:25:54 -08003780 return 0;
3781 }
3782
Johan Hedbergebd3a742014-02-23 19:42:21 +02003783 /* If forcing static address is in use or there is no public
3784 * address use the static address as random address (but skip
3785 * the HCI command if the current random address is already the
3786 * static one.
3787 */
3788 if (test_bit(HCI_FORCE_STATIC_ADDR, &hdev->dev_flags) ||
3789 !bacmp(&hdev->bdaddr, BDADDR_ANY)) {
3790 *own_addr_type = ADDR_LE_DEV_RANDOM;
3791 if (bacmp(&hdev->static_addr, &hdev->random_addr))
3792 hci_req_add(req, HCI_OP_LE_SET_RANDOM_ADDR, 6,
3793 &hdev->static_addr);
3794 return 0;
3795 }
3796
3797 /* Neither privacy nor static address is being used so use a
3798 * public address.
3799 */
3800 *own_addr_type = ADDR_LE_DEV_PUBLIC;
3801
3802 return 0;
3803}
3804
Johan Hedberga1f4c312014-02-27 14:05:41 +02003805/* Copy the Identity Address of the controller.
3806 *
3807 * If the controller has a public BD_ADDR, then by default use that one.
3808 * If this is a LE only controller without a public address, default to
3809 * the static random address.
3810 *
3811 * For debugging purposes it is possible to force controllers with a
3812 * public address to use the static random address instead.
3813 */
3814void hci_copy_identity_address(struct hci_dev *hdev, bdaddr_t *bdaddr,
3815 u8 *bdaddr_type)
3816{
3817 if (test_bit(HCI_FORCE_STATIC_ADDR, &hdev->dev_flags) ||
3818 !bacmp(&hdev->bdaddr, BDADDR_ANY)) {
3819 bacpy(bdaddr, &hdev->static_addr);
3820 *bdaddr_type = ADDR_LE_DEV_RANDOM;
3821 } else {
3822 bacpy(bdaddr, &hdev->bdaddr);
3823 *bdaddr_type = ADDR_LE_DEV_PUBLIC;
3824 }
3825}
3826
David Herrmann9be0dab2012-04-22 14:39:57 +02003827/* Alloc HCI device */
3828struct hci_dev *hci_alloc_dev(void)
3829{
3830 struct hci_dev *hdev;
3831
3832 hdev = kzalloc(sizeof(struct hci_dev), GFP_KERNEL);
3833 if (!hdev)
3834 return NULL;
3835
David Herrmannb1b813d2012-04-22 14:39:58 +02003836 hdev->pkt_type = (HCI_DM1 | HCI_DH1 | HCI_HV1);
3837 hdev->esco_type = (ESCO_HV1);
3838 hdev->link_mode = (HCI_LM_ACCEPT);
Marcel Holtmannb4cb9fb2013-10-14 13:56:16 -07003839 hdev->num_iac = 0x01; /* One IAC support is mandatory */
3840 hdev->io_capability = 0x03; /* No Input No Output */
Johan Hedbergbbaf4442012-11-08 01:22:59 +01003841 hdev->inq_tx_power = HCI_TX_POWER_INVALID;
3842 hdev->adv_tx_power = HCI_TX_POWER_INVALID;
David Herrmannb1b813d2012-04-22 14:39:58 +02003843
David Herrmannb1b813d2012-04-22 14:39:58 +02003844 hdev->sniff_max_interval = 800;
3845 hdev->sniff_min_interval = 80;
3846
Marcel Holtmann3f959d42014-02-20 11:55:56 -08003847 hdev->le_adv_channel_map = 0x07;
Marcel Holtmannbef64732013-10-11 08:23:19 -07003848 hdev->le_scan_interval = 0x0060;
3849 hdev->le_scan_window = 0x0030;
Marcel Holtmann4e70c7e2013-10-19 07:09:13 -07003850 hdev->le_conn_min_interval = 0x0028;
3851 hdev->le_conn_max_interval = 0x0038;
Marcel Holtmannbef64732013-10-11 08:23:19 -07003852
Johan Hedbergd6bfd592014-02-23 19:42:20 +02003853 hdev->rpa_timeout = HCI_DEFAULT_RPA_TIMEOUT;
Lukasz Rymanowskib9a7a612014-03-27 20:55:20 +01003854 hdev->discov_interleaved_timeout = DISCOV_INTERLEAVED_TIMEOUT;
Andrzej Kaczmarek31ad1692014-05-14 13:43:02 +02003855 hdev->conn_info_min_age = DEFAULT_CONN_INFO_MIN_AGE;
3856 hdev->conn_info_max_age = DEFAULT_CONN_INFO_MAX_AGE;
Johan Hedbergd6bfd592014-02-23 19:42:20 +02003857
David Herrmannb1b813d2012-04-22 14:39:58 +02003858 mutex_init(&hdev->lock);
3859 mutex_init(&hdev->req_lock);
3860
3861 INIT_LIST_HEAD(&hdev->mgmt_pending);
3862 INIT_LIST_HEAD(&hdev->blacklist);
3863 INIT_LIST_HEAD(&hdev->uuids);
3864 INIT_LIST_HEAD(&hdev->link_keys);
3865 INIT_LIST_HEAD(&hdev->long_term_keys);
Johan Hedberg970c4e42014-02-18 10:19:33 +02003866 INIT_LIST_HEAD(&hdev->identity_resolving_keys);
David Herrmannb1b813d2012-04-22 14:39:58 +02003867 INIT_LIST_HEAD(&hdev->remote_oob_data);
Marcel Holtmannd2ab0ac2014-02-27 20:37:30 -08003868 INIT_LIST_HEAD(&hdev->le_white_list);
Andre Guedes15819a72014-02-03 13:56:18 -03003869 INIT_LIST_HEAD(&hdev->le_conn_params);
Andre Guedes77a77a32014-02-26 20:21:46 -03003870 INIT_LIST_HEAD(&hdev->pend_le_conns);
Andrei Emeltchenko6b536b52012-08-31 16:39:28 +03003871 INIT_LIST_HEAD(&hdev->conn_hash.list);
David Herrmannb1b813d2012-04-22 14:39:58 +02003872
3873 INIT_WORK(&hdev->rx_work, hci_rx_work);
3874 INIT_WORK(&hdev->cmd_work, hci_cmd_work);
3875 INIT_WORK(&hdev->tx_work, hci_tx_work);
3876 INIT_WORK(&hdev->power_on, hci_power_on);
David Herrmannb1b813d2012-04-22 14:39:58 +02003877
David Herrmannb1b813d2012-04-22 14:39:58 +02003878 INIT_DELAYED_WORK(&hdev->power_off, hci_power_off);
3879 INIT_DELAYED_WORK(&hdev->discov_off, hci_discov_off);
3880 INIT_DELAYED_WORK(&hdev->le_scan_disable, le_scan_disable_work);
3881
David Herrmannb1b813d2012-04-22 14:39:58 +02003882 skb_queue_head_init(&hdev->rx_q);
3883 skb_queue_head_init(&hdev->cmd_q);
3884 skb_queue_head_init(&hdev->raw_q);
3885
3886 init_waitqueue_head(&hdev->req_wait_q);
3887
Marcel Holtmann65cc2b42014-06-16 12:30:56 +02003888 INIT_DELAYED_WORK(&hdev->cmd_timer, hci_cmd_timeout);
David Herrmannb1b813d2012-04-22 14:39:58 +02003889
David Herrmannb1b813d2012-04-22 14:39:58 +02003890 hci_init_sysfs(hdev);
3891 discovery_init(hdev);
David Herrmann9be0dab2012-04-22 14:39:57 +02003892
3893 return hdev;
3894}
3895EXPORT_SYMBOL(hci_alloc_dev);
3896
3897/* Free HCI device */
3898void hci_free_dev(struct hci_dev *hdev)
3899{
David Herrmann9be0dab2012-04-22 14:39:57 +02003900 /* will free via device release */
3901 put_device(&hdev->dev);
3902}
3903EXPORT_SYMBOL(hci_free_dev);
3904
Linus Torvalds1da177e2005-04-16 15:20:36 -07003905/* Register HCI device */
3906int hci_register_dev(struct hci_dev *hdev)
3907{
David Herrmannb1b813d2012-04-22 14:39:58 +02003908 int id, error;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003909
David Herrmann010666a2012-01-07 15:47:07 +01003910 if (!hdev->open || !hdev->close)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003911 return -EINVAL;
3912
Mat Martineau08add512011-11-02 16:18:36 -07003913 /* Do not allow HCI_AMP devices to register at index 0,
3914 * so the index can be used as the AMP controller ID.
3915 */
Sasha Levin3df92b32012-05-27 22:36:56 +02003916 switch (hdev->dev_type) {
3917 case HCI_BREDR:
3918 id = ida_simple_get(&hci_index_ida, 0, 0, GFP_KERNEL);
3919 break;
3920 case HCI_AMP:
3921 id = ida_simple_get(&hci_index_ida, 1, 0, GFP_KERNEL);
3922 break;
3923 default:
3924 return -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003925 }
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09003926
Sasha Levin3df92b32012-05-27 22:36:56 +02003927 if (id < 0)
3928 return id;
3929
Linus Torvalds1da177e2005-04-16 15:20:36 -07003930 sprintf(hdev->name, "hci%d", id);
3931 hdev->id = id;
Andrei Emeltchenko2d8b3a12012-04-16 16:32:04 +03003932
3933 BT_DBG("%p name %s bus %d", hdev, hdev->name, hdev->bus);
3934
Kees Cookd8537542013-07-03 15:04:57 -07003935 hdev->workqueue = alloc_workqueue("%s", WQ_HIGHPRI | WQ_UNBOUND |
3936 WQ_MEM_RECLAIM, 1, hdev->name);
David Herrmann33ca9542011-10-08 14:58:49 +02003937 if (!hdev->workqueue) {
3938 error = -ENOMEM;
3939 goto err;
3940 }
Marcel Holtmannf48fd9c2010-03-20 15:20:04 +01003941
Kees Cookd8537542013-07-03 15:04:57 -07003942 hdev->req_workqueue = alloc_workqueue("%s", WQ_HIGHPRI | WQ_UNBOUND |
3943 WQ_MEM_RECLAIM, 1, hdev->name);
Johan Hedberg6ead1bb2013-01-14 22:33:50 +02003944 if (!hdev->req_workqueue) {
3945 destroy_workqueue(hdev->workqueue);
3946 error = -ENOMEM;
3947 goto err;
3948 }
3949
Marcel Holtmann0153e2e2013-10-17 17:24:17 -07003950 if (!IS_ERR_OR_NULL(bt_debugfs))
3951 hdev->debugfs = debugfs_create_dir(hdev->name, bt_debugfs);
3952
Marcel Holtmannbdc3e0f2013-10-17 17:24:19 -07003953 dev_set_name(&hdev->dev, "%s", hdev->name);
3954
Johan Hedberg99780a72014-02-18 10:40:07 +02003955 hdev->tfm_aes = crypto_alloc_blkcipher("ecb(aes)", 0,
3956 CRYPTO_ALG_ASYNC);
3957 if (IS_ERR(hdev->tfm_aes)) {
3958 BT_ERR("Unable to create crypto context");
3959 error = PTR_ERR(hdev->tfm_aes);
3960 hdev->tfm_aes = NULL;
3961 goto err_wqueue;
3962 }
3963
Marcel Holtmannbdc3e0f2013-10-17 17:24:19 -07003964 error = device_add(&hdev->dev);
David Herrmann33ca9542011-10-08 14:58:49 +02003965 if (error < 0)
Johan Hedberg99780a72014-02-18 10:40:07 +02003966 goto err_tfm;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003967
Marcel Holtmann611b30f2009-06-08 14:41:38 +02003968 hdev->rfkill = rfkill_alloc(hdev->name, &hdev->dev,
Gustavo Padovana8c5fb12012-05-17 00:36:26 -03003969 RFKILL_TYPE_BLUETOOTH, &hci_rfkill_ops,
3970 hdev);
Marcel Holtmann611b30f2009-06-08 14:41:38 +02003971 if (hdev->rfkill) {
3972 if (rfkill_register(hdev->rfkill) < 0) {
3973 rfkill_destroy(hdev->rfkill);
3974 hdev->rfkill = NULL;
3975 }
3976 }
3977
Johan Hedberg5e130362013-09-13 08:58:17 +03003978 if (hdev->rfkill && rfkill_blocked(hdev->rfkill))
3979 set_bit(HCI_RFKILLED, &hdev->dev_flags);
3980
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02003981 set_bit(HCI_SETUP, &hdev->dev_flags);
Marcel Holtmann004b0252013-10-07 00:58:32 -07003982 set_bit(HCI_AUTO_OFF, &hdev->dev_flags);
Andrei Emeltchenkoce2be9a2012-06-29 15:07:00 +03003983
Marcel Holtmann01cd3402013-10-06 01:16:22 -07003984 if (hdev->dev_type == HCI_BREDR) {
Johan Hedberg56f87902013-10-02 13:43:13 +03003985 /* Assume BR/EDR support until proven otherwise (such as
3986 * through reading supported features during init.
3987 */
3988 set_bit(HCI_BREDR_ENABLED, &hdev->dev_flags);
3989 }
Andrei Emeltchenkoce2be9a2012-06-29 15:07:00 +03003990
Gustavo Padovanfcee3372013-07-11 11:34:28 +01003991 write_lock(&hci_dev_list_lock);
3992 list_add(&hdev->list, &hci_dev_list);
3993 write_unlock(&hci_dev_list_lock);
3994
Linus Torvalds1da177e2005-04-16 15:20:36 -07003995 hci_notify(hdev, HCI_DEV_REG);
David Herrmanndc946bd2012-01-07 15:47:24 +01003996 hci_dev_hold(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003997
Johan Hedberg19202572013-01-14 22:33:51 +02003998 queue_work(hdev->req_workqueue, &hdev->power_on);
Marcel Holtmannfbe96d62012-10-30 01:35:40 -07003999
Linus Torvalds1da177e2005-04-16 15:20:36 -07004000 return id;
Marcel Holtmannf48fd9c2010-03-20 15:20:04 +01004001
Johan Hedberg99780a72014-02-18 10:40:07 +02004002err_tfm:
4003 crypto_free_blkcipher(hdev->tfm_aes);
David Herrmann33ca9542011-10-08 14:58:49 +02004004err_wqueue:
4005 destroy_workqueue(hdev->workqueue);
Johan Hedberg6ead1bb2013-01-14 22:33:50 +02004006 destroy_workqueue(hdev->req_workqueue);
David Herrmann33ca9542011-10-08 14:58:49 +02004007err:
Sasha Levin3df92b32012-05-27 22:36:56 +02004008 ida_simple_remove(&hci_index_ida, hdev->id);
Marcel Holtmannf48fd9c2010-03-20 15:20:04 +01004009
David Herrmann33ca9542011-10-08 14:58:49 +02004010 return error;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004011}
4012EXPORT_SYMBOL(hci_register_dev);
4013
4014/* Unregister HCI device */
David Herrmann59735632011-10-26 10:43:19 +02004015void hci_unregister_dev(struct hci_dev *hdev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004016{
Sasha Levin3df92b32012-05-27 22:36:56 +02004017 int i, id;
Marcel Holtmannef222012007-07-11 06:42:04 +02004018
Marcel Holtmannc13854c2010-02-08 15:27:07 +01004019 BT_DBG("%p name %s bus %d", hdev, hdev->name, hdev->bus);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004020
Johan Hovold94324962012-03-15 14:48:41 +01004021 set_bit(HCI_UNREGISTER, &hdev->dev_flags);
4022
Sasha Levin3df92b32012-05-27 22:36:56 +02004023 id = hdev->id;
4024
Gustavo F. Padovanf20d09d2011-12-22 16:30:27 -02004025 write_lock(&hci_dev_list_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004026 list_del(&hdev->list);
Gustavo F. Padovanf20d09d2011-12-22 16:30:27 -02004027 write_unlock(&hci_dev_list_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004028
4029 hci_dev_do_close(hdev);
4030
Suraj Sumangalacd4c5392010-07-14 13:02:16 +05304031 for (i = 0; i < NUM_REASSEMBLY; i++)
Marcel Holtmannef222012007-07-11 06:42:04 +02004032 kfree_skb(hdev->reassembly[i]);
4033
Gustavo Padovanb9b5ef12012-11-21 00:50:21 -02004034 cancel_work_sync(&hdev->power_on);
4035
Johan Hedbergab81cbf2010-12-15 13:53:18 +02004036 if (!test_bit(HCI_INIT, &hdev->flags) &&
Gustavo Padovana8c5fb12012-05-17 00:36:26 -03004037 !test_bit(HCI_SETUP, &hdev->dev_flags)) {
Gustavo F. Padovan09fd0de2011-06-17 13:03:21 -03004038 hci_dev_lock(hdev);
Johan Hedberg744cf192011-11-08 20:40:14 +02004039 mgmt_index_removed(hdev);
Gustavo F. Padovan09fd0de2011-06-17 13:03:21 -03004040 hci_dev_unlock(hdev);
Johan Hedberg56e5cb82011-11-08 20:40:16 +02004041 }
Johan Hedbergab81cbf2010-12-15 13:53:18 +02004042
Johan Hedberg2e58ef32011-11-08 20:40:15 +02004043 /* mgmt_index_removed should take care of emptying the
4044 * pending list */
4045 BUG_ON(!list_empty(&hdev->mgmt_pending));
4046
Linus Torvalds1da177e2005-04-16 15:20:36 -07004047 hci_notify(hdev, HCI_DEV_UNREG);
4048
Marcel Holtmann611b30f2009-06-08 14:41:38 +02004049 if (hdev->rfkill) {
4050 rfkill_unregister(hdev->rfkill);
4051 rfkill_destroy(hdev->rfkill);
4052 }
4053
Johan Hedberg99780a72014-02-18 10:40:07 +02004054 if (hdev->tfm_aes)
4055 crypto_free_blkcipher(hdev->tfm_aes);
4056
Marcel Holtmannbdc3e0f2013-10-17 17:24:19 -07004057 device_del(&hdev->dev);
Dave Young147e2d52008-03-05 18:45:59 -08004058
Marcel Holtmann0153e2e2013-10-17 17:24:17 -07004059 debugfs_remove_recursive(hdev->debugfs);
4060
Marcel Holtmannf48fd9c2010-03-20 15:20:04 +01004061 destroy_workqueue(hdev->workqueue);
Johan Hedberg6ead1bb2013-01-14 22:33:50 +02004062 destroy_workqueue(hdev->req_workqueue);
Marcel Holtmannf48fd9c2010-03-20 15:20:04 +01004063
Gustavo F. Padovan09fd0de2011-06-17 13:03:21 -03004064 hci_dev_lock(hdev);
Johan Hedberge2e0cac2011-01-04 12:08:50 +02004065 hci_blacklist_clear(hdev);
Johan Hedberg2aeb9a12011-01-04 12:08:51 +02004066 hci_uuids_clear(hdev);
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02004067 hci_link_keys_clear(hdev);
Vinicius Costa Gomesb899efa2012-02-02 21:08:00 -03004068 hci_smp_ltks_clear(hdev);
Johan Hedberg970c4e42014-02-18 10:19:33 +02004069 hci_smp_irks_clear(hdev);
Szymon Janc2763eda2011-03-22 13:12:22 +01004070 hci_remote_oob_data_clear(hdev);
Marcel Holtmannd2ab0ac2014-02-27 20:37:30 -08004071 hci_white_list_clear(hdev);
Andre Guedes15819a72014-02-03 13:56:18 -03004072 hci_conn_params_clear(hdev);
Andre Guedes77a77a32014-02-26 20:21:46 -03004073 hci_pend_le_conns_clear(hdev);
Gustavo F. Padovan09fd0de2011-06-17 13:03:21 -03004074 hci_dev_unlock(hdev);
Johan Hedberge2e0cac2011-01-04 12:08:50 +02004075
David Herrmanndc946bd2012-01-07 15:47:24 +01004076 hci_dev_put(hdev);
Sasha Levin3df92b32012-05-27 22:36:56 +02004077
4078 ida_simple_remove(&hci_index_ida, id);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004079}
4080EXPORT_SYMBOL(hci_unregister_dev);
4081
4082/* Suspend HCI device */
4083int hci_suspend_dev(struct hci_dev *hdev)
4084{
4085 hci_notify(hdev, HCI_DEV_SUSPEND);
4086 return 0;
4087}
4088EXPORT_SYMBOL(hci_suspend_dev);
4089
4090/* Resume HCI device */
4091int hci_resume_dev(struct hci_dev *hdev)
4092{
4093 hci_notify(hdev, HCI_DEV_RESUME);
4094 return 0;
4095}
4096EXPORT_SYMBOL(hci_resume_dev);
4097
Marcel Holtmann76bca882009-11-18 00:40:39 +01004098/* Receive frame from HCI drivers */
Marcel Holtmanne1a26172013-10-10 16:52:43 -07004099int hci_recv_frame(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmann76bca882009-11-18 00:40:39 +01004100{
Marcel Holtmann76bca882009-11-18 00:40:39 +01004101 if (!hdev || (!test_bit(HCI_UP, &hdev->flags)
Gustavo Padovana8c5fb12012-05-17 00:36:26 -03004102 && !test_bit(HCI_INIT, &hdev->flags))) {
Marcel Holtmann76bca882009-11-18 00:40:39 +01004103 kfree_skb(skb);
4104 return -ENXIO;
4105 }
4106
Jorrit Schippersd82603c2012-12-27 17:33:02 +01004107 /* Incoming skb */
Marcel Holtmann76bca882009-11-18 00:40:39 +01004108 bt_cb(skb)->incoming = 1;
4109
4110 /* Time stamp */
4111 __net_timestamp(skb);
4112
Marcel Holtmann76bca882009-11-18 00:40:39 +01004113 skb_queue_tail(&hdev->rx_q, skb);
Marcel Holtmannb78752c2010-08-08 23:06:53 -04004114 queue_work(hdev->workqueue, &hdev->rx_work);
Marcel Holtmannc78ae282009-11-18 01:02:54 +01004115
Marcel Holtmann76bca882009-11-18 00:40:39 +01004116 return 0;
4117}
4118EXPORT_SYMBOL(hci_recv_frame);
4119
Suraj Sumangala33e882a2010-07-14 13:02:17 +05304120static int hci_reassembly(struct hci_dev *hdev, int type, void *data,
Gustavo Padovana8c5fb12012-05-17 00:36:26 -03004121 int count, __u8 index)
Suraj Sumangala33e882a2010-07-14 13:02:17 +05304122{
4123 int len = 0;
4124 int hlen = 0;
4125 int remain = count;
4126 struct sk_buff *skb;
4127 struct bt_skb_cb *scb;
4128
4129 if ((type < HCI_ACLDATA_PKT || type > HCI_EVENT_PKT) ||
Gustavo Padovana8c5fb12012-05-17 00:36:26 -03004130 index >= NUM_REASSEMBLY)
Suraj Sumangala33e882a2010-07-14 13:02:17 +05304131 return -EILSEQ;
4132
4133 skb = hdev->reassembly[index];
4134
4135 if (!skb) {
4136 switch (type) {
4137 case HCI_ACLDATA_PKT:
4138 len = HCI_MAX_FRAME_SIZE;
4139 hlen = HCI_ACL_HDR_SIZE;
4140 break;
4141 case HCI_EVENT_PKT:
4142 len = HCI_MAX_EVENT_SIZE;
4143 hlen = HCI_EVENT_HDR_SIZE;
4144 break;
4145 case HCI_SCODATA_PKT:
4146 len = HCI_MAX_SCO_SIZE;
4147 hlen = HCI_SCO_HDR_SIZE;
4148 break;
4149 }
4150
Gustavo F. Padovan1e429f32011-04-04 18:25:14 -03004151 skb = bt_skb_alloc(len, GFP_ATOMIC);
Suraj Sumangala33e882a2010-07-14 13:02:17 +05304152 if (!skb)
4153 return -ENOMEM;
4154
4155 scb = (void *) skb->cb;
4156 scb->expect = hlen;
4157 scb->pkt_type = type;
4158
Suraj Sumangala33e882a2010-07-14 13:02:17 +05304159 hdev->reassembly[index] = skb;
4160 }
4161
4162 while (count) {
4163 scb = (void *) skb->cb;
Dan Carpenter89bb46d2012-02-28 09:57:59 +03004164 len = min_t(uint, scb->expect, count);
Suraj Sumangala33e882a2010-07-14 13:02:17 +05304165
4166 memcpy(skb_put(skb, len), data, len);
4167
4168 count -= len;
4169 data += len;
4170 scb->expect -= len;
4171 remain = count;
4172
4173 switch (type) {
4174 case HCI_EVENT_PKT:
4175 if (skb->len == HCI_EVENT_HDR_SIZE) {
4176 struct hci_event_hdr *h = hci_event_hdr(skb);
4177 scb->expect = h->plen;
4178
4179 if (skb_tailroom(skb) < scb->expect) {
4180 kfree_skb(skb);
4181 hdev->reassembly[index] = NULL;
4182 return -ENOMEM;
4183 }
4184 }
4185 break;
4186
4187 case HCI_ACLDATA_PKT:
4188 if (skb->len == HCI_ACL_HDR_SIZE) {
4189 struct hci_acl_hdr *h = hci_acl_hdr(skb);
4190 scb->expect = __le16_to_cpu(h->dlen);
4191
4192 if (skb_tailroom(skb) < scb->expect) {
4193 kfree_skb(skb);
4194 hdev->reassembly[index] = NULL;
4195 return -ENOMEM;
4196 }
4197 }
4198 break;
4199
4200 case HCI_SCODATA_PKT:
4201 if (skb->len == HCI_SCO_HDR_SIZE) {
4202 struct hci_sco_hdr *h = hci_sco_hdr(skb);
4203 scb->expect = h->dlen;
4204
4205 if (skb_tailroom(skb) < scb->expect) {
4206 kfree_skb(skb);
4207 hdev->reassembly[index] = NULL;
4208 return -ENOMEM;
4209 }
4210 }
4211 break;
4212 }
4213
4214 if (scb->expect == 0) {
4215 /* Complete frame */
4216
4217 bt_cb(skb)->pkt_type = type;
Marcel Holtmanne1a26172013-10-10 16:52:43 -07004218 hci_recv_frame(hdev, skb);
Suraj Sumangala33e882a2010-07-14 13:02:17 +05304219
4220 hdev->reassembly[index] = NULL;
4221 return remain;
4222 }
4223 }
4224
4225 return remain;
4226}
4227
Marcel Holtmannef222012007-07-11 06:42:04 +02004228int hci_recv_fragment(struct hci_dev *hdev, int type, void *data, int count)
4229{
Suraj Sumangalaf39a3c02010-07-14 13:02:18 +05304230 int rem = 0;
4231
Marcel Holtmannef222012007-07-11 06:42:04 +02004232 if (type < HCI_ACLDATA_PKT || type > HCI_EVENT_PKT)
4233 return -EILSEQ;
4234
Gustavo F. Padovanda5f6c32010-07-24 01:34:54 -03004235 while (count) {
Gustavo F. Padovan1e429f32011-04-04 18:25:14 -03004236 rem = hci_reassembly(hdev, type, data, count, type - 1);
Suraj Sumangalaf39a3c02010-07-14 13:02:18 +05304237 if (rem < 0)
4238 return rem;
Marcel Holtmannef222012007-07-11 06:42:04 +02004239
Suraj Sumangalaf39a3c02010-07-14 13:02:18 +05304240 data += (count - rem);
4241 count = rem;
Joe Perchesf81c6222011-06-03 11:51:19 +00004242 }
Marcel Holtmannef222012007-07-11 06:42:04 +02004243
Suraj Sumangalaf39a3c02010-07-14 13:02:18 +05304244 return rem;
Marcel Holtmannef222012007-07-11 06:42:04 +02004245}
4246EXPORT_SYMBOL(hci_recv_fragment);
4247
Suraj Sumangala99811512010-07-14 13:02:19 +05304248#define STREAM_REASSEMBLY 0
4249
4250int hci_recv_stream_fragment(struct hci_dev *hdev, void *data, int count)
4251{
4252 int type;
4253 int rem = 0;
4254
Gustavo F. Padovanda5f6c32010-07-24 01:34:54 -03004255 while (count) {
Suraj Sumangala99811512010-07-14 13:02:19 +05304256 struct sk_buff *skb = hdev->reassembly[STREAM_REASSEMBLY];
4257
4258 if (!skb) {
4259 struct { char type; } *pkt;
4260
4261 /* Start of the frame */
4262 pkt = data;
4263 type = pkt->type;
4264
4265 data++;
4266 count--;
4267 } else
4268 type = bt_cb(skb)->pkt_type;
4269
Gustavo F. Padovan1e429f32011-04-04 18:25:14 -03004270 rem = hci_reassembly(hdev, type, data, count,
Gustavo Padovana8c5fb12012-05-17 00:36:26 -03004271 STREAM_REASSEMBLY);
Suraj Sumangala99811512010-07-14 13:02:19 +05304272 if (rem < 0)
4273 return rem;
4274
4275 data += (count - rem);
4276 count = rem;
Joe Perchesf81c6222011-06-03 11:51:19 +00004277 }
Suraj Sumangala99811512010-07-14 13:02:19 +05304278
4279 return rem;
4280}
4281EXPORT_SYMBOL(hci_recv_stream_fragment);
4282
Linus Torvalds1da177e2005-04-16 15:20:36 -07004283/* ---- Interface to upper protocols ---- */
4284
Linus Torvalds1da177e2005-04-16 15:20:36 -07004285int hci_register_cb(struct hci_cb *cb)
4286{
4287 BT_DBG("%p name %s", cb, cb->name);
4288
Gustavo F. Padovanf20d09d2011-12-22 16:30:27 -02004289 write_lock(&hci_cb_list_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004290 list_add(&cb->list, &hci_cb_list);
Gustavo F. Padovanf20d09d2011-12-22 16:30:27 -02004291 write_unlock(&hci_cb_list_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004292
4293 return 0;
4294}
4295EXPORT_SYMBOL(hci_register_cb);
4296
4297int hci_unregister_cb(struct hci_cb *cb)
4298{
4299 BT_DBG("%p name %s", cb, cb->name);
4300
Gustavo F. Padovanf20d09d2011-12-22 16:30:27 -02004301 write_lock(&hci_cb_list_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004302 list_del(&cb->list);
Gustavo F. Padovanf20d09d2011-12-22 16:30:27 -02004303 write_unlock(&hci_cb_list_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004304
4305 return 0;
4306}
4307EXPORT_SYMBOL(hci_unregister_cb);
4308
Marcel Holtmann51086992013-10-10 14:54:19 -07004309static void hci_send_frame(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004310{
Marcel Holtmann0d48d932005-08-09 20:30:28 -07004311 BT_DBG("%s type %d len %d", hdev->name, bt_cb(skb)->pkt_type, skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004312
Marcel Holtmanncd82e612012-02-20 20:34:38 +01004313 /* Time stamp */
4314 __net_timestamp(skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004315
Marcel Holtmanncd82e612012-02-20 20:34:38 +01004316 /* Send copy to monitor */
4317 hci_send_to_monitor(hdev, skb);
4318
4319 if (atomic_read(&hdev->promisc)) {
4320 /* Send copy to the sockets */
Marcel Holtmann470fe1b2012-02-20 14:50:30 +01004321 hci_send_to_sock(hdev, skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004322 }
4323
4324 /* Get rid of skb owner, prior to sending to the driver. */
4325 skb_orphan(skb);
4326
Marcel Holtmann7bd8f092013-10-11 06:19:18 -07004327 if (hdev->send(hdev, skb) < 0)
Marcel Holtmann51086992013-10-10 14:54:19 -07004328 BT_ERR("%s sending frame failed", hdev->name);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004329}
4330
Johan Hedberg3119ae92013-03-05 20:37:44 +02004331void hci_req_init(struct hci_request *req, struct hci_dev *hdev)
4332{
4333 skb_queue_head_init(&req->cmd_q);
4334 req->hdev = hdev;
Andre Guedes5d73e032013-03-08 11:20:16 -03004335 req->err = 0;
Johan Hedberg3119ae92013-03-05 20:37:44 +02004336}
4337
4338int hci_req_run(struct hci_request *req, hci_req_complete_t complete)
4339{
4340 struct hci_dev *hdev = req->hdev;
4341 struct sk_buff *skb;
4342 unsigned long flags;
4343
4344 BT_DBG("length %u", skb_queue_len(&req->cmd_q));
4345
Andre Guedes5d73e032013-03-08 11:20:16 -03004346 /* If an error occured during request building, remove all HCI
4347 * commands queued on the HCI request queue.
4348 */
4349 if (req->err) {
4350 skb_queue_purge(&req->cmd_q);
4351 return req->err;
4352 }
4353
Johan Hedberg3119ae92013-03-05 20:37:44 +02004354 /* Do not allow empty requests */
4355 if (skb_queue_empty(&req->cmd_q))
Andre Guedes382b0c32013-03-08 11:20:14 -03004356 return -ENODATA;
Johan Hedberg3119ae92013-03-05 20:37:44 +02004357
4358 skb = skb_peek_tail(&req->cmd_q);
4359 bt_cb(skb)->req.complete = complete;
4360
4361 spin_lock_irqsave(&hdev->cmd_q.lock, flags);
4362 skb_queue_splice_tail(&req->cmd_q, &hdev->cmd_q);
4363 spin_unlock_irqrestore(&hdev->cmd_q.lock, flags);
4364
4365 queue_work(hdev->workqueue, &hdev->cmd_work);
4366
4367 return 0;
4368}
4369
Johan Hedberg1ca3a9d2013-03-05 20:37:45 +02004370static struct sk_buff *hci_prepare_cmd(struct hci_dev *hdev, u16 opcode,
Johan Hedberg07dc93d2013-04-19 10:14:51 +03004371 u32 plen, const void *param)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004372{
4373 int len = HCI_COMMAND_HDR_SIZE + plen;
4374 struct hci_command_hdr *hdr;
4375 struct sk_buff *skb;
4376
Linus Torvalds1da177e2005-04-16 15:20:36 -07004377 skb = bt_skb_alloc(len, GFP_ATOMIC);
Johan Hedberg1ca3a9d2013-03-05 20:37:45 +02004378 if (!skb)
4379 return NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004380
4381 hdr = (struct hci_command_hdr *) skb_put(skb, HCI_COMMAND_HDR_SIZE);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004382 hdr->opcode = cpu_to_le16(opcode);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004383 hdr->plen = plen;
4384
4385 if (plen)
4386 memcpy(skb_put(skb, plen), param, plen);
4387
4388 BT_DBG("skb len %d", skb->len);
4389
Marcel Holtmann0d48d932005-08-09 20:30:28 -07004390 bt_cb(skb)->pkt_type = HCI_COMMAND_PKT;
Marcel Holtmannc78ae282009-11-18 01:02:54 +01004391
Johan Hedberg1ca3a9d2013-03-05 20:37:45 +02004392 return skb;
4393}
4394
4395/* Send HCI command */
Johan Hedberg07dc93d2013-04-19 10:14:51 +03004396int hci_send_cmd(struct hci_dev *hdev, __u16 opcode, __u32 plen,
4397 const void *param)
Johan Hedberg1ca3a9d2013-03-05 20:37:45 +02004398{
4399 struct sk_buff *skb;
4400
4401 BT_DBG("%s opcode 0x%4.4x plen %d", hdev->name, opcode, plen);
4402
4403 skb = hci_prepare_cmd(hdev, opcode, plen, param);
4404 if (!skb) {
4405 BT_ERR("%s no memory for command", hdev->name);
4406 return -ENOMEM;
4407 }
4408
Johan Hedberg11714b32013-03-05 20:37:47 +02004409 /* Stand-alone HCI commands must be flaged as
4410 * single-command requests.
4411 */
4412 bt_cb(skb)->req.start = true;
4413
Linus Torvalds1da177e2005-04-16 15:20:36 -07004414 skb_queue_tail(&hdev->cmd_q, skb);
Gustavo F. Padovanc347b762011-12-14 23:53:47 -02004415 queue_work(hdev->workqueue, &hdev->cmd_work);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004416
4417 return 0;
4418}
Linus Torvalds1da177e2005-04-16 15:20:36 -07004419
Johan Hedberg71c76a12013-03-05 20:37:46 +02004420/* Queue a command to an asynchronous HCI request */
Johan Hedberg07dc93d2013-04-19 10:14:51 +03004421void hci_req_add_ev(struct hci_request *req, u16 opcode, u32 plen,
4422 const void *param, u8 event)
Johan Hedberg71c76a12013-03-05 20:37:46 +02004423{
4424 struct hci_dev *hdev = req->hdev;
4425 struct sk_buff *skb;
4426
4427 BT_DBG("%s opcode 0x%4.4x plen %d", hdev->name, opcode, plen);
4428
Andre Guedes34739c12013-03-08 11:20:18 -03004429 /* If an error occured during request building, there is no point in
4430 * queueing the HCI command. We can simply return.
4431 */
4432 if (req->err)
4433 return;
4434
Johan Hedberg71c76a12013-03-05 20:37:46 +02004435 skb = hci_prepare_cmd(hdev, opcode, plen, param);
4436 if (!skb) {
Andre Guedes5d73e032013-03-08 11:20:16 -03004437 BT_ERR("%s no memory for command (opcode 0x%4.4x)",
4438 hdev->name, opcode);
4439 req->err = -ENOMEM;
Andre Guedese348fe62013-03-08 11:20:17 -03004440 return;
Johan Hedberg71c76a12013-03-05 20:37:46 +02004441 }
4442
4443 if (skb_queue_empty(&req->cmd_q))
4444 bt_cb(skb)->req.start = true;
4445
Johan Hedberg02350a72013-04-03 21:50:29 +03004446 bt_cb(skb)->req.event = event;
4447
Johan Hedberg71c76a12013-03-05 20:37:46 +02004448 skb_queue_tail(&req->cmd_q, skb);
Johan Hedberg71c76a12013-03-05 20:37:46 +02004449}
4450
Johan Hedberg07dc93d2013-04-19 10:14:51 +03004451void hci_req_add(struct hci_request *req, u16 opcode, u32 plen,
4452 const void *param)
Johan Hedberg02350a72013-04-03 21:50:29 +03004453{
4454 hci_req_add_ev(req, opcode, plen, param, 0);
4455}
4456
Linus Torvalds1da177e2005-04-16 15:20:36 -07004457/* Get data from the previously sent command */
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004458void *hci_sent_cmd_data(struct hci_dev *hdev, __u16 opcode)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004459{
4460 struct hci_command_hdr *hdr;
4461
4462 if (!hdev->sent_cmd)
4463 return NULL;
4464
4465 hdr = (void *) hdev->sent_cmd->data;
4466
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004467 if (hdr->opcode != cpu_to_le16(opcode))
Linus Torvalds1da177e2005-04-16 15:20:36 -07004468 return NULL;
4469
Andrei Emeltchenkof0e09512012-06-11 11:13:09 +03004470 BT_DBG("%s opcode 0x%4.4x", hdev->name, opcode);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004471
4472 return hdev->sent_cmd->data + HCI_COMMAND_HDR_SIZE;
4473}
4474
4475/* Send ACL data */
4476static void hci_add_acl_hdr(struct sk_buff *skb, __u16 handle, __u16 flags)
4477{
4478 struct hci_acl_hdr *hdr;
4479 int len = skb->len;
4480
Arnaldo Carvalho de Melobadff6d2007-03-13 13:06:52 -03004481 skb_push(skb, HCI_ACL_HDR_SIZE);
4482 skb_reset_transport_header(skb);
Arnaldo Carvalho de Melo9c702202007-04-25 18:04:18 -07004483 hdr = (struct hci_acl_hdr *)skb_transport_header(skb);
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07004484 hdr->handle = cpu_to_le16(hci_handle_pack(handle, flags));
4485 hdr->dlen = cpu_to_le16(len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004486}
4487
Andrei Emeltchenkoee22be72012-09-21 12:30:04 +03004488static void hci_queue_acl(struct hci_chan *chan, struct sk_buff_head *queue,
Gustavo Padovana8c5fb12012-05-17 00:36:26 -03004489 struct sk_buff *skb, __u16 flags)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004490{
Andrei Emeltchenkoee22be72012-09-21 12:30:04 +03004491 struct hci_conn *conn = chan->conn;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004492 struct hci_dev *hdev = conn->hdev;
4493 struct sk_buff *list;
4494
Gustavo Padovan087bfd92012-05-11 13:16:11 -03004495 skb->len = skb_headlen(skb);
4496 skb->data_len = 0;
4497
4498 bt_cb(skb)->pkt_type = HCI_ACLDATA_PKT;
Andrei Emeltchenko204a6e52012-10-15 11:58:39 +03004499
4500 switch (hdev->dev_type) {
4501 case HCI_BREDR:
4502 hci_add_acl_hdr(skb, conn->handle, flags);
4503 break;
4504 case HCI_AMP:
4505 hci_add_acl_hdr(skb, chan->handle, flags);
4506 break;
4507 default:
4508 BT_ERR("%s unknown dev_type %d", hdev->name, hdev->dev_type);
4509 return;
4510 }
Gustavo Padovan087bfd92012-05-11 13:16:11 -03004511
Andrei Emeltchenko70f230202010-12-01 16:58:25 +02004512 list = skb_shinfo(skb)->frag_list;
4513 if (!list) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07004514 /* Non fragmented */
4515 BT_DBG("%s nonfrag skb %p len %d", hdev->name, skb, skb->len);
4516
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +02004517 skb_queue_tail(queue, skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004518 } else {
4519 /* Fragmented */
4520 BT_DBG("%s frag %p len %d", hdev->name, skb, skb->len);
4521
4522 skb_shinfo(skb)->frag_list = NULL;
4523
4524 /* Queue all fragments atomically */
Gustavo F. Padovanaf3e6352011-12-22 16:35:05 -02004525 spin_lock(&queue->lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004526
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +02004527 __skb_queue_tail(queue, skb);
Andrei Emeltchenkoe7021122011-01-03 11:14:36 +02004528
4529 flags &= ~ACL_START;
4530 flags |= ACL_CONT;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004531 do {
4532 skb = list; list = list->next;
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09004533
Marcel Holtmann0d48d932005-08-09 20:30:28 -07004534 bt_cb(skb)->pkt_type = HCI_ACLDATA_PKT;
Andrei Emeltchenkoe7021122011-01-03 11:14:36 +02004535 hci_add_acl_hdr(skb, conn->handle, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004536
4537 BT_DBG("%s frag %p len %d", hdev->name, skb, skb->len);
4538
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +02004539 __skb_queue_tail(queue, skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004540 } while (list);
4541
Gustavo F. Padovanaf3e6352011-12-22 16:35:05 -02004542 spin_unlock(&queue->lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004543 }
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +02004544}
4545
4546void hci_send_acl(struct hci_chan *chan, struct sk_buff *skb, __u16 flags)
4547{
Andrei Emeltchenkoee22be72012-09-21 12:30:04 +03004548 struct hci_dev *hdev = chan->conn->hdev;
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +02004549
Andrei Emeltchenkof0e09512012-06-11 11:13:09 +03004550 BT_DBG("%s chan %p flags 0x%4.4x", hdev->name, chan, flags);
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +02004551
Andrei Emeltchenkoee22be72012-09-21 12:30:04 +03004552 hci_queue_acl(chan, &chan->data_q, skb, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004553
Gustavo F. Padovan3eff45e2011-12-15 00:50:02 -02004554 queue_work(hdev->workqueue, &hdev->tx_work);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004555}
Linus Torvalds1da177e2005-04-16 15:20:36 -07004556
4557/* Send SCO data */
Gustavo F. Padovan0d861d82010-05-01 16:15:35 -03004558void hci_send_sco(struct hci_conn *conn, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004559{
4560 struct hci_dev *hdev = conn->hdev;
4561 struct hci_sco_hdr hdr;
4562
4563 BT_DBG("%s len %d", hdev->name, skb->len);
4564
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07004565 hdr.handle = cpu_to_le16(conn->handle);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004566 hdr.dlen = skb->len;
4567
Arnaldo Carvalho de Melobadff6d2007-03-13 13:06:52 -03004568 skb_push(skb, HCI_SCO_HDR_SIZE);
4569 skb_reset_transport_header(skb);
Arnaldo Carvalho de Melo9c702202007-04-25 18:04:18 -07004570 memcpy(skb_transport_header(skb), &hdr, HCI_SCO_HDR_SIZE);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004571
Marcel Holtmann0d48d932005-08-09 20:30:28 -07004572 bt_cb(skb)->pkt_type = HCI_SCODATA_PKT;
Marcel Holtmannc78ae282009-11-18 01:02:54 +01004573
Linus Torvalds1da177e2005-04-16 15:20:36 -07004574 skb_queue_tail(&conn->data_q, skb);
Gustavo F. Padovan3eff45e2011-12-15 00:50:02 -02004575 queue_work(hdev->workqueue, &hdev->tx_work);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004576}
Linus Torvalds1da177e2005-04-16 15:20:36 -07004577
4578/* ---- HCI TX task (outgoing data) ---- */
4579
4580/* HCI Connection scheduler */
Gustavo Padovan6039aa732012-05-23 04:04:18 -03004581static struct hci_conn *hci_low_sent(struct hci_dev *hdev, __u8 type,
4582 int *quote)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004583{
4584 struct hci_conn_hash *h = &hdev->conn_hash;
Luiz Augusto von Dentz8035ded2011-11-01 10:58:56 +02004585 struct hci_conn *conn = NULL, *c;
Mikel Astizabc5de82012-04-11 08:48:47 +02004586 unsigned int num = 0, min = ~0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004587
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09004588 /* We don't have to lock device here. Connections are always
Linus Torvalds1da177e2005-04-16 15:20:36 -07004589 * added and removed with TX task disabled. */
Gustavo F. Padovanbf4c6322011-12-14 22:54:12 -02004590
4591 rcu_read_lock();
4592
4593 list_for_each_entry_rcu(c, &h->list, list) {
Marcel Holtmann769be972008-07-14 20:13:49 +02004594 if (c->type != type || skb_queue_empty(&c->data_q))
Linus Torvalds1da177e2005-04-16 15:20:36 -07004595 continue;
Marcel Holtmann769be972008-07-14 20:13:49 +02004596
4597 if (c->state != BT_CONNECTED && c->state != BT_CONFIG)
4598 continue;
4599
Linus Torvalds1da177e2005-04-16 15:20:36 -07004600 num++;
4601
4602 if (c->sent < min) {
4603 min = c->sent;
4604 conn = c;
4605 }
Luiz Augusto von Dentz52087a72011-08-17 16:23:00 +03004606
4607 if (hci_conn_num(hdev, type) == num)
4608 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004609 }
4610
Gustavo F. Padovanbf4c6322011-12-14 22:54:12 -02004611 rcu_read_unlock();
4612
Linus Torvalds1da177e2005-04-16 15:20:36 -07004613 if (conn) {
Ville Tervo6ed58ec2011-02-10 22:38:48 -03004614 int cnt, q;
4615
4616 switch (conn->type) {
4617 case ACL_LINK:
4618 cnt = hdev->acl_cnt;
4619 break;
4620 case SCO_LINK:
4621 case ESCO_LINK:
4622 cnt = hdev->sco_cnt;
4623 break;
4624 case LE_LINK:
4625 cnt = hdev->le_mtu ? hdev->le_cnt : hdev->acl_cnt;
4626 break;
4627 default:
4628 cnt = 0;
4629 BT_ERR("Unknown link type");
4630 }
4631
4632 q = cnt / num;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004633 *quote = q ? q : 1;
4634 } else
4635 *quote = 0;
4636
4637 BT_DBG("conn %p quote %d", conn, *quote);
4638 return conn;
4639}
4640
Gustavo Padovan6039aa732012-05-23 04:04:18 -03004641static void hci_link_tx_to(struct hci_dev *hdev, __u8 type)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004642{
4643 struct hci_conn_hash *h = &hdev->conn_hash;
Luiz Augusto von Dentz8035ded2011-11-01 10:58:56 +02004644 struct hci_conn *c;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004645
Ville Tervobae1f5d92011-02-10 22:38:53 -03004646 BT_ERR("%s link tx timeout", hdev->name);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004647
Gustavo F. Padovanbf4c6322011-12-14 22:54:12 -02004648 rcu_read_lock();
4649
Linus Torvalds1da177e2005-04-16 15:20:36 -07004650 /* Kill stalled connections */
Gustavo F. Padovanbf4c6322011-12-14 22:54:12 -02004651 list_for_each_entry_rcu(c, &h->list, list) {
Ville Tervobae1f5d92011-02-10 22:38:53 -03004652 if (c->type == type && c->sent) {
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03004653 BT_ERR("%s killing stalled connection %pMR",
4654 hdev->name, &c->dst);
Andre Guedesbed71742013-01-30 11:50:56 -03004655 hci_disconnect(c, HCI_ERROR_REMOTE_USER_TERM);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004656 }
4657 }
Gustavo F. Padovanbf4c6322011-12-14 22:54:12 -02004658
4659 rcu_read_unlock();
Linus Torvalds1da177e2005-04-16 15:20:36 -07004660}
4661
Gustavo Padovan6039aa732012-05-23 04:04:18 -03004662static struct hci_chan *hci_chan_sent(struct hci_dev *hdev, __u8 type,
4663 int *quote)
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +02004664{
4665 struct hci_conn_hash *h = &hdev->conn_hash;
4666 struct hci_chan *chan = NULL;
Mikel Astizabc5de82012-04-11 08:48:47 +02004667 unsigned int num = 0, min = ~0, cur_prio = 0;
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +02004668 struct hci_conn *conn;
4669 int cnt, q, conn_num = 0;
4670
4671 BT_DBG("%s", hdev->name);
4672
Gustavo F. Padovanbf4c6322011-12-14 22:54:12 -02004673 rcu_read_lock();
4674
4675 list_for_each_entry_rcu(conn, &h->list, list) {
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +02004676 struct hci_chan *tmp;
4677
4678 if (conn->type != type)
4679 continue;
4680
4681 if (conn->state != BT_CONNECTED && conn->state != BT_CONFIG)
4682 continue;
4683
4684 conn_num++;
4685
Gustavo F. Padovan8192ede2011-12-14 15:08:48 -02004686 list_for_each_entry_rcu(tmp, &conn->chan_list, list) {
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +02004687 struct sk_buff *skb;
4688
4689 if (skb_queue_empty(&tmp->data_q))
4690 continue;
4691
4692 skb = skb_peek(&tmp->data_q);
4693 if (skb->priority < cur_prio)
4694 continue;
4695
4696 if (skb->priority > cur_prio) {
4697 num = 0;
4698 min = ~0;
4699 cur_prio = skb->priority;
4700 }
4701
4702 num++;
4703
4704 if (conn->sent < min) {
4705 min = conn->sent;
4706 chan = tmp;
4707 }
4708 }
4709
4710 if (hci_conn_num(hdev, type) == conn_num)
4711 break;
4712 }
4713
Gustavo F. Padovanbf4c6322011-12-14 22:54:12 -02004714 rcu_read_unlock();
4715
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +02004716 if (!chan)
4717 return NULL;
4718
4719 switch (chan->conn->type) {
4720 case ACL_LINK:
4721 cnt = hdev->acl_cnt;
4722 break;
Andrei Emeltchenkobd1eb662012-10-10 17:38:30 +03004723 case AMP_LINK:
4724 cnt = hdev->block_cnt;
4725 break;
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +02004726 case SCO_LINK:
4727 case ESCO_LINK:
4728 cnt = hdev->sco_cnt;
4729 break;
4730 case LE_LINK:
4731 cnt = hdev->le_mtu ? hdev->le_cnt : hdev->acl_cnt;
4732 break;
4733 default:
4734 cnt = 0;
4735 BT_ERR("Unknown link type");
4736 }
4737
4738 q = cnt / num;
4739 *quote = q ? q : 1;
4740 BT_DBG("chan %p quote %d", chan, *quote);
4741 return chan;
4742}
4743
Luiz Augusto von Dentz02b20f02011-11-02 15:52:03 +02004744static void hci_prio_recalculate(struct hci_dev *hdev, __u8 type)
4745{
4746 struct hci_conn_hash *h = &hdev->conn_hash;
4747 struct hci_conn *conn;
4748 int num = 0;
4749
4750 BT_DBG("%s", hdev->name);
4751
Gustavo F. Padovanbf4c6322011-12-14 22:54:12 -02004752 rcu_read_lock();
4753
4754 list_for_each_entry_rcu(conn, &h->list, list) {
Luiz Augusto von Dentz02b20f02011-11-02 15:52:03 +02004755 struct hci_chan *chan;
4756
4757 if (conn->type != type)
4758 continue;
4759
4760 if (conn->state != BT_CONNECTED && conn->state != BT_CONFIG)
4761 continue;
4762
4763 num++;
4764
Gustavo F. Padovan8192ede2011-12-14 15:08:48 -02004765 list_for_each_entry_rcu(chan, &conn->chan_list, list) {
Luiz Augusto von Dentz02b20f02011-11-02 15:52:03 +02004766 struct sk_buff *skb;
4767
4768 if (chan->sent) {
4769 chan->sent = 0;
4770 continue;
4771 }
4772
4773 if (skb_queue_empty(&chan->data_q))
4774 continue;
4775
4776 skb = skb_peek(&chan->data_q);
4777 if (skb->priority >= HCI_PRIO_MAX - 1)
4778 continue;
4779
4780 skb->priority = HCI_PRIO_MAX - 1;
4781
4782 BT_DBG("chan %p skb %p promoted to %d", chan, skb,
Gustavo Padovana8c5fb12012-05-17 00:36:26 -03004783 skb->priority);
Luiz Augusto von Dentz02b20f02011-11-02 15:52:03 +02004784 }
4785
4786 if (hci_conn_num(hdev, type) == num)
4787 break;
4788 }
Gustavo F. Padovanbf4c6322011-12-14 22:54:12 -02004789
4790 rcu_read_unlock();
4791
Luiz Augusto von Dentz02b20f02011-11-02 15:52:03 +02004792}
4793
Andrei Emeltchenkob71d3852012-02-03 16:27:54 +02004794static inline int __get_blocks(struct hci_dev *hdev, struct sk_buff *skb)
4795{
4796 /* Calculate count of blocks used by this packet */
4797 return DIV_ROUND_UP(skb->len - HCI_ACL_HDR_SIZE, hdev->block_len);
4798}
4799
Gustavo Padovan6039aa732012-05-23 04:04:18 -03004800static void __check_timeout(struct hci_dev *hdev, unsigned int cnt)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004801{
Linus Torvalds1da177e2005-04-16 15:20:36 -07004802 if (!test_bit(HCI_RAW, &hdev->flags)) {
4803 /* ACL tx timeout must be longer than maximum
4804 * link supervision timeout (40.9 seconds) */
Andrei Emeltchenko63d2bc12012-02-03 16:27:55 +02004805 if (!cnt && time_after(jiffies, hdev->acl_last_tx +
Andrei Emeltchenko5f246e82012-06-11 11:13:07 +03004806 HCI_ACL_TX_TIMEOUT))
Ville Tervobae1f5d92011-02-10 22:38:53 -03004807 hci_link_tx_to(hdev, ACL_LINK);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004808 }
Andrei Emeltchenko63d2bc12012-02-03 16:27:55 +02004809}
Linus Torvalds1da177e2005-04-16 15:20:36 -07004810
Gustavo Padovan6039aa732012-05-23 04:04:18 -03004811static void hci_sched_acl_pkt(struct hci_dev *hdev)
Andrei Emeltchenko63d2bc12012-02-03 16:27:55 +02004812{
4813 unsigned int cnt = hdev->acl_cnt;
4814 struct hci_chan *chan;
4815 struct sk_buff *skb;
4816 int quote;
4817
4818 __check_timeout(hdev, cnt);
Marcel Holtmann04837f62006-07-03 10:02:33 +02004819
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +02004820 while (hdev->acl_cnt &&
Gustavo Padovana8c5fb12012-05-17 00:36:26 -03004821 (chan = hci_chan_sent(hdev, ACL_LINK, &quote))) {
Luiz Augusto von Dentzec1cce22011-11-02 15:52:02 +02004822 u32 priority = (skb_peek(&chan->data_q))->priority;
4823 while (quote-- && (skb = skb_peek(&chan->data_q))) {
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +02004824 BT_DBG("chan %p skb %p len %d priority %u", chan, skb,
Gustavo Padovana8c5fb12012-05-17 00:36:26 -03004825 skb->len, skb->priority);
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +02004826
Luiz Augusto von Dentzec1cce22011-11-02 15:52:02 +02004827 /* Stop if priority has changed */
4828 if (skb->priority < priority)
4829 break;
4830
4831 skb = skb_dequeue(&chan->data_q);
4832
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +02004833 hci_conn_enter_active_mode(chan->conn,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03004834 bt_cb(skb)->force_active);
Marcel Holtmann04837f62006-07-03 10:02:33 +02004835
Marcel Holtmann57d17d72013-10-10 14:54:17 -07004836 hci_send_frame(hdev, skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004837 hdev->acl_last_tx = jiffies;
4838
4839 hdev->acl_cnt--;
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +02004840 chan->sent++;
4841 chan->conn->sent++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004842 }
4843 }
Luiz Augusto von Dentz02b20f02011-11-02 15:52:03 +02004844
4845 if (cnt != hdev->acl_cnt)
4846 hci_prio_recalculate(hdev, ACL_LINK);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004847}
4848
Gustavo Padovan6039aa732012-05-23 04:04:18 -03004849static void hci_sched_acl_blk(struct hci_dev *hdev)
Andrei Emeltchenkob71d3852012-02-03 16:27:54 +02004850{
Andrei Emeltchenko63d2bc12012-02-03 16:27:55 +02004851 unsigned int cnt = hdev->block_cnt;
Andrei Emeltchenkob71d3852012-02-03 16:27:54 +02004852 struct hci_chan *chan;
4853 struct sk_buff *skb;
4854 int quote;
Andrei Emeltchenkobd1eb662012-10-10 17:38:30 +03004855 u8 type;
Andrei Emeltchenkob71d3852012-02-03 16:27:54 +02004856
Andrei Emeltchenko63d2bc12012-02-03 16:27:55 +02004857 __check_timeout(hdev, cnt);
Andrei Emeltchenkob71d3852012-02-03 16:27:54 +02004858
Andrei Emeltchenkobd1eb662012-10-10 17:38:30 +03004859 BT_DBG("%s", hdev->name);
4860
4861 if (hdev->dev_type == HCI_AMP)
4862 type = AMP_LINK;
4863 else
4864 type = ACL_LINK;
4865
Andrei Emeltchenkob71d3852012-02-03 16:27:54 +02004866 while (hdev->block_cnt > 0 &&
Andrei Emeltchenkobd1eb662012-10-10 17:38:30 +03004867 (chan = hci_chan_sent(hdev, type, &quote))) {
Andrei Emeltchenkob71d3852012-02-03 16:27:54 +02004868 u32 priority = (skb_peek(&chan->data_q))->priority;
4869 while (quote > 0 && (skb = skb_peek(&chan->data_q))) {
4870 int blocks;
4871
4872 BT_DBG("chan %p skb %p len %d priority %u", chan, skb,
Gustavo Padovana8c5fb12012-05-17 00:36:26 -03004873 skb->len, skb->priority);
Andrei Emeltchenkob71d3852012-02-03 16:27:54 +02004874
4875 /* Stop if priority has changed */
4876 if (skb->priority < priority)
4877 break;
4878
4879 skb = skb_dequeue(&chan->data_q);
4880
4881 blocks = __get_blocks(hdev, skb);
4882 if (blocks > hdev->block_cnt)
4883 return;
4884
4885 hci_conn_enter_active_mode(chan->conn,
Gustavo Padovana8c5fb12012-05-17 00:36:26 -03004886 bt_cb(skb)->force_active);
Andrei Emeltchenkob71d3852012-02-03 16:27:54 +02004887
Marcel Holtmann57d17d72013-10-10 14:54:17 -07004888 hci_send_frame(hdev, skb);
Andrei Emeltchenkob71d3852012-02-03 16:27:54 +02004889 hdev->acl_last_tx = jiffies;
4890
4891 hdev->block_cnt -= blocks;
4892 quote -= blocks;
4893
4894 chan->sent += blocks;
4895 chan->conn->sent += blocks;
4896 }
4897 }
4898
4899 if (cnt != hdev->block_cnt)
Andrei Emeltchenkobd1eb662012-10-10 17:38:30 +03004900 hci_prio_recalculate(hdev, type);
Andrei Emeltchenkob71d3852012-02-03 16:27:54 +02004901}
4902
Gustavo Padovan6039aa732012-05-23 04:04:18 -03004903static void hci_sched_acl(struct hci_dev *hdev)
Andrei Emeltchenkob71d3852012-02-03 16:27:54 +02004904{
4905 BT_DBG("%s", hdev->name);
4906
Andrei Emeltchenkobd1eb662012-10-10 17:38:30 +03004907 /* No ACL link over BR/EDR controller */
4908 if (!hci_conn_num(hdev, ACL_LINK) && hdev->dev_type == HCI_BREDR)
4909 return;
4910
4911 /* No AMP link over AMP controller */
4912 if (!hci_conn_num(hdev, AMP_LINK) && hdev->dev_type == HCI_AMP)
Andrei Emeltchenkob71d3852012-02-03 16:27:54 +02004913 return;
4914
4915 switch (hdev->flow_ctl_mode) {
4916 case HCI_FLOW_CTL_MODE_PACKET_BASED:
4917 hci_sched_acl_pkt(hdev);
4918 break;
4919
4920 case HCI_FLOW_CTL_MODE_BLOCK_BASED:
4921 hci_sched_acl_blk(hdev);
4922 break;
4923 }
4924}
4925
Linus Torvalds1da177e2005-04-16 15:20:36 -07004926/* Schedule SCO */
Gustavo Padovan6039aa732012-05-23 04:04:18 -03004927static void hci_sched_sco(struct hci_dev *hdev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004928{
4929 struct hci_conn *conn;
4930 struct sk_buff *skb;
4931 int quote;
4932
4933 BT_DBG("%s", hdev->name);
4934
Luiz Augusto von Dentz52087a72011-08-17 16:23:00 +03004935 if (!hci_conn_num(hdev, SCO_LINK))
4936 return;
4937
Linus Torvalds1da177e2005-04-16 15:20:36 -07004938 while (hdev->sco_cnt && (conn = hci_low_sent(hdev, SCO_LINK, &quote))) {
4939 while (quote-- && (skb = skb_dequeue(&conn->data_q))) {
4940 BT_DBG("skb %p len %d", skb, skb->len);
Marcel Holtmann57d17d72013-10-10 14:54:17 -07004941 hci_send_frame(hdev, skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004942
4943 conn->sent++;
4944 if (conn->sent == ~0)
4945 conn->sent = 0;
4946 }
4947 }
4948}
4949
Gustavo Padovan6039aa732012-05-23 04:04:18 -03004950static void hci_sched_esco(struct hci_dev *hdev)
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02004951{
4952 struct hci_conn *conn;
4953 struct sk_buff *skb;
4954 int quote;
4955
4956 BT_DBG("%s", hdev->name);
4957
Luiz Augusto von Dentz52087a72011-08-17 16:23:00 +03004958 if (!hci_conn_num(hdev, ESCO_LINK))
4959 return;
4960
Gustavo Padovan8fc9ced2012-05-23 04:04:21 -03004961 while (hdev->sco_cnt && (conn = hci_low_sent(hdev, ESCO_LINK,
4962 &quote))) {
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02004963 while (quote-- && (skb = skb_dequeue(&conn->data_q))) {
4964 BT_DBG("skb %p len %d", skb, skb->len);
Marcel Holtmann57d17d72013-10-10 14:54:17 -07004965 hci_send_frame(hdev, skb);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02004966
4967 conn->sent++;
4968 if (conn->sent == ~0)
4969 conn->sent = 0;
4970 }
4971 }
4972}
4973
Gustavo Padovan6039aa732012-05-23 04:04:18 -03004974static void hci_sched_le(struct hci_dev *hdev)
Ville Tervo6ed58ec2011-02-10 22:38:48 -03004975{
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +02004976 struct hci_chan *chan;
Ville Tervo6ed58ec2011-02-10 22:38:48 -03004977 struct sk_buff *skb;
Luiz Augusto von Dentz02b20f02011-11-02 15:52:03 +02004978 int quote, cnt, tmp;
Ville Tervo6ed58ec2011-02-10 22:38:48 -03004979
4980 BT_DBG("%s", hdev->name);
4981
Luiz Augusto von Dentz52087a72011-08-17 16:23:00 +03004982 if (!hci_conn_num(hdev, LE_LINK))
4983 return;
4984
Ville Tervo6ed58ec2011-02-10 22:38:48 -03004985 if (!test_bit(HCI_RAW, &hdev->flags)) {
4986 /* LE tx timeout must be longer than maximum
4987 * link supervision timeout (40.9 seconds) */
Ville Tervobae1f5d92011-02-10 22:38:53 -03004988 if (!hdev->le_cnt && hdev->le_pkts &&
Gustavo Padovana8c5fb12012-05-17 00:36:26 -03004989 time_after(jiffies, hdev->le_last_tx + HZ * 45))
Ville Tervobae1f5d92011-02-10 22:38:53 -03004990 hci_link_tx_to(hdev, LE_LINK);
Ville Tervo6ed58ec2011-02-10 22:38:48 -03004991 }
4992
4993 cnt = hdev->le_pkts ? hdev->le_cnt : hdev->acl_cnt;
Luiz Augusto von Dentz02b20f02011-11-02 15:52:03 +02004994 tmp = cnt;
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +02004995 while (cnt && (chan = hci_chan_sent(hdev, LE_LINK, &quote))) {
Luiz Augusto von Dentzec1cce22011-11-02 15:52:02 +02004996 u32 priority = (skb_peek(&chan->data_q))->priority;
4997 while (quote-- && (skb = skb_peek(&chan->data_q))) {
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +02004998 BT_DBG("chan %p skb %p len %d priority %u", chan, skb,
Gustavo Padovana8c5fb12012-05-17 00:36:26 -03004999 skb->len, skb->priority);
Ville Tervo6ed58ec2011-02-10 22:38:48 -03005000
Luiz Augusto von Dentzec1cce22011-11-02 15:52:02 +02005001 /* Stop if priority has changed */
5002 if (skb->priority < priority)
5003 break;
5004
5005 skb = skb_dequeue(&chan->data_q);
5006
Marcel Holtmann57d17d72013-10-10 14:54:17 -07005007 hci_send_frame(hdev, skb);
Ville Tervo6ed58ec2011-02-10 22:38:48 -03005008 hdev->le_last_tx = jiffies;
5009
5010 cnt--;
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +02005011 chan->sent++;
5012 chan->conn->sent++;
Ville Tervo6ed58ec2011-02-10 22:38:48 -03005013 }
5014 }
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +02005015
Ville Tervo6ed58ec2011-02-10 22:38:48 -03005016 if (hdev->le_pkts)
5017 hdev->le_cnt = cnt;
5018 else
5019 hdev->acl_cnt = cnt;
Luiz Augusto von Dentz02b20f02011-11-02 15:52:03 +02005020
5021 if (cnt != tmp)
5022 hci_prio_recalculate(hdev, LE_LINK);
Ville Tervo6ed58ec2011-02-10 22:38:48 -03005023}
5024
Gustavo F. Padovan3eff45e2011-12-15 00:50:02 -02005025static void hci_tx_work(struct work_struct *work)
Linus Torvalds1da177e2005-04-16 15:20:36 -07005026{
Gustavo F. Padovan3eff45e2011-12-15 00:50:02 -02005027 struct hci_dev *hdev = container_of(work, struct hci_dev, tx_work);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005028 struct sk_buff *skb;
5029
Ville Tervo6ed58ec2011-02-10 22:38:48 -03005030 BT_DBG("%s acl %d sco %d le %d", hdev->name, hdev->acl_cnt,
Gustavo Padovana8c5fb12012-05-17 00:36:26 -03005031 hdev->sco_cnt, hdev->le_cnt);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005032
Marcel Holtmann52de5992013-09-03 18:08:38 -07005033 if (!test_bit(HCI_USER_CHANNEL, &hdev->dev_flags)) {
5034 /* Schedule queues and send stuff to HCI driver */
5035 hci_sched_acl(hdev);
5036 hci_sched_sco(hdev);
5037 hci_sched_esco(hdev);
5038 hci_sched_le(hdev);
5039 }
Ville Tervo6ed58ec2011-02-10 22:38:48 -03005040
Linus Torvalds1da177e2005-04-16 15:20:36 -07005041 /* Send next queued raw (unknown type) packet */
5042 while ((skb = skb_dequeue(&hdev->raw_q)))
Marcel Holtmann57d17d72013-10-10 14:54:17 -07005043 hci_send_frame(hdev, skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005044}
5045
Lucas De Marchi25985ed2011-03-30 22:57:33 -03005046/* ----- HCI RX task (incoming data processing) ----- */
Linus Torvalds1da177e2005-04-16 15:20:36 -07005047
5048/* ACL data packet */
Gustavo Padovan6039aa732012-05-23 04:04:18 -03005049static void hci_acldata_packet(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07005050{
5051 struct hci_acl_hdr *hdr = (void *) skb->data;
5052 struct hci_conn *conn;
5053 __u16 handle, flags;
5054
5055 skb_pull(skb, HCI_ACL_HDR_SIZE);
5056
5057 handle = __le16_to_cpu(hdr->handle);
5058 flags = hci_flags(handle);
5059 handle = hci_handle(handle);
5060
Andrei Emeltchenkof0e09512012-06-11 11:13:09 +03005061 BT_DBG("%s len %d handle 0x%4.4x flags 0x%4.4x", hdev->name, skb->len,
Gustavo Padovana8c5fb12012-05-17 00:36:26 -03005062 handle, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005063
5064 hdev->stat.acl_rx++;
5065
5066 hci_dev_lock(hdev);
5067 conn = hci_conn_hash_lookup_handle(hdev, handle);
5068 hci_dev_unlock(hdev);
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09005069
Linus Torvalds1da177e2005-04-16 15:20:36 -07005070 if (conn) {
Mat Martineau65983fc2011-12-13 15:06:02 -08005071 hci_conn_enter_active_mode(conn, BT_POWER_FORCE_ACTIVE_OFF);
Marcel Holtmann04837f62006-07-03 10:02:33 +02005072
Linus Torvalds1da177e2005-04-16 15:20:36 -07005073 /* Send to upper protocol */
Ulisses Furquim686ebf22011-12-21 10:11:33 -02005074 l2cap_recv_acldata(conn, skb, flags);
5075 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005076 } else {
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09005077 BT_ERR("%s ACL packet for unknown connection handle %d",
Gustavo Padovana8c5fb12012-05-17 00:36:26 -03005078 hdev->name, handle);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005079 }
5080
5081 kfree_skb(skb);
5082}
5083
5084/* SCO data packet */
Gustavo Padovan6039aa732012-05-23 04:04:18 -03005085static void hci_scodata_packet(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07005086{
5087 struct hci_sco_hdr *hdr = (void *) skb->data;
5088 struct hci_conn *conn;
5089 __u16 handle;
5090
5091 skb_pull(skb, HCI_SCO_HDR_SIZE);
5092
5093 handle = __le16_to_cpu(hdr->handle);
5094
Andrei Emeltchenkof0e09512012-06-11 11:13:09 +03005095 BT_DBG("%s len %d handle 0x%4.4x", hdev->name, skb->len, handle);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005096
5097 hdev->stat.sco_rx++;
5098
5099 hci_dev_lock(hdev);
5100 conn = hci_conn_hash_lookup_handle(hdev, handle);
5101 hci_dev_unlock(hdev);
5102
5103 if (conn) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07005104 /* Send to upper protocol */
Ulisses Furquim686ebf22011-12-21 10:11:33 -02005105 sco_recv_scodata(conn, skb);
5106 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005107 } else {
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09005108 BT_ERR("%s SCO packet for unknown connection handle %d",
Gustavo Padovana8c5fb12012-05-17 00:36:26 -03005109 hdev->name, handle);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005110 }
5111
5112 kfree_skb(skb);
5113}
5114
Johan Hedberg9238f362013-03-05 20:37:48 +02005115static bool hci_req_is_complete(struct hci_dev *hdev)
5116{
5117 struct sk_buff *skb;
5118
5119 skb = skb_peek(&hdev->cmd_q);
5120 if (!skb)
5121 return true;
5122
5123 return bt_cb(skb)->req.start;
5124}
5125
Johan Hedberg42c6b122013-03-05 20:37:49 +02005126static void hci_resend_last(struct hci_dev *hdev)
5127{
5128 struct hci_command_hdr *sent;
5129 struct sk_buff *skb;
5130 u16 opcode;
5131
5132 if (!hdev->sent_cmd)
5133 return;
5134
5135 sent = (void *) hdev->sent_cmd->data;
5136 opcode = __le16_to_cpu(sent->opcode);
5137 if (opcode == HCI_OP_RESET)
5138 return;
5139
5140 skb = skb_clone(hdev->sent_cmd, GFP_KERNEL);
5141 if (!skb)
5142 return;
5143
5144 skb_queue_head(&hdev->cmd_q, skb);
5145 queue_work(hdev->workqueue, &hdev->cmd_work);
5146}
5147
Johan Hedberg9238f362013-03-05 20:37:48 +02005148void hci_req_cmd_complete(struct hci_dev *hdev, u16 opcode, u8 status)
5149{
5150 hci_req_complete_t req_complete = NULL;
5151 struct sk_buff *skb;
5152 unsigned long flags;
5153
5154 BT_DBG("opcode 0x%04x status 0x%02x", opcode, status);
5155
Johan Hedberg42c6b122013-03-05 20:37:49 +02005156 /* If the completed command doesn't match the last one that was
5157 * sent we need to do special handling of it.
Johan Hedberg9238f362013-03-05 20:37:48 +02005158 */
Johan Hedberg42c6b122013-03-05 20:37:49 +02005159 if (!hci_sent_cmd_data(hdev, opcode)) {
5160 /* Some CSR based controllers generate a spontaneous
5161 * reset complete event during init and any pending
5162 * command will never be completed. In such a case we
5163 * need to resend whatever was the last sent
5164 * command.
5165 */
5166 if (test_bit(HCI_INIT, &hdev->flags) && opcode == HCI_OP_RESET)
5167 hci_resend_last(hdev);
5168
Johan Hedberg9238f362013-03-05 20:37:48 +02005169 return;
Johan Hedberg42c6b122013-03-05 20:37:49 +02005170 }
Johan Hedberg9238f362013-03-05 20:37:48 +02005171
5172 /* If the command succeeded and there's still more commands in
5173 * this request the request is not yet complete.
5174 */
5175 if (!status && !hci_req_is_complete(hdev))
5176 return;
5177
5178 /* If this was the last command in a request the complete
5179 * callback would be found in hdev->sent_cmd instead of the
5180 * command queue (hdev->cmd_q).
5181 */
5182 if (hdev->sent_cmd) {
5183 req_complete = bt_cb(hdev->sent_cmd)->req.complete;
Johan Hedberg53e21fb2013-07-27 14:11:14 -05005184
5185 if (req_complete) {
5186 /* We must set the complete callback to NULL to
5187 * avoid calling the callback more than once if
5188 * this function gets called again.
5189 */
5190 bt_cb(hdev->sent_cmd)->req.complete = NULL;
5191
Johan Hedberg9238f362013-03-05 20:37:48 +02005192 goto call_complete;
Johan Hedberg53e21fb2013-07-27 14:11:14 -05005193 }
Johan Hedberg9238f362013-03-05 20:37:48 +02005194 }
5195
5196 /* Remove all pending commands belonging to this request */
5197 spin_lock_irqsave(&hdev->cmd_q.lock, flags);
5198 while ((skb = __skb_dequeue(&hdev->cmd_q))) {
5199 if (bt_cb(skb)->req.start) {
5200 __skb_queue_head(&hdev->cmd_q, skb);
5201 break;
5202 }
5203
5204 req_complete = bt_cb(skb)->req.complete;
5205 kfree_skb(skb);
5206 }
5207 spin_unlock_irqrestore(&hdev->cmd_q.lock, flags);
5208
5209call_complete:
5210 if (req_complete)
5211 req_complete(hdev, status);
5212}
5213
Marcel Holtmannb78752c2010-08-08 23:06:53 -04005214static void hci_rx_work(struct work_struct *work)
Linus Torvalds1da177e2005-04-16 15:20:36 -07005215{
Marcel Holtmannb78752c2010-08-08 23:06:53 -04005216 struct hci_dev *hdev = container_of(work, struct hci_dev, rx_work);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005217 struct sk_buff *skb;
5218
5219 BT_DBG("%s", hdev->name);
5220
Linus Torvalds1da177e2005-04-16 15:20:36 -07005221 while ((skb = skb_dequeue(&hdev->rx_q))) {
Marcel Holtmanncd82e612012-02-20 20:34:38 +01005222 /* Send copy to monitor */
5223 hci_send_to_monitor(hdev, skb);
5224
Linus Torvalds1da177e2005-04-16 15:20:36 -07005225 if (atomic_read(&hdev->promisc)) {
5226 /* Send copy to the sockets */
Marcel Holtmann470fe1b2012-02-20 14:50:30 +01005227 hci_send_to_sock(hdev, skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005228 }
5229
Marcel Holtmann0736cfa2013-08-26 21:40:51 -07005230 if (test_bit(HCI_RAW, &hdev->flags) ||
5231 test_bit(HCI_USER_CHANNEL, &hdev->dev_flags)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07005232 kfree_skb(skb);
5233 continue;
5234 }
5235
5236 if (test_bit(HCI_INIT, &hdev->flags)) {
5237 /* Don't process data packets in this states. */
Marcel Holtmann0d48d932005-08-09 20:30:28 -07005238 switch (bt_cb(skb)->pkt_type) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07005239 case HCI_ACLDATA_PKT:
5240 case HCI_SCODATA_PKT:
5241 kfree_skb(skb);
5242 continue;
Stephen Hemminger3ff50b72007-04-20 17:09:22 -07005243 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07005244 }
5245
5246 /* Process frame */
Marcel Holtmann0d48d932005-08-09 20:30:28 -07005247 switch (bt_cb(skb)->pkt_type) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07005248 case HCI_EVENT_PKT:
Marcel Holtmannb78752c2010-08-08 23:06:53 -04005249 BT_DBG("%s Event packet", hdev->name);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005250 hci_event_packet(hdev, skb);
5251 break;
5252
5253 case HCI_ACLDATA_PKT:
5254 BT_DBG("%s ACL data packet", hdev->name);
5255 hci_acldata_packet(hdev, skb);
5256 break;
5257
5258 case HCI_SCODATA_PKT:
5259 BT_DBG("%s SCO data packet", hdev->name);
5260 hci_scodata_packet(hdev, skb);
5261 break;
5262
5263 default:
5264 kfree_skb(skb);
5265 break;
5266 }
5267 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07005268}
5269
Gustavo F. Padovanc347b762011-12-14 23:53:47 -02005270static void hci_cmd_work(struct work_struct *work)
Linus Torvalds1da177e2005-04-16 15:20:36 -07005271{
Gustavo F. Padovanc347b762011-12-14 23:53:47 -02005272 struct hci_dev *hdev = container_of(work, struct hci_dev, cmd_work);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005273 struct sk_buff *skb;
5274
Andrei Emeltchenko21047862012-07-10 15:27:47 +03005275 BT_DBG("%s cmd_cnt %d cmd queued %d", hdev->name,
5276 atomic_read(&hdev->cmd_cnt), skb_queue_len(&hdev->cmd_q));
Linus Torvalds1da177e2005-04-16 15:20:36 -07005277
Linus Torvalds1da177e2005-04-16 15:20:36 -07005278 /* Send queued commands */
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02005279 if (atomic_read(&hdev->cmd_cnt)) {
5280 skb = skb_dequeue(&hdev->cmd_q);
5281 if (!skb)
5282 return;
5283
Wei Yongjun7585b972009-02-25 18:29:52 +08005284 kfree_skb(hdev->sent_cmd);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005285
Marcel Holtmanna675d7f2013-09-03 18:11:07 -07005286 hdev->sent_cmd = skb_clone(skb, GFP_KERNEL);
Andrei Emeltchenko70f230202010-12-01 16:58:25 +02005287 if (hdev->sent_cmd) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07005288 atomic_dec(&hdev->cmd_cnt);
Marcel Holtmann57d17d72013-10-10 14:54:17 -07005289 hci_send_frame(hdev, skb);
Szymon Janc7bdb8a52011-07-26 22:46:54 +02005290 if (test_bit(HCI_RESET, &hdev->flags))
Marcel Holtmann65cc2b42014-06-16 12:30:56 +02005291 cancel_delayed_work(&hdev->cmd_timer);
Szymon Janc7bdb8a52011-07-26 22:46:54 +02005292 else
Marcel Holtmann65cc2b42014-06-16 12:30:56 +02005293 schedule_delayed_work(&hdev->cmd_timer,
5294 HCI_CMD_TIMEOUT);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005295 } else {
5296 skb_queue_head(&hdev->cmd_q, skb);
Gustavo F. Padovanc347b762011-12-14 23:53:47 -02005297 queue_work(hdev->workqueue, &hdev->cmd_work);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005298 }
5299 }
5300}
Andre Guedesb1efcc22014-02-26 20:21:40 -03005301
5302void hci_req_add_le_scan_disable(struct hci_request *req)
5303{
5304 struct hci_cp_le_set_scan_enable cp;
5305
5306 memset(&cp, 0, sizeof(cp));
5307 cp.enable = LE_SCAN_DISABLE;
5308 hci_req_add(req, HCI_OP_LE_SET_SCAN_ENABLE, sizeof(cp), &cp);
5309}
Andre Guedesa4790db2014-02-26 20:21:47 -03005310
Andre Guedes8ef30fd2014-02-26 20:21:55 -03005311void hci_req_add_le_passive_scan(struct hci_request *req)
5312{
5313 struct hci_cp_le_set_scan_param param_cp;
5314 struct hci_cp_le_set_scan_enable enable_cp;
5315 struct hci_dev *hdev = req->hdev;
5316 u8 own_addr_type;
5317
5318 /* Set require_privacy to true to avoid identification from
5319 * unknown peer devices. Since this is passive scanning, no
5320 * SCAN_REQ using the local identity should be sent. Mandating
5321 * privacy is just an extra precaution.
5322 */
5323 if (hci_update_random_address(req, true, &own_addr_type))
5324 return;
5325
5326 memset(&param_cp, 0, sizeof(param_cp));
5327 param_cp.type = LE_SCAN_PASSIVE;
5328 param_cp.interval = cpu_to_le16(hdev->le_scan_interval);
5329 param_cp.window = cpu_to_le16(hdev->le_scan_window);
5330 param_cp.own_address_type = own_addr_type;
5331 hci_req_add(req, HCI_OP_LE_SET_SCAN_PARAM, sizeof(param_cp),
5332 &param_cp);
5333
5334 memset(&enable_cp, 0, sizeof(enable_cp));
5335 enable_cp.enable = LE_SCAN_ENABLE;
Andre Guedes4340a122014-03-10 18:26:24 -03005336 enable_cp.filter_dup = LE_SCAN_FILTER_DUP_ENABLE;
Andre Guedes8ef30fd2014-02-26 20:21:55 -03005337 hci_req_add(req, HCI_OP_LE_SET_SCAN_ENABLE, sizeof(enable_cp),
5338 &enable_cp);
5339}
5340
Andre Guedesa4790db2014-02-26 20:21:47 -03005341static void update_background_scan_complete(struct hci_dev *hdev, u8 status)
5342{
5343 if (status)
5344 BT_DBG("HCI request failed to update background scanning: "
5345 "status 0x%2.2x", status);
5346}
5347
5348/* This function controls the background scanning based on hdev->pend_le_conns
5349 * list. If there are pending LE connection we start the background scanning,
5350 * otherwise we stop it.
5351 *
5352 * This function requires the caller holds hdev->lock.
5353 */
5354void hci_update_background_scan(struct hci_dev *hdev)
5355{
Andre Guedesa4790db2014-02-26 20:21:47 -03005356 struct hci_request req;
5357 struct hci_conn *conn;
5358 int err;
5359
5360 hci_req_init(&req, hdev);
5361
5362 if (list_empty(&hdev->pend_le_conns)) {
5363 /* If there is no pending LE connections, we should stop
5364 * the background scanning.
5365 */
5366
5367 /* If controller is not scanning we are done. */
5368 if (!test_bit(HCI_LE_SCAN, &hdev->dev_flags))
5369 return;
5370
5371 hci_req_add_le_scan_disable(&req);
5372
5373 BT_DBG("%s stopping background scanning", hdev->name);
5374 } else {
Andre Guedesa4790db2014-02-26 20:21:47 -03005375 /* If there is at least one pending LE connection, we should
5376 * keep the background scan running.
5377 */
5378
Andre Guedesa4790db2014-02-26 20:21:47 -03005379 /* If controller is connecting, we should not start scanning
5380 * since some controllers are not able to scan and connect at
5381 * the same time.
5382 */
5383 conn = hci_conn_hash_lookup_state(hdev, LE_LINK, BT_CONNECT);
5384 if (conn)
5385 return;
5386
Andre Guedes4340a122014-03-10 18:26:24 -03005387 /* If controller is currently scanning, we stop it to ensure we
5388 * don't miss any advertising (due to duplicates filter).
5389 */
5390 if (test_bit(HCI_LE_SCAN, &hdev->dev_flags))
5391 hci_req_add_le_scan_disable(&req);
5392
Andre Guedes8ef30fd2014-02-26 20:21:55 -03005393 hci_req_add_le_passive_scan(&req);
Andre Guedesa4790db2014-02-26 20:21:47 -03005394
5395 BT_DBG("%s starting background scanning", hdev->name);
5396 }
5397
5398 err = hci_req_run(&req, update_background_scan_complete);
5399 if (err)
5400 BT_ERR("Failed to run HCI request: err %d", err);
5401}