* [PATCH v2] Bluetooth: Move shutdown callback before flushing tx and rx queue
@ 2021-08-10 4:53 Kai-Heng Feng
2021-08-11 8:25 ` Mattijs Korpershoek
2021-08-16 15:49 ` Marcel Holtmann
0 siblings, 2 replies; 3+ messages in thread
From: Kai-Heng Feng @ 2021-08-10 4:53 UTC (permalink / raw)
To: marcel, johan.hedberg, luiz.dentz
Cc: Kai-Heng Feng, Mattijs Korpershoek, Hsin-Yi Wang, Guenter Roeck,
David S. Miller, Jakub Kicinski, open list:BLUETOOTH SUBSYSTEM,
open list:NETWORKING [GENERAL],
open list
Commit 0ea9fd001a14 ("Bluetooth: Shutdown controller after workqueues
are flushed or cancelled") introduced a regression that makes mtkbtsdio
driver stops working:
[ 36.593956] Bluetooth: hci0: Firmware already downloaded
[ 46.814613] Bluetooth: hci0: Execution of wmt command timed out
[ 46.814619] Bluetooth: hci0: Failed to send wmt func ctrl (-110)
The shutdown callback depends on the result of hdev->rx_work, so we
should call it before flushing rx_work:
-> btmtksdio_shutdown()
-> mtk_hci_wmt_sync()
-> __hci_cmd_send()
-> wait for BTMTKSDIO_TX_WAIT_VND_EVT gets cleared
-> btmtksdio_recv_event()
-> hci_recv_frame()
-> queue_work(hdev->workqueue, &hdev->rx_work)
-> clears BTMTKSDIO_TX_WAIT_VND_EVT
So move the shutdown callback before flushing TX/RX queue to resolve the
issue.
Reported-and-tested-by: Mattijs Korpershoek <mkorpershoek@baylibre.com>
Tested-by: Hsin-Yi Wang <hsinyi@chromium.org>
Cc: Guenter Roeck <linux@roeck-us.net>
Fixes: 0ea9fd001a14 ("Bluetooth: Shutdown controller after workqueues are flushed or cancelled")
Signed-off-by: Kai-Heng Feng <kai.heng.feng@canonical.com>
---
v2:
Move the shutdown callback before clearing HCI_UP, otherwise 1)
shutdown callback won't be called and 2) other routines that depend on
HCI_UP won't work.
net/bluetooth/hci_core.c | 16 ++++++++--------
1 file changed, 8 insertions(+), 8 deletions(-)
diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c
index cb2e9e513907..8622da2d9395 100644
--- a/net/bluetooth/hci_core.c
+++ b/net/bluetooth/hci_core.c
@@ -1727,6 +1727,14 @@ int hci_dev_do_close(struct hci_dev *hdev)
hci_request_cancel_all(hdev);
hci_req_sync_lock(hdev);
+ if (!hci_dev_test_flag(hdev, HCI_UNREGISTER) &&
+ !hci_dev_test_flag(hdev, HCI_USER_CHANNEL) &&
+ test_bit(HCI_UP, &hdev->flags)) {
+ /* Execute vendor specific shutdown routine */
+ if (hdev->shutdown)
+ hdev->shutdown(hdev);
+ }
+
if (!test_and_clear_bit(HCI_UP, &hdev->flags)) {
cancel_delayed_work_sync(&hdev->cmd_timer);
hci_req_sync_unlock(hdev);
@@ -1798,14 +1806,6 @@ int hci_dev_do_close(struct hci_dev *hdev)
clear_bit(HCI_INIT, &hdev->flags);
}
- if (!hci_dev_test_flag(hdev, HCI_UNREGISTER) &&
- !hci_dev_test_flag(hdev, HCI_USER_CHANNEL) &&
- test_bit(HCI_UP, &hdev->flags)) {
- /* Execute vendor specific shutdown routine */
- if (hdev->shutdown)
- hdev->shutdown(hdev);
- }
-
/* flush cmd work */
flush_work(&hdev->cmd_work);
--
2.31.1
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH v2] Bluetooth: Move shutdown callback before flushing tx and rx queue
2021-08-10 4:53 [PATCH v2] Bluetooth: Move shutdown callback before flushing tx and rx queue Kai-Heng Feng
@ 2021-08-11 8:25 ` Mattijs Korpershoek
2021-08-16 15:49 ` Marcel Holtmann
1 sibling, 0 replies; 3+ messages in thread
From: Mattijs Korpershoek @ 2021-08-11 8:25 UTC (permalink / raw)
To: Kai-Heng Feng, marcel, johan.hedberg, luiz.dentz
Cc: Kai-Heng Feng, Hsin-Yi Wang, Guenter Roeck, David S. Miller,
Jakub Kicinski, open list:BLUETOOTH SUBSYSTEM,
open list:NETWORKING [GENERAL],
open list
Hi Kai-Heng,
Thank you for your patch.
Kai-Heng Feng <kai.heng.feng@canonical.com> writes:
> Commit 0ea9fd001a14 ("Bluetooth: Shutdown controller after workqueues
> are flushed or cancelled") introduced a regression that makes mtkbtsdio
> driver stops working:
> [ 36.593956] Bluetooth: hci0: Firmware already downloaded
> [ 46.814613] Bluetooth: hci0: Execution of wmt command timed out
> [ 46.814619] Bluetooth: hci0: Failed to send wmt func ctrl (-110)
>
> The shutdown callback depends on the result of hdev->rx_work, so we
> should call it before flushing rx_work:
> -> btmtksdio_shutdown()
> -> mtk_hci_wmt_sync()
> -> __hci_cmd_send()
> -> wait for BTMTKSDIO_TX_WAIT_VND_EVT gets cleared
>
> -> btmtksdio_recv_event()
> -> hci_recv_frame()
> -> queue_work(hdev->workqueue, &hdev->rx_work)
> -> clears BTMTKSDIO_TX_WAIT_VND_EVT
>
> So move the shutdown callback before flushing TX/RX queue to resolve the
> issue.
>
> Reported-and-tested-by: Mattijs Korpershoek <mkorpershoek@baylibre.com>
> Tested-by: Hsin-Yi Wang <hsinyi@chromium.org>
> Cc: Guenter Roeck <linux@roeck-us.net>
> Fixes: 0ea9fd001a14 ("Bluetooth: Shutdown controller after workqueues are flushed or cancelled")
> Signed-off-by: Kai-Heng Feng <kai.heng.feng@canonical.com>
> ---
> v2:
> Move the shutdown callback before clearing HCI_UP, otherwise 1)
> shutdown callback won't be called and 2) other routines that depend on
> HCI_UP won't work.
>
> net/bluetooth/hci_core.c | 16 ++++++++--------
> 1 file changed, 8 insertions(+), 8 deletions(-)
>
> diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c
> index cb2e9e513907..8622da2d9395 100644
> --- a/net/bluetooth/hci_core.c
> +++ b/net/bluetooth/hci_core.c
> @@ -1727,6 +1727,14 @@ int hci_dev_do_close(struct hci_dev *hdev)
> hci_request_cancel_all(hdev);
> hci_req_sync_lock(hdev);
>
> + if (!hci_dev_test_flag(hdev, HCI_UNREGISTER) &&
> + !hci_dev_test_flag(hdev, HCI_USER_CHANNEL) &&
> + test_bit(HCI_UP, &hdev->flags)) {
> + /* Execute vendor specific shutdown routine */
> + if (hdev->shutdown)
> + hdev->shutdown(hdev);
> + }
> +
> if (!test_and_clear_bit(HCI_UP, &hdev->flags)) {
> cancel_delayed_work_sync(&hdev->cmd_timer);
> hci_req_sync_unlock(hdev);
> @@ -1798,14 +1806,6 @@ int hci_dev_do_close(struct hci_dev *hdev)
> clear_bit(HCI_INIT, &hdev->flags);
> }
>
> - if (!hci_dev_test_flag(hdev, HCI_UNREGISTER) &&
> - !hci_dev_test_flag(hdev, HCI_USER_CHANNEL) &&
> - test_bit(HCI_UP, &hdev->flags)) {
> - /* Execute vendor specific shutdown routine */
> - if (hdev->shutdown)
> - hdev->shutdown(hdev);
> - }
> -
> /* flush cmd work */
> flush_work(&hdev->cmd_work);
I confirm this works fine on mt8183-pumpkin using the btmtksdio driver.
Tested-by: Mattijs Korpershoek <mkorpershoek@baylibre.com>
>
> --
> 2.31.1
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH v2] Bluetooth: Move shutdown callback before flushing tx and rx queue
2021-08-10 4:53 [PATCH v2] Bluetooth: Move shutdown callback before flushing tx and rx queue Kai-Heng Feng
2021-08-11 8:25 ` Mattijs Korpershoek
@ 2021-08-16 15:49 ` Marcel Holtmann
1 sibling, 0 replies; 3+ messages in thread
From: Marcel Holtmann @ 2021-08-16 15:49 UTC (permalink / raw)
To: Kai-Heng Feng
Cc: Johan Hedberg, Luiz Augusto von Dentz, Mattijs Korpershoek,
Hsin-Yi Wang, Guenter Roeck, David S. Miller, Jakub Kicinski,
open list:BLUETOOTH SUBSYSTEM, open list:NETWORKING [GENERAL],
open list
Hi Kai-Heng,
> Commit 0ea9fd001a14 ("Bluetooth: Shutdown controller after workqueues
> are flushed or cancelled") introduced a regression that makes mtkbtsdio
> driver stops working:
> [ 36.593956] Bluetooth: hci0: Firmware already downloaded
> [ 46.814613] Bluetooth: hci0: Execution of wmt command timed out
> [ 46.814619] Bluetooth: hci0: Failed to send wmt func ctrl (-110)
>
> The shutdown callback depends on the result of hdev->rx_work, so we
> should call it before flushing rx_work:
> -> btmtksdio_shutdown()
> -> mtk_hci_wmt_sync()
> -> __hci_cmd_send()
> -> wait for BTMTKSDIO_TX_WAIT_VND_EVT gets cleared
>
> -> btmtksdio_recv_event()
> -> hci_recv_frame()
> -> queue_work(hdev->workqueue, &hdev->rx_work)
> -> clears BTMTKSDIO_TX_WAIT_VND_EVT
>
> So move the shutdown callback before flushing TX/RX queue to resolve the
> issue.
>
> Reported-and-tested-by: Mattijs Korpershoek <mkorpershoek@baylibre.com>
> Tested-by: Hsin-Yi Wang <hsinyi@chromium.org>
> Cc: Guenter Roeck <linux@roeck-us.net>
> Fixes: 0ea9fd001a14 ("Bluetooth: Shutdown controller after workqueues are flushed or cancelled")
> Signed-off-by: Kai-Heng Feng <kai.heng.feng@canonical.com>
> ---
> v2:
> Move the shutdown callback before clearing HCI_UP, otherwise 1)
> shutdown callback won't be called and 2) other routines that depend on
> HCI_UP won't work.
>
> net/bluetooth/hci_core.c | 16 ++++++++--------
> 1 file changed, 8 insertions(+), 8 deletions(-)
patch has been applied to bluetooth-next tree.
Regards
Marcel
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2021-08-16 15:51 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-08-10 4:53 [PATCH v2] Bluetooth: Move shutdown callback before flushing tx and rx queue Kai-Heng Feng
2021-08-11 8:25 ` Mattijs Korpershoek
2021-08-16 15:49 ` Marcel Holtmann
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).