[PATCH] USB: revert "fix" to usb_set_interface()
This reverts a recent change to usb_set_interface(). The change worked around a quirk in certain devices, but doing this in usbcore creates needless regressions for other devices. More appropriate fixes won't put such handling in usbcore. Basically it's tricky to do a full software reset of USB device state, since the devices don't all act the same. This adds a note to the kerneldoc for the usb_reset_configuration() call to highlight the quirk this was working around: endpoint data toggles not being reset. Signed-off-by: David Brownell <dbrownell@users.sourceforge.net> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
Родитель
45f23f189c
Коммит
a81e7ecca3
|
@ -1133,29 +1133,10 @@ int usb_set_interface(struct usb_device *dev, int interface, int alternate)
|
||||||
/* prevent submissions using previous endpoint settings */
|
/* prevent submissions using previous endpoint settings */
|
||||||
usb_disable_interface(dev, iface);
|
usb_disable_interface(dev, iface);
|
||||||
|
|
||||||
/* 9.1.1.5 says:
|
|
||||||
*
|
|
||||||
* Configuring a device or changing an alternate setting
|
|
||||||
* causes all of the status and configuration values
|
|
||||||
* associated with endpoints in the affected interfaces to
|
|
||||||
* be set to their default values. This includes setting
|
|
||||||
* the data toggle of any endpoint using data toggles to
|
|
||||||
* the value DATA0.
|
|
||||||
*
|
|
||||||
* Some devices take this too literally and don't reset the data
|
|
||||||
* toggles if the new altsetting is the same as the old one (the
|
|
||||||
* command isn't "changing" an alternate setting). We will manually
|
|
||||||
* reset the toggles when the new and old altsettings are the same.
|
|
||||||
* Most devices won't need this, but fortunately it doesn't happen
|
|
||||||
* often.
|
|
||||||
*/
|
|
||||||
if (iface->cur_altsetting == alt)
|
|
||||||
manual = 1;
|
|
||||||
iface->cur_altsetting = alt;
|
iface->cur_altsetting = alt;
|
||||||
|
|
||||||
/* If the interface only has one altsetting and the device didn't
|
/* If the interface only has one altsetting and the device didn't
|
||||||
* accept the request (or whenever the old altsetting is the same
|
* accept the request, we attempt to carry out the equivalent action
|
||||||
* as the new one), we attempt to carry out the equivalent action
|
|
||||||
* by manually clearing the HALT feature for each endpoint in the
|
* by manually clearing the HALT feature for each endpoint in the
|
||||||
* new altsetting.
|
* new altsetting.
|
||||||
*/
|
*/
|
||||||
|
@ -1202,7 +1183,9 @@ int usb_set_interface(struct usb_device *dev, int interface, int alternate)
|
||||||
*
|
*
|
||||||
* Because this affects multiple interfaces, avoid using this with composite
|
* Because this affects multiple interfaces, avoid using this with composite
|
||||||
* (multi-interface) devices. Instead, the driver for each interface may
|
* (multi-interface) devices. Instead, the driver for each interface may
|
||||||
* use usb_set_interface() on the interfaces it claims. Resetting the whole
|
* use usb_set_interface() on the interfaces it claims. Be careful though;
|
||||||
|
* some devices don't support the SET_INTERFACE request, and others won't
|
||||||
|
* reset all the interface state (notably data toggles). Resetting the whole
|
||||||
* configuration would affect other drivers' interfaces.
|
* configuration would affect other drivers' interfaces.
|
||||||
*
|
*
|
||||||
* The caller must own the device lock.
|
* The caller must own the device lock.
|
||||||
|
|
Загрузка…
Ссылка в новой задаче