Re: [PATCH] Bluetooth: btusb: CSR chip hangs when unbound

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

 



On Fri, Apr 29, 2022 at 05:31:38PM +0200, Jose Ignacio Tornos Martinez wrote:
> Bluetooth Dongles with CSR chip (i.e. USB Bluetooth V4.0 Dongle by
> Trust) hang when they are unbound from 'unbind' sysfs entry and
> can not be bound again.
> 
> The reason is CSR chip hangs when usb configuration command with
> index 0 (used to unconfigure) is sent during disconnection.
> 
> To avoid this unwanted result, it is necessary not to send this
> command for CSR chip when usb device is unbound.
> Besides, "skip_unconfigure" sysfs entry has been created for
> testing purposes with these or other devices.

I don't see any good reason for adding this sysfs entry.  Normal users 
won't want to do it, and developers can add their own quirks to their 
kernels.  Also, see below.

> Athough device is not unconfigured, it is better to avoid device
> hanging to be able to operate. Even bluetooth can be previously
> turned off.
> On the other hand, this is not important if usb device is going to
> be bound again (normal behavior), i.e. with usbip.
> 
> Signed-off-by: Jose Ignacio Tornos Martinez <jtornosm@xxxxxxxxxx>
> ---
>  drivers/bluetooth/btusb.c  |  8 +++++++-
>  drivers/usb/core/generic.c |  2 +-
>  drivers/usb/core/sysfs.c   | 36 ++++++++++++++++++++++++++++++++++++
>  include/linux/usb.h        |  2 ++
>  4 files changed, 46 insertions(+), 2 deletions(-)
> 
> diff --git a/include/linux/usb.h b/include/linux/usb.h
> index 86a73d834e38..55828cd0a0d1 100644
> --- a/include/linux/usb.h
> +++ b/include/linux/usb.h
> @@ -618,6 +618,7 @@ struct usb3_lpm_parameters {
>   *	parent->hub_delay + wHubDelay + tTPTransmissionDelay (40ns)
>   *	Will be used as wValue for SetIsochDelay requests.
>   * @use_generic_driver: ask driver core to reprobe using the generic driver.
> + * @skip_unconfigure: disable unconfigure operation for devices without support.
>   *
>   * Notes:
>   * Usbcore drivers should not set usbdev->state directly.  Instead use
> @@ -704,6 +705,7 @@ struct usb_device {
>  
>  	u16 hub_delay;
>  	unsigned use_generic_driver:1;
> +	unsigned skip_unconfigure:1;
>  };
>  #define	to_usb_device(d) container_of(d, struct usb_device, dev)

This is not a good way to do it.  Instead you should create a new USB 
device quirk bit.  An advantage of this is that there is already a 
mechanism for users to manually set a quirk flag for a device (the 
"quirks" sysfs module file).

Alan Stern



[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux