blob: 059ff3ed55525dbe22ca980f1c9fc85c718031b6 [file] [log] [blame]
diff -rc --exclude-from SKIP backports-20140417.orig/include/net/bluetooth/hci_core.h backports-20140417/include/net/bluetooth/hci_core.h
*** backports-20140417.orig/include/net/bluetooth/hci_core.h 2014-04-17 16:48:22.000000000 -0700
--- backports-20140417/include/net/bluetooth/hci_core.h 2014-07-24 15:10:13.115698013 -0700
***************
*** 199,204 ****
--- 199,206 ----
__u16 le_scan_window;
__u16 le_conn_min_interval;
__u16 le_conn_max_interval;
+ __u16 le_slave_latency;
+ __u16 le_supervision_timeout;
__u16 discov_interleaved_timeout;
__u8 ssp_debug_mode;
diff -rc --exclude-from SKIP backports-20140417.orig/net/bluetooth/hci_conn.c backports-20140417/net/bluetooth/hci_conn.c
*** backports-20140417.orig/net/bluetooth/hci_conn.c 2014-04-17 16:48:22.000000000 -0700
--- backports-20140417/net/bluetooth/hci_conn.c 2014-07-24 15:10:13.119698013 -0700
***************
*** 619,625 ****
cp.own_address_type = own_addr_type;
cp.conn_interval_min = cpu_to_le16(conn->le_conn_min_interval);
cp.conn_interval_max = cpu_to_le16(conn->le_conn_max_interval);
! cp.supervision_timeout = cpu_to_le16(0x002a);
cp.min_ce_len = cpu_to_le16(0x0000);
cp.max_ce_len = cpu_to_le16(0x0000);
--- 619,626 ----
cp.own_address_type = own_addr_type;
cp.conn_interval_min = cpu_to_le16(conn->le_conn_min_interval);
cp.conn_interval_max = cpu_to_le16(conn->le_conn_max_interval);
! cp.conn_latency = cpu_to_le16(hdev->le_slave_latency);
! cp.supervision_timeout = cpu_to_le16(hdev->le_supervision_timeout);
cp.min_ce_len = cpu_to_le16(0x0000);
cp.max_ce_len = cpu_to_le16(0x0000);
diff -rc --exclude-from SKIP backports-20140417.orig/net/bluetooth/hci_core.c backports-20140417/net/bluetooth/hci_core.c
*** backports-20140417.orig/net/bluetooth/hci_core.c 2014-07-25 00:24:16.952238631 -0700
--- backports-20140417/net/bluetooth/hci_core.c 2014-07-25 09:37:01.871981108 -0700
***************
*** 840,845 ****
--- 840,903 ----
DEFINE_SIMPLE_ATTRIBUTE(conn_max_interval_fops, conn_max_interval_get,
conn_max_interval_set, "%llu\n");
+ static int slave_latency_set(void *data, u64 val)
+ {
+ struct hci_dev *hdev = data;
+
+ if (val >= 500)
+ return -EINVAL;
+
+ hci_dev_lock(hdev);
+ hdev->le_slave_latency = val;
+ hci_dev_unlock(hdev);
+
+ return 0;
+ }
+
+ static int slave_latency_get(void *data, u64 *val)
+ {
+ struct hci_dev *hdev = data;
+
+ hci_dev_lock(hdev);
+ *val = hdev->le_slave_latency;
+ hci_dev_unlock(hdev);
+
+ return 0;
+ }
+
+ DEFINE_SIMPLE_ATTRIBUTE(slave_latency_fops, slave_latency_get,
+ slave_latency_set, "%llu\n");
+
+ static int supervision_timeout_set(void *data, u64 val)
+ {
+ struct hci_dev *hdev = data;
+ int max_latency = (val * 10 / hdev->le_conn_max_interval) - 1;
+
+ /* val is in 10 ms units */
+ if (val < 10 || val > 3200 || hdev->le_slave_latency > max_latency)
+ return -EINVAL;
+
+ hci_dev_lock(hdev);
+ hdev->le_supervision_timeout = val;
+ hci_dev_unlock(hdev);
+
+ return 0;
+ }
+
+ static int supervision_timeout_get(void *data, u64 *val)
+ {
+ struct hci_dev *hdev = data;
+
+ hci_dev_lock(hdev);
+ *val = hdev->le_supervision_timeout;
+ hci_dev_unlock(hdev);
+
+ return 0;
+ }
+
+ DEFINE_SIMPLE_ATTRIBUTE(supervision_timeout_fops, supervision_timeout_get,
+ supervision_timeout_set, "%llu\n");
+
static int adv_channel_map_set(void *data, u64 val)
{
struct hci_dev *hdev = data;
***************
*** 1813,1818 ****
--- 1871,1880 ----
hdev, &conn_min_interval_fops);
debugfs_create_file("conn_max_interval", 0644, hdev->debugfs,
hdev, &conn_max_interval_fops);
+ debugfs_create_file("slave_latency", 0644, hdev->debugfs,
+ hdev, &slave_latency_fops);
+ debugfs_create_file("supervision_timeout", 0644, hdev->debugfs,
+ hdev, &supervision_timeout_fops);
debugfs_create_file("adv_channel_map", 0644, hdev->debugfs,
hdev, &adv_channel_map_fops);
debugfs_create_file("6lowpan", 0644, hdev->debugfs, hdev,
***************
*** 3782,3787 ****
--- 3844,3851 ----
hdev->le_scan_window = 0x0030;
hdev->le_conn_min_interval = 0x0028;
hdev->le_conn_max_interval = 0x0038;
+ hdev->le_slave_latency = 0;
+ hdev->le_supervision_timeout = 0x002a;
hdev->rpa_timeout = HCI_DEFAULT_RPA_TIMEOUT;
hdev->discov_interleaved_timeout = DISCOV_INTERLEAVED_TIMEOUT;