aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlan Stern <stern@rowland.harvard.edu>2007-08-08 11:59:18 -0400
committerGreg Kroah-Hartman <gregkh@suse.de>2007-10-12 17:55:10 -0400
commitd74d4a69dc1cc7ddc0eabb9c9f1e45005e2984eb (patch)
treea1a8465235c4ea6951100e9d8ce24ae63b481399
parente9df41c5c5899259541dc928872cad4d07b82076 (diff)
USB: don't touch sysfs stuff when altsetting is unchanged
This patch (as955) prevents the interface-related sysfs files and endpoint pseudo-devices from being deleted and recreated when a call to usb_set_interface() specifies the current altsetting. Since the altsetting doesn't get changed, there's no need to do anything. Furthermore, avoiding changes to the endpoint devices will be necessary in the future. This code is called from usb_reset_device(), which gets invoked for reset-resume processing, but upcoming changes to the PM and driver cores will make it impossible to register devices while a suspend/resume transition is in progress. Since we don't need to re-register those endpoint devices anyhow, it's best to skip the whole thing. Signed-off-by: Alan Stern <stern@rowland.harvard.edu> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-rw-r--r--drivers/usb/core/message.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/drivers/usb/core/message.c b/drivers/usb/core/message.c
index c905b35d4f85..d638375e22e7 100644
--- a/drivers/usb/core/message.c
+++ b/drivers/usb/core/message.c
@@ -1173,6 +1173,7 @@ int usb_set_interface(struct usb_device *dev, int interface, int alternate)
1173 struct usb_host_interface *alt; 1173 struct usb_host_interface *alt;
1174 int ret; 1174 int ret;
1175 int manual = 0; 1175 int manual = 0;
1176 int changed;
1176 1177
1177 if (dev->state == USB_STATE_SUSPENDED) 1178 if (dev->state == USB_STATE_SUSPENDED)
1178 return -EHOSTUNREACH; 1179 return -EHOSTUNREACH;
@@ -1212,7 +1213,8 @@ int usb_set_interface(struct usb_device *dev, int interface, int alternate)
1212 */ 1213 */
1213 1214
1214 /* prevent submissions using previous endpoint settings */ 1215 /* prevent submissions using previous endpoint settings */
1215 if (device_is_registered(&iface->dev)) 1216 changed = (iface->cur_altsetting != alt);
1217 if (changed && device_is_registered(&iface->dev))
1216 usb_remove_sysfs_intf_files(iface); 1218 usb_remove_sysfs_intf_files(iface);
1217 usb_disable_interface(dev, iface); 1219 usb_disable_interface(dev, iface);
1218 1220
@@ -1249,7 +1251,7 @@ int usb_set_interface(struct usb_device *dev, int interface, int alternate)
1249 * (Likewise, EP0 never "halts" on well designed devices.) 1251 * (Likewise, EP0 never "halts" on well designed devices.)
1250 */ 1252 */
1251 usb_enable_interface(dev, iface); 1253 usb_enable_interface(dev, iface);
1252 if (device_is_registered(&iface->dev)) 1254 if (changed && device_is_registered(&iface->dev))
1253 usb_create_sysfs_intf_files(iface); 1255 usb_create_sysfs_intf_files(iface);
1254 1256
1255 return 0; 1257 return 0;