aboutsummaryrefslogtreecommitdiff
path: root/drivers/usb/core
diff options
context:
space:
mode:
authorDavid Brownell <david-b@pacbell.net>2005-04-18 17:39:25 -0700
committerGreg K-H <gregkh@suse.de>2005-04-18 17:39:25 -0700
commita81e7ecca369afee0b07b4758d8c32542ffc587a (patch)
tree6abfa1d3a86f3a4f355e9dd11e6c8ee158a0202b /drivers/usb/core
parent45f23f189ca66d98b1f8b7f3d30a194d3188039d (diff)
[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>
Diffstat (limited to 'drivers/usb/core')
-rw-r--r--drivers/usb/core/message.c25
1 files changed, 4 insertions, 21 deletions
diff --git a/drivers/usb/core/message.c b/drivers/usb/core/message.c
index 40bdb38e7bc..e12c5be1e0a 100644
--- a/drivers/usb/core/message.c
+++ b/drivers/usb/core/message.c
@@ -1133,29 +1133,10 @@ int usb_set_interface(struct usb_device *dev, int interface, int alternate)
/* prevent submissions using previous endpoint settings */
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;
/* If the interface only has one altsetting and the device didn't
- * accept the request (or whenever the old altsetting is the same
- * as the new one), we attempt to carry out the equivalent action
+ * accept the request, we attempt to carry out the equivalent action
* by manually clearing the HALT feature for each endpoint in the
* 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
* (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.
*
* The caller must own the device lock.