Received: by 2002:a05:7412:b995:b0:f9:9502:5bb8 with SMTP id it21csp6717794rdb; Tue, 2 Jan 2024 10:50:00 -0800 (PST) X-Google-Smtp-Source: AGHT+IHc1TrbFAp9VdmsUHYeQwqWLvLd9VLr5BUz9oPbG/wnAwkscznMTtd91cXI4LS+683adoJN X-Received: by 2002:a05:622a:54a:b0:427:9c78:a2bd with SMTP id m10-20020a05622a054a00b004279c78a2bdmr29755809qtx.22.1704221399890; Tue, 02 Jan 2024 10:49:59 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1704221399; cv=none; d=google.com; s=arc-20160816; b=Uk4QtopDhd+2y9oCL+QQ2ih5ASUVqvA2I7il8uyw74/gSkhW3uiz+ZbngK5HysHtl1 yz0JLSsDUGQz6COvf/D6h6O0MiR1X/HhDgIUiyglkz+oSi36tuGo85DzgT9m27lWaSIh esNcVcVaNcN5Uxzpcu0iIULFdjNFiN/9GX35NELc4lfA0ilR/HK7L3LHfZbiB24Cpdt1 jXJQKPDZDYJ1+K2pdgjOK/Us8sFGHLDPvzZrdqOfF10ppDMrM8baNLgQB0/HysKpV9hI fMPW/dp4LnAK1h1TiwPHmA8QQKuiF0u5pLzwQHI08e3DM9BXAFoi1twAaqdeccf6v+ny KhUw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:in-reply-to:from:references:cc:to :content-language:subject:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:date:message-id; bh=ADjlFHNBxtAIwc1e2L9+zuFQ45wdb2CpQsDcE/XnJE0=; fh=MIXRvhTIDg9SJVhudMDYfdnN3IHFU7q/9XQZJJCpzcY=; b=mFFaXp8zKg7QtQ0Ow8OoLLh+2X+u9j/IlR1Sl5cIYdVVR6kUgG6YnUOK9AxshhZ43r K9L/Umt7HPefYpgb7EVblDXOvKG03Ay7+tk+7gCLQlc7kcZ3dwR2LZD8L+/ivASdkQlm bMZ7DtBOZhW/14Fw3RDaszE7lqJA39HCRfqCHswSwhhIHcA/1EqYX0ttSSz7TD3FxxAB z2ypgmGM9uMbroaqfWSx+E5Y/J2IwymhuVzfuCvShUEZoCsizdVYvnqOVIWGbdr/EFRx zLpDt5lB6bf5AdsIYt+uxZMcL0Lve1BsNw+RfgcXhG0YjpgFD0iCEC1nqc+RoveX+5VO 8twA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-bluetooth+bounces-825-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.199.223 as permitted sender) smtp.mailfrom="linux-bluetooth+bounces-825-linux.lists.archive=gmail.com@vger.kernel.org" Return-Path: Received: from ny.mirrors.kernel.org (ny.mirrors.kernel.org. [147.75.199.223]) by mx.google.com with ESMTPS id s18-20020a05622a019200b0042825564d68si3880257qtw.312.2024.01.02.10.49.59 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 02 Jan 2024 10:49:59 -0800 (PST) Received-SPF: pass (google.com: domain of linux-bluetooth+bounces-825-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.199.223 as permitted sender) client-ip=147.75.199.223; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-bluetooth+bounces-825-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.199.223 as permitted sender) smtp.mailfrom="linux-bluetooth+bounces-825-linux.lists.archive=gmail.com@vger.kernel.org" Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ny.mirrors.kernel.org (Postfix) with ESMTPS id 5C84E1C21669 for ; Tue, 2 Jan 2024 18:49:59 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id B959015AE1; Tue, 2 Jan 2024 18:49:15 +0000 (UTC) X-Original-To: linux-bluetooth@vger.kernel.org Received: from mout-p-101.mailbox.org (mout-p-101.mailbox.org [80.241.56.151]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3691515AD0; Tue, 2 Jan 2024 18:49:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=v0yd.nl Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=v0yd.nl Received: from smtp2.mailbox.org (smtp2.mailbox.org [IPv6:2001:67c:2050:b231:465::2]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by mout-p-101.mailbox.org (Postfix) with ESMTPS id 4T4MMT3lScz9sXk; Tue, 2 Jan 2024 19:49:09 +0100 (CET) Message-ID: <13fc1f7f-9990-4ad4-b8a8-54a9365083e2@v0yd.nl> Date: Tue, 2 Jan 2024 19:49:08 +0100 Precedence: bulk X-Mailing-List: linux-bluetooth@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Subject: Re: [PATCH v2 4/4] Bluetooth: Queue a HCI power-off command before rfkilling adapters Content-Language: en-US To: Luiz Augusto von Dentz Cc: Marcel Holtmann , Johan Hedberg , asahi@lists.linux.dev, linux-bluetooth@vger.kernel.org, linux-kernel@vger.kernel.org, netdev@vger.kernel.org References: <20240102181946.57288-1-verdre@v0yd.nl> <20240102181946.57288-5-verdre@v0yd.nl> From: =?UTF-8?Q?Jonas_Dre=C3=9Fler?= In-Reply-To: Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit X-Rspamd-Queue-Id: 4T4MMT3lScz9sXk On 1/2/24 19:31, Luiz Augusto von Dentz wrote: > Hi Jonas, > > On Tue, Jan 2, 2024 at 1:19 PM Jonas Dreßler wrote: >> >> On a lot of platforms (at least the MS Surface devices, M1 macbooks, and >> a few ThinkPads) firmware doesn't do its job when rfkilling a device >> and the bluetooth adapter is not actually shut down on rfkill. This leads >> to connected devices remaining in connected state and the bluetooth >> connection eventually timing out after rfkilling an adapter. >> >> Use the rfkill hook in the HCI driver to actually power the device off >> before rfkilling it. >> >> Note that the wifi subsystem is doing something similar by calling >> cfg80211_shutdown_all_interfaces() >> in it's rfkill set_block callback (see cfg80211_rfkill_set_block). > > So the rfkill is supposed to be wait for cleanup, not a forceful > shutdown of RF traffic? I assume it would be the later since to do a > proper cleanup that could cause more RF traffic while the current > assumption was to stop all traffic and then call hdev->shutdown to > ensure the driver does shutdown the RF traffic, perhaps this > assumption has changed over time since interrupting the RF traffic may > cause what you just described because the remote end will have to rely > on link-loss logic to detect the connection has been terminated. Yes, it seems to me that as soon as the rfkill happens, anything in the drivers hdev->shutdown to shut things down will no longer go through to the card. I'd assume this is something that's enforced by firmware and we can't change, or would that be a bug on our side? But yeah, proper shutdown of the adapter requires a bit more RF traffic. If rfkill guarantees that it shuts down all RF traffic *immediately*, maybe it would be better to expect power-off MGMT commands from userspace before rfkilling? But given that the disconnect appears to happen fine on some hardware, this seemed like the obvious and more reliable way to me. > >> Signed-off-by: Jonas Dreßler >> --- >> net/bluetooth/hci_core.c | 33 ++++++++++++++++++++++++++++++--- >> 1 file changed, 30 insertions(+), 3 deletions(-) >> >> diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c >> index 1ec83985f..1c91d02f7 100644 >> --- a/net/bluetooth/hci_core.c >> +++ b/net/bluetooth/hci_core.c >> @@ -543,6 +543,23 @@ int hci_dev_open(__u16 dev) >> return err; >> } >> >> +static int set_powered_off_sync(struct hci_dev *hdev, void *data) >> +{ >> + return hci_set_powered_sync(hdev, false); >> +} >> + >> +static void set_powered_off_sync_complete(struct hci_dev *hdev, void *data, int err) >> +{ >> + if (err) >> + bt_dev_err(hdev, "Powering HCI device off before rfkilling failed (%d)", err); >> +} >> + >> +static int hci_dev_do_poweroff(struct hci_dev *hdev) >> +{ >> + return hci_cmd_sync_queue(hdev, set_powered_off_sync, >> + NULL, set_powered_off_sync_complete); >> +} >> + >> int hci_dev_do_close(struct hci_dev *hdev) >> { >> int err; >> @@ -943,17 +960,27 @@ int hci_get_dev_info(void __user *arg) >> static int hci_rfkill_set_block(void *data, bool blocked) >> { >> struct hci_dev *hdev = data; >> + int err; >> >> BT_DBG("%p name %s blocked %d", hdev, hdev->name, blocked); >> >> if (hci_dev_test_flag(hdev, HCI_USER_CHANNEL)) >> return -EBUSY; >> >> + if (blocked == hci_dev_test_flag(hdev, HCI_RFKILLED)) >> + return 0; >> + >> if (blocked) { >> - hci_dev_set_flag(hdev, HCI_RFKILLED); >> if (!hci_dev_test_flag(hdev, HCI_SETUP) && >> - !hci_dev_test_flag(hdev, HCI_CONFIG)) >> - hci_dev_do_close(hdev); >> + !hci_dev_test_flag(hdev, HCI_CONFIG)) { >> + err = hci_dev_do_poweroff(hdev); >> + if (err) { >> + bt_dev_err(hdev, "Powering off device before rfkilling failed (%d)", >> + err); >> + } > > You already have the error printed on set_powered_off_sync_complete > not sure why you have it here as well. > >> + } >> + >> + hci_dev_set_flag(hdev, HCI_RFKILLED); > > Before we used to set the HCI_RFKILLED beforehand, is this change > really intended or not? I think we should keep doing it ahead of power > off sequence since we can probably use it to ignore if there are any > errors on the cleanup, etc. Good point, it's been a while since I wrote that patch, maybe something in the power-off logic bails out if HCI_RFKILLED is set and that's why I moved it below, I'll check that... > >> } else { >> hci_dev_clear_flag(hdev, HCI_RFKILLED); >> } >> -- >> 2.43.0 >> > >