From patchwork Mon Nov 15 06:49:03 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "K, Kiran" X-Patchwork-Id: 518257 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 7E308C433FE for ; Mon, 15 Nov 2021 06:43:48 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 5EE186321A for ; Mon, 15 Nov 2021 06:43:48 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229965AbhKOGql (ORCPT ); Mon, 15 Nov 2021 01:46:41 -0500 Received: from mga02.intel.com ([134.134.136.20]:7178 "EHLO mga02.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229712AbhKOGqh (ORCPT ); Mon, 15 Nov 2021 01:46:37 -0500 X-IronPort-AV: E=McAfee;i="6200,9189,10168"; a="220598220" X-IronPort-AV: E=Sophos;i="5.87,235,1631602800"; d="scan'208";a="220598220" Received: from orsmga003.jf.intel.com ([10.7.209.27]) by orsmga101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 14 Nov 2021 22:43:42 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.87,235,1631602800"; d="scan'208";a="453725945" Received: from intel-lenovo-legion-y540-15irh-pg0.iind.intel.com ([10.224.186.95]) by orsmga003.jf.intel.com with ESMTP; 14 Nov 2021 22:43:40 -0800 From: Kiran K To: linux-bluetooth@vger.kernel.org Cc: ravishankar.srivatsa@intel.com, chethan.tumkur.narayan@intel.com, luiz.von.dentz@intel.com, Kiran K Subject: [PATCH v3 02/13] Bluetooth: Support reading of codecs supported over l2cap socket Date: Mon, 15 Nov 2021 12:19:03 +0530 Message-Id: <20211115064914.2345-2-kiran.k@intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20211115064914.2345-1-kiran.k@intel.com> References: <20211115064914.2345-1-kiran.k@intel.com> Precedence: bulk List-ID: X-Mailing-List: linux-bluetooth@vger.kernel.org Codecs supported for A2DP offload use case are returned over l2cap socket. Add BT_CODEC option to getsockopt to return the codecs. Signed-off-by: Kiran K Reviewed-by: Chethan T N Reviewed-by: Srivatsa Ravishankar --- include/net/bluetooth/hci.h | 1 + net/bluetooth/l2cap_sock.c | 14 ++++++++++++++ 2 files changed, 15 insertions(+) diff --git a/include/net/bluetooth/hci.h b/include/net/bluetooth/hci.h index 63065bc01b76..451d491f7f68 100644 --- a/include/net/bluetooth/hci.h +++ b/include/net/bluetooth/hci.h @@ -2666,6 +2666,7 @@ static inline struct hci_sco_hdr *hci_sco_hdr(const struct sk_buff *skb) #define hci_iso_data_flags(h) ((h) >> 14) /* codec transport types */ +#define HCI_TRANSPORT_ACL 0x00 #define HCI_TRANSPORT_SCO_ESCO 0x01 /* le24 support */ diff --git a/net/bluetooth/l2cap_sock.c b/net/bluetooth/l2cap_sock.c index 4574c5cb1b59..a883acf33e3c 100644 --- a/net/bluetooth/l2cap_sock.c +++ b/net/bluetooth/l2cap_sock.c @@ -36,6 +36,7 @@ #include #include "smp.h" +#include "hci_codec.h" static struct bt_sock_list l2cap_sk_list = { .lock = __RW_LOCK_UNLOCKED(l2cap_sk_list.lock) @@ -568,6 +569,7 @@ static int l2cap_sock_getsockopt(struct socket *sock, int level, int optname, struct bt_power pwr; u32 phys; int len, mode, err = 0; + struct hci_dev *hdev; BT_DBG("sk %p", sk); @@ -704,6 +706,18 @@ static int l2cap_sock_getsockopt(struct socket *sock, int level, int optname, err = -EFAULT; break; + case BT_CODEC: + hdev = hci_get_route(BDADDR_ANY, &chan->src, BDADDR_BREDR); + if (!hdev) { + err = -EBADFD; + break; + } + + err = hci_get_supported_codecs(hdev, HCI_TRANSPORT_ACL, optval, + optlen, len); + hci_dev_put(hdev); + break; + default: err = -ENOPROTOOPT; break; From patchwork Mon Nov 15 06:49:05 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "K, Kiran" X-Patchwork-Id: 518256 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 332F5C433EF for ; Mon, 15 Nov 2021 06:43:51 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 1DC6160F5B for ; Mon, 15 Nov 2021 06:43:51 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230028AbhKOGqn (ORCPT ); Mon, 15 Nov 2021 01:46:43 -0500 Received: from mga02.intel.com ([134.134.136.20]:7180 "EHLO mga02.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229941AbhKOGql (ORCPT ); Mon, 15 Nov 2021 01:46:41 -0500 X-IronPort-AV: E=McAfee;i="6200,9189,10168"; a="220598222" X-IronPort-AV: E=Sophos;i="5.87,235,1631602800"; d="scan'208";a="220598222" Received: from orsmga003.jf.intel.com ([10.7.209.27]) by orsmga101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 14 Nov 2021 22:43:46 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.87,235,1631602800"; d="scan'208";a="453725958" Received: from intel-lenovo-legion-y540-15irh-pg0.iind.intel.com ([10.224.186.95]) by orsmga003.jf.intel.com with ESMTP; 14 Nov 2021 22:43:44 -0800 From: Kiran K To: linux-bluetooth@vger.kernel.org Cc: ravishankar.srivatsa@intel.com, chethan.tumkur.narayan@intel.com, luiz.von.dentz@intel.com, Kiran K Subject: [PATCH v3 04/13] Bluetooth: Pass transport type in get_data_path_id Date: Mon, 15 Nov 2021 12:19:05 +0530 Message-Id: <20211115064914.2345-4-kiran.k@intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20211115064914.2345-1-kiran.k@intel.com> References: <20211115064914.2345-1-kiran.k@intel.com> Precedence: bulk List-ID: X-Mailing-List: linux-bluetooth@vger.kernel.org To support fetching of data path id for other transport types like a2dp, le audio, pass an additional parameter to get_data_path_id callback function. Signed-off-by: Kiran K Reviewed-by: Chethan T N Reviewed-by: Srivatsa Ravishankar --- drivers/bluetooth/btintel.c | 19 +++++++++++++++---- drivers/bluetooth/hci_vhci.c | 6 +++++- include/net/bluetooth/hci_core.h | 3 ++- net/bluetooth/hci_codec.c | 9 ++++++--- net/bluetooth/hci_conn.c | 3 ++- net/bluetooth/hci_request.c | 5 +++-- net/bluetooth/hci_request.h | 3 ++- 7 files changed, 35 insertions(+), 13 deletions(-) diff --git a/drivers/bluetooth/btintel.c b/drivers/bluetooth/btintel.c index c8c5c7007094..4b6d7ea08425 100644 --- a/drivers/bluetooth/btintel.c +++ b/drivers/bluetooth/btintel.c @@ -2209,11 +2209,22 @@ static int btintel_get_codec_config_data(struct hci_dev *hdev, return err; } -static int btintel_get_data_path_id(struct hci_dev *hdev, __u8 *data_path_id) +static int btintel_get_data_path_id(struct hci_dev *hdev, __u8 transport, + __u8 *data_path_id) { - /* Intel uses 1 as data path id for all the usecases */ - *data_path_id = 1; - return 0; + struct btintel_data *intel_data; + + if (transport != HCI_TRANSPORT_SCO_ESCO) + return -EINVAL; + + intel_data = hci_get_priv((hdev)); + + if (intel_data->use_cases.preset[0] & 0x03) { + /* Intel uses 1 as data path id for all the usecases */ + *data_path_id = 1; + return 0; + } + return -EOPNOTSUPP; } static int btintel_configure_offload(struct hci_dev *hdev) diff --git a/drivers/bluetooth/hci_vhci.c b/drivers/bluetooth/hci_vhci.c index 49ac884d996e..57f4d016fa89 100644 --- a/drivers/bluetooth/hci_vhci.c +++ b/drivers/bluetooth/hci_vhci.c @@ -80,8 +80,12 @@ static int vhci_send_frame(struct hci_dev *hdev, struct sk_buff *skb) return 0; } -static int vhci_get_data_path_id(struct hci_dev *hdev, u8 *data_path_id) +static int vhci_get_data_path_id(struct hci_dev *hdev, u8 transport, + u8 *data_path_id) { + if (transport != HCI_TRANSPORT_SCO_ESCO) + return -EINVAL; + *data_path_id = 0; return 0; } diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h index b5f061882c10..6304f8146834 100644 --- a/include/net/bluetooth/hci_core.h +++ b/include/net/bluetooth/hci_core.h @@ -620,7 +620,8 @@ struct hci_dev { void (*cmd_timeout)(struct hci_dev *hdev); bool (*wakeup)(struct hci_dev *hdev); int (*set_quality_report)(struct hci_dev *hdev, bool enable); - int (*get_data_path_id)(struct hci_dev *hdev, __u8 *data_path); + int (*get_data_path_id)(struct hci_dev *hdev, __u8 transport, + __u8 *data_path); int (*get_codec_config_data)(struct hci_dev *hdev, __u8 type, struct bt_codec *codec, __u8 *vnd_len, __u8 **vnd_data); diff --git a/net/bluetooth/hci_codec.c b/net/bluetooth/hci_codec.c index f4d8d3a253d8..6d4e5353f05c 100644 --- a/net/bluetooth/hci_codec.c +++ b/net/bluetooth/hci_codec.c @@ -259,6 +259,7 @@ int hci_get_supported_codecs(struct hci_dev *hdev, u8 type, char __user *optval, struct bt_codec codec; u8 num_codecs = 0, i, __user *ptr; struct codec_list *c; + u8 data_path; if (!hci_dev_test_flag(hdev, HCI_OFFLOAD_CODECS_ENABLED)) { err = -EOPNOTSUPP; @@ -270,6 +271,10 @@ int hci_get_supported_codecs(struct hci_dev *hdev, u8 type, char __user *optval, goto error; } + err = hdev->get_data_path_id(hdev, type, &data_path); + if (err < 0) + goto error; + /* find total buffer size required to copy codec + capabilities */ hci_dev_lock(hdev); list_for_each_entry(c, &hdev->local_codecs, list) { @@ -306,9 +311,7 @@ int hci_get_supported_codecs(struct hci_dev *hdev, u8 type, char __user *optval, codec.id = c->id; codec.cid = c->cid; codec.vid = c->vid; - err = hdev->get_data_path_id(hdev, &codec.data_path); - if (err < 0) - break; + codec.data_path = data_path; codec.num_caps = c->num_caps; if (copy_to_user(ptr, &codec, sizeof(codec))) { err = -EFAULT; diff --git a/net/bluetooth/hci_conn.c b/net/bluetooth/hci_conn.c index cd6e1cf7e396..ce87692272b5 100644 --- a/net/bluetooth/hci_conn.c +++ b/net/bluetooth/hci_conn.c @@ -317,7 +317,8 @@ static bool hci_enhanced_setup_sync_conn(struct hci_conn *conn, __u16 handle) /* for offload use case, codec needs to configured before opening SCO */ if (conn->codec.data_path) - hci_req_configure_datapath(hdev, &conn->codec); + hci_req_configure_datapath(hdev, HCI_TRANSPORT_SCO_ESCO, + &conn->codec); conn->state = BT_CONNECT; conn->out = true; diff --git a/net/bluetooth/hci_request.c b/net/bluetooth/hci_request.c index 8aa6e1840c9a..12e68d67b9d9 100644 --- a/net/bluetooth/hci_request.c +++ b/net/bluetooth/hci_request.c @@ -2636,7 +2636,8 @@ static void config_data_path_complete(struct hci_dev *hdev, u8 status, bt_dev_dbg(hdev, "status %u", status); } -int hci_req_configure_datapath(struct hci_dev *hdev, struct bt_codec *codec) +int hci_req_configure_datapath(struct hci_dev *hdev, u8 transport, + struct bt_codec *codec) { struct hci_request req; int err; @@ -2656,7 +2657,7 @@ int hci_req_configure_datapath(struct hci_dev *hdev, struct bt_codec *codec) goto error; } - err = hdev->get_data_path_id(hdev, &cmd->data_path_id); + err = hdev->get_data_path_id(hdev, transport, &cmd->data_path_id); if (err < 0) goto error; diff --git a/net/bluetooth/hci_request.h b/net/bluetooth/hci_request.h index ba75c2da70f4..e6345d69898d 100644 --- a/net/bluetooth/hci_request.h +++ b/net/bluetooth/hci_request.h @@ -111,7 +111,8 @@ void __hci_req_update_class(struct hci_request *req); /* Returns true if HCI commands were queued */ bool hci_req_stop_discovery(struct hci_request *req); -int hci_req_configure_datapath(struct hci_dev *hdev, struct bt_codec *codec); +int hci_req_configure_datapath(struct hci_dev *hdev, u8 transport, + struct bt_codec *codec); static inline void hci_req_update_scan(struct hci_dev *hdev) { From patchwork Mon Nov 15 06:49:07 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "K, Kiran" X-Patchwork-Id: 518253 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 252F8C433EF for ; Mon, 15 Nov 2021 06:44:24 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 0698D61BFA for ; Mon, 15 Nov 2021 06:44:24 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230018AbhKOGrQ (ORCPT ); Mon, 15 Nov 2021 01:47:16 -0500 Received: from mga02.intel.com ([134.134.136.20]:7188 "EHLO mga02.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230135AbhKOGqs (ORCPT ); Mon, 15 Nov 2021 01:46:48 -0500 X-IronPort-AV: E=McAfee;i="6200,9189,10168"; a="220598231" X-IronPort-AV: E=Sophos;i="5.87,235,1631602800"; d="scan'208";a="220598231" Received: from orsmga003.jf.intel.com ([10.7.209.27]) by orsmga101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 14 Nov 2021 22:43:50 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.87,235,1631602800"; d="scan'208";a="453725969" Received: from intel-lenovo-legion-y540-15irh-pg0.iind.intel.com ([10.224.186.95]) by orsmga003.jf.intel.com with ESMTP; 14 Nov 2021 22:43:48 -0800 From: Kiran K To: linux-bluetooth@vger.kernel.org Cc: ravishankar.srivatsa@intel.com, chethan.tumkur.narayan@intel.com, luiz.von.dentz@intel.com, Kiran K Subject: [PATCH v3 06/13] Bluetooth: Remove unused member in struct hci_vnd_codec_v2 Date: Mon, 15 Nov 2021 12:19:07 +0530 Message-Id: <20211115064914.2345-6-kiran.k@intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20211115064914.2345-1-kiran.k@intel.com> References: <20211115064914.2345-1-kiran.k@intel.com> Precedence: bulk List-ID: X-Mailing-List: linux-bluetooth@vger.kernel.org Remove unused "u8 id" member in struct hci_vnd_codec_v2. Vendor codec is identifiable by Company Id and Vendor Id fields. Signed-off-by: Kiran K Reviewed-by: Chethan T N Reviewed-by: Srivatsa Ravishankar --- include/net/bluetooth/hci.h | 1 - 1 file changed, 1 deletion(-) diff --git a/include/net/bluetooth/hci.h b/include/net/bluetooth/hci.h index 451d491f7f68..7ea1bfce204f 100644 --- a/include/net/bluetooth/hci.h +++ b/include/net/bluetooth/hci.h @@ -1393,7 +1393,6 @@ struct hci_std_codecs_v2 { } __packed; struct hci_vnd_codec_v2 { - __u8 id; __le16 cid; __le16 vid; __u8 transport; From patchwork Mon Nov 15 06:49:08 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "K, Kiran" X-Patchwork-Id: 518255 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id B88EFC433F5 for ; Mon, 15 Nov 2021 06:44:10 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id A0AB663218 for ; Mon, 15 Nov 2021 06:44:10 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230445AbhKOGq4 (ORCPT ); Mon, 15 Nov 2021 01:46:56 -0500 Received: from mga02.intel.com ([134.134.136.20]:7180 "EHLO mga02.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230336AbhKOGqt (ORCPT ); Mon, 15 Nov 2021 01:46:49 -0500 X-IronPort-AV: E=McAfee;i="6200,9189,10168"; a="220598238" X-IronPort-AV: E=Sophos;i="5.87,235,1631602800"; d="scan'208";a="220598238" Received: from orsmga003.jf.intel.com ([10.7.209.27]) by orsmga101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 14 Nov 2021 22:43:52 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.87,235,1631602800"; d="scan'208";a="453725972" Received: from intel-lenovo-legion-y540-15irh-pg0.iind.intel.com ([10.224.186.95]) by orsmga003.jf.intel.com with ESMTP; 14 Nov 2021 22:43:50 -0800 From: Kiran K To: linux-bluetooth@vger.kernel.org Cc: ravishankar.srivatsa@intel.com, chethan.tumkur.narayan@intel.com, luiz.von.dentz@intel.com, Kiran K Subject: [PATCH v3 07/13] Bluetooth: Read Output codec capabilities Date: Mon, 15 Nov 2021 12:19:08 +0530 Message-Id: <20211115064914.2345-7-kiran.k@intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20211115064914.2345-1-kiran.k@intel.com> References: <20211115064914.2345-1-kiran.k@intel.com> Precedence: bulk List-ID: X-Mailing-List: linux-bluetooth@vger.kernel.org When reading codec capabilities, read output (controller to host) capabilities also along with input (host to controller) capabilities. Signed-off-by: Kiran K Reviewed-by: Chethan T N Reviewed-by: Srivatsa Ravishankar --- net/bluetooth/hci_codec.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/net/bluetooth/hci_codec.c b/net/bluetooth/hci_codec.c index 6d4e5353f05c..c6bd934dcf36 100644 --- a/net/bluetooth/hci_codec.c +++ b/net/bluetooth/hci_codec.c @@ -159,6 +159,9 @@ void hci_read_supported_codecs(struct hci_dev *hdev) caps.id = std_codecs->codec[i]; caps.direction = 0x00; hci_read_codec_capabilities(hdev, LOCAL_CODEC_ACL_MASK, &caps); + + caps.direction = 0x01; + hci_read_codec_capabilities(hdev, LOCAL_CODEC_ACL_MASK, &caps); } skb_pull(skb, flex_array_size(std_codecs, codec, std_codecs->num) @@ -179,6 +182,9 @@ void hci_read_supported_codecs(struct hci_dev *hdev) caps.vid = vnd_codecs->codec[i].vid; caps.direction = 0x00; hci_read_codec_capabilities(hdev, LOCAL_CODEC_ACL_MASK, &caps); + + caps.direction = 0x01; + hci_read_codec_capabilities(hdev, LOCAL_CODEC_ACL_MASK, &caps); } error: @@ -224,6 +230,10 @@ void hci_read_supported_codecs_v2(struct hci_dev *hdev) for (i = 0; i < std_codecs->num; i++) { caps.id = std_codecs->codec[i].id; + caps.direction = 0x00; + hci_read_codec_capabilities(hdev, std_codecs->codec[i].transport, + &caps); + caps.direction = 0x01; hci_read_codec_capabilities(hdev, std_codecs->codec[i].transport, &caps); } @@ -243,6 +253,10 @@ void hci_read_supported_codecs_v2(struct hci_dev *hdev) caps.id = 0xFF; caps.cid = vnd_codecs->codec[i].cid; caps.vid = vnd_codecs->codec[i].vid; + caps.direction = 0x00; + hci_read_codec_capabilities(hdev, vnd_codecs->codec[i].transport, + &caps); + caps.direction = 0x01; hci_read_codec_capabilities(hdev, vnd_codecs->codec[i].transport, &caps); } From patchwork Mon Nov 15 06:49:09 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "K, Kiran" X-Patchwork-Id: 518254 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 4BCFBC433F5 for ; Mon, 15 Nov 2021 06:44:19 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 36AC160F5B for ; Mon, 15 Nov 2021 06:44:19 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230039AbhKOGrL (ORCPT ); Mon, 15 Nov 2021 01:47:11 -0500 Received: from mga02.intel.com ([134.134.136.20]:7188 "EHLO mga02.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230075AbhKOGqu (ORCPT ); Mon, 15 Nov 2021 01:46:50 -0500 X-IronPort-AV: E=McAfee;i="6200,9189,10168"; a="220598242" X-IronPort-AV: E=Sophos;i="5.87,235,1631602800"; d="scan'208";a="220598242" Received: from orsmga003.jf.intel.com ([10.7.209.27]) by orsmga101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 14 Nov 2021 22:43:54 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.87,235,1631602800"; d="scan'208";a="453725986" Received: from intel-lenovo-legion-y540-15irh-pg0.iind.intel.com ([10.224.186.95]) by orsmga003.jf.intel.com with ESMTP; 14 Nov 2021 22:43:52 -0800 From: Kiran K To: linux-bluetooth@vger.kernel.org Cc: ravishankar.srivatsa@intel.com, chethan.tumkur.narayan@intel.com, luiz.von.dentz@intel.com, Kiran K Subject: [PATCH v3 08/13] Bluetooth: Implement MSFT avdtp open command Date: Mon, 15 Nov 2021 12:19:09 +0530 Message-Id: <20211115064914.2345-8-kiran.k@intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20211115064914.2345-1-kiran.k@intel.com> References: <20211115064914.2345-1-kiran.k@intel.com> Precedence: bulk List-ID: X-Mailing-List: linux-bluetooth@vger.kernel.org In A2DP offload use case, controller needs to configured with selected codec capabilities, dcid of media transport channel and ACL connection handle. Controller responds with avdtp handle which needs to be sent in other avdtp commands like start, suspend and close. Signed-off-by: Kiran K Reviewed-by: Chethan T N Reviewed-by: Srivatsa Ravishankar --- include/net/bluetooth/bluetooth.h | 2 ++ include/net/bluetooth/hci.h | 16 ++++++++++++ net/bluetooth/hci_codec.c | 43 +++++++++++++++++++++++++++++++ net/bluetooth/hci_codec.h | 4 +++ net/bluetooth/l2cap_sock.c | 24 +++++++++++++++++ 5 files changed, 89 insertions(+) diff --git a/include/net/bluetooth/bluetooth.h b/include/net/bluetooth/bluetooth.h index 2f31e571f34c..5e07cfed941d 100644 --- a/include/net/bluetooth/bluetooth.h +++ b/include/net/bluetooth/bluetooth.h @@ -177,6 +177,8 @@ struct bt_codecs { #define BT_CODEC_TRANSPARENT 0x03 #define BT_CODEC_MSBC 0x05 +#define BT_MSFT_OPEN 20 + __printf(1, 2) void bt_info(const char *fmt, ...); __printf(1, 2) diff --git a/include/net/bluetooth/hci.h b/include/net/bluetooth/hci.h index 7ea1bfce204f..a7dad0125c10 100644 --- a/include/net/bluetooth/hci.h +++ b/include/net/bluetooth/hci.h @@ -2009,6 +2009,22 @@ struct hci_cp_le_reject_cis { __u8 reason; } __packed; +#define HCI_MSFT_AVDTP_CMD 0xfc1e + +#define HCI_MSFT_AVDTP_OPEN 0x08 +struct hci_media_service_caps { + __u8 category; + __u8 len; + __u8 data[0]; +} __packed; + +struct msft_cp_avdtp_open { + __u8 sub_opcode; + __le16 handle; + __le16 dcid; + __le16 omtu; +} __packed; + /* ---- HCI Events ---- */ #define HCI_EV_INQUIRY_COMPLETE 0x01 diff --git a/net/bluetooth/hci_codec.c b/net/bluetooth/hci_codec.c index c6bd934dcf36..e179f3bfb494 100644 --- a/net/bluetooth/hci_codec.c +++ b/net/bluetooth/hci_codec.c @@ -355,3 +355,46 @@ int hci_get_supported_codecs(struct hci_dev *hdev, u8 type, char __user *optval, error: return err; } + +int hci_configure_msft_avdtp_open(struct hci_dev *hdev, struct l2cap_chan *chan, + sockptr_t optval, int optlen) +{ + struct msft_cp_avdtp_open *cmd = NULL; + struct hci_media_service_caps *caps; + int err; + + if (!optlen || optlen < sizeof(*caps)) { + err = -EINVAL; + goto fail; + } + + cmd = kzalloc(sizeof(*cmd) + optlen, GFP_KERNEL); + if (!cmd) { + err = -ENOMEM; + goto fail; + } + + cmd->sub_opcode = HCI_MSFT_AVDTP_OPEN; + cmd->handle = __cpu_to_le16(chan->conn->hcon->handle); + cmd->dcid = cpu_to_le16(chan->dcid); + cmd->omtu = cpu_to_le16(chan->omtu); + caps = (void *)(cmd + 1); + + if (copy_from_sockptr(caps, optval, optlen)) { + err = -EFAULT; + goto fail; + } + + if (caps->category != 0x07) { + err = -EINVAL; + goto fail; + } + + hci_send_cmd(hdev, HCI_MSFT_AVDTP_CMD, sizeof(*cmd) + optlen, cmd); + + /* wait until we get avdtp handle or timeout */ + +fail: + kfree(cmd); + return err; +} diff --git a/net/bluetooth/hci_codec.h b/net/bluetooth/hci_codec.h index 6e849c7d75b9..123b46a6a8ce 100644 --- a/net/bluetooth/hci_codec.h +++ b/net/bluetooth/hci_codec.h @@ -2,8 +2,12 @@ /* Copyright (C) 2014 Intel Corporation */ +#include + void hci_read_supported_codecs(struct hci_dev *hdev); void hci_read_supported_codecs_v2(struct hci_dev *hdev); void hci_codec_list_clear(struct list_head *codec_list); int hci_get_supported_codecs(struct hci_dev *hdev, u8 type, char __user *optval, int __user *optlen, int len); +int hci_configure_msft_avdtp_open(struct hci_dev *hdev, struct l2cap_chan *chan, + sockptr_t optval, int optlen); diff --git a/net/bluetooth/l2cap_sock.c b/net/bluetooth/l2cap_sock.c index a883acf33e3c..fa689e576576 100644 --- a/net/bluetooth/l2cap_sock.c +++ b/net/bluetooth/l2cap_sock.c @@ -909,6 +909,7 @@ static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname, struct l2cap_conn *conn; int len, err = 0; u32 opt; + struct hci_dev *hdev; BT_DBG("sk %p", sk); @@ -1137,6 +1138,29 @@ static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname, break; + case BT_MSFT_OPEN: + if (sk->sk_state != BT_CONNECTED) { + err = -ENOTCONN; + break; + } + + hdev = hci_get_route(BDADDR_ANY, &chan->src, BDADDR_BREDR); + if (!hdev) { + err = -EBADFD; + break; + } + + if (!hci_dev_test_flag(hdev, HCI_OFFLOAD_CODECS_ENABLED) || + !hdev->get_data_path_id) { + err = -EOPNOTSUPP; + hci_dev_put(hdev); + break; + } + + err = hci_configure_msft_avdtp_open(hdev, chan, optval, optlen); + hci_dev_put(hdev); + break; + default: err = -ENOPROTOOPT; break; From patchwork Mon Nov 15 06:49:14 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "K, Kiran" X-Patchwork-Id: 518252 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 2DA7FC433EF for ; Mon, 15 Nov 2021 06:44:29 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 1648360F5B for ; Mon, 15 Nov 2021 06:44:29 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231137AbhKOGrV (ORCPT ); Mon, 15 Nov 2021 01:47:21 -0500 Received: from mga02.intel.com ([134.134.136.20]:7199 "EHLO mga02.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229791AbhKOGrB (ORCPT ); Mon, 15 Nov 2021 01:47:01 -0500 X-IronPort-AV: E=McAfee;i="6200,9189,10168"; a="220598261" X-IronPort-AV: E=Sophos;i="5.87,235,1631602800"; d="scan'208";a="220598261" Received: from orsmga003.jf.intel.com ([10.7.209.27]) by orsmga101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 14 Nov 2021 22:44:05 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.87,235,1631602800"; d="scan'208";a="453726014" Received: from intel-lenovo-legion-y540-15irh-pg0.iind.intel.com ([10.224.186.95]) by orsmga003.jf.intel.com with ESMTP; 14 Nov 2021 22:44:03 -0800 From: Kiran K To: linux-bluetooth@vger.kernel.org Cc: ravishankar.srivatsa@intel.com, chethan.tumkur.narayan@intel.com, luiz.von.dentz@intel.com, Kiran K Subject: [PATCH v3 13/13] Bluetooth: Implment MSFT avdtp close command Date: Mon, 15 Nov 2021 12:19:14 +0530 Message-Id: <20211115064914.2345-13-kiran.k@intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20211115064914.2345-1-kiran.k@intel.com> References: <20211115064914.2345-1-kiran.k@intel.com> Precedence: bulk List-ID: X-Mailing-List: linux-bluetooth@vger.kernel.org In a2dp offload use case, to tear down streaming, controller needs to sent MSFT avdtp close command. Allow BlueZ daemon to send MSFT avdtp close command via setsockopt. Signed-off-by: Kiran K Reviewed-by: Chethan T N Reviewed-by: Srivatsa Ravishankar --- include/net/bluetooth/bluetooth.h | 1 + include/net/bluetooth/hci.h | 6 ++++++ net/bluetooth/hci_codec.c | 15 +++++++++++++++ net/bluetooth/hci_codec.h | 1 + net/bluetooth/hci_event.c | 1 + net/bluetooth/l2cap_sock.c | 18 ++++++++++++++++++ 6 files changed, 42 insertions(+) diff --git a/include/net/bluetooth/bluetooth.h b/include/net/bluetooth/bluetooth.h index 149b9958f304..a40ba8239189 100644 --- a/include/net/bluetooth/bluetooth.h +++ b/include/net/bluetooth/bluetooth.h @@ -180,6 +180,7 @@ struct bt_codecs { #define BT_MSFT_OPEN 20 #define BT_MSFT_START 21 #define BT_MSFT_SUSPEND 22 +#define BT_MSFT_CLOSE 23 __printf(1, 2) void bt_info(const char *fmt, ...); diff --git a/include/net/bluetooth/hci.h b/include/net/bluetooth/hci.h index 70b9796a8493..35951ba5d8d3 100644 --- a/include/net/bluetooth/hci.h +++ b/include/net/bluetooth/hci.h @@ -2045,6 +2045,12 @@ struct msft_cp_avdtp_suspend { __le16 avdtp_handle; } __packed; +#define HCI_MSFT_AVDTP_CLOSE 0x0B +struct msft_cp_avdtp_close { + u8 sub_opcode; + __le16 avdtp_handle; +} __packed; + /* ---- HCI Events ---- */ #define HCI_EV_INQUIRY_COMPLETE 0x01 diff --git a/net/bluetooth/hci_codec.c b/net/bluetooth/hci_codec.c index b50dc20ca034..8a00cf6b7d2f 100644 --- a/net/bluetooth/hci_codec.c +++ b/net/bluetooth/hci_codec.c @@ -426,3 +426,18 @@ int hci_configure_msft_avdtp_suspend(struct hci_dev *hdev, struct sock *sk) return hci_send_cmd(hdev, HCI_MSFT_AVDTP_CMD, sizeof(cmd), &cmd); } + +int hci_configure_msft_avdtp_close(struct hci_dev *hdev, struct sock *sk) +{ + struct msft_cp_avdtp_close cmd; + + if (!bt_sk(sk)->avdtp_handle) + return -EBADFD; + + cmd.sub_opcode = HCI_MSFT_AVDTP_CLOSE; + cmd.avdtp_handle = cpu_to_le16(bt_sk(sk)->avdtp_handle); + + bt_sk(sk)->avdtp_handle = 0; + + return hci_send_cmd(hdev, HCI_MSFT_AVDTP_CMD, sizeof(cmd), &cmd); +} diff --git a/net/bluetooth/hci_codec.h b/net/bluetooth/hci_codec.h index d6dcd1a83059..933cd1df68f9 100644 --- a/net/bluetooth/hci_codec.h +++ b/net/bluetooth/hci_codec.h @@ -13,3 +13,4 @@ int hci_configure_msft_avdtp_open(struct hci_dev *hdev, struct l2cap_chan *chan, sockptr_t optval, int optlen, struct sock *sk); int hci_configure_msft_avdtp_start(struct hci_dev *hdev, struct sock *sk); int hci_configure_msft_avdtp_suspend(struct hci_dev *hdev, struct sock *sk); +int hci_configure_msft_avdtp_close(struct hci_dev *hdev, struct sock *sk); diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c index ac35b0f6a203..0b267a97eb23 100644 --- a/net/bluetooth/hci_event.c +++ b/net/bluetooth/hci_event.c @@ -1494,6 +1494,7 @@ static void hci_cc_msft_avdtp_cmd(struct hci_dev *hdev, struct sk_buff *skb) case HCI_MSFT_AVDTP_START: case HCI_MSFT_AVDTP_SUSPEND: + case HCI_MSFT_AVDTP_CLOSE: break; default: diff --git a/net/bluetooth/l2cap_sock.c b/net/bluetooth/l2cap_sock.c index bd8061604880..1ef76f34907c 100644 --- a/net/bluetooth/l2cap_sock.c +++ b/net/bluetooth/l2cap_sock.c @@ -1198,6 +1198,24 @@ static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname, hci_dev_put(hdev); break; + case BT_MSFT_CLOSE: + hdev = hci_get_route(BDADDR_ANY, &chan->src, BDADDR_BREDR); + if (!hdev) { + err = -EBADFD; + break; + } + + if (!hci_dev_test_flag(hdev, HCI_OFFLOAD_CODECS_ENABLED) || + !hdev->get_data_path_id) { + err = -EOPNOTSUPP; + hci_dev_put(hdev); + break; + } + + err = hci_configure_msft_avdtp_close(hdev, sk); + hci_dev_put(hdev); + break; + default: err = -ENOPROTOOPT; break;