Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Bluetooth: Expose debugfs settings for LE connection interval

For testing purposes expose the default LE connection interval values
via debugfs.

Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>

authored by

Marcel Holtmann and committed by
Johan Hedberg
4e70c7e7 06f5b778

+67 -2
+2
include/net/bluetooth/hci_core.h
··· 169 169 __u8 page_scan_type; 170 170 __u16 le_scan_interval; 171 171 __u16 le_scan_window; 172 + __u16 le_conn_min_interval; 173 + __u16 le_conn_max_interval; 172 174 __u8 ssp_debug_mode; 173 175 174 176 __u16 devid_source;
+3 -2
net/bluetooth/hci_conn.c
··· 558 558 bacpy(&cp.peer_addr, &conn->dst); 559 559 cp.peer_addr_type = conn->dst_type; 560 560 cp.own_address_type = conn->src_type; 561 - cp.conn_interval_min = __constant_cpu_to_le16(0x0028); 562 - cp.conn_interval_max = __constant_cpu_to_le16(0x0038); 561 + cp.conn_interval_min = cpu_to_le16(hdev->le_conn_min_interval); 562 + cp.conn_interval_max = cpu_to_le16(hdev->le_conn_max_interval); 563 563 cp.supervision_timeout = __constant_cpu_to_le16(0x002a); 564 564 cp.min_ce_len = __constant_cpu_to_le16(0x0000); 565 565 cp.max_ce_len = __constant_cpu_to_le16(0x0000); 566 + 566 567 hci_req_add(&req, HCI_OP_LE_CREATE_CONN, sizeof(cp), &cp); 567 568 568 569 err = hci_req_run(&req, create_le_conn_complete);
+62
net/bluetooth/hci_core.c
··· 517 517 .release = single_release, 518 518 }; 519 519 520 + static int conn_min_interval_set(void *data, u64 val) 521 + { 522 + struct hci_dev *hdev = data; 523 + 524 + if (val < 0x0006 || val > 0x0c80 || val > hdev->le_conn_max_interval) 525 + return -EINVAL; 526 + 527 + hci_dev_lock(hdev); 528 + hdev->le_conn_min_interval= val; 529 + hci_dev_unlock(hdev); 530 + 531 + return 0; 532 + } 533 + 534 + static int conn_min_interval_get(void *data, u64 *val) 535 + { 536 + struct hci_dev *hdev = data; 537 + 538 + hci_dev_lock(hdev); 539 + *val = hdev->le_conn_min_interval; 540 + hci_dev_unlock(hdev); 541 + 542 + return 0; 543 + } 544 + 545 + DEFINE_SIMPLE_ATTRIBUTE(conn_min_interval_fops, conn_min_interval_get, 546 + conn_min_interval_set, "%llu\n"); 547 + 548 + static int conn_max_interval_set(void *data, u64 val) 549 + { 550 + struct hci_dev *hdev = data; 551 + 552 + if (val < 0x0006 || val > 0x0c80 || val < hdev->le_conn_min_interval) 553 + return -EINVAL; 554 + 555 + hci_dev_lock(hdev); 556 + hdev->le_conn_max_interval= val; 557 + hci_dev_unlock(hdev); 558 + 559 + return 0; 560 + } 561 + 562 + static int conn_max_interval_get(void *data, u64 *val) 563 + { 564 + struct hci_dev *hdev = data; 565 + 566 + hci_dev_lock(hdev); 567 + *val = hdev->le_conn_max_interval; 568 + hci_dev_unlock(hdev); 569 + 570 + return 0; 571 + } 572 + 573 + DEFINE_SIMPLE_ATTRIBUTE(conn_max_interval_fops, conn_max_interval_get, 574 + conn_max_interval_set, "%llu\n"); 575 + 520 576 /* ---- HCI requests ---- */ 521 577 522 578 static void hci_req_sync_complete(struct hci_dev *hdev, u8 result) ··· 1329 1273 hdev, &own_address_type_fops); 1330 1274 debugfs_create_file("long_term_keys", 0400, hdev->debugfs, 1331 1275 hdev, &long_term_keys_fops); 1276 + debugfs_create_file("conn_min_interval", 0644, hdev->debugfs, 1277 + hdev, &conn_min_interval_fops); 1278 + debugfs_create_file("conn_max_interval", 0644, hdev->debugfs, 1279 + hdev, &conn_max_interval_fops); 1332 1280 } 1333 1281 1334 1282 return 0; ··· 2798 2738 2799 2739 hdev->le_scan_interval = 0x0060; 2800 2740 hdev->le_scan_window = 0x0030; 2741 + hdev->le_conn_min_interval = 0x0028; 2742 + hdev->le_conn_max_interval = 0x0038; 2801 2743 2802 2744 mutex_init(&hdev->lock); 2803 2745 mutex_init(&hdev->req_lock);