From patchwork Mon Mar 1 20:06:04 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Abhishek Pandit-Subedi X-Patchwork-Id: 12110607 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=-18.8 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS, USER_AGENT_GIT 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 D8067C433DB for ; Mon, 1 Mar 2021 20:15:31 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id A148B64E87 for ; Mon, 1 Mar 2021 20:15:31 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S243109AbhCAUO5 (ORCPT ); Mon, 1 Mar 2021 15:14:57 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:55332 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S242326AbhCAUHN (ORCPT ); Mon, 1 Mar 2021 15:07:13 -0500 Received: from mail-pj1-x1034.google.com (mail-pj1-x1034.google.com [IPv6:2607:f8b0:4864:20::1034]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 86669C061794 for ; Mon, 1 Mar 2021 12:06:16 -0800 (PST) Received: by mail-pj1-x1034.google.com with SMTP id l18so304935pji.3 for ; Mon, 01 Mar 2021 12:06:16 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=FmepXWNSTdEA/KAVI+oGgo16QBYQH6RJ6J9+l/y7d7k=; b=McvTQtWmvYeirDmyu8L2JF7XHJv7bQrSQps5CeCQa1wGyAV75Isv5HuzVp0HR5x6Ru xYfbMPLaqg1sWsNUx2SQj+9N7rOQbD0qyg5+0B1nh1BUEs9N/+cmRs2oHg6vq/LO/dpY z46LpHPUovpIUzpIFwVeBwy3NJ/q1TNEcPTr8= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=FmepXWNSTdEA/KAVI+oGgo16QBYQH6RJ6J9+l/y7d7k=; b=rg6zTQ7byaAmrQ8jrfGS5S9jda1rbibiurKEzdWvJZev62p0FwdY4eAJGt5u1ZHW9d c3cUILMlvGih7rMuHj3vzGvbST+qGdB8XFTEJPJNZSbCeTgABVC4wtQydKtiQg/++d5m Q38JETZSeSU+2I36rXYmYUOs2kRpOsZURg78SxjFwA1MCqc1VpB1Kn8muiNrqK9DIG0z BORdDh5JXyAiqCN/YZ8ip/UgrjGJL8sSL5HAVu1cKDntuCrVrhTx20WXEhHxL4Vpr/TT PWuST5KlPKYL8DK6LTDH69J+B5wwsYolrATgApOe2GVZ/9AXJq1mD1PNxaG0iViAdglN bB9w== X-Gm-Message-State: AOAM531ggV6TFNwTG7cSl6xOcHPPlgt3CrN8JtJ5OVwDQVZ2N3CrZhvF 55iGBwmoxYaKRr95hZG3rg++Qg== X-Google-Smtp-Source: ABdhPJxmVMgVucgDn8XCd+M7wCjWLhNXnFkQgXS4h0sfEl7VoV1ymxBwC/zGqjfq4Bl13yHk53vGpA== X-Received: by 2002:a17:902:be06:b029:e3:7031:bef with SMTP id r6-20020a170902be06b02900e370310befmr285165pls.19.1614629176090; Mon, 01 Mar 2021 12:06:16 -0800 (PST) Received: from apsdesk.mtv.corp.google.com ([2620:15c:202:1:d800:e660:6ed:356a]) by smtp.gmail.com with ESMTPSA id t4sm238256pjs.12.2021.03.01.12.06.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 01 Mar 2021 12:06:15 -0800 (PST) From: Abhishek Pandit-Subedi To: marcel@holtmann.org Cc: chromeos-bluetooth-upstreaming@chromium.org, Hans de Goede , linux-bluetooth@vger.kernel.org, Abhishek Pandit-Subedi , Archie Pusaka , "David S. Miller" , Johan Hedberg , netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Jakub Kicinski , Luiz Augusto von Dentz Subject: [PATCH 1/2] Bluetooth: Notify suspend on le conn failed Date: Mon, 1 Mar 2021 12:06:04 -0800 Message-Id: <20210301120602.1.Ia32a022edc307a4cb0c93dc18d52b6c5f97db23b@changeid> X-Mailer: git-send-email 2.30.1.766.gb4fecdf3b7-goog In-Reply-To: <20210301200605.106607-1-abhishekpandit@chromium.org> References: <20210301200605.106607-1-abhishekpandit@chromium.org> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-bluetooth@vger.kernel.org When suspending, Bluetooth disconnects all connected peers devices. If an LE connection is started but isn't completed, we will see an LE Create Connection Cancel instead of an HCI disconnect. This just adds a check to see if an LE cancel was the last disconnected device and wake the suspend thread when that is the case. Signed-off-by: Abhishek Pandit-Subedi Reviewed-by: Archie Pusaka --- Here is an HCI trace when the issue occurred. < HCI Command: LE Create Connection (0x08|0x000d) plen 25 #187777 [hci0] 2021-02-03 21:42:35.130208 Scan interval: 60.000 msec (0x0060) Scan window: 60.000 msec (0x0060) Filter policy: White list is not used (0x00) Peer address type: Random (0x01) Peer address: D9:DC:6B:61:EB:3A (Static) Own address type: Public (0x00) Min connection interval: 15.00 msec (0x000c) Max connection interval: 30.00 msec (0x0018) Connection latency: 20 (0x0014) Supervision timeout: 3000 msec (0x012c) Min connection length: 0.000 msec (0x0000) Max connection length: 0.000 msec (0x0000) > HCI Event: Command Status (0x0f) plen 4 #187778 [hci0] 2021-02-03 21:42:35.131184 LE Create Connection (0x08|0x000d) ncmd 1 Status: Success (0x00) < HCI Command: LE Create Connection Cancel (0x08|0x000e) plen 0 #187805 [hci0] 2021-02-03 21:42:37.183336 > HCI Event: Command Complete (0x0e) plen 4 #187806 [hci0] 2021-02-03 21:42:37.192394 LE Create Connection Cancel (0x08|0x000e) ncmd 1 Status: Success (0x00) > HCI Event: LE Meta Event (0x3e) plen 19 #187807 [hci0] 2021-02-03 21:42:37.193400 LE Connection Complete (0x01) Status: Unknown Connection Identifier (0x02) Handle: 0 Role: Master (0x00) Peer address type: Random (0x01) Peer address: D9:DC:6B:61:EB:3A (Static) Connection interval: 0.00 msec (0x0000) Connection latency: 0 (0x0000) Supervision timeout: 0 msec (0x0000) Master clock accuracy: 0x00 ... @ MGMT Event: Controller Suspended (0x002d) plen 1 {0x0002} [hci0] 2021-02-03 21:42:39.178780 Suspend state: Controller running (failed to suspend) (0) @ MGMT Event: Controller Suspended (0x002d) plen 1 {0x0001} [hci0] 2021-02-03 21:42:39.178780 Suspend state: Controller running (failed to suspend) (0) ... < HCI Command: Set Event Filter (0x03|0x0005) plen 1 #187808 [hci0] 2021-02-04 09:23:07.313591 Type: Clear All Filters (0x00) net/bluetooth/hci_conn.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/net/bluetooth/hci_conn.c b/net/bluetooth/hci_conn.c index 6ffa89e3ba0a85..468d31f3303d7a 100644 --- a/net/bluetooth/hci_conn.c +++ b/net/bluetooth/hci_conn.c @@ -772,6 +772,16 @@ void hci_le_conn_failed(struct hci_conn *conn, u8 status) hci_conn_del(conn); + /* The suspend notifier is waiting for all devices to disconnect and an + * LE connect cancel will result in an hci_le_conn_failed. Once the last + * connection is deleted, we should also wake the suspend queue to + * complete suspend operations. + */ + if (list_empty(&hdev->conn_hash.list) && + test_and_clear_bit(SUSPEND_DISCONNECTING, hdev->suspend_tasks)) { + wake_up(&hdev->suspend_wait_q); + } + /* Since we may have temporarily stopped the background scanning in * favor of connection establishment, we should restart it. */ From patchwork Mon Mar 1 20:06:05 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Abhishek Pandit-Subedi X-Patchwork-Id: 12110609 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=-18.8 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS, USER_AGENT_GIT 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 1CA5FC433DB for ; Mon, 1 Mar 2021 20:15:41 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id C92C564ECF for ; Mon, 1 Mar 2021 20:15:40 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S241521AbhCAUPO (ORCPT ); Mon, 1 Mar 2021 15:15:14 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:55876 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S236171AbhCAUJs (ORCPT ); Mon, 1 Mar 2021 15:09:48 -0500 Received: from mail-pj1-x102f.google.com (mail-pj1-x102f.google.com [IPv6:2607:f8b0:4864:20::102f]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 01BF4C061797 for ; Mon, 1 Mar 2021 12:06:18 -0800 (PST) Received: by mail-pj1-x102f.google.com with SMTP id i14so292734pjz.4 for ; Mon, 01 Mar 2021 12:06:17 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=U+yZn5oAcut/C/aebOJ16/bGakvc9MpdGSWik0h5VXc=; b=WoqBGSdMrcG7i8F+POoakKo8qZE6yUVQgoE3Y8qtfWvdLpMLOZCPTFFQKFSpR4E/L7 0cYCUSTthhZ89M8yRs/gH4Gk6O/9YuTsqFPhhW+v3MNPl7ZKrHGLDN4HhlKScp2QTYX2 gOIBafTn/FrYPZkfvWQBE7NlZk1pEUmwAWO2E= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=U+yZn5oAcut/C/aebOJ16/bGakvc9MpdGSWik0h5VXc=; b=AqSzItbt4lomanfYmW4vgIfyD7Gc6Hkm9wHHNYjiXWZ+K/mTIjTClX/fwteE+LR3lA 8CtU+YH50eHVXiC525uMsnrhWamZKcvldc2oJ6q9oTQD4vreAW6GY/5jUSN00OR8rSDs laXiz3nFJ78HQKGcKoXkdR9IhKY7UQLrMw8Nz1qhwBne+BDzm3d6RE+pRa/Jytxjj4yy KRGoxMoNsTTuinDzFeN+JZ2Ta02gB08C1fTAS7QX+zBX1AxGJMcRzEdDedLopeQI4o9g jpaoP+Vn2xO8uJ+2wvWHpX+oD9jLjmE19YbCn0gTfA2Bzvv1M0ZW4M2VgOdRW7mvY6iZ gZlw== X-Gm-Message-State: AOAM532h11G5W8gI7yAOd43rLx2TDyWKxa0y5tm2yBkFcGcPxgpOZEhe aNuiaCf6Gim7i2ef+h/C8Doq+g== X-Google-Smtp-Source: ABdhPJyNiWBUOGz2CemLY+WQB6z0EWQ7Xrcxm+QMYPJbcIFbDa2D/IXXStrtHhATfs0WLrfwaI2Xgg== X-Received: by 2002:a17:90a:ba16:: with SMTP id s22mr646925pjr.88.1614629177608; Mon, 01 Mar 2021 12:06:17 -0800 (PST) Received: from apsdesk.mtv.corp.google.com ([2620:15c:202:1:d800:e660:6ed:356a]) by smtp.gmail.com with ESMTPSA id t4sm238256pjs.12.2021.03.01.12.06.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 01 Mar 2021 12:06:17 -0800 (PST) From: Abhishek Pandit-Subedi To: marcel@holtmann.org Cc: chromeos-bluetooth-upstreaming@chromium.org, Hans de Goede , linux-bluetooth@vger.kernel.org, Abhishek Pandit-Subedi , Archie Pusaka , Alain Michaud , "David S. Miller" , Johan Hedberg , netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Jakub Kicinski , Luiz Augusto von Dentz Subject: [PATCH 2/2] Bluetooth: Remove unneeded commands for suspend Date: Mon, 1 Mar 2021 12:06:05 -0800 Message-Id: <20210301120602.2.Ifcac8bd85b5339135af8e08370bacecc518b1c35@changeid> X-Mailer: git-send-email 2.30.1.766.gb4fecdf3b7-goog In-Reply-To: <20210301200605.106607-1-abhishekpandit@chromium.org> References: <20210301200605.106607-1-abhishekpandit@chromium.org> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-bluetooth@vger.kernel.org During suspend, there are a few scan enable and set event filter commands that don't need to be sent unless there are actual BR/EDR devices capable of waking the system. Check the HCI_PSCAN bit before writing scan enable and use a new dev flag, HCI_EVENT_FILTER_CONFIGURED to control whether to clear the event filter. Signed-off-by: Abhishek Pandit-Subedi Reviewed-by: Archie Pusaka Reviewed-by: Alain Michaud --- include/net/bluetooth/hci.h | 1 + net/bluetooth/hci_event.c | 31 ++++++++++++++++++++++++++ net/bluetooth/hci_request.c | 44 +++++++++++++++++++++++-------------- 3 files changed, 59 insertions(+), 17 deletions(-) diff --git a/include/net/bluetooth/hci.h b/include/net/bluetooth/hci.h index ba2f439bc04d34..ea4ae551c42687 100644 --- a/include/net/bluetooth/hci.h +++ b/include/net/bluetooth/hci.h @@ -320,6 +320,7 @@ enum { HCI_BREDR_ENABLED, HCI_LE_SCAN_INTERRUPTED, HCI_WIDEBAND_SPEECH_ENABLED, + HCI_EVENT_FILTER_CONFIGURED, HCI_DUT_MODE, HCI_VENDOR_DIAG, diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c index 67668be3461e93..17847e672b98cf 100644 --- a/net/bluetooth/hci_event.c +++ b/net/bluetooth/hci_event.c @@ -395,6 +395,33 @@ static void hci_cc_write_scan_enable(struct hci_dev *hdev, struct sk_buff *skb) hci_dev_unlock(hdev); } +static void hci_cc_set_event_filter(struct hci_dev *hdev, struct sk_buff *skb) +{ + __u8 status = *((__u8 *)skb->data); + struct hci_cp_set_event_filter *cp; + void *sent; + + BT_DBG("%s status 0x%2.2x", hdev->name, status); + + sent = hci_sent_cmd_data(hdev, HCI_OP_SET_EVENT_FLT); + if (!sent) + return; + + cp = (struct hci_cp_set_event_filter *)sent; + + hci_dev_lock(hdev); + + if (status) + goto done; + + if (cp->flt_type == HCI_FLT_CLEAR_ALL) + hci_dev_clear_flag(hdev, HCI_EVENT_FILTER_CONFIGURED); + else + hci_dev_set_flag(hdev, HCI_EVENT_FILTER_CONFIGURED); +done: + hci_dev_unlock(hdev); +} + static void hci_cc_read_class_of_dev(struct hci_dev *hdev, struct sk_buff *skb) { struct hci_rp_read_class_of_dev *rp = (void *) skb->data; @@ -3328,6 +3355,10 @@ static void hci_cmd_complete_evt(struct hci_dev *hdev, struct sk_buff *skb, hci_cc_write_scan_enable(hdev, skb); break; + case HCI_OP_SET_EVENT_FLT: + hci_cc_set_event_filter(hdev, skb); + break; + case HCI_OP_READ_CLASS_OF_DEV: hci_cc_read_class_of_dev(hdev, skb); break; diff --git a/net/bluetooth/hci_request.c b/net/bluetooth/hci_request.c index e55976db4403e7..75a42178c82d9b 100644 --- a/net/bluetooth/hci_request.c +++ b/net/bluetooth/hci_request.c @@ -1131,14 +1131,14 @@ static void hci_req_clear_event_filter(struct hci_request *req) { struct hci_cp_set_event_filter f; - memset(&f, 0, sizeof(f)); - f.flt_type = HCI_FLT_CLEAR_ALL; - hci_req_add(req, HCI_OP_SET_EVENT_FLT, 1, &f); + if (!hci_dev_test_flag(req->hdev, HCI_BREDR_ENABLED)) + return; - /* Update page scan state (since we may have modified it when setting - * the event filter). - */ - __hci_req_update_scan(req); + if (hci_dev_test_flag(req->hdev, HCI_EVENT_FILTER_CONFIGURED)) { + memset(&f, 0, sizeof(f)); + f.flt_type = HCI_FLT_CLEAR_ALL; + hci_req_add(req, HCI_OP_SET_EVENT_FLT, 1, &f); + } } static void hci_req_set_event_filter(struct hci_request *req) @@ -1147,6 +1147,10 @@ static void hci_req_set_event_filter(struct hci_request *req) struct hci_cp_set_event_filter f; struct hci_dev *hdev = req->hdev; u8 scan = SCAN_DISABLED; + bool scanning = test_bit(HCI_PSCAN, &hdev->flags); + + if (!hci_dev_test_flag(hdev, HCI_BREDR_ENABLED)) + return; /* Always clear event filter when starting */ hci_req_clear_event_filter(req); @@ -1167,12 +1171,13 @@ static void hci_req_set_event_filter(struct hci_request *req) scan = SCAN_PAGE; } - if (scan) + if (scan && !scanning) { set_bit(SUSPEND_SCAN_ENABLE, hdev->suspend_tasks); - else + hci_req_add(req, HCI_OP_WRITE_SCAN_ENABLE, 1, &scan); + } else if (!scan && scanning) { set_bit(SUSPEND_SCAN_DISABLE, hdev->suspend_tasks); - - hci_req_add(req, HCI_OP_WRITE_SCAN_ENABLE, 1, &scan); + hci_req_add(req, HCI_OP_WRITE_SCAN_ENABLE, 1, &scan); + } } static void cancel_adv_timeout(struct hci_dev *hdev) @@ -1315,9 +1320,14 @@ void hci_req_prepare_suspend(struct hci_dev *hdev, enum suspended_state next) hdev->advertising_paused = true; hdev->advertising_old_state = old_state; - /* Disable page scan */ - page_scan = SCAN_DISABLED; - hci_req_add(&req, HCI_OP_WRITE_SCAN_ENABLE, 1, &page_scan); + + /* Disable page scan if enabled */ + if (test_bit(HCI_PSCAN, &hdev->flags)) { + page_scan = SCAN_DISABLED; + hci_req_add(&req, HCI_OP_WRITE_SCAN_ENABLE, 1, + &page_scan); + set_bit(SUSPEND_SCAN_DISABLE, hdev->suspend_tasks); + } /* Disable LE passive scan if enabled */ if (hci_dev_test_flag(hdev, HCI_LE_SCAN)) { @@ -1328,9 +1338,6 @@ void hci_req_prepare_suspend(struct hci_dev *hdev, enum suspended_state next) /* Disable advertisement filters */ hci_req_add_set_adv_filter_enable(&req, false); - /* Mark task needing completion */ - set_bit(SUSPEND_SCAN_DISABLE, hdev->suspend_tasks); - /* Prevent disconnects from causing scanning to be re-enabled */ hdev->scanning_paused = true; @@ -1364,7 +1371,10 @@ void hci_req_prepare_suspend(struct hci_dev *hdev, enum suspended_state next) hdev->suspended = false; hdev->scanning_paused = false; + /* Clear any event filters and restore scan state */ hci_req_clear_event_filter(&req); + __hci_req_update_scan(&req); + /* Reset passive/background scanning to normal */ __hci_update_background_scan(&req); /* Enable all of the advertisement filters */