From patchwork Mon Nov 9 07:57:23 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Howard Chung X-Patchwork-Id: 321170 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-20.4 required=3.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH, MAILING_LIST_MULTI, SIGNED_OFF_BY, SPF_HELO_NONE, SPF_PASS, URIBL_BLOCKED, USER_AGENT_GIT, USER_IN_DEF_DKIM_WL autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 6729FC61DD8 for ; Mon, 9 Nov 2020 07:57:44 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 1C74F20853 for ; Mon, 9 Nov 2020 07:57:43 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="dCjzCsA1" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729756AbgKIH5m (ORCPT ); Mon, 9 Nov 2020 02:57:42 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58322 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729737AbgKIH5l (ORCPT ); Mon, 9 Nov 2020 02:57:41 -0500 Received: from mail-pl1-x649.google.com (mail-pl1-x649.google.com [IPv6:2607:f8b0:4864:20::649]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E8822C0613D4 for ; Sun, 8 Nov 2020 23:57:39 -0800 (PST) Received: by mail-pl1-x649.google.com with SMTP id l3so3600232ply.6 for ; Sun, 08 Nov 2020 23:57:39 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=sender:date:in-reply-to:message-id:mime-version:references:subject :from:to:cc; bh=fZu+i/Tey4YuHE3nmf4R/J6pPaT130pHwxhtyujUvT8=; b=dCjzCsA1NNS5/KnUDsa0Jo9Dx9F/NoCnQ4fUtHSJ3jy8SfMB2iffkzAlNmiBxpzv93 R8ZrvAVK+qwQRQUxZQRiK860r1KKiIKzQ+nptmBAeWZnER6ixDejzjWrxfsbWFpesO6q fB71JL3uHFwx0yIrjmqmv5VYlPmuW5aCek6SG27rcHvOFQV0j0WxgMXOrlUE+n1xTftI OHCOBgQEZVDC5lZb7tRT8yFBV/Gt3ZchznUFo3od037F1uwp66wZ75bXDf54oAqfj7yM N8xngeORkWvr2OYCBwvOLu+0y8745+A2Jt+u6PFMd1EFREprQq6wAtKOBt0tEHYPFgD+ +gVA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=fZu+i/Tey4YuHE3nmf4R/J6pPaT130pHwxhtyujUvT8=; b=EKQ5Pq5GVcbmH14a1wNiBeJnPbJa51dIn+3VZcatLouzNsodceiKgscaE9IDJwtaFB riJnML2rj1P2hQqFxYrTR2zH05PvxgdYjS0S6YqI7ADwN7DgRDztGn2peLPYRQEeDfN1 CVEr/goOsBUTSk51/d+wKux74r26QMsZEJA6Rm9QQw8t5MInOp5VNS3LTI5D3GxBuF5o D+NCu8CFRjGQDUeH6MrdSB2DN6UY6W6u+6ijIFLpiPqCo1AVGbGv6Q6B62JnECnsRtf0 HIshrCxAoQrywoURv7JbdfvDru2UrYU3dAWPysS7+TEpgEK6qjs7CnlUESheFkPFczpJ qYGQ== X-Gm-Message-State: AOAM530z9ONXMuOcF6H+FvamgBXiZzvrq/bRRqn1UXvBhqI3VcP+7VeY gmvGv2n2c3+gqVNxP//AoAH/MsNpTwaHvCCw7rIn0sFyygqC8fD+hYwDp7FO9tgd7AImncnE3D5 BaW6f6nYw+VJdyuSgHYOjC1cZPPmMNcrw6pLwX1Uh5KQ71n+43UbkwhICZyW0kw94dhoR1GCMJ1 h0AlkGlI2AEHA= X-Google-Smtp-Source: ABdhPJzvhFDG65ja4IDNja/+FMSLFMnHzO5O5WnBrF0c4Jy+9ZC4DC5CJtt2ggr4upsCUOF7GrFvI0b/S+/8uHHW3g== Sender: "howardchung via sendgmr" X-Received: from howardchung-p920.tpe.corp.google.com ([2401:fa00:1:10:f693:9fff:fef4:4e45]) (user=howardchung job=sendgmr) by 2002:a17:902:8e87:b029:d6:8dde:138b with SMTP id bg7-20020a1709028e87b02900d68dde138bmr11541206plb.83.1604908659272; Sun, 08 Nov 2020 23:57:39 -0800 (PST) Date: Mon, 9 Nov 2020 15:57:23 +0800 In-Reply-To: <20201109155659.v7.1.Ib75f58e90c477f9b82c5598f00c59f0e95a1a352@changeid> Message-Id: <20201109155659.v7.2.I3774a8f0d748c7c6ec3402c4adcead32810c9164@changeid> Mime-Version: 1.0 References: <20201109155659.v7.1.Ib75f58e90c477f9b82c5598f00c59f0e95a1a352@changeid> X-Mailer: git-send-email 2.29.2.222.g5d2a92d10f8-goog Subject: [PATCH v7 2/5] Bluetooth: Handle system suspend resume case From: Howard Chung To: linux-bluetooth@vger.kernel.org, marcel@holtmann.org, luiz.dentz@gmail.com Cc: mmandlik@chromium.org, alainm@chromium.org, mcchou@chromium.org, Howard Chung , Abhishek Pandit-Subedi , "David S. Miller" , Jakub Kicinski , Johan Hedberg , linux-kernel@vger.kernel.org, netdev@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-bluetooth@vger.kernel.org This patch adds code to handle the system suspension during interleave scan. The interleave scan will be canceled when the system is going to sleep, and will be restarted after waking up. Commit-changes 5: - Remove the change in hci_req_config_le_suspend_scan Signed-off-by: Howard Chung Reviewed-by: Alain Michaud Reviewed-by: Manish Mandlik Reviewed-by: Abhishek Pandit-Subedi Reviewed-by: Miao-chen Chou --- (no changes since v1) net/bluetooth/hci_request.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/net/bluetooth/hci_request.c b/net/bluetooth/hci_request.c index 70ea126f56282..b615b981be9d6 100644 --- a/net/bluetooth/hci_request.c +++ b/net/bluetooth/hci_request.c @@ -1284,8 +1284,10 @@ void hci_req_prepare_suspend(struct hci_dev *hdev, enum suspended_state next) hci_req_add(&req, HCI_OP_WRITE_SCAN_ENABLE, 1, &page_scan); /* Disable LE passive scan if enabled */ - if (hci_dev_test_flag(hdev, HCI_LE_SCAN)) + if (hci_dev_test_flag(hdev, HCI_LE_SCAN)) { + cancel_interleave_scan(hdev); hci_req_add_le_scan_disable(&req, false); + } /* Mark task needing completion */ set_bit(SUSPEND_SCAN_DISABLE, hdev->suspend_tasks); From patchwork Mon Nov 9 07:57:26 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Howard Chung X-Patchwork-Id: 321169 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-20.4 required=3.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH, MAILING_LIST_MULTI, SIGNED_OFF_BY, SPF_HELO_NONE, SPF_PASS, URIBL_BLOCKED,USER_AGENT_GIT,USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 667A0C5517A for ; Mon, 9 Nov 2020 07:57:56 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 09BF320853 for ; Mon, 9 Nov 2020 07:57:55 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="DSsSyRwJ" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729758AbgKIH5z (ORCPT ); Mon, 9 Nov 2020 02:57:55 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58376 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729789AbgKIH5v (ORCPT ); Mon, 9 Nov 2020 02:57:51 -0500 Received: from mail-yb1-xb49.google.com (mail-yb1-xb49.google.com [IPv6:2607:f8b0:4864:20::b49]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 7C489C0617A6 for ; Sun, 8 Nov 2020 23:57:51 -0800 (PST) Received: by mail-yb1-xb49.google.com with SMTP id a12so10089098ybc.20 for ; Sun, 08 Nov 2020 23:57:51 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=sender:date:in-reply-to:message-id:mime-version:references:subject :from:to:cc; bh=mzPL36jUYccmuy3uUDUDamZKwDlz8VG/1Akljp216ug=; b=DSsSyRwJ7An+hAHQ1FozZlvz0sliHFKo45v06BwynZehQg3lhOhgzwlexw2BgY49mI IQem62rda/lNiV4JQma6JuYXIH/YsR8KJ5qF+0K4LDJVVEuKF3OhOhahETGU5ILvxMtn /MGS3nJVqZFFjjS8+Tvr1rjrs3Y9ip+4IknvOELFksJQHAqSwQJ6JVfLGD81+pnDa4+s QnQ4e2cIn75DseWzVGLQWT8f3e5TblBJf7XEKYj+IXdoG6FWeAaAY2pF/JdMEVzaNEPm WXuAh7QndfBTo6oVMLqxVJPlOQ5kLJPvsiTIfxIfk/EbkkL+7ExXVWN7dWfbatwMql7r 4nLA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=mzPL36jUYccmuy3uUDUDamZKwDlz8VG/1Akljp216ug=; b=dVytFMc596Uf2ezBxbm85Clq/EZS1+dV85fdNl/b9njbMjhu3Ds6+v4Bj8WXlb0q0+ ClgDeNy37AEtMgX7Y6ZYNK2+shYeM6uxUp88tFSBTsswSJSukMx3PrLjQm11eSBNweLV TC+QOM4gNZB+LHVVTrLHnOVHFAq4js9KIpuguuoegrkhcbSNWeoBcpn513KkOGKYDvwk 5kUeo0A/1H5y4gPVo9XKUxeC9uRGlt8O3wWmXMeCrf7Ty0uq8jZL/ayhvfx/oQkQkmYj g4mdKhZrwtO2B1/XqBYjEwLGpy/XVEHmJrIivsDzlksp5quOKBDG+w2cZNjXKXQC8o7Q H+9w== X-Gm-Message-State: AOAM530zCUFPd6k8vBzCoO6Zzc6DEXV4s1dEX/Z2/hmOjU3tnRIyXw3Q bpaO9hK20BWwrEMwU2weDrBcErTz6eNgvrI53veEmRWYFlLHe8Y0wo2JPhahQ8pqqhZHGyewNb7 M7RvWiWaojarNwU/nOV5NLz/7nr1wHSME03QhkG0b52tGv15empaXlGRxMV7Ur9Rideolrb2xRs 6ktWrE/Gemehk= X-Google-Smtp-Source: ABdhPJyLAMuC2pjYzipDevJKIWKM9mGTw75n1CMvn1lgViTf/WE72G+Jtkerg4MpqD/wKzTcn52wB5eU3H5Dh5M8cw== Sender: "howardchung via sendgmr" X-Received: from howardchung-p920.tpe.corp.google.com ([2401:fa00:1:10:f693:9fff:fef4:4e45]) (user=howardchung job=sendgmr) by 2002:a25:468a:: with SMTP id t132mr5491805yba.312.1604908670614; Sun, 08 Nov 2020 23:57:50 -0800 (PST) Date: Mon, 9 Nov 2020 15:57:26 +0800 In-Reply-To: <20201109155659.v7.1.Ib75f58e90c477f9b82c5598f00c59f0e95a1a352@changeid> Message-Id: <20201109155659.v7.5.I756c1fecc03bcc0cd94400b4992cd7e743f4b3e2@changeid> Mime-Version: 1.0 References: <20201109155659.v7.1.Ib75f58e90c477f9b82c5598f00c59f0e95a1a352@changeid> X-Mailer: git-send-email 2.29.2.222.g5d2a92d10f8-goog Subject: [PATCH v7 5/5] Bluetooth: Add toggle to switch off interleave scan From: Howard Chung To: linux-bluetooth@vger.kernel.org, marcel@holtmann.org, luiz.dentz@gmail.com Cc: mmandlik@chromium.org, alainm@chromium.org, mcchou@chromium.org, Howard Chung , "David S. Miller" , Jakub Kicinski , Johan Hedberg , linux-kernel@vger.kernel.org, netdev@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-bluetooth@vger.kernel.org This patch add a configurable parameter to switch off the interleave scan feature. Reviewed-by: Alain Michaud Signed-off-by: Howard Chung --- Changes in v7: - Fix bt_dev_warn arguemnt type warning Changes in v6: - Set EnableAdvMonInterleaveScan to 1 byte long Changes in v4: - Set EnableAdvMonInterleaveScan default to Disable - Fix 80 chars limit in mgmt_config.c include/net/bluetooth/hci_core.h | 1 + net/bluetooth/hci_core.c | 1 + net/bluetooth/hci_request.c | 3 ++- net/bluetooth/mgmt_config.c | 41 +++++++++++++++++++++++++------- 4 files changed, 37 insertions(+), 9 deletions(-) diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h index cfede18709d8f..63c6d656564a1 100644 --- a/include/net/bluetooth/hci_core.h +++ b/include/net/bluetooth/hci_core.h @@ -363,6 +363,7 @@ struct hci_dev { __u32 clock; __u16 advmon_allowlist_duration; __u16 advmon_no_filter_duration; + __u8 enable_advmon_interleave_scan; __u16 devid_source; __u16 devid_vendor; diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c index 65b7b74baba4c..b7cb7bfe250bd 100644 --- a/net/bluetooth/hci_core.c +++ b/net/bluetooth/hci_core.c @@ -3595,6 +3595,7 @@ struct hci_dev *hci_alloc_dev(void) /* The default values will be chosen in the future */ hdev->advmon_allowlist_duration = 300; hdev->advmon_no_filter_duration = 500; + hdev->enable_advmon_interleave_scan = 0x00; /* Default to disable */ hdev->sniff_max_interval = 800; hdev->sniff_min_interval = 80; diff --git a/net/bluetooth/hci_request.c b/net/bluetooth/hci_request.c index 396960ef54a13..85948c73c72b3 100644 --- a/net/bluetooth/hci_request.c +++ b/net/bluetooth/hci_request.c @@ -1059,7 +1059,8 @@ void hci_req_add_le_passive_scan(struct hci_request *req) &own_addr_type)) return; - if (__hci_update_interleaved_scan(hdev)) + if (hdev->enable_advmon_interleave_scan && + __hci_update_interleaved_scan(hdev)) return; bt_dev_dbg(hdev, "interleave state %d", hdev->interleave_scan_state); diff --git a/net/bluetooth/mgmt_config.c b/net/bluetooth/mgmt_config.c index b735e59c7fd51..a3dfcdcb3b78d 100644 --- a/net/bluetooth/mgmt_config.c +++ b/net/bluetooth/mgmt_config.c @@ -17,12 +17,24 @@ __le16 value; \ } __packed _param_name_ +#define HDEV_PARAM_U8(_param_name_) \ + struct {\ + struct mgmt_tlv entry; \ + __u8 value; \ + } __packed _param_name_ + #define TLV_SET_U16(_param_code_, _param_name_) \ { \ { cpu_to_le16(_param_code_), sizeof(__u16) }, \ cpu_to_le16(hdev->_param_name_) \ } +#define TLV_SET_U8(_param_code_, _param_name_) \ + { \ + { cpu_to_le16(_param_code_), sizeof(__u8) }, \ + hdev->_param_name_ \ + } + #define TLV_SET_U16_JIFFIES_TO_MSECS(_param_code_, _param_name_) \ { \ { cpu_to_le16(_param_code_), sizeof(__u16) }, \ @@ -65,6 +77,7 @@ int read_def_system_config(struct sock *sk, struct hci_dev *hdev, void *data, HDEV_PARAM_U16(def_le_autoconnect_timeout); HDEV_PARAM_U16(advmon_allowlist_duration); HDEV_PARAM_U16(advmon_no_filter_duration); + HDEV_PARAM_U8(enable_advmon_interleave_scan); } __packed rp = { TLV_SET_U16(0x0000, def_page_scan_type), TLV_SET_U16(0x0001, def_page_scan_int), @@ -97,6 +110,7 @@ int read_def_system_config(struct sock *sk, struct hci_dev *hdev, void *data, def_le_autoconnect_timeout), TLV_SET_U16(0x001d, advmon_allowlist_duration), TLV_SET_U16(0x001e, advmon_no_filter_duration), + TLV_SET_U8(0x001f, enable_advmon_interleave_scan), }; bt_dev_dbg(hdev, "sock %p", sk); @@ -109,6 +123,7 @@ int read_def_system_config(struct sock *sk, struct hci_dev *hdev, void *data, #define TO_TLV(x) ((struct mgmt_tlv *)(x)) #define TLV_GET_LE16(tlv) le16_to_cpu(*((__le16 *)(TO_TLV(tlv)->value))) +#define TLV_GET_LE8(tlv) le16_to_cpu(*((__u8 *)(TO_TLV(tlv)->value))) int set_def_system_config(struct sock *sk, struct hci_dev *hdev, void *data, u16 data_len) @@ -125,6 +140,7 @@ int set_def_system_config(struct sock *sk, struct hci_dev *hdev, void *data, /* First pass to validate the tlv */ while (buffer_left >= sizeof(struct mgmt_tlv)) { const u8 len = TO_TLV(buffer)->length; + size_t exp_type_len; const u16 exp_len = sizeof(struct mgmt_tlv) + len; const u16 type = le16_to_cpu(TO_TLV(buffer)->type); @@ -170,20 +186,26 @@ int set_def_system_config(struct sock *sk, struct hci_dev *hdev, void *data, case 0x001b: case 0x001d: case 0x001e: - if (len != sizeof(u16)) { - bt_dev_warn(hdev, "invalid length %d, exp %zu for type %d", - len, sizeof(u16), type); - - return mgmt_cmd_status(sk, hdev->id, - MGMT_OP_SET_DEF_SYSTEM_CONFIG, - MGMT_STATUS_INVALID_PARAMS); - } + exp_type_len = sizeof(u16); + break; + case 0x001f: + exp_type_len = sizeof(u8); break; default: + exp_type_len = 0; bt_dev_warn(hdev, "unsupported parameter %u", type); break; } + if (exp_type_len && len != exp_type_len) { + bt_dev_warn(hdev, "invalid length %d, exp %zu for type %d", + len, exp_type_len, type); + + return mgmt_cmd_status(sk, hdev->id, + MGMT_OP_SET_DEF_SYSTEM_CONFIG, + MGMT_STATUS_INVALID_PARAMS); + } + buffer_left -= exp_len; buffer += exp_len; } @@ -289,6 +311,9 @@ int set_def_system_config(struct sock *sk, struct hci_dev *hdev, void *data, case 0x0001e: hdev->advmon_no_filter_duration = TLV_GET_LE16(buffer); break; + case 0x0001f: + hdev->enable_advmon_interleave_scan = TLV_GET_LE8(buffer); + break; default: bt_dev_warn(hdev, "unsupported parameter %u", type); break;