Received: by 2002:a05:6a10:eb17:0:0:0:0 with SMTP id hx23csp439145pxb; Fri, 3 Sep 2021 05:46:11 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxDJ3mDXzEhhYk6NB1oa1xGsy6YbnLiJrRuxh7GtNwnQgmv+xdCN+/n7MT0Py7nsvVa868j X-Received: by 2002:aa7:d648:: with SMTP id v8mr3863432edr.340.1630673171320; Fri, 03 Sep 2021 05:46:11 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1630673171; cv=none; d=google.com; s=arc-20160816; b=A7z63xUzov2JJopZKmDSMzAnjQO2uMrGSTQF6FuiIrJRtp4FUPSCC6Z7Qzphz3u04I KXJysdIjT50o6Lka8ocrczu41NvTxRNFPapjXJ7mv63spaOS4j2FtZe0FsYFpmbOOQ8j VEyZ2/bOH47BJIxeZhHTXyzCnKn+4i/ZETHyc0tlkuRf3W04J2wWinE7NBxswwXH6IL3 IxCApLiFb5dYlgRCVqMoI6Sp6XimuJbqcck//A1rXjfgBOVQb3Qu+hRQGIhA/Y1mB+ah LfQRPpmj4wuF12y1yA8p4TpkPV5ekjsFNVv/Gi5C7iDkgJGVyzMKi2vzcj5OOS3yXIGk lXHA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:references:in-reply-to:message-id:date:subject :cc:to:from; bh=6R/7Pvs/zvfS+VBMJ9Mjxisxa1Y3BL09Ly0g3LXJ1r8=; b=p+KyC9d8BPxqJhWP2CQbeneKnrfEWb2pbY9Zo9gVGVYuSaPtUH1U54iUKfswgXkpVh zpjMxLubJZ0iJ1bbx5plC56uhXx+i7IlUyBHHQsUVZsEBJerdvuKPeDIkO7Na1wShvrz OBSItBquAyJCiScqW1P/xjzxw5nwefrWKvEi7ywNdqmJ8dk3zoXpx4YmBLuIkstGkCgk M5B9I0NJ90fTPJgGS9r3csuVQbQ+tqxwClrJ9mLIeQUGYbc+Vaxo5gkVImf9i5CsnIRi e2lbIquhegNUG4ImGvMgaEGZX65vkmTH8j5zcMfmFLZ2yhnQkL88dvcBtGv+QQ4/aOUl a7Xg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-bluetooth-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-bluetooth-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id z3si5030893ejc.215.2021.09.03.05.45.29; Fri, 03 Sep 2021 05:46:11 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-bluetooth-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-bluetooth-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-bluetooth-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1349196AbhICKyL (ORCPT + 99 others); Fri, 3 Sep 2021 06:54:11 -0400 Received: from mga02.intel.com ([134.134.136.20]:35135 "EHLO mga02.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1349178AbhICKyL (ORCPT ); Fri, 3 Sep 2021 06:54:11 -0400 X-IronPort-AV: E=McAfee;i="6200,9189,10095"; a="206611731" X-IronPort-AV: E=Sophos;i="5.85,265,1624345200"; d="scan'208";a="206611731" Received: from fmsmga005.fm.intel.com ([10.253.24.32]) by orsmga101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 03 Sep 2021 03:53:11 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.85,265,1624345200"; d="scan'208";a="692090409" Received: from intel-lenovo-legion-y540-15irh-pg0.iind.intel.com ([10.224.186.95]) by fmsmga005.fm.intel.com with ESMTP; 03 Sep 2021 03:53:09 -0700 From: Kiran K To: linux-bluetooth@vger.kernel.org Cc: ravishankar.srivatsa@intel.com, chethan.tumkur.narayan@intel.com, tedd.an@intel.com, luiz.von.dentz@intel.com, Kiran K Subject: [PATCH v14 06/12] Bluetooth: Allow setting of codec for HFP offload use case Date: Fri, 3 Sep 2021 16:28:07 +0530 Message-Id: <20210903105813.2440-6-kiran.k@intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20210903105813.2440-1-kiran.k@intel.com> References: <20210903105813.2440-1-kiran.k@intel.com> Precedence: bulk List-ID: X-Mailing-List: linux-bluetooth@vger.kernel.org This patch allows user space to set the codec that needs to be used for HFP offload use case. The codec details are cached and the controller is configured before opening the SCO connection. Signed-off-by: Kiran K Reviewed-by: Chethan T N Reviewed-by: Srivatsa Ravishankar --- Notes: * changes in v14: - No changes * changes in v13: - Only cache the codec to be set in setsockopt. Use these values later when opening SCO connection * changes in v12: - check for mgmt flag before setting codec for offload use case * changes in v11: - Remove changes related to Kconfig * changes in v10: - patch refactor - having callback definition and usage in the same patch include/net/bluetooth/bluetooth.h | 2 ++ net/bluetooth/sco.c | 60 +++++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+) diff --git a/include/net/bluetooth/bluetooth.h b/include/net/bluetooth/bluetooth.h index 64cddff0c9c4..1a48b6732eef 100644 --- a/include/net/bluetooth/bluetooth.h +++ b/include/net/bluetooth/bluetooth.h @@ -173,6 +173,8 @@ struct bt_codecs { struct bt_codec codecs[]; } __packed; +#define CODING_FORMAT_CVSD 0x02 + __printf(1, 2) void bt_info(const char *fmt, ...); __printf(1, 2) diff --git a/net/bluetooth/sco.c b/net/bluetooth/sco.c index 7e081761a1cd..727b766488db 100644 --- a/net/bluetooth/sco.c +++ b/net/bluetooth/sco.c @@ -69,6 +69,7 @@ struct sco_pinfo { __u32 flags; __u16 setting; __u8 cmsg_mask; + struct bt_codec codec; struct sco_conn *conn; }; @@ -441,6 +442,7 @@ static void __sco_sock_close(struct sock *sk) sock_set_flag(sk, SOCK_ZAPPED); break; } + } /* Must be called on unlocked socket. */ @@ -501,6 +503,10 @@ static struct sock *sco_sock_alloc(struct net *net, struct socket *sock, sk->sk_state = BT_OPEN; sco_pi(sk)->setting = BT_VOICE_CVSD_16BIT; + sco_pi(sk)->codec.id = CODING_FORMAT_CVSD; + sco_pi(sk)->codec.cid = 0xffff; + sco_pi(sk)->codec.vid = 0xffff; + sco_pi(sk)->codec.data_path = 0x00; bt_sock_link(&sco_sk_list, sk); return sk; @@ -833,6 +839,9 @@ static int sco_sock_setsockopt(struct socket *sock, int level, int optname, int len, err = 0; struct bt_voice voice; u32 opt; + struct bt_codecs *codecs; + struct hci_dev *hdev; + __u8 buffer[255]; BT_DBG("sk %p", sk); @@ -894,6 +903,57 @@ static int sco_sock_setsockopt(struct socket *sock, int level, int optname, sco_pi(sk)->cmsg_mask &= SCO_CMSG_PKT_STATUS; break; + case BT_CODEC: + if (sk->sk_state != BT_OPEN && sk->sk_state != BT_BOUND && + sk->sk_state != BT_CONNECT2) { + err = -EINVAL; + break; + } + + hdev = hci_get_route(&sco_pi(sk)->dst, &sco_pi(sk)->src, + BDADDR_BREDR); + if (!hdev) { + err = -EBADFD; + break; + } + + if (!hci_dev_test_flag(hdev, HCI_OFFLOAD_CODECS_ENABLED)) { + hci_dev_put(hdev); + err = -EOPNOTSUPP; + break; + } + + if (!hdev->get_data_path_id) { + hci_dev_put(hdev); + err = -EOPNOTSUPP; + break; + } + + if (optlen < sizeof(struct bt_codecs) || + optlen > sizeof(buffer)) { + hci_dev_put(hdev); + err = -EINVAL; + break; + } + + if (copy_from_sockptr(buffer, optval, optlen)) { + hci_dev_put(hdev); + err = -EFAULT; + break; + } + + codecs = (void *)buffer; + + if (codecs->num_codecs > 1) { + hci_dev_put(hdev); + err = -EINVAL; + break; + } + + sco_pi(sk)->codec = codecs->codecs[0]; + hci_dev_put(hdev); + break; + default: err = -ENOPROTOOPT; break; -- 2.17.1