Sorry, messed up with my mailer -- retrying
usb: introduce usb_reenumerate_device()
This function implements a logical reset which will cause the device
to be reenumerated in the USB stack, without physically being
disconnected from the bus.
This is useful for device-firmware-upload cases where we can't use
usb_reset_device() as it would bring the device back to full reset
state.
Signed-off-by: Inaky Perez-Gonzalez <[EMAIL PROTECTED]>
---
drivers/usb/core/hub.c | 33 +++++++++++++++++++++++++++++++++
include/linux/usb.h | 1 +
2 files changed, 34 insertions(+)
Index: linux.cg/drivers/usb/core/hub.c
===================================================================
--- linux.cg.orig/drivers/usb/core/hub.c 2006-09-07 15:04:14.000000000
-0700
+++ linux.cg/drivers/usb/core/hub.c 2006-09-07 15:05:06.000000000 -0700
@@ -3075,3 +3075,36 @@
return ret;
}
EXPORT_SYMBOL(usb_reset_composite_device);
+
+
+/**
+ * usb_reenumerate_device - Reenumerate a USB device
+ *
+ * @usb_dev: USB device that needs to be reset.
+ *
+ * Disconnects the device from the USB bus (without physically doing
+ * so), forcing a reenumearation. This is useful for
+ * device-firmware-upload cases where we can't use usb_reset_device()
+ * as it would bring the device back to full reset state.
+ */
+int usb_reenumerate_device(struct usb_device *usb_dev)
+{
+ struct usb_device *parent_hdev = usb_dev->parent;
+ struct usb_hub *parent_hub;
+
+ if (usb_dev->state == USB_STATE_NOTATTACHED ||
+ usb_dev->state == USB_STATE_SUSPENDED) {
+ dev_dbg(&usb_dev->dev,
+ "device reenumeration not allowed in state %d\n",
+ usb_dev->state);
+ return -EINVAL;
+ }
+ if (!parent_hdev) {
+ /* this requires hcd-specific logic; see OHCI hc_restart() */
+ dev_dbg(&udev->dev, "%s for root hub!\n", __FUNCTION__);
+ return -EISDIR;
+ }
+ parent_hub = hdev_to_hub(parent_hdev);
+ hub_port_logical_disconnect(parent_hub, usb_dev->portnum);
+}
+EXPORT_SYMBOL_GPL(usb_reenumerate_device);
Index: linux.cg/include/linux/usb.h
===================================================================
--- linux.cg.orig/include/linux/usb.h 2006-09-07 15:04:14.000000000 -0700
+++ linux.cg/include/linux/usb.h 2006-09-07 15:05:06.000000000 -0700
@@ -406,6 +406,7 @@
extern int usb_reset_device(struct usb_device *dev);
extern int usb_reset_composite_device(struct usb_device *dev,
struct usb_interface *iface);
+extern int usb_reenumerate_device(struct usb_device *usb_dev);
extern struct usb_device *usb_find_device(u16 vendor_id, u16 product_id);
-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
[email protected]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel