staging: ks7010: replace cast type in assignment in hostif_sme_set_pmksa
[linux/fpc-iii.git] / net / bluetooth / hci_debugfs.c
blob418b76e557b0a58bf7903c830866a58b4b28147d
1 /*
2 BlueZ - Bluetooth protocol stack for Linux
4 Copyright (C) 2014 Intel Corporation
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License version 2 as
8 published by the Free Software Foundation;
10 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
11 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
12 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
13 IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
14 CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
15 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19 ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
20 COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
21 SOFTWARE IS DISCLAIMED.
24 #include <linux/debugfs.h>
26 #include <net/bluetooth/bluetooth.h>
27 #include <net/bluetooth/hci_core.h>
29 #include "hci_debugfs.h"
31 #define DEFINE_QUIRK_ATTRIBUTE(__name, __quirk) \
32 static ssize_t __name ## _read(struct file *file, \
33 char __user *user_buf, \
34 size_t count, loff_t *ppos) \
35 { \
36 struct hci_dev *hdev = file->private_data; \
37 char buf[3]; \
39 buf[0] = test_bit(__quirk, &hdev->quirks) ? 'Y' : 'N'; \
40 buf[1] = '\n'; \
41 buf[2] = '\0'; \
42 return simple_read_from_buffer(user_buf, count, ppos, buf, 2); \
43 } \
45 static ssize_t __name ## _write(struct file *file, \
46 const char __user *user_buf, \
47 size_t count, loff_t *ppos) \
48 { \
49 struct hci_dev *hdev = file->private_data; \
50 char buf[32]; \
51 size_t buf_size = min(count, (sizeof(buf) - 1)); \
52 bool enable; \
54 if (test_bit(HCI_UP, &hdev->flags)) \
55 return -EBUSY; \
57 if (copy_from_user(buf, user_buf, buf_size)) \
58 return -EFAULT; \
60 buf[buf_size] = '\0'; \
61 if (strtobool(buf, &enable)) \
62 return -EINVAL; \
64 if (enable == test_bit(__quirk, &hdev->quirks)) \
65 return -EALREADY; \
67 change_bit(__quirk, &hdev->quirks); \
69 return count; \
70 } \
72 static const struct file_operations __name ## _fops = { \
73 .open = simple_open, \
74 .read = __name ## _read, \
75 .write = __name ## _write, \
76 .llseek = default_llseek, \
77 } \
79 #define DEFINE_INFO_ATTRIBUTE(__name, __field) \
80 static int __name ## _show(struct seq_file *f, void *ptr) \
81 { \
82 struct hci_dev *hdev = f->private; \
84 hci_dev_lock(hdev); \
85 seq_printf(f, "%s\n", hdev->__field ? : ""); \
86 hci_dev_unlock(hdev); \
88 return 0; \
89 } \
91 DEFINE_SHOW_ATTRIBUTE(__name)
93 static int features_show(struct seq_file *f, void *ptr)
95 struct hci_dev *hdev = f->private;
96 u8 p;
98 hci_dev_lock(hdev);
99 for (p = 0; p < HCI_MAX_PAGES && p <= hdev->max_page; p++)
100 seq_printf(f, "%2u: %8ph\n", p, hdev->features[p]);
101 if (lmp_le_capable(hdev))
102 seq_printf(f, "LE: %8ph\n", hdev->le_features);
103 hci_dev_unlock(hdev);
105 return 0;
108 DEFINE_SHOW_ATTRIBUTE(features);
110 static int device_id_show(struct seq_file *f, void *ptr)
112 struct hci_dev *hdev = f->private;
114 hci_dev_lock(hdev);
115 seq_printf(f, "%4.4x:%4.4x:%4.4x:%4.4x\n", hdev->devid_source,
116 hdev->devid_vendor, hdev->devid_product, hdev->devid_version);
117 hci_dev_unlock(hdev);
119 return 0;
122 DEFINE_SHOW_ATTRIBUTE(device_id);
124 static int device_list_show(struct seq_file *f, void *ptr)
126 struct hci_dev *hdev = f->private;
127 struct hci_conn_params *p;
128 struct bdaddr_list *b;
130 hci_dev_lock(hdev);
131 list_for_each_entry(b, &hdev->whitelist, list)
132 seq_printf(f, "%pMR (type %u)\n", &b->bdaddr, b->bdaddr_type);
133 list_for_each_entry(p, &hdev->le_conn_params, list) {
134 seq_printf(f, "%pMR (type %u) %u\n", &p->addr, p->addr_type,
135 p->auto_connect);
137 hci_dev_unlock(hdev);
139 return 0;
142 DEFINE_SHOW_ATTRIBUTE(device_list);
144 static int blacklist_show(struct seq_file *f, void *p)
146 struct hci_dev *hdev = f->private;
147 struct bdaddr_list *b;
149 hci_dev_lock(hdev);
150 list_for_each_entry(b, &hdev->blacklist, list)
151 seq_printf(f, "%pMR (type %u)\n", &b->bdaddr, b->bdaddr_type);
152 hci_dev_unlock(hdev);
154 return 0;
157 DEFINE_SHOW_ATTRIBUTE(blacklist);
159 static int uuids_show(struct seq_file *f, void *p)
161 struct hci_dev *hdev = f->private;
162 struct bt_uuid *uuid;
164 hci_dev_lock(hdev);
165 list_for_each_entry(uuid, &hdev->uuids, list) {
166 u8 i, val[16];
168 /* The Bluetooth UUID values are stored in big endian,
169 * but with reversed byte order. So convert them into
170 * the right order for the %pUb modifier.
172 for (i = 0; i < 16; i++)
173 val[i] = uuid->uuid[15 - i];
175 seq_printf(f, "%pUb\n", val);
177 hci_dev_unlock(hdev);
179 return 0;
182 DEFINE_SHOW_ATTRIBUTE(uuids);
184 static int remote_oob_show(struct seq_file *f, void *ptr)
186 struct hci_dev *hdev = f->private;
187 struct oob_data *data;
189 hci_dev_lock(hdev);
190 list_for_each_entry(data, &hdev->remote_oob_data, list) {
191 seq_printf(f, "%pMR (type %u) %u %*phN %*phN %*phN %*phN\n",
192 &data->bdaddr, data->bdaddr_type, data->present,
193 16, data->hash192, 16, data->rand192,
194 16, data->hash256, 16, data->rand256);
196 hci_dev_unlock(hdev);
198 return 0;
201 DEFINE_SHOW_ATTRIBUTE(remote_oob);
203 static int conn_info_min_age_set(void *data, u64 val)
205 struct hci_dev *hdev = data;
207 if (val == 0 || val > hdev->conn_info_max_age)
208 return -EINVAL;
210 hci_dev_lock(hdev);
211 hdev->conn_info_min_age = val;
212 hci_dev_unlock(hdev);
214 return 0;
217 static int conn_info_min_age_get(void *data, u64 *val)
219 struct hci_dev *hdev = data;
221 hci_dev_lock(hdev);
222 *val = hdev->conn_info_min_age;
223 hci_dev_unlock(hdev);
225 return 0;
228 DEFINE_SIMPLE_ATTRIBUTE(conn_info_min_age_fops, conn_info_min_age_get,
229 conn_info_min_age_set, "%llu\n");
231 static int conn_info_max_age_set(void *data, u64 val)
233 struct hci_dev *hdev = data;
235 if (val == 0 || val < hdev->conn_info_min_age)
236 return -EINVAL;
238 hci_dev_lock(hdev);
239 hdev->conn_info_max_age = val;
240 hci_dev_unlock(hdev);
242 return 0;
245 static int conn_info_max_age_get(void *data, u64 *val)
247 struct hci_dev *hdev = data;
249 hci_dev_lock(hdev);
250 *val = hdev->conn_info_max_age;
251 hci_dev_unlock(hdev);
253 return 0;
256 DEFINE_SIMPLE_ATTRIBUTE(conn_info_max_age_fops, conn_info_max_age_get,
257 conn_info_max_age_set, "%llu\n");
259 static ssize_t use_debug_keys_read(struct file *file, char __user *user_buf,
260 size_t count, loff_t *ppos)
262 struct hci_dev *hdev = file->private_data;
263 char buf[3];
265 buf[0] = hci_dev_test_flag(hdev, HCI_USE_DEBUG_KEYS) ? 'Y': 'N';
266 buf[1] = '\n';
267 buf[2] = '\0';
268 return simple_read_from_buffer(user_buf, count, ppos, buf, 2);
271 static const struct file_operations use_debug_keys_fops = {
272 .open = simple_open,
273 .read = use_debug_keys_read,
274 .llseek = default_llseek,
277 static ssize_t sc_only_mode_read(struct file *file, char __user *user_buf,
278 size_t count, loff_t *ppos)
280 struct hci_dev *hdev = file->private_data;
281 char buf[3];
283 buf[0] = hci_dev_test_flag(hdev, HCI_SC_ONLY) ? 'Y': 'N';
284 buf[1] = '\n';
285 buf[2] = '\0';
286 return simple_read_from_buffer(user_buf, count, ppos, buf, 2);
289 static const struct file_operations sc_only_mode_fops = {
290 .open = simple_open,
291 .read = sc_only_mode_read,
292 .llseek = default_llseek,
295 DEFINE_INFO_ATTRIBUTE(hardware_info, hw_info);
296 DEFINE_INFO_ATTRIBUTE(firmware_info, fw_info);
298 void hci_debugfs_create_common(struct hci_dev *hdev)
300 debugfs_create_file("features", 0444, hdev->debugfs, hdev,
301 &features_fops);
302 debugfs_create_u16("manufacturer", 0444, hdev->debugfs,
303 &hdev->manufacturer);
304 debugfs_create_u8("hci_version", 0444, hdev->debugfs, &hdev->hci_ver);
305 debugfs_create_u16("hci_revision", 0444, hdev->debugfs, &hdev->hci_rev);
306 debugfs_create_u8("hardware_error", 0444, hdev->debugfs,
307 &hdev->hw_error_code);
308 debugfs_create_file("device_id", 0444, hdev->debugfs, hdev,
309 &device_id_fops);
311 debugfs_create_file("device_list", 0444, hdev->debugfs, hdev,
312 &device_list_fops);
313 debugfs_create_file("blacklist", 0444, hdev->debugfs, hdev,
314 &blacklist_fops);
315 debugfs_create_file("uuids", 0444, hdev->debugfs, hdev, &uuids_fops);
316 debugfs_create_file("remote_oob", 0400, hdev->debugfs, hdev,
317 &remote_oob_fops);
319 debugfs_create_file("conn_info_min_age", 0644, hdev->debugfs, hdev,
320 &conn_info_min_age_fops);
321 debugfs_create_file("conn_info_max_age", 0644, hdev->debugfs, hdev,
322 &conn_info_max_age_fops);
324 if (lmp_ssp_capable(hdev) || lmp_le_capable(hdev))
325 debugfs_create_file("use_debug_keys", 0444, hdev->debugfs,
326 hdev, &use_debug_keys_fops);
328 if (lmp_sc_capable(hdev) || lmp_le_capable(hdev))
329 debugfs_create_file("sc_only_mode", 0444, hdev->debugfs,
330 hdev, &sc_only_mode_fops);
332 if (hdev->hw_info)
333 debugfs_create_file("hardware_info", 0444, hdev->debugfs,
334 hdev, &hardware_info_fops);
336 if (hdev->fw_info)
337 debugfs_create_file("firmware_info", 0444, hdev->debugfs,
338 hdev, &firmware_info_fops);
341 static int inquiry_cache_show(struct seq_file *f, void *p)
343 struct hci_dev *hdev = f->private;
344 struct discovery_state *cache = &hdev->discovery;
345 struct inquiry_entry *e;
347 hci_dev_lock(hdev);
349 list_for_each_entry(e, &cache->all, all) {
350 struct inquiry_data *data = &e->data;
351 seq_printf(f, "%pMR %d %d %d 0x%.2x%.2x%.2x 0x%.4x %d %d %u\n",
352 &data->bdaddr,
353 data->pscan_rep_mode, data->pscan_period_mode,
354 data->pscan_mode, data->dev_class[2],
355 data->dev_class[1], data->dev_class[0],
356 __le16_to_cpu(data->clock_offset),
357 data->rssi, data->ssp_mode, e->timestamp);
360 hci_dev_unlock(hdev);
362 return 0;
365 DEFINE_SHOW_ATTRIBUTE(inquiry_cache);
367 static int link_keys_show(struct seq_file *f, void *ptr)
369 struct hci_dev *hdev = f->private;
370 struct link_key *key;
372 rcu_read_lock();
373 list_for_each_entry_rcu(key, &hdev->link_keys, list)
374 seq_printf(f, "%pMR %u %*phN %u\n", &key->bdaddr, key->type,
375 HCI_LINK_KEY_SIZE, key->val, key->pin_len);
376 rcu_read_unlock();
378 return 0;
381 DEFINE_SHOW_ATTRIBUTE(link_keys);
383 static int dev_class_show(struct seq_file *f, void *ptr)
385 struct hci_dev *hdev = f->private;
387 hci_dev_lock(hdev);
388 seq_printf(f, "0x%.2x%.2x%.2x\n", hdev->dev_class[2],
389 hdev->dev_class[1], hdev->dev_class[0]);
390 hci_dev_unlock(hdev);
392 return 0;
395 DEFINE_SHOW_ATTRIBUTE(dev_class);
397 static int voice_setting_get(void *data, u64 *val)
399 struct hci_dev *hdev = data;
401 hci_dev_lock(hdev);
402 *val = hdev->voice_setting;
403 hci_dev_unlock(hdev);
405 return 0;
408 DEFINE_SIMPLE_ATTRIBUTE(voice_setting_fops, voice_setting_get,
409 NULL, "0x%4.4llx\n");
411 static ssize_t ssp_debug_mode_read(struct file *file, char __user *user_buf,
412 size_t count, loff_t *ppos)
414 struct hci_dev *hdev = file->private_data;
415 char buf[3];
417 buf[0] = hdev->ssp_debug_mode ? 'Y': 'N';
418 buf[1] = '\n';
419 buf[2] = '\0';
420 return simple_read_from_buffer(user_buf, count, ppos, buf, 2);
423 static const struct file_operations ssp_debug_mode_fops = {
424 .open = simple_open,
425 .read = ssp_debug_mode_read,
426 .llseek = default_llseek,
429 static int auto_accept_delay_set(void *data, u64 val)
431 struct hci_dev *hdev = data;
433 hci_dev_lock(hdev);
434 hdev->auto_accept_delay = val;
435 hci_dev_unlock(hdev);
437 return 0;
440 static int auto_accept_delay_get(void *data, u64 *val)
442 struct hci_dev *hdev = data;
444 hci_dev_lock(hdev);
445 *val = hdev->auto_accept_delay;
446 hci_dev_unlock(hdev);
448 return 0;
451 DEFINE_SIMPLE_ATTRIBUTE(auto_accept_delay_fops, auto_accept_delay_get,
452 auto_accept_delay_set, "%llu\n");
454 static int idle_timeout_set(void *data, u64 val)
456 struct hci_dev *hdev = data;
458 if (val != 0 && (val < 500 || val > 3600000))
459 return -EINVAL;
461 hci_dev_lock(hdev);
462 hdev->idle_timeout = val;
463 hci_dev_unlock(hdev);
465 return 0;
468 static int idle_timeout_get(void *data, u64 *val)
470 struct hci_dev *hdev = data;
472 hci_dev_lock(hdev);
473 *val = hdev->idle_timeout;
474 hci_dev_unlock(hdev);
476 return 0;
479 DEFINE_SIMPLE_ATTRIBUTE(idle_timeout_fops, idle_timeout_get,
480 idle_timeout_set, "%llu\n");
482 static int sniff_min_interval_set(void *data, u64 val)
484 struct hci_dev *hdev = data;
486 if (val == 0 || val % 2 || val > hdev->sniff_max_interval)
487 return -EINVAL;
489 hci_dev_lock(hdev);
490 hdev->sniff_min_interval = val;
491 hci_dev_unlock(hdev);
493 return 0;
496 static int sniff_min_interval_get(void *data, u64 *val)
498 struct hci_dev *hdev = data;
500 hci_dev_lock(hdev);
501 *val = hdev->sniff_min_interval;
502 hci_dev_unlock(hdev);
504 return 0;
507 DEFINE_SIMPLE_ATTRIBUTE(sniff_min_interval_fops, sniff_min_interval_get,
508 sniff_min_interval_set, "%llu\n");
510 static int sniff_max_interval_set(void *data, u64 val)
512 struct hci_dev *hdev = data;
514 if (val == 0 || val % 2 || val < hdev->sniff_min_interval)
515 return -EINVAL;
517 hci_dev_lock(hdev);
518 hdev->sniff_max_interval = val;
519 hci_dev_unlock(hdev);
521 return 0;
524 static int sniff_max_interval_get(void *data, u64 *val)
526 struct hci_dev *hdev = data;
528 hci_dev_lock(hdev);
529 *val = hdev->sniff_max_interval;
530 hci_dev_unlock(hdev);
532 return 0;
535 DEFINE_SIMPLE_ATTRIBUTE(sniff_max_interval_fops, sniff_max_interval_get,
536 sniff_max_interval_set, "%llu\n");
538 void hci_debugfs_create_bredr(struct hci_dev *hdev)
540 debugfs_create_file("inquiry_cache", 0444, hdev->debugfs, hdev,
541 &inquiry_cache_fops);
542 debugfs_create_file("link_keys", 0400, hdev->debugfs, hdev,
543 &link_keys_fops);
544 debugfs_create_file("dev_class", 0444, hdev->debugfs, hdev,
545 &dev_class_fops);
546 debugfs_create_file("voice_setting", 0444, hdev->debugfs, hdev,
547 &voice_setting_fops);
549 if (lmp_ssp_capable(hdev)) {
550 debugfs_create_file("ssp_debug_mode", 0444, hdev->debugfs,
551 hdev, &ssp_debug_mode_fops);
552 debugfs_create_file("auto_accept_delay", 0644, hdev->debugfs,
553 hdev, &auto_accept_delay_fops);
556 if (lmp_sniff_capable(hdev)) {
557 debugfs_create_file("idle_timeout", 0644, hdev->debugfs,
558 hdev, &idle_timeout_fops);
559 debugfs_create_file("sniff_min_interval", 0644, hdev->debugfs,
560 hdev, &sniff_min_interval_fops);
561 debugfs_create_file("sniff_max_interval", 0644, hdev->debugfs,
562 hdev, &sniff_max_interval_fops);
566 static int identity_show(struct seq_file *f, void *p)
568 struct hci_dev *hdev = f->private;
569 bdaddr_t addr;
570 u8 addr_type;
572 hci_dev_lock(hdev);
574 hci_copy_identity_address(hdev, &addr, &addr_type);
576 seq_printf(f, "%pMR (type %u) %*phN %pMR\n", &addr, addr_type,
577 16, hdev->irk, &hdev->rpa);
579 hci_dev_unlock(hdev);
581 return 0;
584 DEFINE_SHOW_ATTRIBUTE(identity);
586 static int rpa_timeout_set(void *data, u64 val)
588 struct hci_dev *hdev = data;
590 /* Require the RPA timeout to be at least 30 seconds and at most
591 * 24 hours.
593 if (val < 30 || val > (60 * 60 * 24))
594 return -EINVAL;
596 hci_dev_lock(hdev);
597 hdev->rpa_timeout = val;
598 hci_dev_unlock(hdev);
600 return 0;
603 static int rpa_timeout_get(void *data, u64 *val)
605 struct hci_dev *hdev = data;
607 hci_dev_lock(hdev);
608 *val = hdev->rpa_timeout;
609 hci_dev_unlock(hdev);
611 return 0;
614 DEFINE_SIMPLE_ATTRIBUTE(rpa_timeout_fops, rpa_timeout_get,
615 rpa_timeout_set, "%llu\n");
617 static int random_address_show(struct seq_file *f, void *p)
619 struct hci_dev *hdev = f->private;
621 hci_dev_lock(hdev);
622 seq_printf(f, "%pMR\n", &hdev->random_addr);
623 hci_dev_unlock(hdev);
625 return 0;
628 DEFINE_SHOW_ATTRIBUTE(random_address);
630 static int static_address_show(struct seq_file *f, void *p)
632 struct hci_dev *hdev = f->private;
634 hci_dev_lock(hdev);
635 seq_printf(f, "%pMR\n", &hdev->static_addr);
636 hci_dev_unlock(hdev);
638 return 0;
641 DEFINE_SHOW_ATTRIBUTE(static_address);
643 static ssize_t force_static_address_read(struct file *file,
644 char __user *user_buf,
645 size_t count, loff_t *ppos)
647 struct hci_dev *hdev = file->private_data;
648 char buf[3];
650 buf[0] = hci_dev_test_flag(hdev, HCI_FORCE_STATIC_ADDR) ? 'Y': 'N';
651 buf[1] = '\n';
652 buf[2] = '\0';
653 return simple_read_from_buffer(user_buf, count, ppos, buf, 2);
656 static ssize_t force_static_address_write(struct file *file,
657 const char __user *user_buf,
658 size_t count, loff_t *ppos)
660 struct hci_dev *hdev = file->private_data;
661 char buf[32];
662 size_t buf_size = min(count, (sizeof(buf)-1));
663 bool enable;
665 if (test_bit(HCI_UP, &hdev->flags))
666 return -EBUSY;
668 if (copy_from_user(buf, user_buf, buf_size))
669 return -EFAULT;
671 buf[buf_size] = '\0';
672 if (strtobool(buf, &enable))
673 return -EINVAL;
675 if (enable == hci_dev_test_flag(hdev, HCI_FORCE_STATIC_ADDR))
676 return -EALREADY;
678 hci_dev_change_flag(hdev, HCI_FORCE_STATIC_ADDR);
680 return count;
683 static const struct file_operations force_static_address_fops = {
684 .open = simple_open,
685 .read = force_static_address_read,
686 .write = force_static_address_write,
687 .llseek = default_llseek,
690 static int white_list_show(struct seq_file *f, void *ptr)
692 struct hci_dev *hdev = f->private;
693 struct bdaddr_list *b;
695 hci_dev_lock(hdev);
696 list_for_each_entry(b, &hdev->le_white_list, list)
697 seq_printf(f, "%pMR (type %u)\n", &b->bdaddr, b->bdaddr_type);
698 hci_dev_unlock(hdev);
700 return 0;
703 DEFINE_SHOW_ATTRIBUTE(white_list);
705 static int identity_resolving_keys_show(struct seq_file *f, void *ptr)
707 struct hci_dev *hdev = f->private;
708 struct smp_irk *irk;
710 rcu_read_lock();
711 list_for_each_entry_rcu(irk, &hdev->identity_resolving_keys, list) {
712 seq_printf(f, "%pMR (type %u) %*phN %pMR\n",
713 &irk->bdaddr, irk->addr_type,
714 16, irk->val, &irk->rpa);
716 rcu_read_unlock();
718 return 0;
721 DEFINE_SHOW_ATTRIBUTE(identity_resolving_keys);
723 static int long_term_keys_show(struct seq_file *f, void *ptr)
725 struct hci_dev *hdev = f->private;
726 struct smp_ltk *ltk;
728 rcu_read_lock();
729 list_for_each_entry_rcu(ltk, &hdev->long_term_keys, list)
730 seq_printf(f, "%pMR (type %u) %u 0x%02x %u %.4x %.16llx %*phN\n",
731 &ltk->bdaddr, ltk->bdaddr_type, ltk->authenticated,
732 ltk->type, ltk->enc_size, __le16_to_cpu(ltk->ediv),
733 __le64_to_cpu(ltk->rand), 16, ltk->val);
734 rcu_read_unlock();
736 return 0;
739 DEFINE_SHOW_ATTRIBUTE(long_term_keys);
741 static int conn_min_interval_set(void *data, u64 val)
743 struct hci_dev *hdev = data;
745 if (val < 0x0006 || val > 0x0c80 || val > hdev->le_conn_max_interval)
746 return -EINVAL;
748 hci_dev_lock(hdev);
749 hdev->le_conn_min_interval = val;
750 hci_dev_unlock(hdev);
752 return 0;
755 static int conn_min_interval_get(void *data, u64 *val)
757 struct hci_dev *hdev = data;
759 hci_dev_lock(hdev);
760 *val = hdev->le_conn_min_interval;
761 hci_dev_unlock(hdev);
763 return 0;
766 DEFINE_SIMPLE_ATTRIBUTE(conn_min_interval_fops, conn_min_interval_get,
767 conn_min_interval_set, "%llu\n");
769 static int conn_max_interval_set(void *data, u64 val)
771 struct hci_dev *hdev = data;
773 if (val < 0x0006 || val > 0x0c80 || val < hdev->le_conn_min_interval)
774 return -EINVAL;
776 hci_dev_lock(hdev);
777 hdev->le_conn_max_interval = val;
778 hci_dev_unlock(hdev);
780 return 0;
783 static int conn_max_interval_get(void *data, u64 *val)
785 struct hci_dev *hdev = data;
787 hci_dev_lock(hdev);
788 *val = hdev->le_conn_max_interval;
789 hci_dev_unlock(hdev);
791 return 0;
794 DEFINE_SIMPLE_ATTRIBUTE(conn_max_interval_fops, conn_max_interval_get,
795 conn_max_interval_set, "%llu\n");
797 static int conn_latency_set(void *data, u64 val)
799 struct hci_dev *hdev = data;
801 if (val > 0x01f3)
802 return -EINVAL;
804 hci_dev_lock(hdev);
805 hdev->le_conn_latency = val;
806 hci_dev_unlock(hdev);
808 return 0;
811 static int conn_latency_get(void *data, u64 *val)
813 struct hci_dev *hdev = data;
815 hci_dev_lock(hdev);
816 *val = hdev->le_conn_latency;
817 hci_dev_unlock(hdev);
819 return 0;
822 DEFINE_SIMPLE_ATTRIBUTE(conn_latency_fops, conn_latency_get,
823 conn_latency_set, "%llu\n");
825 static int supervision_timeout_set(void *data, u64 val)
827 struct hci_dev *hdev = data;
829 if (val < 0x000a || val > 0x0c80)
830 return -EINVAL;
832 hci_dev_lock(hdev);
833 hdev->le_supv_timeout = val;
834 hci_dev_unlock(hdev);
836 return 0;
839 static int supervision_timeout_get(void *data, u64 *val)
841 struct hci_dev *hdev = data;
843 hci_dev_lock(hdev);
844 *val = hdev->le_supv_timeout;
845 hci_dev_unlock(hdev);
847 return 0;
850 DEFINE_SIMPLE_ATTRIBUTE(supervision_timeout_fops, supervision_timeout_get,
851 supervision_timeout_set, "%llu\n");
853 static int adv_channel_map_set(void *data, u64 val)
855 struct hci_dev *hdev = data;
857 if (val < 0x01 || val > 0x07)
858 return -EINVAL;
860 hci_dev_lock(hdev);
861 hdev->le_adv_channel_map = val;
862 hci_dev_unlock(hdev);
864 return 0;
867 static int adv_channel_map_get(void *data, u64 *val)
869 struct hci_dev *hdev = data;
871 hci_dev_lock(hdev);
872 *val = hdev->le_adv_channel_map;
873 hci_dev_unlock(hdev);
875 return 0;
878 DEFINE_SIMPLE_ATTRIBUTE(adv_channel_map_fops, adv_channel_map_get,
879 adv_channel_map_set, "%llu\n");
881 static int adv_min_interval_set(void *data, u64 val)
883 struct hci_dev *hdev = data;
885 if (val < 0x0020 || val > 0x4000 || val > hdev->le_adv_max_interval)
886 return -EINVAL;
888 hci_dev_lock(hdev);
889 hdev->le_adv_min_interval = val;
890 hci_dev_unlock(hdev);
892 return 0;
895 static int adv_min_interval_get(void *data, u64 *val)
897 struct hci_dev *hdev = data;
899 hci_dev_lock(hdev);
900 *val = hdev->le_adv_min_interval;
901 hci_dev_unlock(hdev);
903 return 0;
906 DEFINE_SIMPLE_ATTRIBUTE(adv_min_interval_fops, adv_min_interval_get,
907 adv_min_interval_set, "%llu\n");
909 static int adv_max_interval_set(void *data, u64 val)
911 struct hci_dev *hdev = data;
913 if (val < 0x0020 || val > 0x4000 || val < hdev->le_adv_min_interval)
914 return -EINVAL;
916 hci_dev_lock(hdev);
917 hdev->le_adv_max_interval = val;
918 hci_dev_unlock(hdev);
920 return 0;
923 static int adv_max_interval_get(void *data, u64 *val)
925 struct hci_dev *hdev = data;
927 hci_dev_lock(hdev);
928 *val = hdev->le_adv_max_interval;
929 hci_dev_unlock(hdev);
931 return 0;
934 DEFINE_SIMPLE_ATTRIBUTE(adv_max_interval_fops, adv_max_interval_get,
935 adv_max_interval_set, "%llu\n");
937 DEFINE_QUIRK_ATTRIBUTE(quirk_strict_duplicate_filter,
938 HCI_QUIRK_STRICT_DUPLICATE_FILTER);
939 DEFINE_QUIRK_ATTRIBUTE(quirk_simultaneous_discovery,
940 HCI_QUIRK_SIMULTANEOUS_DISCOVERY);
942 void hci_debugfs_create_le(struct hci_dev *hdev)
944 debugfs_create_file("identity", 0400, hdev->debugfs, hdev,
945 &identity_fops);
946 debugfs_create_file("rpa_timeout", 0644, hdev->debugfs, hdev,
947 &rpa_timeout_fops);
948 debugfs_create_file("random_address", 0444, hdev->debugfs, hdev,
949 &random_address_fops);
950 debugfs_create_file("static_address", 0444, hdev->debugfs, hdev,
951 &static_address_fops);
953 /* For controllers with a public address, provide a debug
954 * option to force the usage of the configured static
955 * address. By default the public address is used.
957 if (bacmp(&hdev->bdaddr, BDADDR_ANY))
958 debugfs_create_file("force_static_address", 0644,
959 hdev->debugfs, hdev,
960 &force_static_address_fops);
962 debugfs_create_u8("white_list_size", 0444, hdev->debugfs,
963 &hdev->le_white_list_size);
964 debugfs_create_file("white_list", 0444, hdev->debugfs, hdev,
965 &white_list_fops);
966 debugfs_create_file("identity_resolving_keys", 0400, hdev->debugfs,
967 hdev, &identity_resolving_keys_fops);
968 debugfs_create_file("long_term_keys", 0400, hdev->debugfs, hdev,
969 &long_term_keys_fops);
970 debugfs_create_file("conn_min_interval", 0644, hdev->debugfs, hdev,
971 &conn_min_interval_fops);
972 debugfs_create_file("conn_max_interval", 0644, hdev->debugfs, hdev,
973 &conn_max_interval_fops);
974 debugfs_create_file("conn_latency", 0644, hdev->debugfs, hdev,
975 &conn_latency_fops);
976 debugfs_create_file("supervision_timeout", 0644, hdev->debugfs, hdev,
977 &supervision_timeout_fops);
978 debugfs_create_file("adv_channel_map", 0644, hdev->debugfs, hdev,
979 &adv_channel_map_fops);
980 debugfs_create_file("adv_min_interval", 0644, hdev->debugfs, hdev,
981 &adv_min_interval_fops);
982 debugfs_create_file("adv_max_interval", 0644, hdev->debugfs, hdev,
983 &adv_max_interval_fops);
984 debugfs_create_u16("discov_interleaved_timeout", 0644, hdev->debugfs,
985 &hdev->discov_interleaved_timeout);
987 debugfs_create_file("quirk_strict_duplicate_filter", 0644,
988 hdev->debugfs, hdev,
989 &quirk_strict_duplicate_filter_fops);
990 debugfs_create_file("quirk_simultaneous_discovery", 0644,
991 hdev->debugfs, hdev,
992 &quirk_simultaneous_discovery_fops);
995 void hci_debugfs_create_conn(struct hci_conn *conn)
997 struct hci_dev *hdev = conn->hdev;
998 char name[6];
1000 if (IS_ERR_OR_NULL(hdev->debugfs))
1001 return;
1003 snprintf(name, sizeof(name), "%u", conn->handle);
1004 conn->debugfs = debugfs_create_dir(name, hdev->debugfs);