summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuiz Augusto von Dentz <luiz.von.dentz@intel.com>2026-05-26 12:43:42 -0400
committerLuiz Augusto von Dentz <luiz.von.dentz@intel.com>2026-06-11 14:24:39 -0400
commiteb87bf6fcae6a2dc25d7f2c977d2cbca2113fb1e (patch)
treeb7cddaeb6ffe44b95517b7ea468c898b2d037607
parentddb249341df3779c3c5cbe407b196f39921e1c53 (diff)
Bluetooth: hci_sync: Add support for HCI_LE_Set_Host_Feature [v2]
This adds support for using HCI_LE_Set_Host_Feature [v2] instead of v1 if LL Extented Features is supported and the controller supports the command. Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
-rw-r--r--include/net/bluetooth/hci.h6
-rw-r--r--net/bluetooth/hci_sync.c24
2 files changed, 29 insertions, 1 deletions
diff --git a/include/net/bluetooth/hci.h b/include/net/bluetooth/hci.h
index 572b1c620c5d..5462f14ea0c6 100644
--- a/include/net/bluetooth/hci.h
+++ b/include/net/bluetooth/hci.h
@@ -2486,6 +2486,12 @@ struct hci_rp_le_cs_test {
#define HCI_OP_LE_CS_TEST_END 0x2096
+#define HCI_OP_LE_SET_HOST_FEATURE_V2 0x2097
+struct hci_cp_le_set_host_feature_v2 {
+ __le16 bit_number;
+ __u8 bit_value;
+} __packed;
+
/* ---- HCI Events ---- */
struct hci_ev_status {
__u8 status;
diff --git a/net/bluetooth/hci_sync.c b/net/bluetooth/hci_sync.c
index df23245d6ccd..3be8c3581c6c 100644
--- a/net/bluetooth/hci_sync.c
+++ b/net/bluetooth/hci_sync.c
@@ -4588,11 +4588,33 @@ static int hci_set_le_support_sync(struct hci_dev *hdev)
sizeof(cp), &cp, HCI_CMD_TIMEOUT);
}
+/* LE Set Host Feature V2 */
+static int hci_le_set_host_feature_v2_sync(struct hci_dev *hdev, u16 bit,
+ u8 value)
+{
+ struct hci_cp_le_set_host_feature_v2 cp;
+
+ memset(&cp, 0, sizeof(cp));
+
+ /* Connected Isochronous Channels (Host Support) */
+ cp.bit_number = cpu_to_le16(bit);
+ cp.bit_value = value;
+
+ return __hci_cmd_sync_status(hdev, HCI_OP_LE_SET_HOST_FEATURE_V2,
+ sizeof(cp), &cp, HCI_CMD_TIMEOUT);
+}
+
/* LE Set Host Feature */
-static int hci_le_set_host_feature_sync(struct hci_dev *hdev, u8 bit, u8 value)
+static int hci_le_set_host_feature_sync(struct hci_dev *hdev, u16 bit, u8 value)
{
struct hci_cp_le_set_host_feature cp;
+ if (ll_ext_feature_capable(hdev) && hdev->commands[47] & BIT(4))
+ return hci_le_set_host_feature_v2_sync(hdev, bit, value);
+
+ if (bit > 255)
+ return 0;
+
memset(&cp, 0, sizeof(cp));
/* Connected Isochronous Channels (Host Support) */