diff options
Diffstat (limited to 'net/bluetooth/hci_core.c')
-rw-r--r-- | net/bluetooth/hci_core.c | 803 |
1 files changed, 697 insertions, 106 deletions
diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c index 7add9c96e32c..6ccc4eb9e55e 100644 --- a/net/bluetooth/hci_core.c +++ b/net/bluetooth/hci_core.c | |||
@@ -27,8 +27,9 @@ | |||
27 | 27 | ||
28 | #include <linux/export.h> | 28 | #include <linux/export.h> |
29 | #include <linux/idr.h> | 29 | #include <linux/idr.h> |
30 | |||
31 | #include <linux/rfkill.h> | 30 | #include <linux/rfkill.h> |
31 | #include <linux/debugfs.h> | ||
32 | #include <asm/unaligned.h> | ||
32 | 33 | ||
33 | #include <net/bluetooth/bluetooth.h> | 34 | #include <net/bluetooth/bluetooth.h> |
34 | #include <net/bluetooth/hci_core.h> | 35 | #include <net/bluetooth/hci_core.h> |
@@ -55,6 +56,586 @@ static void hci_notify(struct hci_dev *hdev, int event) | |||
55 | hci_sock_dev_event(hdev, event); | 56 | hci_sock_dev_event(hdev, event); |
56 | } | 57 | } |
57 | 58 | ||
59 | /* ---- HCI debugfs entries ---- */ | ||
60 | |||
61 | static ssize_t dut_mode_read(struct file *file, char __user *user_buf, | ||
62 | size_t count, loff_t *ppos) | ||
63 | { | ||
64 | struct hci_dev *hdev = file->private_data; | ||
65 | char buf[3]; | ||
66 | |||
67 | buf[0] = test_bit(HCI_DUT_MODE, &hdev->dev_flags) ? 'Y': 'N'; | ||
68 | buf[1] = '\n'; | ||
69 | buf[2] = '\0'; | ||
70 | return simple_read_from_buffer(user_buf, count, ppos, buf, 2); | ||
71 | } | ||
72 | |||
73 | static ssize_t dut_mode_write(struct file *file, const char __user *user_buf, | ||
74 | size_t count, loff_t *ppos) | ||
75 | { | ||
76 | struct hci_dev *hdev = file->private_data; | ||
77 | struct sk_buff *skb; | ||
78 | char buf[32]; | ||
79 | size_t buf_size = min(count, (sizeof(buf)-1)); | ||
80 | bool enable; | ||
81 | int err; | ||
82 | |||
83 | if (!test_bit(HCI_UP, &hdev->flags)) | ||
84 | return -ENETDOWN; | ||
85 | |||
86 | if (copy_from_user(buf, user_buf, buf_size)) | ||
87 | return -EFAULT; | ||
88 | |||
89 | buf[buf_size] = '\0'; | ||
90 | if (strtobool(buf, &enable)) | ||
91 | return -EINVAL; | ||
92 | |||
93 | if (enable == test_bit(HCI_DUT_MODE, &hdev->dev_flags)) | ||
94 | return -EALREADY; | ||
95 | |||
96 | hci_req_lock(hdev); | ||
97 | if (enable) | ||
98 | skb = __hci_cmd_sync(hdev, HCI_OP_ENABLE_DUT_MODE, 0, NULL, | ||
99 | HCI_CMD_TIMEOUT); | ||
100 | else | ||
101 | skb = __hci_cmd_sync(hdev, HCI_OP_RESET, 0, NULL, | ||
102 | HCI_CMD_TIMEOUT); | ||
103 | hci_req_unlock(hdev); | ||
104 | |||
105 | if (IS_ERR(skb)) | ||
106 | return PTR_ERR(skb); | ||
107 | |||
108 | err = -bt_to_errno(skb->data[0]); | ||
109 | kfree_skb(skb); | ||
110 | |||
111 | if (err < 0) | ||
112 | return err; | ||
113 | |||
114 | change_bit(HCI_DUT_MODE, &hdev->dev_flags); | ||
115 | |||
116 | return count; | ||
117 | } | ||
118 | |||
119 | static const struct file_operations dut_mode_fops = { | ||
120 | .open = simple_open, | ||
121 | .read = dut_mode_read, | ||
122 | .write = dut_mode_write, | ||
123 | .llseek = default_llseek, | ||
124 | }; | ||
125 | |||
126 | static int features_show(struct seq_file *f, void *ptr) | ||
127 | { | ||
128 | struct hci_dev *hdev = f->private; | ||
129 | u8 p; | ||
130 | |||
131 | hci_dev_lock(hdev); | ||
132 | for (p = 0; p < HCI_MAX_PAGES && p <= hdev->max_page; p++) { | ||
133 | seq_printf(f, "%2u: 0x%2.2x 0x%2.2x 0x%2.2x 0x%2.2x " | ||
134 | "0x%2.2x 0x%2.2x 0x%2.2x 0x%2.2x\n", p, | ||
135 | hdev->features[p][0], hdev->features[p][1], | ||
136 | hdev->features[p][2], hdev->features[p][3], | ||
137 | hdev->features[p][4], hdev->features[p][5], | ||
138 | hdev->features[p][6], hdev->features[p][7]); | ||
139 | } | ||
140 | if (lmp_le_capable(hdev)) | ||
141 | seq_printf(f, "LE: 0x%2.2x 0x%2.2x 0x%2.2x 0x%2.2x " | ||
142 | "0x%2.2x 0x%2.2x 0x%2.2x 0x%2.2x\n", | ||
143 | hdev->le_features[0], hdev->le_features[1], | ||
144 | hdev->le_features[2], hdev->le_features[3], | ||
145 | hdev->le_features[4], hdev->le_features[5], | ||
146 | hdev->le_features[6], hdev->le_features[7]); | ||
147 | hci_dev_unlock(hdev); | ||
148 | |||
149 | return 0; | ||
150 | } | ||
151 | |||
152 | static int features_open(struct inode *inode, struct file *file) | ||
153 | { | ||
154 | return single_open(file, features_show, inode->i_private); | ||
155 | } | ||
156 | |||
157 | static const struct file_operations features_fops = { | ||
158 | .open = features_open, | ||
159 | .read = seq_read, | ||
160 | .llseek = seq_lseek, | ||
161 | .release = single_release, | ||
162 | }; | ||
163 | |||
164 | static int blacklist_show(struct seq_file *f, void *p) | ||
165 | { | ||
166 | struct hci_dev *hdev = f->private; | ||
167 | struct bdaddr_list *b; | ||
168 | |||
169 | hci_dev_lock(hdev); | ||
170 | list_for_each_entry(b, &hdev->blacklist, list) | ||
171 | seq_printf(f, "%pMR (type %u)\n", &b->bdaddr, b->bdaddr_type); | ||
172 | hci_dev_unlock(hdev); | ||
173 | |||
174 | return 0; | ||
175 | } | ||
176 | |||
177 | static int blacklist_open(struct inode *inode, struct file *file) | ||
178 | { | ||
179 | return single_open(file, blacklist_show, inode->i_private); | ||
180 | } | ||
181 | |||
182 | static const struct file_operations blacklist_fops = { | ||
183 | .open = blacklist_open, | ||
184 | .read = seq_read, | ||
185 | .llseek = seq_lseek, | ||
186 | .release = single_release, | ||
187 | }; | ||
188 | |||
189 | static int uuids_show(struct seq_file *f, void *p) | ||
190 | { | ||
191 | struct hci_dev *hdev = f->private; | ||
192 | struct bt_uuid *uuid; | ||
193 | |||
194 | hci_dev_lock(hdev); | ||
195 | list_for_each_entry(uuid, &hdev->uuids, list) { | ||
196 | u8 i, val[16]; | ||
197 | |||
198 | /* The Bluetooth UUID values are stored in big endian, | ||
199 | * but with reversed byte order. So convert them into | ||
200 | * the right order for the %pUb modifier. | ||
201 | */ | ||
202 | for (i = 0; i < 16; i++) | ||
203 | val[i] = uuid->uuid[15 - i]; | ||
204 | |||
205 | seq_printf(f, "%pUb\n", val); | ||
206 | } | ||
207 | hci_dev_unlock(hdev); | ||
208 | |||
209 | return 0; | ||
210 | } | ||
211 | |||
212 | static int uuids_open(struct inode *inode, struct file *file) | ||
213 | { | ||
214 | return single_open(file, uuids_show, inode->i_private); | ||
215 | } | ||
216 | |||
217 | static const struct file_operations uuids_fops = { | ||
218 | .open = uuids_open, | ||
219 | .read = seq_read, | ||
220 | .llseek = seq_lseek, | ||
221 | .release = single_release, | ||
222 | }; | ||
223 | |||
224 | static int inquiry_cache_show(struct seq_file *f, void *p) | ||
225 | { | ||
226 | struct hci_dev *hdev = f->private; | ||
227 | struct discovery_state *cache = &hdev->discovery; | ||
228 | struct inquiry_entry *e; | ||
229 | |||
230 | hci_dev_lock(hdev); | ||
231 | |||
232 | list_for_each_entry(e, &cache->all, all) { | ||
233 | struct inquiry_data *data = &e->data; | ||
234 | seq_printf(f, "%pMR %d %d %d 0x%.2x%.2x%.2x 0x%.4x %d %d %u\n", | ||
235 | &data->bdaddr, | ||
236 | data->pscan_rep_mode, data->pscan_period_mode, | ||
237 | data->pscan_mode, data->dev_class[2], | ||
238 | data->dev_class[1], data->dev_class[0], | ||
239 | __le16_to_cpu(data->clock_offset), | ||
240 | data->rssi, data->ssp_mode, e->timestamp); | ||
241 | } | ||
242 | |||
243 | hci_dev_unlock(hdev); | ||
244 | |||
245 | return 0; | ||
246 | } | ||
247 | |||
248 | static int inquiry_cache_open(struct inode *inode, struct file *file) | ||
249 | { | ||
250 | return single_open(file, inquiry_cache_show, inode->i_private); | ||
251 | } | ||
252 | |||
253 | static const struct file_operations inquiry_cache_fops = { | ||
254 | .open = inquiry_cache_open, | ||
255 | .read = seq_read, | ||
256 | .llseek = seq_lseek, | ||
257 | .release = single_release, | ||
258 | }; | ||
259 | |||
260 | static int link_keys_show(struct seq_file *f, void *ptr) | ||
261 | { | ||
262 | struct hci_dev *hdev = f->private; | ||
263 | struct list_head *p, *n; | ||
264 | |||
265 | hci_dev_lock(hdev); | ||
266 | list_for_each_safe(p, n, &hdev->link_keys) { | ||
267 | struct link_key *key = list_entry(p, struct link_key, list); | ||
268 | seq_printf(f, "%pMR %u %*phN %u\n", &key->bdaddr, key->type, | ||
269 | HCI_LINK_KEY_SIZE, key->val, key->pin_len); | ||
270 | } | ||
271 | hci_dev_unlock(hdev); | ||
272 | |||
273 | return 0; | ||
274 | } | ||
275 | |||
276 | static int link_keys_open(struct inode *inode, struct file *file) | ||
277 | { | ||
278 | return single_open(file, link_keys_show, inode->i_private); | ||
279 | } | ||
280 | |||
281 | static const struct file_operations link_keys_fops = { | ||
282 | .open = link_keys_open, | ||
283 | .read = seq_read, | ||
284 | .llseek = seq_lseek, | ||
285 | .release = single_release, | ||
286 | }; | ||
287 | |||
288 | static ssize_t use_debug_keys_read(struct file *file, char __user *user_buf, | ||
289 | size_t count, loff_t *ppos) | ||
290 | { | ||
291 | struct hci_dev *hdev = file->private_data; | ||
292 | char buf[3]; | ||
293 | |||
294 | buf[0] = test_bit(HCI_DEBUG_KEYS, &hdev->dev_flags) ? 'Y': 'N'; | ||
295 | buf[1] = '\n'; | ||
296 | buf[2] = '\0'; | ||
297 | return simple_read_from_buffer(user_buf, count, ppos, buf, 2); | ||
298 | } | ||
299 | |||
300 | static const struct file_operations use_debug_keys_fops = { | ||
301 | .open = simple_open, | ||
302 | .read = use_debug_keys_read, | ||
303 | .llseek = default_llseek, | ||
304 | }; | ||
305 | |||
306 | static int dev_class_show(struct seq_file *f, void *ptr) | ||
307 | { | ||
308 | struct hci_dev *hdev = f->private; | ||
309 | |||
310 | hci_dev_lock(hdev); | ||
311 | seq_printf(f, "0x%.2x%.2x%.2x\n", hdev->dev_class[2], | ||
312 | hdev->dev_class[1], hdev->dev_class[0]); | ||
313 | hci_dev_unlock(hdev); | ||
314 | |||
315 | return 0; | ||
316 | } | ||
317 | |||
318 | static int dev_class_open(struct inode *inode, struct file *file) | ||
319 | { | ||
320 | return single_open(file, dev_class_show, inode->i_private); | ||
321 | } | ||
322 | |||
323 | static const struct file_operations dev_class_fops = { | ||
324 | .open = dev_class_open, | ||
325 | .read = seq_read, | ||
326 | .llseek = seq_lseek, | ||
327 | .release = single_release, | ||
328 | }; | ||
329 | |||
330 | static int voice_setting_get(void *data, u64 *val) | ||
331 | { | ||
332 | struct hci_dev *hdev = data; | ||
333 | |||
334 | hci_dev_lock(hdev); | ||
335 | *val = hdev->voice_setting; | ||
336 | hci_dev_unlock(hdev); | ||
337 | |||
338 | return 0; | ||
339 | } | ||
340 | |||
341 | DEFINE_SIMPLE_ATTRIBUTE(voice_setting_fops, voice_setting_get, | ||
342 | NULL, "0x%4.4llx\n"); | ||
343 | |||
344 | static int auto_accept_delay_set(void *data, u64 val) | ||
345 | { | ||
346 | struct hci_dev *hdev = data; | ||
347 | |||
348 | hci_dev_lock(hdev); | ||
349 | hdev->auto_accept_delay = val; | ||
350 | hci_dev_unlock(hdev); | ||
351 | |||
352 | return 0; | ||
353 | } | ||
354 | |||
355 | static int auto_accept_delay_get(void *data, u64 *val) | ||
356 | { | ||
357 | struct hci_dev *hdev = data; | ||
358 | |||
359 | hci_dev_lock(hdev); | ||
360 | *val = hdev->auto_accept_delay; | ||
361 | hci_dev_unlock(hdev); | ||
362 | |||
363 | return 0; | ||
364 | } | ||
365 | |||
366 | DEFINE_SIMPLE_ATTRIBUTE(auto_accept_delay_fops, auto_accept_delay_get, | ||
367 | auto_accept_delay_set, "%llu\n"); | ||
368 | |||
369 | static int ssp_debug_mode_set(void *data, u64 val) | ||
370 | { | ||
371 | struct hci_dev *hdev = data; | ||
372 | struct sk_buff *skb; | ||
373 | __u8 mode; | ||
374 | int err; | ||
375 | |||
376 | if (val != 0 && val != 1) | ||
377 | return -EINVAL; | ||
378 | |||
379 | if (!test_bit(HCI_UP, &hdev->flags)) | ||
380 | return -ENETDOWN; | ||
381 | |||
382 | hci_req_lock(hdev); | ||
383 | mode = val; | ||
384 | skb = __hci_cmd_sync(hdev, HCI_OP_WRITE_SSP_DEBUG_MODE, sizeof(mode), | ||
385 | &mode, HCI_CMD_TIMEOUT); | ||
386 | hci_req_unlock(hdev); | ||
387 | |||
388 | if (IS_ERR(skb)) | ||
389 | return PTR_ERR(skb); | ||
390 | |||
391 | err = -bt_to_errno(skb->data[0]); | ||
392 | kfree_skb(skb); | ||
393 | |||
394 | if (err < 0) | ||
395 | return err; | ||
396 | |||
397 | hci_dev_lock(hdev); | ||
398 | hdev->ssp_debug_mode = val; | ||
399 | hci_dev_unlock(hdev); | ||
400 | |||
401 | return 0; | ||
402 | } | ||
403 | |||
404 | static int ssp_debug_mode_get(void *data, u64 *val) | ||
405 | { | ||
406 | struct hci_dev *hdev = data; | ||
407 | |||
408 | hci_dev_lock(hdev); | ||
409 | *val = hdev->ssp_debug_mode; | ||
410 | hci_dev_unlock(hdev); | ||
411 | |||
412 | return 0; | ||
413 | } | ||
414 | |||
415 | DEFINE_SIMPLE_ATTRIBUTE(ssp_debug_mode_fops, ssp_debug_mode_get, | ||
416 | ssp_debug_mode_set, "%llu\n"); | ||
417 | |||
418 | static int idle_timeout_set(void *data, u64 val) | ||
419 | { | ||
420 | struct hci_dev *hdev = data; | ||
421 | |||
422 | if (val != 0 && (val < 500 || val > 3600000)) | ||
423 | return -EINVAL; | ||
424 | |||
425 | hci_dev_lock(hdev); | ||
426 | hdev->idle_timeout = val; | ||
427 | hci_dev_unlock(hdev); | ||
428 | |||
429 | return 0; | ||
430 | } | ||
431 | |||
432 | static int idle_timeout_get(void *data, u64 *val) | ||
433 | { | ||
434 | struct hci_dev *hdev = data; | ||
435 | |||
436 | hci_dev_lock(hdev); | ||
437 | *val = hdev->idle_timeout; | ||
438 | hci_dev_unlock(hdev); | ||
439 | |||
440 | return 0; | ||
441 | } | ||
442 | |||
443 | DEFINE_SIMPLE_ATTRIBUTE(idle_timeout_fops, idle_timeout_get, | ||
444 | idle_timeout_set, "%llu\n"); | ||
445 | |||
446 | static int sniff_min_interval_set(void *data, u64 val) | ||
447 | { | ||
448 | struct hci_dev *hdev = data; | ||
449 | |||
450 | if (val == 0 || val % 2 || val > hdev->sniff_max_interval) | ||
451 | return -EINVAL; | ||
452 | |||
453 | hci_dev_lock(hdev); | ||
454 | hdev->sniff_min_interval = val; | ||
455 | hci_dev_unlock(hdev); | ||
456 | |||
457 | return 0; | ||
458 | } | ||
459 | |||
460 | static int sniff_min_interval_get(void *data, u64 *val) | ||
461 | { | ||
462 | struct hci_dev *hdev = data; | ||
463 | |||
464 | hci_dev_lock(hdev); | ||
465 | *val = hdev->sniff_min_interval; | ||
466 | hci_dev_unlock(hdev); | ||
467 | |||
468 | return 0; | ||
469 | } | ||
470 | |||
471 | DEFINE_SIMPLE_ATTRIBUTE(sniff_min_interval_fops, sniff_min_interval_get, | ||
472 | sniff_min_interval_set, "%llu\n"); | ||
473 | |||
474 | static int sniff_max_interval_set(void *data, u64 val) | ||
475 | { | ||
476 | struct hci_dev *hdev = data; | ||
477 | |||
478 | if (val == 0 || val % 2 || val < hdev->sniff_min_interval) | ||
479 | return -EINVAL; | ||
480 | |||
481 | hci_dev_lock(hdev); | ||
482 | hdev->sniff_max_interval = val; | ||
483 | hci_dev_unlock(hdev); | ||
484 | |||
485 | return 0; | ||
486 | } | ||
487 | |||
488 | static int sniff_max_interval_get(void *data, u64 *val) | ||
489 | { | ||
490 | struct hci_dev *hdev = data; | ||
491 | |||
492 | hci_dev_lock(hdev); | ||
493 | *val = hdev->sniff_max_interval; | ||
494 | hci_dev_unlock(hdev); | ||
495 | |||
496 | return 0; | ||
497 | } | ||
498 | |||
499 | DEFINE_SIMPLE_ATTRIBUTE(sniff_max_interval_fops, sniff_max_interval_get, | ||
500 | sniff_max_interval_set, "%llu\n"); | ||
501 | |||
502 | static int static_address_show(struct seq_file *f, void *p) | ||
503 | { | ||
504 | struct hci_dev *hdev = f->private; | ||
505 | |||
506 | hci_dev_lock(hdev); | ||
507 | seq_printf(f, "%pMR\n", &hdev->static_addr); | ||
508 | hci_dev_unlock(hdev); | ||
509 | |||
510 | return 0; | ||
511 | } | ||
512 | |||
513 | static int static_address_open(struct inode *inode, struct file *file) | ||
514 | { | ||
515 | return single_open(file, static_address_show, inode->i_private); | ||
516 | } | ||
517 | |||
518 | static const struct file_operations static_address_fops = { | ||
519 | .open = static_address_open, | ||
520 | .read = seq_read, | ||
521 | .llseek = seq_lseek, | ||
522 | .release = single_release, | ||
523 | }; | ||
524 | |||
525 | static int own_address_type_set(void *data, u64 val) | ||
526 | { | ||
527 | struct hci_dev *hdev = data; | ||
528 | |||
529 | if (val != 0 && val != 1) | ||
530 | return -EINVAL; | ||
531 | |||
532 | hci_dev_lock(hdev); | ||
533 | hdev->own_addr_type = val; | ||
534 | hci_dev_unlock(hdev); | ||
535 | |||
536 | return 0; | ||
537 | } | ||
538 | |||
539 | static int own_address_type_get(void *data, u64 *val) | ||
540 | { | ||
541 | struct hci_dev *hdev = data; | ||
542 | |||
543 | hci_dev_lock(hdev); | ||
544 | *val = hdev->own_addr_type; | ||
545 | hci_dev_unlock(hdev); | ||
546 | |||
547 | return 0; | ||
548 | } | ||
549 | |||
550 | DEFINE_SIMPLE_ATTRIBUTE(own_address_type_fops, own_address_type_get, | ||
551 | own_address_type_set, "%llu\n"); | ||
552 | |||
553 | static int long_term_keys_show(struct seq_file *f, void *ptr) | ||
554 | { | ||
555 | struct hci_dev *hdev = f->private; | ||
556 | struct list_head *p, *n; | ||
557 | |||
558 | hci_dev_lock(hdev); | ||
559 | list_for_each_safe(p, n, &hdev->link_keys) { | ||
560 | struct smp_ltk *ltk = list_entry(p, struct smp_ltk, list); | ||
561 | seq_printf(f, "%pMR (type %u) %u %u %u %.4x %*phN %*phN\\n", | ||
562 | <k->bdaddr, ltk->bdaddr_type, ltk->authenticated, | ||
563 | ltk->type, ltk->enc_size, __le16_to_cpu(ltk->ediv), | ||
564 | 8, ltk->rand, 16, ltk->val); | ||
565 | } | ||
566 | hci_dev_unlock(hdev); | ||
567 | |||
568 | return 0; | ||
569 | } | ||
570 | |||
571 | static int long_term_keys_open(struct inode *inode, struct file *file) | ||
572 | { | ||
573 | return single_open(file, long_term_keys_show, inode->i_private); | ||
574 | } | ||
575 | |||
576 | static const struct file_operations long_term_keys_fops = { | ||
577 | .open = long_term_keys_open, | ||
578 | .read = seq_read, | ||
579 | .llseek = seq_lseek, | ||
580 | .release = single_release, | ||
581 | }; | ||
582 | |||
583 | static int conn_min_interval_set(void *data, u64 val) | ||
584 | { | ||
585 | struct hci_dev *hdev = data; | ||
586 | |||
587 | if (val < 0x0006 || val > 0x0c80 || val > hdev->le_conn_max_interval) | ||
588 | return -EINVAL; | ||
589 | |||
590 | hci_dev_lock(hdev); | ||
591 | hdev->le_conn_min_interval = val; | ||
592 | hci_dev_unlock(hdev); | ||
593 | |||
594 | return 0; | ||
595 | } | ||
596 | |||
597 | static int conn_min_interval_get(void *data, u64 *val) | ||
598 | { | ||
599 | struct hci_dev *hdev = data; | ||
600 | |||
601 | hci_dev_lock(hdev); | ||
602 | *val = hdev->le_conn_min_interval; | ||
603 | hci_dev_unlock(hdev); | ||
604 | |||
605 | return 0; | ||
606 | } | ||
607 | |||
608 | DEFINE_SIMPLE_ATTRIBUTE(conn_min_interval_fops, conn_min_interval_get, | ||
609 | conn_min_interval_set, "%llu\n"); | ||
610 | |||
611 | static int conn_max_interval_set(void *data, u64 val) | ||
612 | { | ||
613 | struct hci_dev *hdev = data; | ||
614 | |||
615 | if (val < 0x0006 || val > 0x0c80 || val < hdev->le_conn_min_interval) | ||
616 | return -EINVAL; | ||
617 | |||
618 | hci_dev_lock(hdev); | ||
619 | hdev->le_conn_max_interval = val; | ||
620 | hci_dev_unlock(hdev); | ||
621 | |||
622 | return 0; | ||
623 | } | ||
624 | |||
625 | static int conn_max_interval_get(void *data, u64 *val) | ||
626 | { | ||
627 | struct hci_dev *hdev = data; | ||
628 | |||
629 | hci_dev_lock(hdev); | ||
630 | *val = hdev->le_conn_max_interval; | ||
631 | hci_dev_unlock(hdev); | ||
632 | |||
633 | return 0; | ||
634 | } | ||
635 | |||
636 | DEFINE_SIMPLE_ATTRIBUTE(conn_max_interval_fops, conn_max_interval_get, | ||
637 | conn_max_interval_set, "%llu\n"); | ||
638 | |||
58 | /* ---- HCI requests ---- */ | 639 | /* ---- HCI requests ---- */ |
59 | 640 | ||
60 | static void hci_req_sync_complete(struct hci_dev *hdev, u8 result) | 641 | static void hci_req_sync_complete(struct hci_dev *hdev, u8 result) |
@@ -556,6 +1137,14 @@ static void hci_init2_req(struct hci_request *req, unsigned long opt) | |||
556 | hci_req_add(req, HCI_OP_READ_LOCAL_COMMANDS, 0, NULL); | 1137 | hci_req_add(req, HCI_OP_READ_LOCAL_COMMANDS, 0, NULL); |
557 | 1138 | ||
558 | if (lmp_ssp_capable(hdev)) { | 1139 | if (lmp_ssp_capable(hdev)) { |
1140 | /* When SSP is available, then the host features page | ||
1141 | * should also be available as well. However some | ||
1142 | * controllers list the max_page as 0 as long as SSP | ||
1143 | * has not been enabled. To achieve proper debugging | ||
1144 | * output, force the minimum max_page to 1 at least. | ||
1145 | */ | ||
1146 | hdev->max_page = 0x01; | ||
1147 | |||
559 | if (test_bit(HCI_SSP_ENABLED, &hdev->dev_flags)) { | 1148 | if (test_bit(HCI_SSP_ENABLED, &hdev->dev_flags)) { |
560 | u8 mode = 0x01; | 1149 | u8 mode = 0x01; |
561 | hci_req_add(req, HCI_OP_WRITE_SSP_MODE, | 1150 | hci_req_add(req, HCI_OP_WRITE_SSP_MODE, |
@@ -686,8 +1275,17 @@ static void hci_init3_req(struct hci_request *req, unsigned long opt) | |||
686 | hci_setup_link_policy(req); | 1275 | hci_setup_link_policy(req); |
687 | 1276 | ||
688 | if (lmp_le_capable(hdev)) { | 1277 | if (lmp_le_capable(hdev)) { |
1278 | /* If the controller has a public BD_ADDR, then by | ||
1279 | * default use that one. If this is a LE only | ||
1280 | * controller without one, default to the random | ||
1281 | * address. | ||
1282 | */ | ||
1283 | if (bacmp(&hdev->bdaddr, BDADDR_ANY)) | ||
1284 | hdev->own_addr_type = ADDR_LE_DEV_PUBLIC; | ||
1285 | else | ||
1286 | hdev->own_addr_type = ADDR_LE_DEV_RANDOM; | ||
1287 | |||
689 | hci_set_le_support(req); | 1288 | hci_set_le_support(req); |
690 | hci_update_ad(req); | ||
691 | } | 1289 | } |
692 | 1290 | ||
693 | /* Read features beyond page 1 if available */ | 1291 | /* Read features beyond page 1 if available */ |
@@ -721,6 +1319,14 @@ static int __hci_init(struct hci_dev *hdev) | |||
721 | if (err < 0) | 1319 | if (err < 0) |
722 | return err; | 1320 | return err; |
723 | 1321 | ||
1322 | /* The Device Under Test (DUT) mode is special and available for | ||
1323 | * all controller types. So just create it early on. | ||
1324 | */ | ||
1325 | if (test_bit(HCI_SETUP, &hdev->dev_flags)) { | ||
1326 | debugfs_create_file("dut_mode", 0644, hdev->debugfs, hdev, | ||
1327 | &dut_mode_fops); | ||
1328 | } | ||
1329 | |||
724 | /* HCI_BREDR covers both single-mode LE, BR/EDR and dual-mode | 1330 | /* HCI_BREDR covers both single-mode LE, BR/EDR and dual-mode |
725 | * BR/EDR/LE type controllers. AMP controllers only need the | 1331 | * BR/EDR/LE type controllers. AMP controllers only need the |
726 | * first stage init. | 1332 | * first stage init. |
@@ -736,7 +1342,71 @@ static int __hci_init(struct hci_dev *hdev) | |||
736 | if (err < 0) | 1342 | if (err < 0) |
737 | return err; | 1343 | return err; |
738 | 1344 | ||
739 | return __hci_req_sync(hdev, hci_init4_req, 0, HCI_INIT_TIMEOUT); | 1345 | err = __hci_req_sync(hdev, hci_init4_req, 0, HCI_INIT_TIMEOUT); |
1346 | if (err < 0) | ||
1347 | return err; | ||
1348 | |||
1349 | /* Only create debugfs entries during the initial setup | ||
1350 | * phase and not every time the controller gets powered on. | ||
1351 | */ | ||
1352 | if (!test_bit(HCI_SETUP, &hdev->dev_flags)) | ||
1353 | return 0; | ||
1354 | |||
1355 | debugfs_create_file("features", 0444, hdev->debugfs, hdev, | ||
1356 | &features_fops); | ||
1357 | debugfs_create_u16("manufacturer", 0444, hdev->debugfs, | ||
1358 | &hdev->manufacturer); | ||
1359 | debugfs_create_u8("hci_version", 0444, hdev->debugfs, &hdev->hci_ver); | ||
1360 | debugfs_create_u16("hci_revision", 0444, hdev->debugfs, &hdev->hci_rev); | ||
1361 | debugfs_create_file("blacklist", 0444, hdev->debugfs, hdev, | ||
1362 | &blacklist_fops); | ||
1363 | debugfs_create_file("uuids", 0444, hdev->debugfs, hdev, &uuids_fops); | ||
1364 | |||
1365 | if (lmp_bredr_capable(hdev)) { | ||
1366 | debugfs_create_file("inquiry_cache", 0444, hdev->debugfs, | ||
1367 | hdev, &inquiry_cache_fops); | ||
1368 | debugfs_create_file("link_keys", 0400, hdev->debugfs, | ||
1369 | hdev, &link_keys_fops); | ||
1370 | debugfs_create_file("use_debug_keys", 0444, hdev->debugfs, | ||
1371 | hdev, &use_debug_keys_fops); | ||
1372 | debugfs_create_file("dev_class", 0444, hdev->debugfs, | ||
1373 | hdev, &dev_class_fops); | ||
1374 | debugfs_create_file("voice_setting", 0444, hdev->debugfs, | ||
1375 | hdev, &voice_setting_fops); | ||
1376 | } | ||
1377 | |||
1378 | if (lmp_ssp_capable(hdev)) { | ||
1379 | debugfs_create_file("auto_accept_delay", 0644, hdev->debugfs, | ||
1380 | hdev, &auto_accept_delay_fops); | ||
1381 | debugfs_create_file("ssp_debug_mode", 0644, hdev->debugfs, | ||
1382 | hdev, &ssp_debug_mode_fops); | ||
1383 | } | ||
1384 | |||
1385 | if (lmp_sniff_capable(hdev)) { | ||
1386 | debugfs_create_file("idle_timeout", 0644, hdev->debugfs, | ||
1387 | hdev, &idle_timeout_fops); | ||
1388 | debugfs_create_file("sniff_min_interval", 0644, hdev->debugfs, | ||
1389 | hdev, &sniff_min_interval_fops); | ||
1390 | debugfs_create_file("sniff_max_interval", 0644, hdev->debugfs, | ||
1391 | hdev, &sniff_max_interval_fops); | ||
1392 | } | ||
1393 | |||
1394 | if (lmp_le_capable(hdev)) { | ||
1395 | debugfs_create_u8("white_list_size", 0444, hdev->debugfs, | ||
1396 | &hdev->le_white_list_size); | ||
1397 | debugfs_create_file("static_address", 0444, hdev->debugfs, | ||
1398 | hdev, &static_address_fops); | ||
1399 | debugfs_create_file("own_address_type", 0644, hdev->debugfs, | ||
1400 | hdev, &own_address_type_fops); | ||
1401 | debugfs_create_file("long_term_keys", 0400, hdev->debugfs, | ||
1402 | hdev, &long_term_keys_fops); | ||
1403 | debugfs_create_file("conn_min_interval", 0644, hdev->debugfs, | ||
1404 | hdev, &conn_min_interval_fops); | ||
1405 | debugfs_create_file("conn_max_interval", 0644, hdev->debugfs, | ||
1406 | hdev, &conn_max_interval_fops); | ||
1407 | } | ||
1408 | |||
1409 | return 0; | ||
740 | } | 1410 | } |
741 | 1411 | ||
742 | static void hci_scan_req(struct hci_request *req, unsigned long opt) | 1412 | static void hci_scan_req(struct hci_request *req, unsigned long opt) |
@@ -1127,89 +1797,6 @@ done: | |||
1127 | return err; | 1797 | return err; |
1128 | } | 1798 | } |
1129 | 1799 | ||
1130 | static u8 create_ad(struct hci_dev *hdev, u8 *ptr) | ||
1131 | { | ||
1132 | u8 ad_len = 0, flags = 0; | ||
1133 | size_t name_len; | ||
1134 | |||
1135 | if (test_bit(HCI_ADVERTISING, &hdev->dev_flags)) | ||
1136 | flags |= LE_AD_GENERAL; | ||
1137 | |||
1138 | if (test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags)) { | ||
1139 | if (lmp_le_br_capable(hdev)) | ||
1140 | flags |= LE_AD_SIM_LE_BREDR_CTRL; | ||
1141 | if (lmp_host_le_br_capable(hdev)) | ||
1142 | flags |= LE_AD_SIM_LE_BREDR_HOST; | ||
1143 | } else { | ||
1144 | flags |= LE_AD_NO_BREDR; | ||
1145 | } | ||
1146 | |||
1147 | if (flags) { | ||
1148 | BT_DBG("adv flags 0x%02x", flags); | ||
1149 | |||
1150 | ptr[0] = 2; | ||
1151 | ptr[1] = EIR_FLAGS; | ||
1152 | ptr[2] = flags; | ||
1153 | |||
1154 | ad_len += 3; | ||
1155 | ptr += 3; | ||
1156 | } | ||
1157 | |||
1158 | if (hdev->adv_tx_power != HCI_TX_POWER_INVALID) { | ||
1159 | ptr[0] = 2; | ||
1160 | ptr[1] = EIR_TX_POWER; | ||
1161 | ptr[2] = (u8) hdev->adv_tx_power; | ||
1162 | |||
1163 | ad_len += 3; | ||
1164 | ptr += 3; | ||
1165 | } | ||
1166 | |||
1167 | name_len = strlen(hdev->dev_name); | ||
1168 | if (name_len > 0) { | ||
1169 | size_t max_len = HCI_MAX_AD_LENGTH - ad_len - 2; | ||
1170 | |||
1171 | if (name_len > max_len) { | ||
1172 | name_len = max_len; | ||
1173 | ptr[1] = EIR_NAME_SHORT; | ||
1174 | } else | ||
1175 | ptr[1] = EIR_NAME_COMPLETE; | ||
1176 | |||
1177 | ptr[0] = name_len + 1; | ||
1178 | |||
1179 | memcpy(ptr + 2, hdev->dev_name, name_len); | ||
1180 | |||
1181 | ad_len += (name_len + 2); | ||
1182 | ptr += (name_len + 2); | ||
1183 | } | ||
1184 | |||
1185 | return ad_len; | ||
1186 | } | ||
1187 | |||
1188 | void hci_update_ad(struct hci_request *req) | ||
1189 | { | ||
1190 | struct hci_dev *hdev = req->hdev; | ||
1191 | struct hci_cp_le_set_adv_data cp; | ||
1192 | u8 len; | ||
1193 | |||
1194 | if (!lmp_le_capable(hdev)) | ||
1195 | return; | ||
1196 | |||
1197 | memset(&cp, 0, sizeof(cp)); | ||
1198 | |||
1199 | len = create_ad(hdev, cp.data); | ||
1200 | |||
1201 | if (hdev->adv_data_len == len && | ||
1202 | memcmp(cp.data, hdev->adv_data, len) == 0) | ||
1203 | return; | ||
1204 | |||
1205 | memcpy(hdev->adv_data, cp.data, sizeof(cp.data)); | ||
1206 | hdev->adv_data_len = len; | ||
1207 | |||
1208 | cp.length = len; | ||
1209 | |||
1210 | hci_req_add(req, HCI_OP_LE_SET_ADV_DATA, sizeof(cp), &cp); | ||
1211 | } | ||
1212 | |||
1213 | static int hci_dev_do_open(struct hci_dev *hdev) | 1800 | static int hci_dev_do_open(struct hci_dev *hdev) |
1214 | { | 1801 | { |
1215 | int ret = 0; | 1802 | int ret = 0; |
@@ -1367,6 +1954,7 @@ static int hci_dev_do_close(struct hci_dev *hdev) | |||
1367 | cancel_delayed_work(&hdev->discov_off); | 1954 | cancel_delayed_work(&hdev->discov_off); |
1368 | hdev->discov_timeout = 0; | 1955 | hdev->discov_timeout = 0; |
1369 | clear_bit(HCI_DISCOVERABLE, &hdev->dev_flags); | 1956 | clear_bit(HCI_DISCOVERABLE, &hdev->dev_flags); |
1957 | clear_bit(HCI_LIMITED_DISCOVERABLE, &hdev->dev_flags); | ||
1370 | } | 1958 | } |
1371 | 1959 | ||
1372 | if (test_and_clear_bit(HCI_SERVICE_CACHE, &hdev->dev_flags)) | 1960 | if (test_and_clear_bit(HCI_SERVICE_CACHE, &hdev->dev_flags)) |
@@ -1789,19 +2377,12 @@ static void hci_power_off(struct work_struct *work) | |||
1789 | static void hci_discov_off(struct work_struct *work) | 2377 | static void hci_discov_off(struct work_struct *work) |
1790 | { | 2378 | { |
1791 | struct hci_dev *hdev; | 2379 | struct hci_dev *hdev; |
1792 | u8 scan = SCAN_PAGE; | ||
1793 | 2380 | ||
1794 | hdev = container_of(work, struct hci_dev, discov_off.work); | 2381 | hdev = container_of(work, struct hci_dev, discov_off.work); |
1795 | 2382 | ||
1796 | BT_DBG("%s", hdev->name); | 2383 | BT_DBG("%s", hdev->name); |
1797 | 2384 | ||
1798 | hci_dev_lock(hdev); | 2385 | mgmt_discoverable_timeout(hdev); |
1799 | |||
1800 | hci_send_cmd(hdev, HCI_OP_WRITE_SCAN_ENABLE, sizeof(scan), &scan); | ||
1801 | |||
1802 | hdev->discov_timeout = 0; | ||
1803 | |||
1804 | hci_dev_unlock(hdev); | ||
1805 | } | 2386 | } |
1806 | 2387 | ||
1807 | int hci_uuids_clear(struct hci_dev *hdev) | 2388 | int hci_uuids_clear(struct hci_dev *hdev) |
@@ -2124,13 +2705,15 @@ int hci_add_remote_oob_data(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 *hash, | |||
2124 | return 0; | 2705 | return 0; |
2125 | } | 2706 | } |
2126 | 2707 | ||
2127 | struct bdaddr_list *hci_blacklist_lookup(struct hci_dev *hdev, bdaddr_t *bdaddr) | 2708 | struct bdaddr_list *hci_blacklist_lookup(struct hci_dev *hdev, |
2709 | bdaddr_t *bdaddr, u8 type) | ||
2128 | { | 2710 | { |
2129 | struct bdaddr_list *b; | 2711 | struct bdaddr_list *b; |
2130 | 2712 | ||
2131 | list_for_each_entry(b, &hdev->blacklist, list) | 2713 | list_for_each_entry(b, &hdev->blacklist, list) { |
2132 | if (bacmp(bdaddr, &b->bdaddr) == 0) | 2714 | if (!bacmp(&b->bdaddr, bdaddr) && b->bdaddr_type == type) |
2133 | return b; | 2715 | return b; |
2716 | } | ||
2134 | 2717 | ||
2135 | return NULL; | 2718 | return NULL; |
2136 | } | 2719 | } |
@@ -2140,9 +2723,7 @@ int hci_blacklist_clear(struct hci_dev *hdev) | |||
2140 | struct list_head *p, *n; | 2723 | struct list_head *p, *n; |
2141 | 2724 | ||
2142 | list_for_each_safe(p, n, &hdev->blacklist) { | 2725 | list_for_each_safe(p, n, &hdev->blacklist) { |
2143 | struct bdaddr_list *b; | 2726 | struct bdaddr_list *b = list_entry(p, struct bdaddr_list, list); |
2144 | |||
2145 | b = list_entry(p, struct bdaddr_list, list); | ||
2146 | 2727 | ||
2147 | list_del(p); | 2728 | list_del(p); |
2148 | kfree(b); | 2729 | kfree(b); |
@@ -2155,10 +2736,10 @@ int hci_blacklist_add(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type) | |||
2155 | { | 2736 | { |
2156 | struct bdaddr_list *entry; | 2737 | struct bdaddr_list *entry; |
2157 | 2738 | ||
2158 | if (bacmp(bdaddr, BDADDR_ANY) == 0) | 2739 | if (!bacmp(bdaddr, BDADDR_ANY)) |
2159 | return -EBADF; | 2740 | return -EBADF; |
2160 | 2741 | ||
2161 | if (hci_blacklist_lookup(hdev, bdaddr)) | 2742 | if (hci_blacklist_lookup(hdev, bdaddr, type)) |
2162 | return -EEXIST; | 2743 | return -EEXIST; |
2163 | 2744 | ||
2164 | entry = kzalloc(sizeof(struct bdaddr_list), GFP_KERNEL); | 2745 | entry = kzalloc(sizeof(struct bdaddr_list), GFP_KERNEL); |
@@ -2166,6 +2747,7 @@ int hci_blacklist_add(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type) | |||
2166 | return -ENOMEM; | 2747 | return -ENOMEM; |
2167 | 2748 | ||
2168 | bacpy(&entry->bdaddr, bdaddr); | 2749 | bacpy(&entry->bdaddr, bdaddr); |
2750 | entry->bdaddr_type = type; | ||
2169 | 2751 | ||
2170 | list_add(&entry->list, &hdev->blacklist); | 2752 | list_add(&entry->list, &hdev->blacklist); |
2171 | 2753 | ||
@@ -2176,10 +2758,10 @@ int hci_blacklist_del(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type) | |||
2176 | { | 2758 | { |
2177 | struct bdaddr_list *entry; | 2759 | struct bdaddr_list *entry; |
2178 | 2760 | ||
2179 | if (bacmp(bdaddr, BDADDR_ANY) == 0) | 2761 | if (!bacmp(bdaddr, BDADDR_ANY)) |
2180 | return hci_blacklist_clear(hdev); | 2762 | return hci_blacklist_clear(hdev); |
2181 | 2763 | ||
2182 | entry = hci_blacklist_lookup(hdev, bdaddr); | 2764 | entry = hci_blacklist_lookup(hdev, bdaddr, type); |
2183 | if (!entry) | 2765 | if (!entry) |
2184 | return -ENOENT; | 2766 | return -ENOENT; |
2185 | 2767 | ||
@@ -2287,6 +2869,8 @@ struct hci_dev *hci_alloc_dev(void) | |||
2287 | 2869 | ||
2288 | hdev->le_scan_interval = 0x0060; | 2870 | hdev->le_scan_interval = 0x0060; |
2289 | hdev->le_scan_window = 0x0030; | 2871 | hdev->le_scan_window = 0x0030; |
2872 | hdev->le_conn_min_interval = 0x0028; | ||
2873 | hdev->le_conn_max_interval = 0x0038; | ||
2290 | 2874 | ||
2291 | mutex_init(&hdev->lock); | 2875 | mutex_init(&hdev->lock); |
2292 | mutex_init(&hdev->req_lock); | 2876 | mutex_init(&hdev->req_lock); |
@@ -2376,7 +2960,12 @@ int hci_register_dev(struct hci_dev *hdev) | |||
2376 | goto err; | 2960 | goto err; |
2377 | } | 2961 | } |
2378 | 2962 | ||
2379 | error = hci_add_sysfs(hdev); | 2963 | if (!IS_ERR_OR_NULL(bt_debugfs)) |
2964 | hdev->debugfs = debugfs_create_dir(hdev->name, bt_debugfs); | ||
2965 | |||
2966 | dev_set_name(&hdev->dev, "%s", hdev->name); | ||
2967 | |||
2968 | error = device_add(&hdev->dev); | ||
2380 | if (error < 0) | 2969 | if (error < 0) |
2381 | goto err_wqueue; | 2970 | goto err_wqueue; |
2382 | 2971 | ||
@@ -2464,7 +3053,9 @@ void hci_unregister_dev(struct hci_dev *hdev) | |||
2464 | rfkill_destroy(hdev->rfkill); | 3053 | rfkill_destroy(hdev->rfkill); |
2465 | } | 3054 | } |
2466 | 3055 | ||
2467 | hci_del_sysfs(hdev); | 3056 | device_del(&hdev->dev); |
3057 | |||
3058 | debugfs_remove_recursive(hdev->debugfs); | ||
2468 | 3059 | ||
2469 | destroy_workqueue(hdev->workqueue); | 3060 | destroy_workqueue(hdev->workqueue); |
2470 | destroy_workqueue(hdev->req_workqueue); | 3061 | destroy_workqueue(hdev->req_workqueue); |