On Mon, May 02, 2022 at 09:07:58AM +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, so a new quirk > has been created for this device. > > 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. > --- > drivers/usb/core/generic.c | 3 ++- > drivers/usb/core/quirks.c | 3 +++ > include/linux/usb/quirks.h | 3 +++ > 3 files changed, 8 insertions(+), 1 deletion(-) > > diff --git a/drivers/usb/core/generic.c b/drivers/usb/core/generic.c > index 740342a2812a..ea770b83d876 100644 > --- a/drivers/usb/core/generic.c > +++ b/drivers/usb/core/generic.c > @@ -22,6 +22,7 @@ > #include <linux/usb.h> > #include <linux/usb/hcd.h> > #include <uapi/linux/usb/audio.h> > +#include <linux/usb/quirks.h> Shouldn't that be above the uapi include? > #include "usb.h" > > static inline const char *plural(int n) > @@ -256,7 +257,7 @@ void usb_generic_driver_disconnect(struct usb_device *udev) > > /* if this is only an unbind, not a physical disconnect, then > * unconfigure the device */ > - if (udev->actconfig) > + if (!(udev->quirks & USB_QUIRK_SKIP_UNCONFIGURE) && udev->actconfig) > usb_set_configuration(udev, -1); > } > > diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c > index d3c14b5ed4a1..13989629d743 100644 > --- a/drivers/usb/core/quirks.c > +++ b/drivers/usb/core/quirks.c > @@ -510,6 +510,9 @@ static const struct usb_device_id usb_quirk_list[] = { > /* INTEL VALUE SSD */ > { USB_DEVICE(0x8086, 0xf1a5), .driver_info = USB_QUIRK_RESET_RESUME }, > > + /* CSR Bluetooth */ > + { USB_DEVICE(0x0a12, 0x0001), .driver_info = USB_QUIRK_SKIP_UNCONFIGURE }, Please read the big comment at the top of this list of entries. It says it must be in sorder order, which this is not :( thanks, greg k-h