Re: [PATCH] Bluetooth: btusb: Avoid unnecessary reset upon system resume

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

 



Hi Abhishek,

> On September 25, 2020 at 11:34, Abhishek Pandit-Subedi wrote:
> 
> + Alex Lu (who contributed the original change)
> 
> Hi Kai-Heng,
> 
> 
> On Thu, Sep 24, 2020 at 12:10 AM Kai-Heng Feng
> <kai.heng.feng@xxxxxxxxxxxxx> wrote:
> >
> > [+Cc linux-usb]
> >
> > Hi Abhishek,
> >
> > > On Sep 24, 2020, at 04:41, Abhishek Pandit-Subedi
> <abhishekpandit@xxxxxxxxxxxx> wrote:
> > >
> > > Hi Kai-Heng,
> > >
> > > Which Realtek controller is this on?'
> >
> > The issue happens on 8821CE.
> >
> > >
> > > Specifically for RTL8822CE, we tested without reset_resume being set
> > > and that was causing the controller being reset without bluez ever
> > > learning about it (resulting in devices being unusable without
> > > toggling the BT power).
> >
> > The reset is done by the kernel, so how does that affect bluez?
> >
> > From what you described, it sounds more like runtime resume since bluez
> is already running.
> > If we need reset resume for runtime resume, maybe it's another bug
> which needs to be addressed?
> 
> From btusb.c:
> https://git.kernel.org/pub/scm/linux/kernel/git/bluetooth/bluetooth-
> next.git/tree/drivers/bluetooth/btusb.c#n4189
> /* Realtek devices lose their updated firmware over global
> * suspend that means host doesn't send SET_FEATURE
> * (DEVICE_REMOTE_WAKEUP)
> */
> 
> Runtime suspend always requires remote wakeup to be set and reset
> resume isn't used there.
> 
> During system suspend, when remote wakeup is not set, RTL8822CE loses
> the FW loaded by the driver and any state currently in the controller.
> This causes the kernel and the controller state to go out of sync.
> One of the issues we observed on the Realtek controller without the
> reset resume quirk was that paired or connected devices would just
> stop working after resume.
> 
> >
> > > If the firmware doesn't cut off power during suspend, maybe you
> > > shouldn't set the BTUSB_WAKEUP_DISABLE flag for that controller.
> >
> > We don't know beforehand if the platform firmware (BIOS for my case) will
> cut power off or not.
> >
> > In general, laptops will cut off the USB power during S3.
> > When AC is plugged, some laptops cuts USB power off and some don't. This
> also applies to many desktops. Not to mention there can be BIOS options to
> control USB power under S3/S4/S5...
> >
> > So we don't know beforehand.
> >
> 
> I think the confusion here stems from what is actually being turned
> off between our two boards and what we're referring to as firmware :)
> 
> In your case, the Realtek controller retains firmware unless the
> platform cuts of power to USB (which it does during S3).
> In my case, the Realtek controller loses firmware when Remote Wakeup
> isn't set, even if the platform doesn't cut power to USB.
> 
> In your case, since you don't need to enforce the 'Remote Wakeup' bit,
> if you unset the BTUSB_WAKEUP_DISABLE for that VID:PID, you should get
> the desirable behavior (which is actually the default behavior; remote
> wake will always be asserted instead of only during Runtime Suspend).
> 
> @Alex -- What is the common behavior for Realtek controllers? Should
> we set BTUSB_WAKEUP_DISABLE only on RTL8822CE or should we unset it
> only on RTL8821CE?
> 

According to the feedback from our firmware engineers, all Realtek controllers should have the same behavior on suspend and resume.
@ Kai-Heng, " Bluetooth: hci0: command 0x1001 tx timeout " is irrelevant to firmware loss or not. The rom code in controller supports this command.

> > >
> > > I would prefer this doesn't get accepted in its current state.
> >
> > Of course.
> > I think we need to find the root cause for your case before applying this
> one.
> >
> > Kai-Heng
> >
> > >
> > > Abhishek
> > >
> > > On Wed, Sep 23, 2020 at 10:56 AM Kai-Heng Feng
> > > <kai.heng.feng@xxxxxxxxxxxxx> wrote:
> > >>
> > >> Realtek bluetooth controller may fail to work after system sleep:
> > >> [ 1272.707670] Bluetooth: hci0: command 0x1001 tx timeout
> > >> [ 1280.835712] Bluetooth: hci0: RTL: HCI_OP_READ_LOCAL_VERSION
> failed (-110)
> > >>
> > >> If platform firmware doesn't cut power off during suspend, the
> firmware
> > >> is considered retained in controller but the driver is still asking USB
> > >> core to perform a reset-resume. This can make bluetooth controller
> > >> unusable.
> > >>
> > >> So avoid unnecessary reset to resolve the issue.
> > >>
> > >> For devices that really lose power during suspend, USB core will detect
> > >> and handle reset-resume correctly.
> > >>
> > >> Signed-off-by: Kai-Heng Feng <kai.heng.feng@xxxxxxxxxxxxx>
> > >> ---
> > >> drivers/bluetooth/btusb.c | 8 +++-----
> > >> 1 file changed, 3 insertions(+), 5 deletions(-)
> > >>
> > >> diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c
> > >> index 8d2608ddfd08..de86ef4388f9 100644
> > >> --- a/drivers/bluetooth/btusb.c
> > >> +++ b/drivers/bluetooth/btusb.c
> > >> @@ -4255,17 +4255,15 @@ static int btusb_suspend(struct
> usb_interface *intf, pm_message_t message)
> > >>                enable_irq(data->oob_wake_irq);
> > >>        }
> > >>
> > >> -       /* For global suspend, Realtek devices lose the loaded fw
> > >> -        * in them. But for autosuspend, firmware should remain.
> > >> -        * Actually, it depends on whether the usb host sends
> > >> +       /* For global suspend, Realtek devices lose the loaded fw in them if
> > >> +        * platform firmware cut power off. But for autosuspend, firmware
> > >> +        * should remain.  Actually, it depends on whether the usb host
> sends
> > >>         * set feature (enable wakeup) or not.
> > >>         */
> > >>        if (test_bit(BTUSB_WAKEUP_DISABLE, &data->flags)) {
> > >>                if (PMSG_IS_AUTO(message) &&
> > >>                    device_can_wakeup(&data->udev->dev))
> > >>                        data->udev->do_remote_wakeup = 1;
> > >> -               else if (!PMSG_IS_AUTO(message))
> > >> -                       data->udev->reset_resume = 1;
> > >>        }
> > >>
> > >>        return 0;
> > >> --
> > >> 2.17.1
> > >>
> >
> 




[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