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 DEFINE_SHOW_ATTRIBUTE(__name)
93 static int features_show(struct seq_file
*f
, void *ptr
)
95 struct hci_dev
*hdev
= f
->private;
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
);
108 DEFINE_SHOW_ATTRIBUTE(features
);
110 static int device_id_show(struct seq_file
*f
, void *ptr
)
112 struct hci_dev
*hdev
= f
->private;
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
);
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
;
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
,
137 hci_dev_unlock(hdev
);
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
;
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
);
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
;
165 list_for_each_entry(uuid
, &hdev
->uuids
, list
) {
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
);
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
;
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
);
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
)
211 hdev
->conn_info_min_age
= val
;
212 hci_dev_unlock(hdev
);
217 static int conn_info_min_age_get(void *data
, u64
*val
)
219 struct hci_dev
*hdev
= data
;
222 *val
= hdev
->conn_info_min_age
;
223 hci_dev_unlock(hdev
);
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
)
239 hdev
->conn_info_max_age
= val
;
240 hci_dev_unlock(hdev
);
245 static int conn_info_max_age_get(void *data
, u64
*val
)
247 struct hci_dev
*hdev
= data
;
250 *val
= hdev
->conn_info_max_age
;
251 hci_dev_unlock(hdev
);
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
;
265 buf
[0] = hci_dev_test_flag(hdev
, HCI_USE_DEBUG_KEYS
) ? 'Y': 'N';
268 return simple_read_from_buffer(user_buf
, count
, ppos
, buf
, 2);
271 static const struct file_operations use_debug_keys_fops
= {
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
;
283 buf
[0] = hci_dev_test_flag(hdev
, HCI_SC_ONLY
) ? 'Y': 'N';
286 return simple_read_from_buffer(user_buf
, count
, ppos
, buf
, 2);
289 static const struct file_operations sc_only_mode_fops
= {
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
,
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
,
311 debugfs_create_file("device_list", 0444, hdev
->debugfs
, hdev
,
313 debugfs_create_file("blacklist", 0444, hdev
->debugfs
, hdev
,
315 debugfs_create_file("uuids", 0444, hdev
->debugfs
, hdev
, &uuids_fops
);
316 debugfs_create_file("remote_oob", 0400, hdev
->debugfs
, hdev
,
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
);
333 debugfs_create_file("hardware_info", 0444, hdev
->debugfs
,
334 hdev
, &hardware_info_fops
);
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
;
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",
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
);
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
;
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
);
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;
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
);
395 DEFINE_SHOW_ATTRIBUTE(dev_class
);
397 static int voice_setting_get(void *data
, u64
*val
)
399 struct hci_dev
*hdev
= data
;
402 *val
= hdev
->voice_setting
;
403 hci_dev_unlock(hdev
);
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
;
417 buf
[0] = hdev
->ssp_debug_mode
? 'Y': 'N';
420 return simple_read_from_buffer(user_buf
, count
, ppos
, buf
, 2);
423 static const struct file_operations ssp_debug_mode_fops
= {
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
;
434 hdev
->auto_accept_delay
= val
;
435 hci_dev_unlock(hdev
);
440 static int auto_accept_delay_get(void *data
, u64
*val
)
442 struct hci_dev
*hdev
= data
;
445 *val
= hdev
->auto_accept_delay
;
446 hci_dev_unlock(hdev
);
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))
462 hdev
->idle_timeout
= val
;
463 hci_dev_unlock(hdev
);
468 static int idle_timeout_get(void *data
, u64
*val
)
470 struct hci_dev
*hdev
= data
;
473 *val
= hdev
->idle_timeout
;
474 hci_dev_unlock(hdev
);
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
)
490 hdev
->sniff_min_interval
= val
;
491 hci_dev_unlock(hdev
);
496 static int sniff_min_interval_get(void *data
, u64
*val
)
498 struct hci_dev
*hdev
= data
;
501 *val
= hdev
->sniff_min_interval
;
502 hci_dev_unlock(hdev
);
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
)
518 hdev
->sniff_max_interval
= val
;
519 hci_dev_unlock(hdev
);
524 static int sniff_max_interval_get(void *data
, u64
*val
)
526 struct hci_dev
*hdev
= data
;
529 *val
= hdev
->sniff_max_interval
;
530 hci_dev_unlock(hdev
);
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
,
544 debugfs_create_file("dev_class", 0444, hdev
->debugfs
, hdev
,
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;
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
);
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
593 if (val
< 30 || val
> (60 * 60 * 24))
597 hdev
->rpa_timeout
= val
;
598 hci_dev_unlock(hdev
);
603 static int rpa_timeout_get(void *data
, u64
*val
)
605 struct hci_dev
*hdev
= data
;
608 *val
= hdev
->rpa_timeout
;
609 hci_dev_unlock(hdev
);
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;
622 seq_printf(f
, "%pMR\n", &hdev
->random_addr
);
623 hci_dev_unlock(hdev
);
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;
635 seq_printf(f
, "%pMR\n", &hdev
->static_addr
);
636 hci_dev_unlock(hdev
);
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
;
650 buf
[0] = hci_dev_test_flag(hdev
, HCI_FORCE_STATIC_ADDR
) ? 'Y': 'N';
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
;
662 size_t buf_size
= min(count
, (sizeof(buf
)-1));
665 if (test_bit(HCI_UP
, &hdev
->flags
))
668 if (copy_from_user(buf
, user_buf
, buf_size
))
671 buf
[buf_size
] = '\0';
672 if (strtobool(buf
, &enable
))
675 if (enable
== hci_dev_test_flag(hdev
, HCI_FORCE_STATIC_ADDR
))
678 hci_dev_change_flag(hdev
, HCI_FORCE_STATIC_ADDR
);
683 static const struct file_operations force_static_address_fops
= {
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
;
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
);
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;
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
);
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;
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 <k
->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
);
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
)
749 hdev
->le_conn_min_interval
= val
;
750 hci_dev_unlock(hdev
);
755 static int conn_min_interval_get(void *data
, u64
*val
)
757 struct hci_dev
*hdev
= data
;
760 *val
= hdev
->le_conn_min_interval
;
761 hci_dev_unlock(hdev
);
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
)
777 hdev
->le_conn_max_interval
= val
;
778 hci_dev_unlock(hdev
);
783 static int conn_max_interval_get(void *data
, u64
*val
)
785 struct hci_dev
*hdev
= data
;
788 *val
= hdev
->le_conn_max_interval
;
789 hci_dev_unlock(hdev
);
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
;
805 hdev
->le_conn_latency
= val
;
806 hci_dev_unlock(hdev
);
811 static int conn_latency_get(void *data
, u64
*val
)
813 struct hci_dev
*hdev
= data
;
816 *val
= hdev
->le_conn_latency
;
817 hci_dev_unlock(hdev
);
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)
833 hdev
->le_supv_timeout
= val
;
834 hci_dev_unlock(hdev
);
839 static int supervision_timeout_get(void *data
, u64
*val
)
841 struct hci_dev
*hdev
= data
;
844 *val
= hdev
->le_supv_timeout
;
845 hci_dev_unlock(hdev
);
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)
861 hdev
->le_adv_channel_map
= val
;
862 hci_dev_unlock(hdev
);
867 static int adv_channel_map_get(void *data
, u64
*val
)
869 struct hci_dev
*hdev
= data
;
872 *val
= hdev
->le_adv_channel_map
;
873 hci_dev_unlock(hdev
);
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
)
889 hdev
->le_adv_min_interval
= val
;
890 hci_dev_unlock(hdev
);
895 static int adv_min_interval_get(void *data
, u64
*val
)
897 struct hci_dev
*hdev
= data
;
900 *val
= hdev
->le_adv_min_interval
;
901 hci_dev_unlock(hdev
);
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
)
917 hdev
->le_adv_max_interval
= val
;
918 hci_dev_unlock(hdev
);
923 static int adv_max_interval_get(void *data
, u64
*val
)
925 struct hci_dev
*hdev
= data
;
928 *val
= hdev
->le_adv_max_interval
;
929 hci_dev_unlock(hdev
);
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
,
946 debugfs_create_file("rpa_timeout", 0644, hdev
->debugfs
, hdev
,
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,
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
,
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
,
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,
989 &quirk_strict_duplicate_filter_fops
);
990 debugfs_create_file("quirk_simultaneous_discovery", 0644,
992 &quirk_simultaneous_discovery_fops
);
995 void hci_debugfs_create_conn(struct hci_conn
*conn
)
997 struct hci_dev
*hdev
= conn
->hdev
;
1000 if (IS_ERR_OR_NULL(hdev
->debugfs
))
1003 snprintf(name
, sizeof(name
), "%u", conn
->handle
);
1004 conn
->debugfs
= debugfs_create_dir(name
, hdev
->debugfs
);