Re: [PATCH 5.15 regression fix] Bluetooth: hci_h5: Fix (runtime)suspend issues on RTL8723BS HCIs

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Hans,

On Mon, 20 Sept 2021 at 20:57, Hans de Goede <hdegoede@xxxxxxxxxx> wrote:
>
> The recently added H5_WAKEUP_DISABLE h5->flags flag gets checked in
> h5_btrtl_open(), but it gets set in h5_serdev_probe() *after*
> calling  hci_uart_register_device() and thus after h5_btrtl_open()
> is called, set this flag earlier.
>
> Also on devices where suspend/resume involves fully re-probing the HCI,
> runtime-pm suspend should not be used, make the runtime-pm setup
> conditional on the H5_WAKEUP_DISABLE flag too.
>
> This fixes the HCI being removed and then re-added every 10 seconds
> because it was being reprobed as soon as it was runtime-suspended.
>
> Cc: Archie Pusaka <apusaka@xxxxxxxxxxxx>
> Fixes: 66f077dde749 ("Bluetooth: hci_h5: add WAKEUP_DISABLE flag")
> Fixes: d9dd833cf6d2 ("Bluetooth: hci_h5: Add runtime suspend")
> Signed-off-by: Hans de Goede <hdegoede@xxxxxxxxxx>

You are correct, I should have checked H5_WAKEUP_DISABLE before using
autosuspend.

Reviewed-by: Archie Pusaka <apusaka@xxxxxxxxxxxx>

> ---
>  drivers/bluetooth/hci_h5.c | 20 +++++++++++---------
>  1 file changed, 11 insertions(+), 9 deletions(-)
>
> diff --git a/drivers/bluetooth/hci_h5.c b/drivers/bluetooth/hci_h5.c
> index 0c0dedece59c..59b712742d33 100644
> --- a/drivers/bluetooth/hci_h5.c
> +++ b/drivers/bluetooth/hci_h5.c
> @@ -846,6 +846,8 @@ static int h5_serdev_probe(struct serdev_device *serdev)
>                 h5->vnd = data->vnd;
>         }
>
> +       if (data->driver_info & H5_INFO_WAKEUP_DISABLE)
> +               set_bit(H5_WAKEUP_DISABLE, &h5->flags);
>
>         h5->enable_gpio = devm_gpiod_get_optional(dev, "enable", GPIOD_OUT_LOW);
>         if (IS_ERR(h5->enable_gpio))
> @@ -860,9 +862,6 @@ static int h5_serdev_probe(struct serdev_device *serdev)
>         if (err)
>                 return err;
>
> -       if (data->driver_info & H5_INFO_WAKEUP_DISABLE)
> -               set_bit(H5_WAKEUP_DISABLE, &h5->flags);
> -

We can simplify by just returning err and not check its value.

>         return 0;
>  }
>
> @@ -962,11 +961,13 @@ static void h5_btrtl_open(struct h5 *h5)
>         serdev_device_set_parity(h5->hu->serdev, SERDEV_PARITY_EVEN);
>         serdev_device_set_baudrate(h5->hu->serdev, 115200);
>
> -       pm_runtime_set_active(&h5->hu->serdev->dev);
> -       pm_runtime_use_autosuspend(&h5->hu->serdev->dev);
> -       pm_runtime_set_autosuspend_delay(&h5->hu->serdev->dev,
> -                                        SUSPEND_TIMEOUT_MS);
> -       pm_runtime_enable(&h5->hu->serdev->dev);
> +       if (!test_bit(H5_WAKEUP_DISABLE, &h5->flags)) {
> +               pm_runtime_set_active(&h5->hu->serdev->dev);
> +               pm_runtime_use_autosuspend(&h5->hu->serdev->dev);
> +               pm_runtime_set_autosuspend_delay(&h5->hu->serdev->dev,
> +                                                SUSPEND_TIMEOUT_MS);
> +               pm_runtime_enable(&h5->hu->serdev->dev);
> +       }
>
>         /* The controller needs up to 500ms to wakeup */
>         gpiod_set_value_cansleep(h5->enable_gpio, 1);
> @@ -976,7 +977,8 @@ static void h5_btrtl_open(struct h5 *h5)
>
>  static void h5_btrtl_close(struct h5 *h5)
>  {
> -       pm_runtime_disable(&h5->hu->serdev->dev);
> +       if (!test_bit(H5_WAKEUP_DISABLE, &h5->flags))
> +               pm_runtime_disable(&h5->hu->serdev->dev);
>
>         gpiod_set_value_cansleep(h5->device_wake_gpio, 0);
>         gpiod_set_value_cansleep(h5->enable_gpio, 0);
> --
> 2.31.1
>

Thanks,
Archie



[Index of Archives]     [Bluez Devel]     [Linux Wireless Networking]     [Linux Wireless Personal Area Networking]     [Linux ATH6KL]     [Linux USB Devel]     [Linux Media Drivers]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Big List of Linux Books]

  Powered by Linux