Re: [PATCH v5] Bluetooth: btusb: mediatek: fix WMT failure during runtime suspend

From: Sean Wang
Date: Wed Aug 31 2022 - 19:16:45 EST


Hi Luiz,

If the patch looks good to you, could you help apply the patch to
bluetooth.git? It can fix the issue present in the stable kernel, I
would like to backport it earlier once it appears in the Linus tree.

Sean

On Wed, Aug 10, 2022 at 5:59 PM <sean.wang@xxxxxxxxxxxx> wrote:
>
> From: Sean Wang <sean.wang@xxxxxxxxxxxx>
>
> WMT cmd/event doesn't follow up the generic HCI cmd/event handling, it
> needs constantly polling control pipe until the host received the WMT
> event, thus, we should require to specifically acquire PM counter on the
> USB to prevent the interface from entering auto suspended while WMT
> cmd/event in progress.
>
> Fixes: a1c49c434e15 ("Bluetooth: btusb: Add protocol support for MediaTek
> MT7668U USB devices")
> Co-developed-by: Jing Cai <jing.cai@xxxxxxxxxxxx>
> Signed-off-by: Jing Cai <jing.cai@xxxxxxxxxxxx>
> Signed-off-by: Sean Wang <sean.wang@xxxxxxxxxxxx>
> ---
> v2:
> 1. move usb_autopm_[get, put]_interface to btusb_mtk_hci_wmt_sync whenever
> wmt cmd is invoked.
> 2. add the explanation why we needed the specific
> usb_autopm_[get, put]_interface there.
>
> v3: correct the version and there is no logic changed
> v4: fix GitLint fail due to Title exceeds max length
> v5: rebase to fix patches does not apply
> ---
> drivers/bluetooth/btusb.c | 14 ++++++++++++++
> 1 file changed, 14 insertions(+)
>
> diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c
> index 30dd443f395f..70d61bb4a053 100644
> --- a/drivers/bluetooth/btusb.c
> +++ b/drivers/bluetooth/btusb.c
> @@ -2480,15 +2480,29 @@ static int btusb_mtk_hci_wmt_sync(struct hci_dev *hdev,
>
> set_bit(BTUSB_TX_WAIT_VND_EVT, &data->flags);
>
> + /* WMT cmd/event doesn't follow up the generic HCI cmd/event handling,
> + * it needs constantly polling control pipe until the host received the
> + * WMT event, thus, we should require to specifically acquire PM counter
> + * on the USB to prevent the interface from entering auto suspended
> + * while WMT cmd/event in progress.
> + */
> + err = usb_autopm_get_interface(data->intf);
> + if (err < 0)
> + goto err_free_wc;
> +
> err = __hci_cmd_send(hdev, 0xfc6f, hlen, wc);
>
> if (err < 0) {
> clear_bit(BTUSB_TX_WAIT_VND_EVT, &data->flags);
> + usb_autopm_put_interface(data->intf);
> goto err_free_wc;
> }
>
> /* Submit control IN URB on demand to process the WMT event */
> err = btusb_mtk_submit_wmt_recv_urb(hdev);
> +
> + usb_autopm_put_interface(data->intf);
> +
> if (err < 0)
> goto err_free_wc;
>
> --
> 2.25.1
>