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 static int features_show(struct seq_file *f, void *ptr)
81 struct hci_dev
*hdev
= f
->private;
85 for (p
= 0; p
< HCI_MAX_PAGES
&& p
<= hdev
->max_page
; p
++) {
86 seq_printf(f
, "%2u: 0x%2.2x 0x%2.2x 0x%2.2x 0x%2.2x "
87 "0x%2.2x 0x%2.2x 0x%2.2x 0x%2.2x\n", p
,
88 hdev
->features
[p
][0], hdev
->features
[p
][1],
89 hdev
->features
[p
][2], hdev
->features
[p
][3],
90 hdev
->features
[p
][4], hdev
->features
[p
][5],
91 hdev
->features
[p
][6], hdev
->features
[p
][7]);
93 if (lmp_le_capable(hdev
))
94 seq_printf(f
, "LE: 0x%2.2x 0x%2.2x 0x%2.2x 0x%2.2x "
95 "0x%2.2x 0x%2.2x 0x%2.2x 0x%2.2x\n",
96 hdev
->le_features
[0], hdev
->le_features
[1],
97 hdev
->le_features
[2], hdev
->le_features
[3],
98 hdev
->le_features
[4], hdev
->le_features
[5],
99 hdev
->le_features
[6], hdev
->le_features
[7]);
100 hci_dev_unlock(hdev
);
105 static int features_open(struct inode
*inode
, struct file
*file
)
107 return single_open(file
, features_show
, inode
->i_private
);
110 static const struct file_operations features_fops
= {
111 .open
= features_open
,
114 .release
= single_release
,
117 static int device_id_show(struct seq_file
*f
, void *ptr
)
119 struct hci_dev
*hdev
= f
->private;
122 seq_printf(f
, "%4.4x:%4.4x:%4.4x:%4.4x\n", hdev
->devid_source
,
123 hdev
->devid_vendor
, hdev
->devid_product
, hdev
->devid_version
);
124 hci_dev_unlock(hdev
);
129 static int device_id_open(struct inode
*inode
, struct file
*file
)
131 return single_open(file
, device_id_show
, inode
->i_private
);
134 static const struct file_operations device_id_fops
= {
135 .open
= device_id_open
,
138 .release
= single_release
,
141 static int device_list_show(struct seq_file
*f
, void *ptr
)
143 struct hci_dev
*hdev
= f
->private;
144 struct hci_conn_params
*p
;
145 struct bdaddr_list
*b
;
148 list_for_each_entry(b
, &hdev
->whitelist
, list
)
149 seq_printf(f
, "%pMR (type %u)\n", &b
->bdaddr
, b
->bdaddr_type
);
150 list_for_each_entry(p
, &hdev
->le_conn_params
, list
) {
151 seq_printf(f
, "%pMR (type %u) %u\n", &p
->addr
, p
->addr_type
,
154 hci_dev_unlock(hdev
);
159 static int device_list_open(struct inode
*inode
, struct file
*file
)
161 return single_open(file
, device_list_show
, inode
->i_private
);
164 static const struct file_operations device_list_fops
= {
165 .open
= device_list_open
,
168 .release
= single_release
,
171 static int blacklist_show(struct seq_file
*f
, void *p
)
173 struct hci_dev
*hdev
= f
->private;
174 struct bdaddr_list
*b
;
177 list_for_each_entry(b
, &hdev
->blacklist
, list
)
178 seq_printf(f
, "%pMR (type %u)\n", &b
->bdaddr
, b
->bdaddr_type
);
179 hci_dev_unlock(hdev
);
184 static int blacklist_open(struct inode
*inode
, struct file
*file
)
186 return single_open(file
, blacklist_show
, inode
->i_private
);
189 static const struct file_operations blacklist_fops
= {
190 .open
= blacklist_open
,
193 .release
= single_release
,
196 static int uuids_show(struct seq_file
*f
, void *p
)
198 struct hci_dev
*hdev
= f
->private;
199 struct bt_uuid
*uuid
;
202 list_for_each_entry(uuid
, &hdev
->uuids
, list
) {
205 /* The Bluetooth UUID values are stored in big endian,
206 * but with reversed byte order. So convert them into
207 * the right order for the %pUb modifier.
209 for (i
= 0; i
< 16; i
++)
210 val
[i
] = uuid
->uuid
[15 - i
];
212 seq_printf(f
, "%pUb\n", val
);
214 hci_dev_unlock(hdev
);
219 static int uuids_open(struct inode
*inode
, struct file
*file
)
221 return single_open(file
, uuids_show
, inode
->i_private
);
224 static const struct file_operations uuids_fops
= {
228 .release
= single_release
,
231 static int remote_oob_show(struct seq_file
*f
, void *ptr
)
233 struct hci_dev
*hdev
= f
->private;
234 struct oob_data
*data
;
237 list_for_each_entry(data
, &hdev
->remote_oob_data
, list
) {
238 seq_printf(f
, "%pMR (type %u) %u %*phN %*phN %*phN %*phN\n",
239 &data
->bdaddr
, data
->bdaddr_type
, data
->present
,
240 16, data
->hash192
, 16, data
->rand192
,
241 16, data
->hash256
, 16, data
->rand256
);
243 hci_dev_unlock(hdev
);
248 static int remote_oob_open(struct inode
*inode
, struct file
*file
)
250 return single_open(file
, remote_oob_show
, inode
->i_private
);
253 static const struct file_operations remote_oob_fops
= {
254 .open
= remote_oob_open
,
257 .release
= single_release
,
260 static int conn_info_min_age_set(void *data
, u64 val
)
262 struct hci_dev
*hdev
= data
;
264 if (val
== 0 || val
> hdev
->conn_info_max_age
)
268 hdev
->conn_info_min_age
= val
;
269 hci_dev_unlock(hdev
);
274 static int conn_info_min_age_get(void *data
, u64
*val
)
276 struct hci_dev
*hdev
= data
;
279 *val
= hdev
->conn_info_min_age
;
280 hci_dev_unlock(hdev
);
285 DEFINE_SIMPLE_ATTRIBUTE(conn_info_min_age_fops
, conn_info_min_age_get
,
286 conn_info_min_age_set
, "%llu\n");
288 static int conn_info_max_age_set(void *data
, u64 val
)
290 struct hci_dev
*hdev
= data
;
292 if (val
== 0 || val
< hdev
->conn_info_min_age
)
296 hdev
->conn_info_max_age
= val
;
297 hci_dev_unlock(hdev
);
302 static int conn_info_max_age_get(void *data
, u64
*val
)
304 struct hci_dev
*hdev
= data
;
307 *val
= hdev
->conn_info_max_age
;
308 hci_dev_unlock(hdev
);
313 DEFINE_SIMPLE_ATTRIBUTE(conn_info_max_age_fops
, conn_info_max_age_get
,
314 conn_info_max_age_set
, "%llu\n");
316 static ssize_t
use_debug_keys_read(struct file
*file
, char __user
*user_buf
,
317 size_t count
, loff_t
*ppos
)
319 struct hci_dev
*hdev
= file
->private_data
;
322 buf
[0] = hci_dev_test_flag(hdev
, HCI_USE_DEBUG_KEYS
) ? 'Y': 'N';
325 return simple_read_from_buffer(user_buf
, count
, ppos
, buf
, 2);
328 static const struct file_operations use_debug_keys_fops
= {
330 .read
= use_debug_keys_read
,
331 .llseek
= default_llseek
,
334 static ssize_t
sc_only_mode_read(struct file
*file
, char __user
*user_buf
,
335 size_t count
, loff_t
*ppos
)
337 struct hci_dev
*hdev
= file
->private_data
;
340 buf
[0] = hci_dev_test_flag(hdev
, HCI_SC_ONLY
) ? 'Y': 'N';
343 return simple_read_from_buffer(user_buf
, count
, ppos
, buf
, 2);
346 static const struct file_operations sc_only_mode_fops
= {
348 .read
= sc_only_mode_read
,
349 .llseek
= default_llseek
,
352 void hci_debugfs_create_common(struct hci_dev
*hdev
)
354 debugfs_create_file("features", 0444, hdev
->debugfs
, hdev
,
356 debugfs_create_u16("manufacturer", 0444, hdev
->debugfs
,
357 &hdev
->manufacturer
);
358 debugfs_create_u8("hci_version", 0444, hdev
->debugfs
, &hdev
->hci_ver
);
359 debugfs_create_u16("hci_revision", 0444, hdev
->debugfs
, &hdev
->hci_rev
);
360 debugfs_create_u8("hardware_error", 0444, hdev
->debugfs
,
361 &hdev
->hw_error_code
);
362 debugfs_create_file("device_id", 0444, hdev
->debugfs
, hdev
,
365 debugfs_create_file("device_list", 0444, hdev
->debugfs
, hdev
,
367 debugfs_create_file("blacklist", 0444, hdev
->debugfs
, hdev
,
369 debugfs_create_file("uuids", 0444, hdev
->debugfs
, hdev
, &uuids_fops
);
370 debugfs_create_file("remote_oob", 0400, hdev
->debugfs
, hdev
,
373 debugfs_create_file("conn_info_min_age", 0644, hdev
->debugfs
, hdev
,
374 &conn_info_min_age_fops
);
375 debugfs_create_file("conn_info_max_age", 0644, hdev
->debugfs
, hdev
,
376 &conn_info_max_age_fops
);
378 if (lmp_ssp_capable(hdev
) || lmp_le_capable(hdev
))
379 debugfs_create_file("use_debug_keys", 0444, hdev
->debugfs
,
380 hdev
, &use_debug_keys_fops
);
382 if (lmp_sc_capable(hdev
) || lmp_le_capable(hdev
))
383 debugfs_create_file("sc_only_mode", 0444, hdev
->debugfs
,
384 hdev
, &sc_only_mode_fops
);
387 static int inquiry_cache_show(struct seq_file
*f
, void *p
)
389 struct hci_dev
*hdev
= f
->private;
390 struct discovery_state
*cache
= &hdev
->discovery
;
391 struct inquiry_entry
*e
;
395 list_for_each_entry(e
, &cache
->all
, all
) {
396 struct inquiry_data
*data
= &e
->data
;
397 seq_printf(f
, "%pMR %d %d %d 0x%.2x%.2x%.2x 0x%.4x %d %d %u\n",
399 data
->pscan_rep_mode
, data
->pscan_period_mode
,
400 data
->pscan_mode
, data
->dev_class
[2],
401 data
->dev_class
[1], data
->dev_class
[0],
402 __le16_to_cpu(data
->clock_offset
),
403 data
->rssi
, data
->ssp_mode
, e
->timestamp
);
406 hci_dev_unlock(hdev
);
411 static int inquiry_cache_open(struct inode
*inode
, struct file
*file
)
413 return single_open(file
, inquiry_cache_show
, inode
->i_private
);
416 static const struct file_operations inquiry_cache_fops
= {
417 .open
= inquiry_cache_open
,
420 .release
= single_release
,
423 static int link_keys_show(struct seq_file
*f
, void *ptr
)
425 struct hci_dev
*hdev
= f
->private;
426 struct link_key
*key
;
429 list_for_each_entry_rcu(key
, &hdev
->link_keys
, list
)
430 seq_printf(f
, "%pMR %u %*phN %u\n", &key
->bdaddr
, key
->type
,
431 HCI_LINK_KEY_SIZE
, key
->val
, key
->pin_len
);
437 static int link_keys_open(struct inode
*inode
, struct file
*file
)
439 return single_open(file
, link_keys_show
, inode
->i_private
);
442 static const struct file_operations link_keys_fops
= {
443 .open
= link_keys_open
,
446 .release
= single_release
,
449 static int dev_class_show(struct seq_file
*f
, void *ptr
)
451 struct hci_dev
*hdev
= f
->private;
454 seq_printf(f
, "0x%.2x%.2x%.2x\n", hdev
->dev_class
[2],
455 hdev
->dev_class
[1], hdev
->dev_class
[0]);
456 hci_dev_unlock(hdev
);
461 static int dev_class_open(struct inode
*inode
, struct file
*file
)
463 return single_open(file
, dev_class_show
, inode
->i_private
);
466 static const struct file_operations dev_class_fops
= {
467 .open
= dev_class_open
,
470 .release
= single_release
,
473 static int voice_setting_get(void *data
, u64
*val
)
475 struct hci_dev
*hdev
= data
;
478 *val
= hdev
->voice_setting
;
479 hci_dev_unlock(hdev
);
484 DEFINE_SIMPLE_ATTRIBUTE(voice_setting_fops
, voice_setting_get
,
485 NULL
, "0x%4.4llx\n");
487 static ssize_t
ssp_debug_mode_read(struct file
*file
, char __user
*user_buf
,
488 size_t count
, loff_t
*ppos
)
490 struct hci_dev
*hdev
= file
->private_data
;
493 buf
[0] = hdev
->ssp_debug_mode
? 'Y': 'N';
496 return simple_read_from_buffer(user_buf
, count
, ppos
, buf
, 2);
499 static const struct file_operations ssp_debug_mode_fops
= {
501 .read
= ssp_debug_mode_read
,
502 .llseek
= default_llseek
,
505 static int auto_accept_delay_set(void *data
, u64 val
)
507 struct hci_dev
*hdev
= data
;
510 hdev
->auto_accept_delay
= val
;
511 hci_dev_unlock(hdev
);
516 static int auto_accept_delay_get(void *data
, u64
*val
)
518 struct hci_dev
*hdev
= data
;
521 *val
= hdev
->auto_accept_delay
;
522 hci_dev_unlock(hdev
);
527 DEFINE_SIMPLE_ATTRIBUTE(auto_accept_delay_fops
, auto_accept_delay_get
,
528 auto_accept_delay_set
, "%llu\n");
530 static int idle_timeout_set(void *data
, u64 val
)
532 struct hci_dev
*hdev
= data
;
534 if (val
!= 0 && (val
< 500 || val
> 3600000))
538 hdev
->idle_timeout
= val
;
539 hci_dev_unlock(hdev
);
544 static int idle_timeout_get(void *data
, u64
*val
)
546 struct hci_dev
*hdev
= data
;
549 *val
= hdev
->idle_timeout
;
550 hci_dev_unlock(hdev
);
555 DEFINE_SIMPLE_ATTRIBUTE(idle_timeout_fops
, idle_timeout_get
,
556 idle_timeout_set
, "%llu\n");
558 static int sniff_min_interval_set(void *data
, u64 val
)
560 struct hci_dev
*hdev
= data
;
562 if (val
== 0 || val
% 2 || val
> hdev
->sniff_max_interval
)
566 hdev
->sniff_min_interval
= val
;
567 hci_dev_unlock(hdev
);
572 static int sniff_min_interval_get(void *data
, u64
*val
)
574 struct hci_dev
*hdev
= data
;
577 *val
= hdev
->sniff_min_interval
;
578 hci_dev_unlock(hdev
);
583 DEFINE_SIMPLE_ATTRIBUTE(sniff_min_interval_fops
, sniff_min_interval_get
,
584 sniff_min_interval_set
, "%llu\n");
586 static int sniff_max_interval_set(void *data
, u64 val
)
588 struct hci_dev
*hdev
= data
;
590 if (val
== 0 || val
% 2 || val
< hdev
->sniff_min_interval
)
594 hdev
->sniff_max_interval
= val
;
595 hci_dev_unlock(hdev
);
600 static int sniff_max_interval_get(void *data
, u64
*val
)
602 struct hci_dev
*hdev
= data
;
605 *val
= hdev
->sniff_max_interval
;
606 hci_dev_unlock(hdev
);
611 DEFINE_SIMPLE_ATTRIBUTE(sniff_max_interval_fops
, sniff_max_interval_get
,
612 sniff_max_interval_set
, "%llu\n");
614 void hci_debugfs_create_bredr(struct hci_dev
*hdev
)
616 debugfs_create_file("inquiry_cache", 0444, hdev
->debugfs
, hdev
,
617 &inquiry_cache_fops
);
618 debugfs_create_file("link_keys", 0400, hdev
->debugfs
, hdev
,
620 debugfs_create_file("dev_class", 0444, hdev
->debugfs
, hdev
,
622 debugfs_create_file("voice_setting", 0444, hdev
->debugfs
, hdev
,
623 &voice_setting_fops
);
625 if (lmp_ssp_capable(hdev
)) {
626 debugfs_create_file("ssp_debug_mode", 0444, hdev
->debugfs
,
627 hdev
, &ssp_debug_mode_fops
);
628 debugfs_create_file("auto_accept_delay", 0644, hdev
->debugfs
,
629 hdev
, &auto_accept_delay_fops
);
632 if (lmp_sniff_capable(hdev
)) {
633 debugfs_create_file("idle_timeout", 0644, hdev
->debugfs
,
634 hdev
, &idle_timeout_fops
);
635 debugfs_create_file("sniff_min_interval", 0644, hdev
->debugfs
,
636 hdev
, &sniff_min_interval_fops
);
637 debugfs_create_file("sniff_max_interval", 0644, hdev
->debugfs
,
638 hdev
, &sniff_max_interval_fops
);
642 static int identity_show(struct seq_file
*f
, void *p
)
644 struct hci_dev
*hdev
= f
->private;
650 hci_copy_identity_address(hdev
, &addr
, &addr_type
);
652 seq_printf(f
, "%pMR (type %u) %*phN %pMR\n", &addr
, addr_type
,
653 16, hdev
->irk
, &hdev
->rpa
);
655 hci_dev_unlock(hdev
);
660 static int identity_open(struct inode
*inode
, struct file
*file
)
662 return single_open(file
, identity_show
, inode
->i_private
);
665 static const struct file_operations identity_fops
= {
666 .open
= identity_open
,
669 .release
= single_release
,
672 static int rpa_timeout_set(void *data
, u64 val
)
674 struct hci_dev
*hdev
= data
;
676 /* Require the RPA timeout to be at least 30 seconds and at most
679 if (val
< 30 || val
> (60 * 60 * 24))
683 hdev
->rpa_timeout
= val
;
684 hci_dev_unlock(hdev
);
689 static int rpa_timeout_get(void *data
, u64
*val
)
691 struct hci_dev
*hdev
= data
;
694 *val
= hdev
->rpa_timeout
;
695 hci_dev_unlock(hdev
);
700 DEFINE_SIMPLE_ATTRIBUTE(rpa_timeout_fops
, rpa_timeout_get
,
701 rpa_timeout_set
, "%llu\n");
703 static int random_address_show(struct seq_file
*f
, void *p
)
705 struct hci_dev
*hdev
= f
->private;
708 seq_printf(f
, "%pMR\n", &hdev
->random_addr
);
709 hci_dev_unlock(hdev
);
714 static int random_address_open(struct inode
*inode
, struct file
*file
)
716 return single_open(file
, random_address_show
, inode
->i_private
);
719 static const struct file_operations random_address_fops
= {
720 .open
= random_address_open
,
723 .release
= single_release
,
726 static int static_address_show(struct seq_file
*f
, void *p
)
728 struct hci_dev
*hdev
= f
->private;
731 seq_printf(f
, "%pMR\n", &hdev
->static_addr
);
732 hci_dev_unlock(hdev
);
737 static int static_address_open(struct inode
*inode
, struct file
*file
)
739 return single_open(file
, static_address_show
, inode
->i_private
);
742 static const struct file_operations static_address_fops
= {
743 .open
= static_address_open
,
746 .release
= single_release
,
749 static ssize_t
force_static_address_read(struct file
*file
,
750 char __user
*user_buf
,
751 size_t count
, loff_t
*ppos
)
753 struct hci_dev
*hdev
= file
->private_data
;
756 buf
[0] = hci_dev_test_flag(hdev
, HCI_FORCE_STATIC_ADDR
) ? 'Y': 'N';
759 return simple_read_from_buffer(user_buf
, count
, ppos
, buf
, 2);
762 static ssize_t
force_static_address_write(struct file
*file
,
763 const char __user
*user_buf
,
764 size_t count
, loff_t
*ppos
)
766 struct hci_dev
*hdev
= file
->private_data
;
768 size_t buf_size
= min(count
, (sizeof(buf
)-1));
771 if (test_bit(HCI_UP
, &hdev
->flags
))
774 if (copy_from_user(buf
, user_buf
, buf_size
))
777 buf
[buf_size
] = '\0';
778 if (strtobool(buf
, &enable
))
781 if (enable
== hci_dev_test_flag(hdev
, HCI_FORCE_STATIC_ADDR
))
784 hci_dev_change_flag(hdev
, HCI_FORCE_STATIC_ADDR
);
789 static const struct file_operations force_static_address_fops
= {
791 .read
= force_static_address_read
,
792 .write
= force_static_address_write
,
793 .llseek
= default_llseek
,
796 static int white_list_show(struct seq_file
*f
, void *ptr
)
798 struct hci_dev
*hdev
= f
->private;
799 struct bdaddr_list
*b
;
802 list_for_each_entry(b
, &hdev
->le_white_list
, list
)
803 seq_printf(f
, "%pMR (type %u)\n", &b
->bdaddr
, b
->bdaddr_type
);
804 hci_dev_unlock(hdev
);
809 static int white_list_open(struct inode
*inode
, struct file
*file
)
811 return single_open(file
, white_list_show
, inode
->i_private
);
814 static const struct file_operations white_list_fops
= {
815 .open
= white_list_open
,
818 .release
= single_release
,
821 static int identity_resolving_keys_show(struct seq_file
*f
, void *ptr
)
823 struct hci_dev
*hdev
= f
->private;
827 list_for_each_entry_rcu(irk
, &hdev
->identity_resolving_keys
, list
) {
828 seq_printf(f
, "%pMR (type %u) %*phN %pMR\n",
829 &irk
->bdaddr
, irk
->addr_type
,
830 16, irk
->val
, &irk
->rpa
);
837 static int identity_resolving_keys_open(struct inode
*inode
, struct file
*file
)
839 return single_open(file
, identity_resolving_keys_show
,
843 static const struct file_operations identity_resolving_keys_fops
= {
844 .open
= identity_resolving_keys_open
,
847 .release
= single_release
,
850 static int long_term_keys_show(struct seq_file
*f
, void *ptr
)
852 struct hci_dev
*hdev
= f
->private;
856 list_for_each_entry_rcu(ltk
, &hdev
->long_term_keys
, list
)
857 seq_printf(f
, "%pMR (type %u) %u 0x%02x %u %.4x %.16llx %*phN\n",
858 <k
->bdaddr
, ltk
->bdaddr_type
, ltk
->authenticated
,
859 ltk
->type
, ltk
->enc_size
, __le16_to_cpu(ltk
->ediv
),
860 __le64_to_cpu(ltk
->rand
), 16, ltk
->val
);
866 static int long_term_keys_open(struct inode
*inode
, struct file
*file
)
868 return single_open(file
, long_term_keys_show
, inode
->i_private
);
871 static const struct file_operations long_term_keys_fops
= {
872 .open
= long_term_keys_open
,
875 .release
= single_release
,
878 static int conn_min_interval_set(void *data
, u64 val
)
880 struct hci_dev
*hdev
= data
;
882 if (val
< 0x0006 || val
> 0x0c80 || val
> hdev
->le_conn_max_interval
)
886 hdev
->le_conn_min_interval
= val
;
887 hci_dev_unlock(hdev
);
892 static int conn_min_interval_get(void *data
, u64
*val
)
894 struct hci_dev
*hdev
= data
;
897 *val
= hdev
->le_conn_min_interval
;
898 hci_dev_unlock(hdev
);
903 DEFINE_SIMPLE_ATTRIBUTE(conn_min_interval_fops
, conn_min_interval_get
,
904 conn_min_interval_set
, "%llu\n");
906 static int conn_max_interval_set(void *data
, u64 val
)
908 struct hci_dev
*hdev
= data
;
910 if (val
< 0x0006 || val
> 0x0c80 || val
< hdev
->le_conn_min_interval
)
914 hdev
->le_conn_max_interval
= val
;
915 hci_dev_unlock(hdev
);
920 static int conn_max_interval_get(void *data
, u64
*val
)
922 struct hci_dev
*hdev
= data
;
925 *val
= hdev
->le_conn_max_interval
;
926 hci_dev_unlock(hdev
);
931 DEFINE_SIMPLE_ATTRIBUTE(conn_max_interval_fops
, conn_max_interval_get
,
932 conn_max_interval_set
, "%llu\n");
934 static int conn_latency_set(void *data
, u64 val
)
936 struct hci_dev
*hdev
= data
;
942 hdev
->le_conn_latency
= val
;
943 hci_dev_unlock(hdev
);
948 static int conn_latency_get(void *data
, u64
*val
)
950 struct hci_dev
*hdev
= data
;
953 *val
= hdev
->le_conn_latency
;
954 hci_dev_unlock(hdev
);
959 DEFINE_SIMPLE_ATTRIBUTE(conn_latency_fops
, conn_latency_get
,
960 conn_latency_set
, "%llu\n");
962 static int supervision_timeout_set(void *data
, u64 val
)
964 struct hci_dev
*hdev
= data
;
966 if (val
< 0x000a || val
> 0x0c80)
970 hdev
->le_supv_timeout
= val
;
971 hci_dev_unlock(hdev
);
976 static int supervision_timeout_get(void *data
, u64
*val
)
978 struct hci_dev
*hdev
= data
;
981 *val
= hdev
->le_supv_timeout
;
982 hci_dev_unlock(hdev
);
987 DEFINE_SIMPLE_ATTRIBUTE(supervision_timeout_fops
, supervision_timeout_get
,
988 supervision_timeout_set
, "%llu\n");
990 static int adv_channel_map_set(void *data
, u64 val
)
992 struct hci_dev
*hdev
= data
;
994 if (val
< 0x01 || val
> 0x07)
998 hdev
->le_adv_channel_map
= val
;
999 hci_dev_unlock(hdev
);
1004 static int adv_channel_map_get(void *data
, u64
*val
)
1006 struct hci_dev
*hdev
= data
;
1009 *val
= hdev
->le_adv_channel_map
;
1010 hci_dev_unlock(hdev
);
1015 DEFINE_SIMPLE_ATTRIBUTE(adv_channel_map_fops
, adv_channel_map_get
,
1016 adv_channel_map_set
, "%llu\n");
1018 static int adv_min_interval_set(void *data
, u64 val
)
1020 struct hci_dev
*hdev
= data
;
1022 if (val
< 0x0020 || val
> 0x4000 || val
> hdev
->le_adv_max_interval
)
1026 hdev
->le_adv_min_interval
= val
;
1027 hci_dev_unlock(hdev
);
1032 static int adv_min_interval_get(void *data
, u64
*val
)
1034 struct hci_dev
*hdev
= data
;
1037 *val
= hdev
->le_adv_min_interval
;
1038 hci_dev_unlock(hdev
);
1043 DEFINE_SIMPLE_ATTRIBUTE(adv_min_interval_fops
, adv_min_interval_get
,
1044 adv_min_interval_set
, "%llu\n");
1046 static int adv_max_interval_set(void *data
, u64 val
)
1048 struct hci_dev
*hdev
= data
;
1050 if (val
< 0x0020 || val
> 0x4000 || val
< hdev
->le_adv_min_interval
)
1054 hdev
->le_adv_max_interval
= val
;
1055 hci_dev_unlock(hdev
);
1060 static int adv_max_interval_get(void *data
, u64
*val
)
1062 struct hci_dev
*hdev
= data
;
1065 *val
= hdev
->le_adv_max_interval
;
1066 hci_dev_unlock(hdev
);
1071 DEFINE_SIMPLE_ATTRIBUTE(adv_max_interval_fops
, adv_max_interval_get
,
1072 adv_max_interval_set
, "%llu\n");
1074 DEFINE_QUIRK_ATTRIBUTE(quirk_strict_duplicate_filter
,
1075 HCI_QUIRK_STRICT_DUPLICATE_FILTER
);
1076 DEFINE_QUIRK_ATTRIBUTE(quirk_simultaneous_discovery
,
1077 HCI_QUIRK_SIMULTANEOUS_DISCOVERY
);
1079 void hci_debugfs_create_le(struct hci_dev
*hdev
)
1081 debugfs_create_file("identity", 0400, hdev
->debugfs
, hdev
,
1083 debugfs_create_file("rpa_timeout", 0644, hdev
->debugfs
, hdev
,
1085 debugfs_create_file("random_address", 0444, hdev
->debugfs
, hdev
,
1086 &random_address_fops
);
1087 debugfs_create_file("static_address", 0444, hdev
->debugfs
, hdev
,
1088 &static_address_fops
);
1090 /* For controllers with a public address, provide a debug
1091 * option to force the usage of the configured static
1092 * address. By default the public address is used.
1094 if (bacmp(&hdev
->bdaddr
, BDADDR_ANY
))
1095 debugfs_create_file("force_static_address", 0644,
1096 hdev
->debugfs
, hdev
,
1097 &force_static_address_fops
);
1099 debugfs_create_u8("white_list_size", 0444, hdev
->debugfs
,
1100 &hdev
->le_white_list_size
);
1101 debugfs_create_file("white_list", 0444, hdev
->debugfs
, hdev
,
1103 debugfs_create_file("identity_resolving_keys", 0400, hdev
->debugfs
,
1104 hdev
, &identity_resolving_keys_fops
);
1105 debugfs_create_file("long_term_keys", 0400, hdev
->debugfs
, hdev
,
1106 &long_term_keys_fops
);
1107 debugfs_create_file("conn_min_interval", 0644, hdev
->debugfs
, hdev
,
1108 &conn_min_interval_fops
);
1109 debugfs_create_file("conn_max_interval", 0644, hdev
->debugfs
, hdev
,
1110 &conn_max_interval_fops
);
1111 debugfs_create_file("conn_latency", 0644, hdev
->debugfs
, hdev
,
1112 &conn_latency_fops
);
1113 debugfs_create_file("supervision_timeout", 0644, hdev
->debugfs
, hdev
,
1114 &supervision_timeout_fops
);
1115 debugfs_create_file("adv_channel_map", 0644, hdev
->debugfs
, hdev
,
1116 &adv_channel_map_fops
);
1117 debugfs_create_file("adv_min_interval", 0644, hdev
->debugfs
, hdev
,
1118 &adv_min_interval_fops
);
1119 debugfs_create_file("adv_max_interval", 0644, hdev
->debugfs
, hdev
,
1120 &adv_max_interval_fops
);
1121 debugfs_create_u16("discov_interleaved_timeout", 0644, hdev
->debugfs
,
1122 &hdev
->discov_interleaved_timeout
);
1124 debugfs_create_file("quirk_strict_duplicate_filter", 0644,
1125 hdev
->debugfs
, hdev
,
1126 &quirk_strict_duplicate_filter_fops
);
1127 debugfs_create_file("quirk_simultaneous_discovery", 0644,
1128 hdev
->debugfs
, hdev
,
1129 &quirk_simultaneous_discovery_fops
);
1132 void hci_debugfs_create_conn(struct hci_conn
*conn
)
1134 struct hci_dev
*hdev
= conn
->hdev
;
1137 if (IS_ERR_OR_NULL(hdev
->debugfs
))
1140 snprintf(name
, sizeof(name
), "%u", conn
->handle
);
1141 conn
->debugfs
= debugfs_create_dir(name
, hdev
->debugfs
);