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) \
36 struct hci_dev *hdev = file->private_data; \
39 buf[0] = test_bit(__quirk, &hdev->quirks) ? 'Y' : 'N'; \
42 return simple_read_from_buffer(user_buf, count, ppos, buf, 2); \
45 static ssize_t __name ## _write(struct file *file, \
46 const char __user *user_buf, \
47 size_t count, loff_t *ppos) \
49 struct hci_dev *hdev = file->private_data; \
51 size_t buf_size = min(count, (sizeof(buf) - 1)); \
54 if (test_bit(HCI_UP, &hdev->flags)) \
57 if (copy_from_user(buf, user_buf, buf_size)) \
60 buf[buf_size] = '\0'; \
61 if (strtobool(buf, &enable)) \
64 if (enable == test_bit(__quirk, &hdev->quirks)) \
67 change_bit(__quirk, &hdev->quirks); \
72 static const struct file_operations __name ## _fops = { \
73 .open = simple_open, \
74 .read = __name ## _read, \
75 .write = __name ## _write, \
76 .llseek = default_llseek, \
79 #define DEFINE_INFO_ATTRIBUTE(__name, __field) \
80 static int __name ## _show(struct seq_file *f, void *ptr) \
82 struct hci_dev *hdev = f->private; \
85 seq_printf(f, "%s\n", hdev->__field ? : ""); \
86 hci_dev_unlock(hdev); \
91 static int __name ## _open(struct inode *inode, struct file *file) \
93 return single_open(file, __name ## _show, inode->i_private); \
96 static const struct file_operations __name ## _fops = { \
97 .open = __name ## _open, \
99 .llseek = seq_lseek, \
100 .release = single_release, \
103 static int features_show(struct seq_file *f, void *ptr)
105 struct hci_dev *hdev = f->private;
109 for (p = 0; p < HCI_MAX_PAGES && p <= hdev->max_page; p++)
110 seq_printf(f, "%2u: %8ph\n", p, hdev->features[p]);
111 if (lmp_le_capable(hdev))
112 seq_printf(f, "LE: %8ph\n", hdev->le_features);
113 hci_dev_unlock(hdev);
118 static int features_open(struct inode *inode, struct file *file)
120 return single_open(file, features_show, inode->i_private);
123 static const struct file_operations features_fops = {
124 .open = features_open,
127 .release = single_release,
130 static int device_id_show(struct seq_file *f, void *ptr)
132 struct hci_dev *hdev = f->private;
135 seq_printf(f, "%4.4x:%4.4x:%4.4x:%4.4x\n", hdev->devid_source,
136 hdev->devid_vendor, hdev->devid_product, hdev->devid_version);
137 hci_dev_unlock(hdev);
142 static int device_id_open(struct inode *inode, struct file *file)
144 return single_open(file, device_id_show, inode->i_private);
147 static const struct file_operations device_id_fops = {
148 .open = device_id_open,
151 .release = single_release,
154 static int device_list_show(struct seq_file *f, void *ptr)
156 struct hci_dev *hdev = f->private;
157 struct hci_conn_params *p;
158 struct bdaddr_list *b;
161 list_for_each_entry(b, &hdev->whitelist, list)
162 seq_printf(f, "%pMR (type %u)\n", &b->bdaddr, b->bdaddr_type);
163 list_for_each_entry(p, &hdev->le_conn_params, list) {
164 seq_printf(f, "%pMR (type %u) %u\n", &p->addr, p->addr_type,
167 hci_dev_unlock(hdev);
172 static int device_list_open(struct inode *inode, struct file *file)
174 return single_open(file, device_list_show, inode->i_private);
177 static const struct file_operations device_list_fops = {
178 .open = device_list_open,
181 .release = single_release,
184 static int blacklist_show(struct seq_file *f, void *p)
186 struct hci_dev *hdev = f->private;
187 struct bdaddr_list *b;
190 list_for_each_entry(b, &hdev->blacklist, list)
191 seq_printf(f, "%pMR (type %u)\n", &b->bdaddr, b->bdaddr_type);
192 hci_dev_unlock(hdev);
197 static int blacklist_open(struct inode *inode, struct file *file)
199 return single_open(file, blacklist_show, inode->i_private);
202 static const struct file_operations blacklist_fops = {
203 .open = blacklist_open,
206 .release = single_release,
209 static int uuids_show(struct seq_file *f, void *p)
211 struct hci_dev *hdev = f->private;
212 struct bt_uuid *uuid;
215 list_for_each_entry(uuid, &hdev->uuids, list) {
218 /* The Bluetooth UUID values are stored in big endian,
219 * but with reversed byte order. So convert them into
220 * the right order for the %pUb modifier.
222 for (i = 0; i < 16; i++)
223 val[i] = uuid->uuid[15 - i];
225 seq_printf(f, "%pUb\n", val);
227 hci_dev_unlock(hdev);
232 static int uuids_open(struct inode *inode, struct file *file)
234 return single_open(file, uuids_show, inode->i_private);
237 static const struct file_operations uuids_fops = {
241 .release = single_release,
244 static int remote_oob_show(struct seq_file *f, void *ptr)
246 struct hci_dev *hdev = f->private;
247 struct oob_data *data;
250 list_for_each_entry(data, &hdev->remote_oob_data, list) {
251 seq_printf(f, "%pMR (type %u) %u %*phN %*phN %*phN %*phN\n",
252 &data->bdaddr, data->bdaddr_type, data->present,
253 16, data->hash192, 16, data->rand192,
254 16, data->hash256, 16, data->rand256);
256 hci_dev_unlock(hdev);
261 static int remote_oob_open(struct inode *inode, struct file *file)
263 return single_open(file, remote_oob_show, inode->i_private);
266 static const struct file_operations remote_oob_fops = {
267 .open = remote_oob_open,
270 .release = single_release,
273 static int conn_info_min_age_set(void *data, u64 val)
275 struct hci_dev *hdev = data;
277 if (val == 0 || val > hdev->conn_info_max_age)
281 hdev->conn_info_min_age = val;
282 hci_dev_unlock(hdev);
287 static int conn_info_min_age_get(void *data, u64 *val)
289 struct hci_dev *hdev = data;
292 *val = hdev->conn_info_min_age;
293 hci_dev_unlock(hdev);
298 DEFINE_SIMPLE_ATTRIBUTE(conn_info_min_age_fops, conn_info_min_age_get,
299 conn_info_min_age_set, "%llu\n");
301 static int conn_info_max_age_set(void *data, u64 val)
303 struct hci_dev *hdev = data;
305 if (val == 0 || val < hdev->conn_info_min_age)
309 hdev->conn_info_max_age = val;
310 hci_dev_unlock(hdev);
315 static int conn_info_max_age_get(void *data, u64 *val)
317 struct hci_dev *hdev = data;
320 *val = hdev->conn_info_max_age;
321 hci_dev_unlock(hdev);
326 DEFINE_SIMPLE_ATTRIBUTE(conn_info_max_age_fops, conn_info_max_age_get,
327 conn_info_max_age_set, "%llu\n");
329 static ssize_t use_debug_keys_read(struct file *file, char __user *user_buf,
330 size_t count, loff_t *ppos)
332 struct hci_dev *hdev = file->private_data;
335 buf[0] = hci_dev_test_flag(hdev, HCI_USE_DEBUG_KEYS) ? 'Y': 'N';
338 return simple_read_from_buffer(user_buf, count, ppos, buf, 2);
341 static const struct file_operations use_debug_keys_fops = {
343 .read = use_debug_keys_read,
344 .llseek = default_llseek,
347 static ssize_t sc_only_mode_read(struct file *file, char __user *user_buf,
348 size_t count, loff_t *ppos)
350 struct hci_dev *hdev = file->private_data;
353 buf[0] = hci_dev_test_flag(hdev, HCI_SC_ONLY) ? 'Y': 'N';
356 return simple_read_from_buffer(user_buf, count, ppos, buf, 2);
359 static const struct file_operations sc_only_mode_fops = {
361 .read = sc_only_mode_read,
362 .llseek = default_llseek,
365 DEFINE_INFO_ATTRIBUTE(hardware_info, hw_info);
366 DEFINE_INFO_ATTRIBUTE(firmware_info, fw_info);
368 void hci_debugfs_create_common(struct hci_dev *hdev)
370 debugfs_create_file("features", 0444, hdev->debugfs, hdev,
372 debugfs_create_u16("manufacturer", 0444, hdev->debugfs,
373 &hdev->manufacturer);
374 debugfs_create_u8("hci_version", 0444, hdev->debugfs, &hdev->hci_ver);
375 debugfs_create_u16("hci_revision", 0444, hdev->debugfs, &hdev->hci_rev);
376 debugfs_create_u8("hardware_error", 0444, hdev->debugfs,
377 &hdev->hw_error_code);
378 debugfs_create_file("device_id", 0444, hdev->debugfs, hdev,
381 debugfs_create_file("device_list", 0444, hdev->debugfs, hdev,
383 debugfs_create_file("blacklist", 0444, hdev->debugfs, hdev,
385 debugfs_create_file("uuids", 0444, hdev->debugfs, hdev, &uuids_fops);
386 debugfs_create_file("remote_oob", 0400, hdev->debugfs, hdev,
389 debugfs_create_file("conn_info_min_age", 0644, hdev->debugfs, hdev,
390 &conn_info_min_age_fops);
391 debugfs_create_file("conn_info_max_age", 0644, hdev->debugfs, hdev,
392 &conn_info_max_age_fops);
394 if (lmp_ssp_capable(hdev) || lmp_le_capable(hdev))
395 debugfs_create_file("use_debug_keys", 0444, hdev->debugfs,
396 hdev, &use_debug_keys_fops);
398 if (lmp_sc_capable(hdev) || lmp_le_capable(hdev))
399 debugfs_create_file("sc_only_mode", 0444, hdev->debugfs,
400 hdev, &sc_only_mode_fops);
403 debugfs_create_file("hardware_info", 0444, hdev->debugfs,
404 hdev, &hardware_info_fops);
407 debugfs_create_file("firmware_info", 0444, hdev->debugfs,
408 hdev, &firmware_info_fops);
411 static int inquiry_cache_show(struct seq_file *f, void *p)
413 struct hci_dev *hdev = f->private;
414 struct discovery_state *cache = &hdev->discovery;
415 struct inquiry_entry *e;
419 list_for_each_entry(e, &cache->all, all) {
420 struct inquiry_data *data = &e->data;
421 seq_printf(f, "%pMR %d %d %d 0x%.2x%.2x%.2x 0x%.4x %d %d %u\n",
423 data->pscan_rep_mode, data->pscan_period_mode,
424 data->pscan_mode, data->dev_class[2],
425 data->dev_class[1], data->dev_class[0],
426 __le16_to_cpu(data->clock_offset),
427 data->rssi, data->ssp_mode, e->timestamp);
430 hci_dev_unlock(hdev);
435 static int inquiry_cache_open(struct inode *inode, struct file *file)
437 return single_open(file, inquiry_cache_show, inode->i_private);
440 static const struct file_operations inquiry_cache_fops = {
441 .open = inquiry_cache_open,
444 .release = single_release,
447 static int link_keys_show(struct seq_file *f, void *ptr)
449 struct hci_dev *hdev = f->private;
450 struct link_key *key;
453 list_for_each_entry_rcu(key, &hdev->link_keys, list)
454 seq_printf(f, "%pMR %u %*phN %u\n", &key->bdaddr, key->type,
455 HCI_LINK_KEY_SIZE, key->val, key->pin_len);
461 static int link_keys_open(struct inode *inode, struct file *file)
463 return single_open(file, link_keys_show, inode->i_private);
466 static const struct file_operations link_keys_fops = {
467 .open = link_keys_open,
470 .release = single_release,
473 static int dev_class_show(struct seq_file *f, void *ptr)
475 struct hci_dev *hdev = f->private;
478 seq_printf(f, "0x%.2x%.2x%.2x\n", hdev->dev_class[2],
479 hdev->dev_class[1], hdev->dev_class[0]);
480 hci_dev_unlock(hdev);
485 static int dev_class_open(struct inode *inode, struct file *file)
487 return single_open(file, dev_class_show, inode->i_private);
490 static const struct file_operations dev_class_fops = {
491 .open = dev_class_open,
494 .release = single_release,
497 static int voice_setting_get(void *data, u64 *val)
499 struct hci_dev *hdev = data;
502 *val = hdev->voice_setting;
503 hci_dev_unlock(hdev);
508 DEFINE_SIMPLE_ATTRIBUTE(voice_setting_fops, voice_setting_get,
509 NULL, "0x%4.4llx\n");
511 static ssize_t ssp_debug_mode_read(struct file *file, char __user *user_buf,
512 size_t count, loff_t *ppos)
514 struct hci_dev *hdev = file->private_data;
517 buf[0] = hdev->ssp_debug_mode ? 'Y': 'N';
520 return simple_read_from_buffer(user_buf, count, ppos, buf, 2);
523 static const struct file_operations ssp_debug_mode_fops = {
525 .read = ssp_debug_mode_read,
526 .llseek = default_llseek,
529 static int auto_accept_delay_set(void *data, u64 val)
531 struct hci_dev *hdev = data;
534 hdev->auto_accept_delay = val;
535 hci_dev_unlock(hdev);
540 static int auto_accept_delay_get(void *data, u64 *val)
542 struct hci_dev *hdev = data;
545 *val = hdev->auto_accept_delay;
546 hci_dev_unlock(hdev);
551 DEFINE_SIMPLE_ATTRIBUTE(auto_accept_delay_fops, auto_accept_delay_get,
552 auto_accept_delay_set, "%llu\n");
554 static int idle_timeout_set(void *data, u64 val)
556 struct hci_dev *hdev = data;
558 if (val != 0 && (val < 500 || val > 3600000))
562 hdev->idle_timeout = val;
563 hci_dev_unlock(hdev);
568 static int idle_timeout_get(void *data, u64 *val)
570 struct hci_dev *hdev = data;
573 *val = hdev->idle_timeout;
574 hci_dev_unlock(hdev);
579 DEFINE_SIMPLE_ATTRIBUTE(idle_timeout_fops, idle_timeout_get,
580 idle_timeout_set, "%llu\n");
582 static int sniff_min_interval_set(void *data, u64 val)
584 struct hci_dev *hdev = data;
586 if (val == 0 || val % 2 || val > hdev->sniff_max_interval)
590 hdev->sniff_min_interval = val;
591 hci_dev_unlock(hdev);
596 static int sniff_min_interval_get(void *data, u64 *val)
598 struct hci_dev *hdev = data;
601 *val = hdev->sniff_min_interval;
602 hci_dev_unlock(hdev);
607 DEFINE_SIMPLE_ATTRIBUTE(sniff_min_interval_fops, sniff_min_interval_get,
608 sniff_min_interval_set, "%llu\n");
610 static int sniff_max_interval_set(void *data, u64 val)
612 struct hci_dev *hdev = data;
614 if (val == 0 || val % 2 || val < hdev->sniff_min_interval)
618 hdev->sniff_max_interval = val;
619 hci_dev_unlock(hdev);
624 static int sniff_max_interval_get(void *data, u64 *val)
626 struct hci_dev *hdev = data;
629 *val = hdev->sniff_max_interval;
630 hci_dev_unlock(hdev);
635 DEFINE_SIMPLE_ATTRIBUTE(sniff_max_interval_fops, sniff_max_interval_get,
636 sniff_max_interval_set, "%llu\n");
638 void hci_debugfs_create_bredr(struct hci_dev *hdev)
640 debugfs_create_file("inquiry_cache", 0444, hdev->debugfs, hdev,
641 &inquiry_cache_fops);
642 debugfs_create_file("link_keys", 0400, hdev->debugfs, hdev,
644 debugfs_create_file("dev_class", 0444, hdev->debugfs, hdev,
646 debugfs_create_file("voice_setting", 0444, hdev->debugfs, hdev,
647 &voice_setting_fops);
649 if (lmp_ssp_capable(hdev)) {
650 debugfs_create_file("ssp_debug_mode", 0444, hdev->debugfs,
651 hdev, &ssp_debug_mode_fops);
652 debugfs_create_file("auto_accept_delay", 0644, hdev->debugfs,
653 hdev, &auto_accept_delay_fops);
656 if (lmp_sniff_capable(hdev)) {
657 debugfs_create_file("idle_timeout", 0644, hdev->debugfs,
658 hdev, &idle_timeout_fops);
659 debugfs_create_file("sniff_min_interval", 0644, hdev->debugfs,
660 hdev, &sniff_min_interval_fops);
661 debugfs_create_file("sniff_max_interval", 0644, hdev->debugfs,
662 hdev, &sniff_max_interval_fops);
666 static int identity_show(struct seq_file *f, void *p)
668 struct hci_dev *hdev = f->private;
674 hci_copy_identity_address(hdev, &addr, &addr_type);
676 seq_printf(f, "%pMR (type %u) %*phN %pMR\n", &addr, addr_type,
677 16, hdev->irk, &hdev->rpa);
679 hci_dev_unlock(hdev);
684 static int identity_open(struct inode *inode, struct file *file)
686 return single_open(file, identity_show, inode->i_private);
689 static const struct file_operations identity_fops = {
690 .open = identity_open,
693 .release = single_release,
696 static int rpa_timeout_set(void *data, u64 val)
698 struct hci_dev *hdev = data;
700 /* Require the RPA timeout to be at least 30 seconds and at most
703 if (val < 30 || val > (60 * 60 * 24))
707 hdev->rpa_timeout = val;
708 hci_dev_unlock(hdev);
713 static int rpa_timeout_get(void *data, u64 *val)
715 struct hci_dev *hdev = data;
718 *val = hdev->rpa_timeout;
719 hci_dev_unlock(hdev);
724 DEFINE_SIMPLE_ATTRIBUTE(rpa_timeout_fops, rpa_timeout_get,
725 rpa_timeout_set, "%llu\n");
727 static int random_address_show(struct seq_file *f, void *p)
729 struct hci_dev *hdev = f->private;
732 seq_printf(f, "%pMR\n", &hdev->random_addr);
733 hci_dev_unlock(hdev);
738 static int random_address_open(struct inode *inode, struct file *file)
740 return single_open(file, random_address_show, inode->i_private);
743 static const struct file_operations random_address_fops = {
744 .open = random_address_open,
747 .release = single_release,
750 static int static_address_show(struct seq_file *f, void *p)
752 struct hci_dev *hdev = f->private;
755 seq_printf(f, "%pMR\n", &hdev->static_addr);
756 hci_dev_unlock(hdev);
761 static int static_address_open(struct inode *inode, struct file *file)
763 return single_open(file, static_address_show, inode->i_private);
766 static const struct file_operations static_address_fops = {
767 .open = static_address_open,
770 .release = single_release,
773 static ssize_t force_static_address_read(struct file *file,
774 char __user *user_buf,
775 size_t count, loff_t *ppos)
777 struct hci_dev *hdev = file->private_data;
780 buf[0] = hci_dev_test_flag(hdev, HCI_FORCE_STATIC_ADDR) ? 'Y': 'N';
783 return simple_read_from_buffer(user_buf, count, ppos, buf, 2);
786 static ssize_t force_static_address_write(struct file *file,
787 const char __user *user_buf,
788 size_t count, loff_t *ppos)
790 struct hci_dev *hdev = file->private_data;
792 size_t buf_size = min(count, (sizeof(buf)-1));
795 if (test_bit(HCI_UP, &hdev->flags))
798 if (copy_from_user(buf, user_buf, buf_size))
801 buf[buf_size] = '\0';
802 if (strtobool(buf, &enable))
805 if (enable == hci_dev_test_flag(hdev, HCI_FORCE_STATIC_ADDR))
808 hci_dev_change_flag(hdev, HCI_FORCE_STATIC_ADDR);
813 static const struct file_operations force_static_address_fops = {
815 .read = force_static_address_read,
816 .write = force_static_address_write,
817 .llseek = default_llseek,
820 static int white_list_show(struct seq_file *f, void *ptr)
822 struct hci_dev *hdev = f->private;
823 struct bdaddr_list *b;
826 list_for_each_entry(b, &hdev->le_white_list, list)
827 seq_printf(f, "%pMR (type %u)\n", &b->bdaddr, b->bdaddr_type);
828 hci_dev_unlock(hdev);
833 static int white_list_open(struct inode *inode, struct file *file)
835 return single_open(file, white_list_show, inode->i_private);
838 static const struct file_operations white_list_fops = {
839 .open = white_list_open,
842 .release = single_release,
845 static int identity_resolving_keys_show(struct seq_file *f, void *ptr)
847 struct hci_dev *hdev = f->private;
851 list_for_each_entry_rcu(irk, &hdev->identity_resolving_keys, list) {
852 seq_printf(f, "%pMR (type %u) %*phN %pMR\n",
853 &irk->bdaddr, irk->addr_type,
854 16, irk->val, &irk->rpa);
861 static int identity_resolving_keys_open(struct inode *inode, struct file *file)
863 return single_open(file, identity_resolving_keys_show,
867 static const struct file_operations identity_resolving_keys_fops = {
868 .open = identity_resolving_keys_open,
871 .release = single_release,
874 static int long_term_keys_show(struct seq_file *f, void *ptr)
876 struct hci_dev *hdev = f->private;
880 list_for_each_entry_rcu(ltk, &hdev->long_term_keys, list)
881 seq_printf(f, "%pMR (type %u) %u 0x%02x %u %.4x %.16llx %*phN\n",
882 <k->bdaddr, ltk->bdaddr_type, ltk->authenticated,
883 ltk->type, ltk->enc_size, __le16_to_cpu(ltk->ediv),
884 __le64_to_cpu(ltk->rand), 16, ltk->val);
890 static int long_term_keys_open(struct inode *inode, struct file *file)
892 return single_open(file, long_term_keys_show, inode->i_private);
895 static const struct file_operations long_term_keys_fops = {
896 .open = long_term_keys_open,
899 .release = single_release,
902 static int conn_min_interval_set(void *data, u64 val)
904 struct hci_dev *hdev = data;
906 if (val < 0x0006 || val > 0x0c80 || val > hdev->le_conn_max_interval)
910 hdev->le_conn_min_interval = val;
911 hci_dev_unlock(hdev);
916 static int conn_min_interval_get(void *data, u64 *val)
918 struct hci_dev *hdev = data;
921 *val = hdev->le_conn_min_interval;
922 hci_dev_unlock(hdev);
927 DEFINE_SIMPLE_ATTRIBUTE(conn_min_interval_fops, conn_min_interval_get,
928 conn_min_interval_set, "%llu\n");
930 static int conn_max_interval_set(void *data, u64 val)
932 struct hci_dev *hdev = data;
934 if (val < 0x0006 || val > 0x0c80 || val < hdev->le_conn_min_interval)
938 hdev->le_conn_max_interval = val;
939 hci_dev_unlock(hdev);
944 static int conn_max_interval_get(void *data, u64 *val)
946 struct hci_dev *hdev = data;
949 *val = hdev->le_conn_max_interval;
950 hci_dev_unlock(hdev);
955 DEFINE_SIMPLE_ATTRIBUTE(conn_max_interval_fops, conn_max_interval_get,
956 conn_max_interval_set, "%llu\n");
958 static int conn_latency_set(void *data, u64 val)
960 struct hci_dev *hdev = data;
966 hdev->le_conn_latency = val;
967 hci_dev_unlock(hdev);
972 static int conn_latency_get(void *data, u64 *val)
974 struct hci_dev *hdev = data;
977 *val = hdev->le_conn_latency;
978 hci_dev_unlock(hdev);
983 DEFINE_SIMPLE_ATTRIBUTE(conn_latency_fops, conn_latency_get,
984 conn_latency_set, "%llu\n");
986 static int supervision_timeout_set(void *data, u64 val)
988 struct hci_dev *hdev = data;
990 if (val < 0x000a || val > 0x0c80)
994 hdev->le_supv_timeout = val;
995 hci_dev_unlock(hdev);
1000 static int supervision_timeout_get(void *data, u64 *val)
1002 struct hci_dev *hdev = data;
1005 *val = hdev->le_supv_timeout;
1006 hci_dev_unlock(hdev);
1011 DEFINE_SIMPLE_ATTRIBUTE(supervision_timeout_fops, supervision_timeout_get,
1012 supervision_timeout_set, "%llu\n");
1014 static int adv_channel_map_set(void *data, u64 val)
1016 struct hci_dev *hdev = data;
1018 if (val < 0x01 || val > 0x07)
1022 hdev->le_adv_channel_map = val;
1023 hci_dev_unlock(hdev);
1028 static int adv_channel_map_get(void *data, u64 *val)
1030 struct hci_dev *hdev = data;
1033 *val = hdev->le_adv_channel_map;
1034 hci_dev_unlock(hdev);
1039 DEFINE_SIMPLE_ATTRIBUTE(adv_channel_map_fops, adv_channel_map_get,
1040 adv_channel_map_set, "%llu\n");
1042 static int adv_min_interval_set(void *data, u64 val)
1044 struct hci_dev *hdev = data;
1046 if (val < 0x0020 || val > 0x4000 || val > hdev->le_adv_max_interval)
1050 hdev->le_adv_min_interval = val;
1051 hci_dev_unlock(hdev);
1056 static int adv_min_interval_get(void *data, u64 *val)
1058 struct hci_dev *hdev = data;
1061 *val = hdev->le_adv_min_interval;
1062 hci_dev_unlock(hdev);
1067 DEFINE_SIMPLE_ATTRIBUTE(adv_min_interval_fops, adv_min_interval_get,
1068 adv_min_interval_set, "%llu\n");
1070 static int adv_max_interval_set(void *data, u64 val)
1072 struct hci_dev *hdev = data;
1074 if (val < 0x0020 || val > 0x4000 || val < hdev->le_adv_min_interval)
1078 hdev->le_adv_max_interval = val;
1079 hci_dev_unlock(hdev);
1084 static int adv_max_interval_get(void *data, u64 *val)
1086 struct hci_dev *hdev = data;
1089 *val = hdev->le_adv_max_interval;
1090 hci_dev_unlock(hdev);
1095 DEFINE_SIMPLE_ATTRIBUTE(adv_max_interval_fops, adv_max_interval_get,
1096 adv_max_interval_set, "%llu\n");
1098 DEFINE_QUIRK_ATTRIBUTE(quirk_strict_duplicate_filter,
1099 HCI_QUIRK_STRICT_DUPLICATE_FILTER);
1100 DEFINE_QUIRK_ATTRIBUTE(quirk_simultaneous_discovery,
1101 HCI_QUIRK_SIMULTANEOUS_DISCOVERY);
1103 void hci_debugfs_create_le(struct hci_dev *hdev)
1105 debugfs_create_file("identity", 0400, hdev->debugfs, hdev,
1107 debugfs_create_file("rpa_timeout", 0644, hdev->debugfs, hdev,
1109 debugfs_create_file("random_address", 0444, hdev->debugfs, hdev,
1110 &random_address_fops);
1111 debugfs_create_file("static_address", 0444, hdev->debugfs, hdev,
1112 &static_address_fops);
1114 /* For controllers with a public address, provide a debug
1115 * option to force the usage of the configured static
1116 * address. By default the public address is used.
1118 if (bacmp(&hdev->bdaddr, BDADDR_ANY))
1119 debugfs_create_file("force_static_address", 0644,
1120 hdev->debugfs, hdev,
1121 &force_static_address_fops);
1123 debugfs_create_u8("white_list_size", 0444, hdev->debugfs,
1124 &hdev->le_white_list_size);
1125 debugfs_create_file("white_list", 0444, hdev->debugfs, hdev,
1127 debugfs_create_file("identity_resolving_keys", 0400, hdev->debugfs,
1128 hdev, &identity_resolving_keys_fops);
1129 debugfs_create_file("long_term_keys", 0400, hdev->debugfs, hdev,
1130 &long_term_keys_fops);
1131 debugfs_create_file("conn_min_interval", 0644, hdev->debugfs, hdev,
1132 &conn_min_interval_fops);
1133 debugfs_create_file("conn_max_interval", 0644, hdev->debugfs, hdev,
1134 &conn_max_interval_fops);
1135 debugfs_create_file("conn_latency", 0644, hdev->debugfs, hdev,
1136 &conn_latency_fops);
1137 debugfs_create_file("supervision_timeout", 0644, hdev->debugfs, hdev,
1138 &supervision_timeout_fops);
1139 debugfs_create_file("adv_channel_map", 0644, hdev->debugfs, hdev,
1140 &adv_channel_map_fops);
1141 debugfs_create_file("adv_min_interval", 0644, hdev->debugfs, hdev,
1142 &adv_min_interval_fops);
1143 debugfs_create_file("adv_max_interval", 0644, hdev->debugfs, hdev,
1144 &adv_max_interval_fops);
1145 debugfs_create_u16("discov_interleaved_timeout", 0644, hdev->debugfs,
1146 &hdev->discov_interleaved_timeout);
1148 debugfs_create_file("quirk_strict_duplicate_filter", 0644,
1149 hdev->debugfs, hdev,
1150 &quirk_strict_duplicate_filter_fops);
1151 debugfs_create_file("quirk_simultaneous_discovery", 0644,
1152 hdev->debugfs, hdev,
1153 &quirk_simultaneous_discovery_fops);
1156 void hci_debugfs_create_conn(struct hci_conn *conn)
1158 struct hci_dev *hdev = conn->hdev;
1161 if (IS_ERR_OR_NULL(hdev->debugfs))
1164 snprintf(name, sizeof(name), "%u", conn->handle);
1165 conn->debugfs = debugfs_create_dir(name, hdev->debugfs);