Bluetooth: Add support for Shorter Connection Interval (SCI) feature
Subsystems (2)
Luiz Augusto von Dentz
maintainerPATCH v2 1/3 Bluetooth: Add support for Shorter Connection Interval (SCI) feature
From: Luiz Augusto von Dentz <[email protected]>
Add HCI command, event and feature bit definitions for the Bluetooth 6.2 Shorter Connection Interval feature:
Commands:
- HCI_OP_LE_CONN_RATE (0x20a1) - Connection Rate Request
- HCI_OP_LE_SET_DEF_RATE (0x20a2) - Set Default Rate Parameters
- HCI_OP_LE_READ_CONN_INTERVAL (0x20a3) - Read Min Supported Connection Interval
Events:
- HCI_EVT_LE_CONN_RATE_CHANGE (0x37) - Connection Rate Change
Feature bits:
- HCI_LE_SCI - Shorter Connection Intervals
- HCI_LE_SCI_HOST - Shorter Connection Intervals (Host Support)
During controller init, when SCI is supported:
- Set Shorter Connection Intervals (Host Support) feature via LE Set Host Feature
- Read Minimum Supported Connection Interval
- Set Default Rate Parameters
The Connection Rate Change event handler updates the connection interval, latency and supervision timeout on the hci_conn.
--- include/net/bluetooth/hci.h | 53 ++++++++++++++++++++++++++++++++ include/net/bluetooth/hci_core.h | 3 ++ net/bluetooth/hci_event.c | 27 ++++++++++++++++ net/bluetooth/hci_sync.c | 53 ++++++++++++++++++++++++++++++-- 4 files changed, 134 insertions(+), 2 deletions(-)
include/net/bluetooth/hci.h +53 -0
@@ -653,6 +653,8 @@ enum {#define HCI_LE_LL_EXT_FEATURE 0x80#define HCI_LE_CS 0x40#define HCI_LE_CS_HOST 0x80 +#define HCI_LE_SCI 0x01/* byte 9 - Shorter Connection Intervals */ +#define HCI_LE_SCI_HOST 0x02/* byte 9 - Shorter Connection Intervals (Host) */ /* Connection modes */ #define HCI_CM_ACTIVE 0x0000
@@ -2489,6 +2491,46 @@ struct hci_cp_le_set_host_feature_v2 {__u8 bit_value; } __packed; +#define HCI_OP_LE_CONN_RATE 0x20a1 +struct hci_cp_le_conn_rate { +__le16 handle; +__le16 interval_min; +__le16 interval_max; +__le16 subrate_min; +__le16 subrate_max; +__le16 max_latency; +__le16 cont_num; +__le16 supv_timeout; +__le16 min_ce_len; +__le16 max_ce_len; +} __packed; + +#define HCI_OP_LE_SET_DEF_RATE 0x20a2 +struct hci_cp_le_set_def_rate { +__le16 interval_min; +__le16 interval_max; +__le16 subrate_min; +__le16 subrate_max; +__le16 max_latency; +__le16 cont_num; +__le16 supv_timeout; +__le16 min_ce_len; +__le16 max_ce_len; +} __packed; + +#define HCI_OP_LE_READ_CONN_INTERVAL 0x20a3 +struct hci_le_conn_interval_group { +__le16 min; +__le16 max; +__le16 stride; +} __packed; + +struct hci_rp_le_read_conn_interval { +__u8 status; +__u8 num_grps; +struct hci_le_conn_interval_group grps[]; +} __packed; +/* ---- HCI Events ---- */ struct hci_ev_status {__u8 status;
@@ -3303,6 +3345,17 @@ struct hci_evt_le_cs_test_end_complete {__u8 status; } __packed; +#define HCI_EVT_LE_CONN_RATE_CHANGE 0x37 +struct hci_evt_le_conn_rate_change { +__u8 status; +__le16 handle; +__le16 interval; +__le16 subrate; +__le16 latency; +__le16 cont_number; +__le16 supv_timeout; +} __packed; +#define HCI_EV_VENDOR 0xff/* Internal events generated by Bluetooth stack */
include/net/bluetooth/hci_core.h +3 -0
@@ -2077,6 +2077,9 @@ void hci_conn_del_sysfs(struct hci_conn *conn);#define le_cs_host_capable (dev) \ ((dev)->le_features[5] & HCI_LE_CS_HOST) +#define le_sci_capable (dev) \ + ((dev)->le_features[9] & HCI_LE_SCI) +#define mws_transport_config_capable (dev) (((dev)->commands[30] & 0x08) && \ (!hci_test_quirk((dev), HCI_QUIRK_BROKEN_MWS_TRANSPORT_CONFIG)))
net/bluetooth/hci_event.c +27 -0
@@ -7363,6 +7363,29 @@ static void hci_le_read_all_remote_features_evt(struct hci_dev *hdev,hci_dev_unlock (hdev); } +static void hci_le_conn_rate_change_evt (struct hci_dev *hdev,void *data, +struct sk_buff *skb) +{ +struct hci_evt_le_conn_rate_change *ev = data; +struct hci_conn *conn; + +bt_dev_dbg (hdev,"status 0x%2.2x" , ev->status); + +if (ev->status) +return ; + +hci_dev_lock (hdev); + + conn =hci_conn_hash_lookup_handle (hdev,__le16_to_cpu (ev->handle)); +if (conn) { + conn->le_conn_interval =le16_to_cpu (ev->interval); + conn->le_conn_latency =le16_to_cpu (ev->latency); + conn->le_supv_timeout =le16_to_cpu (ev->supv_timeout); + } + +hci_dev_unlock (hdev); +} +#define HCI_LE_EV_VL (_op, _func, _min_len, _max_len) \ [_op] = { \ .func = _func, \
@@ -7474,6 +7497,10 @@ static const struct hci_le_ev { sizeof(struct hci_evt_le_read_all_remote_features_complete), HCI_MAX_EVENT_SIZE), +/* [0x37 = HCI_EVT_LE_CONN_RATE_CHANGE] */ +HCI_LE_EV (HCI_EVT_LE_CONN_RATE_CHANGE , + hci_le_conn_rate_change_evt, + sizeof(struct hci_evt_le_conn_rate_change)), }; static void hci_le_meta_evt(struct hci_dev *hdev, void *data,
net/bluetooth/hci_sync.c +51 -2
84 lines not on this page · raw message
Signature · 1 line
2.54.0
Luiz Augusto von Dentz
maintainerPATCH v2 2/3 Bluetooth: Add MGMT Shorter Connection Interval setting
From: Luiz Augusto von Dentz <[email protected]>
Add MGMT_SETTING_SCI (bit 25) to advertise support for the Shorter Connection Interval (SCI) feature. It is reported in the supported settings whenever the controller is SCI capable, and in the current settings whenever LE is enabled and the controller is SCI capable (SCI has no separate enable command, so it is a passive capability).
--- include/net/bluetooth/hci_core.h | 2 ++ include/net/bluetooth/mgmt.h | 1 + net/bluetooth/mgmt.c | 6 ++++++ 3 files changed, 9 insertions(+)
include/net/bluetooth/hci_core.h +2 -0
@@ -2079,6 +2079,8 @@ void hci_conn_del_sysfs(struct hci_conn *conn);#define le_sci_capable (dev) \ ((dev)->le_features[9] & HCI_LE_SCI) +#define le_sci_enabled (dev) \ + (le_enabled(dev) && le_sci_capable(dev))#define mws_transport_config_capable (dev) (((dev)->commands[30] & 0x08) && \ (!hci_test_quirk((dev), HCI_QUIRK_BROKEN_MWS_TRANSPORT_CONFIG)))
include/net/bluetooth/mgmt.h +1 -0
@@ -118,6 +118,7 @@ struct mgmt_rp_read_index_list {#define MGMT_SETTING_LL_PRIVACY BIT(22)#define MGMT_SETTING_PAST_SENDER BIT(23)#define MGMT_SETTING_PAST_RECEIVER BIT(24) +#define MGMT_SETTING_SCI BIT(25)#define MGMT_OP_READ_INFO 0x0004#define MGMT_READ_INFO_SIZE 0
net/bluetooth/mgmt.c +6 -0
@@ -861,6 +861,9 @@ static u32 get_supported_settings(struct hci_dev *hdev)if (past_receiver_capable (hdev)) settings |=MGMT_SETTING_PAST_RECEIVER ; +if (le_sci_capable (hdev)) + settings |=MGMT_SETTING_SCI ; + settings |=MGMT_SETTING_PHY_CONFIGURATION ;return settings;
@@ -952,6 +955,9 @@ static u32 get_current_settings(struct hci_dev *hdev)if (past_receiver_enabled (hdev)) settings |=MGMT_SETTING_PAST_RECEIVER ; +if (le_sci_enabled (hdev)) + settings |=MGMT_SETTING_SCI ; +return settings; }
Signature · 1 line
2.54.0
Luiz Augusto von Dentz
maintainerPATCH v2 3/3 Bluetooth: Add MGMT Load Connection Subrate command
In reply to Luiz Augusto von DentzFrom: Luiz Augusto von Dentz <[email protected]>
Add MGMT_OP_LOAD_CONN_SUBRATE (0x005C) command to load per-device connection subrate parameters when the SCI feature is supported.
Add MGMT_EV_CONN_SUBRATE (0x0033) event to notify userspace when connection rate changes occur via the LE Connection Rate Change HCI event.
Add subrate fields (subrate_min, subrate_max, max_latency, cont_num) to struct hci_conn_params to store the loaded subrate parameters, and the corresponding le_rate_* fields to struct hci_conn to track the parameters currently in use.
When a single entry is loaded for an already-connected central, or on connection completion, the LE Connection Rate Request procedure is initiated to apply the parameters.
--- include/net/bluetooth/hci_core.h | 15 ++++ include/net/bluetooth/hci_sync.h | 1 + include/net/bluetooth/mgmt.h | 28 +++++++ net/bluetooth/hci_event.c | 30 ++++++-- net/bluetooth/hci_sync.c | 62 +++++++++++++++ net/bluetooth/mgmt.c | 128 +++++++++++++++++++++++++++++++ 6 files changed, 258 insertions(+), 6 deletions(-)
include/net/bluetooth/hci_core.h +15 -0
@@ -720,6 +720,11 @@ struct hci_conn {__u16 le_conn_interval;__u16 le_conn_latency;__u16 le_supv_timeout; +__u16 le_rate_interval; +__u16 le_subrate; +__u16 le_rate_latency; +__u16 le_cont_num; +__u16 le_rate_supv_timeout;__u8 le_adv_data[HCI_MAX_EXT_AD_LENGTH ];__u8 le_adv_data_len;__u8 le_per_adv_data[HCI_MAX_PER_AD_TOT_LEN ];
@@ -810,6 +815,14 @@ struct hci_conn_params {u16 conn_latency;u16 supervision_timeout; +u16 rate_min_interval; +u16 rate_max_interval; +u16 subrate_min; +u16 subrate_max; +u16 max_latency; +u16 cont_num; +u16 rate_supv_timeout; +enum {HCI_AUTO_CONN_DISABLED ,HCI_AUTO_CONN_REPORT ,
@@ -2497,6 +2510,8 @@ void mgmt_advertising_removed(struct sock *sk, struct hci_dev *hdev,int mgmt_phy_configuration_changed (struct hci_dev *hdev,struct sock *skip);void mgmt_adv_monitor_device_lost (struct hci_dev *hdev,u16 handle,bdaddr_t *bdaddr,u8 addr_type); +void mgmt_conn_subrate_notify (struct hci_dev *hdev,struct hci_conn *conn, +u8 status);int hci_abort_conn (struct hci_conn *conn,u8 reason); void hci_le_conn_update(struct hci_conn *conn, u16 min, u16 max, u16 latency,
include/net/bluetooth/hci_sync.h +1 -0
@@ -183,6 +183,7 @@ int hci_connect_le_sync(struct hci_dev *hdev, struct hci_conn *conn);int hci_cancel_connect_sync (struct hci_dev *hdev,struct hci_conn *conn);int hci_le_conn_update_sync (struct hci_dev *hdev,struct hci_conn *conn,struct hci_conn_params *params); +int hci_le_conn_rate_request (struct hci_dev *hdev,struct hci_conn *conn);int hci_connect_pa_sync (struct hci_dev *hdev,struct hci_conn *conn);int hci_connect_big_sync (struct hci_dev *hdev,struct hci_conn *conn);
include/net/bluetooth/mgmt.h +28 -0
@@ -894,6 +894,23 @@ struct mgmt_cp_hci_cmd_sync { } __packed;#define MGMT_HCI_CMD_SYNC_SIZE 6 +#define MGMT_OP_LOAD_CONN_SUBRATE 0x005C +struct mgmt_conn_subrate { +struct mgmt_addr_info addr; +__le16 min_interval; +__le16 max_interval; +__le16 subrate_min; +__le16 subrate_max; +__le16 max_latency; +__le16 cont_num; +__le16 supv_timeout; +} __packed; +struct mgmt_cp_load_conn_subrate { +__le16 param_count; + struct mgmt_conn_subrate params[] __counted_by_le(param_count); +} __packed; +#define MGMT_LOAD_CONN_SUBRATE_SIZE 2 +#define MGMT_EV_CMD_COMPLETE 0x0001struct mgmt_ev_cmd_complete {__le16 opcode;
@@ -1193,3 +1210,14 @@ struct mgmt_ev_mesh_device_found {struct mgmt_ev_mesh_pkt_cmplt {__u8 handle; } __packed; + +#define MGMT_EV_CONN_SUBRATE 0x0033 +struct mgmt_ev_conn_subrate { +struct mgmt_addr_info addr; +__u8 status; +__le16 interval; +__le16 subrate; +__le16 latency; +__le16 cont_num; +__le16 supv_timeout; +} __packed;
net/bluetooth/hci_event.c +24 -6
@@ -5867,6 +5867,17 @@ static void le_conn_complete_evt(struct hci_dev *hdev, u8 status, } } +/* If we are central and have subrate parameters stored, queue a +* connection rate request to apply them. +*/ +if (conn->role ==HCI_ROLE_MASTER &&le_sci_capable (hdev)) { +struct hci_conn_params *p; + + p =hci_conn_params_lookup (hdev, &conn->dst, conn->dst_type); +if (p && p->subrate_max) +hci_le_conn_rate_request (hdev, conn); + } + unlock:hci_update_passive_scan (hdev);hci_dev_unlock (hdev);
@@ -7371,16 +7382,23 @@ static void hci_le_conn_rate_change_evt(struct hci_dev *hdev, void *data,bt_dev_dbg (hdev,"status 0x%2.2x" , ev->status); -if (ev->status) -return ; -hci_dev_lock (hdev); conn =hci_conn_hash_lookup_handle (hdev,__le16_to_cpu (ev->handle));if (conn) { - conn->le_conn_interval =le16_to_cpu (ev->interval); - conn->le_conn_latency =le16_to_cpu (ev->latency); - conn->le_supv_timeout =le16_to_cpu (ev->supv_timeout); +/* Only update the stored rate parameters on success; on +* failure the values in the event are not valid. Userspace is +* notified either way. +*/ +if (!ev->status) { + conn->le_rate_interval =le16_to_cpu (ev->interval); + conn->le_subrate =le16_to_cpu (ev->subrate); + conn->le_rate_latency =le16_to_cpu (ev->latency); + conn->le_cont_num =le16_to_cpu (ev->cont_number); + conn->le_rate_supv_timeout = +le16_to_cpu (ev->supv_timeout); + } +mgmt_conn_subrate_notify (hdev, conn, ev->status); }hci_dev_unlock (hdev);
net/bluetooth/hci_sync.c +62 -0
68 lines not on this page · raw message
net/bluetooth/mgmt.c +128 -0
146 lines not on this page · raw message
Signature · 1 line
2.54.0
This is automated email and please do not reply to this email!
Dear submitter,
Thank you for submitting the patches to the linux bluetooth mailing list. This is a CI test results with your patch series:
PW Link:https://patchwork.kernel.org/project/bluetooth/list/?series=1136133
---Test result---
Test Summary:
CheckPatch FAIL 3.94 seconds VerifyFixes PASS 0.07 seconds VerifySignedoff PASS 0.07 seconds GitLint PASS 0.63 seconds SubjectPrefix PASS 0.20 seconds BuildKernel PASS 27.22 seconds CheckAllWarning PASS 29.83 seconds CheckSparse PASS 28.29 seconds BuildKernel32 PASS 26.08 seconds CheckKernelLLVM SKIP 0.00 seconds TestRunnerSetup PASS 502.86 seconds TestRunner_l2cap-tester PASS 64.25 seconds TestRunner_iso-tester PASS 87.98 seconds TestRunner_bnep-tester PASS 19.65 seconds TestRunner_mgmt-tester FAIL 227.70 seconds TestRunner_rfcomm-tester PASS 26.75 seconds TestRunner_sco-tester PASS 33.64 seconds TestRunner_ioctl-tester PASS 27.17 seconds TestRunner_mesh-tester FAIL 26.87 seconds TestRunner_smp-tester PASS 23.54 seconds TestRunner_userchan-tester PASS 20.04 seconds TestRunner_6lowpan-tester PASS 23.07 seconds IncrementalBuild PASS 61.52 seconds
Details
##############################
Test: CheckPatch - FAIL
Desc: Run checkpatch.pl script
Output:
[v2,3/3] Bluetooth: Add MGMT Load Connection Subrate command
WARNING: Prefer using '"%s...", __func__' to using 'load_conn_subrate', this function's name, in a string #369: FILE: net/bluetooth/mgmt.c:8178:
+ bt_dev_err(hdev, "load_conn_subrate: too big param_count value %u",
WARNING: Prefer using '"%s...", __func__' to using 'load_conn_subrate', this function's name, in a string #377: FILE: net/bluetooth/mgmt.c:8186:
+ bt_dev_err(hdev, "load_conn_subrate: expected %u bytes, got %u bytes",
total: 0 errors, 2 warnings, 0 checks, 337 lines checked
NOTE: For some of the reported defects, checkpatch may be able to
mechanically convert to the typical style using --fix or --fix-inplace.
/github/workspace/src/patch/14716338.patch has style problems, please review.
NOTE: Ignored message types: UNKNOWN_COMMIT_ID
NOTE: If any of the errors are false positives, please report
them to the maintainer, see CHECKPATCH in MAINTAINERS.
##############################
Test: CheckKernelLLVM - SKIP
Desc: Build kernel with LLVM + context analysis Output:
Clang not found
##############################
Test: TestRunner_mgmt-tester - FAIL
Desc: Run mgmt-tester with test-runner Output:
Total: 494, Passed: 489 (99.0%), Failed: 1, Not Run: 4
Failed Test Cases
Read Exp Feature - Success Failed 0.267 seconds
##############################
Test: TestRunner_mesh-tester - FAIL
Desc: Run mesh-tester with test-runner Output:
Total: 10, Passed: 8 (80.0%), Failed: 2, Not Run: 0
Failed Test Cases
Mesh - Send cancel - 1 Timed out 2.678 seconds Mesh - Send cancel - 2 Timed out 1.988 seconds
https://github.com/bluez/bluetooth-next/pull/505
---
Regards,
Linux Bluetooth