Re: [PATCH] Bluetooth: btusb: Avoid unnecessary reset upon system resume
From: Kai-Heng Feng
Date: Fri Sep 25 2020 - 02:47:27 EST
> On Sep 25, 2020, at 14:40, 陆朱伟 <alex_lu@xxxxxxxxxxxxxx> wrote:
>
> 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.
Does USB warm-reset affect the Bluetooth controller?
Kai-Heng
>
>>>>
>>>> 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