Hi Paul, On Tue, 4 Oct 2022 at 17:18, Paul Menzel <pmenzel@xxxxxxxxxxxxx> wrote: > > Dear Archie, > > > Thank you for the patch. > > Am 04.10.22 um 10:32 schrieb Archie Pusaka: > > From: Archie Pusaka <apusaka@xxxxxxxxxxxx> > > > > On cmd_timeout and there is no reset_gpio, reset the USB port as a > > Maybe: > > s/there is no/with no/g > > > last resort. > > Can you please document your test setup, and also mention that you > change the behavior of: > > 1. btusb_intel_cmd_timeout > 2. btusb_rtl_cmd_timeout > > […] > > > Kind regards, > > Paul Thanks for the input! All done, uploaded v2. PTAL, thanks! > > > > Signed-off-by: Archie Pusaka <apusaka@xxxxxxxxxxxx> > > Reviewed-by: Abhishek Pandit-Subedi <abhishekpandit@xxxxxxxxxx> > > Reviewed-by: Ying Hsu <yinghsu@xxxxxxxxxxxx> > > > > --- > > > > drivers/bluetooth/btusb.c | 26 ++++++++++++++++---------- > > 1 file changed, 16 insertions(+), 10 deletions(-) > > > > diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c > > index 271963805a38..11040124ef79 100644 > > --- a/drivers/bluetooth/btusb.c > > +++ b/drivers/bluetooth/btusb.c > > @@ -696,6 +696,19 @@ struct btusb_data { > > unsigned cmd_timeout_cnt; > > }; > > > > +static void generic_usb_reset(struct hci_dev *hdev, struct btusb_data *data) > > +{ > > + int err; > > + > > + bt_dev_err(hdev, "Resetting usb device."); > > + /* This is not an unbalanced PM reference since the device will reset */ > > + err = usb_autopm_get_interface(data->intf); > > + if (!err) > > + usb_queue_reset_device(data->intf); > > + else > > + bt_dev_err(hdev, "Failed usb_autopm_get_interface: %d", err); > > +} > > + > > static void btusb_intel_cmd_timeout(struct hci_dev *hdev) > > { > > struct btusb_data *data = hci_get_drvdata(hdev); > > @@ -705,7 +718,7 @@ static void btusb_intel_cmd_timeout(struct hci_dev *hdev) > > return; > > > > if (!reset_gpio) { > > - bt_dev_err(hdev, "No way to reset. Ignoring and continuing"); > > + generic_usb_reset(hdev, data); > > return; > > } > > > > @@ -736,7 +749,7 @@ static void btusb_rtl_cmd_timeout(struct hci_dev *hdev) > > return; > > > > if (!reset_gpio) { > > - bt_dev_err(hdev, "No gpio to reset Realtek device, ignoring"); > > + generic_usb_reset(hdev, data); > > return; > > } > > > > @@ -761,7 +774,6 @@ static void btusb_qca_cmd_timeout(struct hci_dev *hdev) > > { > > struct btusb_data *data = hci_get_drvdata(hdev); > > struct gpio_desc *reset_gpio = data->reset_gpio; > > - int err; > > > > if (++data->cmd_timeout_cnt < 5) > > return; > > @@ -787,13 +799,7 @@ static void btusb_qca_cmd_timeout(struct hci_dev *hdev) > > return; > > } > > > > - bt_dev_err(hdev, "Multiple cmd timeouts seen. Resetting usb device."); > > - /* This is not an unbalanced PM reference since the device will reset */ > > - err = usb_autopm_get_interface(data->intf); > > - if (!err) > > - usb_queue_reset_device(data->intf); > > - else > > - bt_dev_err(hdev, "Failed usb_autopm_get_interface with %d", err); > > + generic_usb_reset(hdev, data); > > } > > > > static inline void btusb_free_frags(struct btusb_data *data) Cheers, Archie