Please disregard this earlier email without the Fixes tag. On Wed, Aug 26, 2020 at 3:26 PM Abhishek Pandit-Subedi <abhishekpandit@xxxxxxxxxxxx> wrote: > > While unregistering, make sure to clear the suspend tasks before > cancelling the work. If the unregister is called during resume from > suspend, this will unnecessarily add 2s to the resume time otherwise. > > Signed-off-by: Abhishek Pandit-Subedi <abhishekpandit@xxxxxxxxxxxx> > --- > This was discovered with RT8822CE using the btusb driver. This chipset > will reset on resume during system suspend and was unnecessarily adding > 2s to every resume. Since we're unregistering anyway, there's no harm in > just clearing the pending events. > > net/bluetooth/hci_core.c | 11 +++++++++++ > 1 file changed, 11 insertions(+) > > diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c > index 68bfe57b66250f..ed4cb3479433c0 100644 > --- a/net/bluetooth/hci_core.c > +++ b/net/bluetooth/hci_core.c > @@ -3442,6 +3442,16 @@ void hci_copy_identity_address(struct hci_dev *hdev, bdaddr_t *bdaddr, > } > } > > +static void hci_suspend_clear_tasks(struct hci_dev *hdev) > +{ > + int i; > + > + for (i = 0; i < __SUSPEND_NUM_TASKS; ++i) > + clear_bit(i, hdev->suspend_tasks); > + > + wake_up(&hdev->suspend_wait_q); > +} > + > static int hci_suspend_wait_event(struct hci_dev *hdev) > { > #define WAKE_COND \ > @@ -3785,6 +3795,7 @@ void hci_unregister_dev(struct hci_dev *hdev) > cancel_work_sync(&hdev->power_on); > > unregister_pm_notifier(&hdev->suspend_notifier); > + hci_suspend_clear_tasks(hdev); > cancel_work_sync(&hdev->suspend_prepare); > > hci_dev_do_close(hdev); > -- > 2.28.0.297.g1956fa8f8d-goog >