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

Sean Wang sean.wang at kernel.org
Wed Aug 31 16:15:17 PDT 2022


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 at mediatek.com> wrote:
>
> From: Sean Wang <sean.wang at mediatek.com>
>
> 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 at mediatek.com>
> Signed-off-by: Jing Cai <jing.cai at mediatek.com>
> Signed-off-by: Sean Wang <sean.wang at mediatek.com>
> ---
> 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
>



More information about the Linux-mediatek mailing list