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