ChangeSet 1.1843.4.13, 2004/08/24 11:54:54-07:00, [EMAIL PROTECTED]

[PATCH] USB OTG: add usb_bus_start_enum() (1/5)

Define a new usb_bus_start_enum() routine that's available with OTG.
It starts immediate enumeration (port reset) and makes khubd wake up
later.  Non-OTG code could start to use this, given some attention to
HC-specific reset timing issues.

Signed-off-by: David Brownell <[EMAIL PROTECTED]>
Signed-off-by: Greg Kroah-Hartman <[EMAIL PROTECTED]>


 drivers/usb/core/hcd.c  |   39 +++++++++++++++++++++++++++++++++++++++
 drivers/usb/core/hcd.h  |    1 +
 include/linux/usb_otg.h |    2 ++
 3 files changed, 42 insertions(+)


diff -Nru a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c
--- a/drivers/usb/core/hcd.c    2004-08-26 16:42:39 -07:00
+++ b/drivers/usb/core/hcd.c    2004-08-26 16:42:39 -07:00
@@ -1404,6 +1404,45 @@
 
 /*-------------------------------------------------------------------------*/
 
+#ifdef CONFIG_USB_OTG
+
+/**
+ * usb_bus_start_enum - start immediate enumeration (for OTG)
+ * @bus: the bus (must use hcd framework)
+ * @port: 1-based number of port; usually bus->otg_port
+ * Context: in_interrupt()
+ *
+ * Starts enumeration, with an immediate reset followed later by
+ * khubd identifying and possibly configuring the device.
+ * This is needed by OTG controller drivers, where it helps meet
+ * HNP protocol timing requirements for starting a port reset.
+ */
+int usb_bus_start_enum(struct usb_bus *bus, unsigned port_num)
+{
+       struct usb_hcd          *hcd;
+       int                     status = -EOPNOTSUPP;
+
+       /* NOTE: since HNP can't start by grabbing the bus's address0_sem,
+        * boards with root hubs hooked up to internal devices (instead of
+        * just the OTG port) may need more attention to resetting...
+        */
+       hcd = container_of (bus, struct usb_hcd, self);
+       if (port_num && hcd->driver->start_port_reset)
+               status = hcd->driver->start_port_reset(hcd, port_num);
+
+       /* run khubd shortly after (first) root port reset finishes;
+        * it may issue others, until at least 50 msecs have passed.
+        */
+       if (status == 0)
+               mod_timer(&hcd->rh_timer, jiffies + msecs_to_jiffies(10));
+       return status;
+}
+EXPORT_SYMBOL (usb_bus_start_enum);
+
+#endif
+
+/*-------------------------------------------------------------------------*/
+
 /* called by khubd, rmmod, apmd, or other thread for hcd-private cleanup.
  * we're guaranteed that the device is fully quiesced.  also, that each
  * endpoint has been hcd_endpoint_disabled.
diff -Nru a/drivers/usb/core/hcd.h b/drivers/usb/core/hcd.h
--- a/drivers/usb/core/hcd.h    2004-08-26 16:42:39 -07:00
+++ b/drivers/usb/core/hcd.h    2004-08-26 16:42:39 -07:00
@@ -212,6 +212,7 @@
                                char *buf, u16 wLength);
        int             (*hub_suspend)(struct usb_hcd *);
        int             (*hub_resume)(struct usb_hcd *);
+       int             (*start_port_reset)(struct usb_hcd *, unsigned port_num);
 };
 
 extern void usb_hcd_giveback_urb (struct usb_hcd *hcd, struct urb *urb, struct 
pt_regs *regs);
diff -Nru a/include/linux/usb_otg.h b/include/linux/usb_otg.h
--- a/include/linux/usb_otg.h   2004-08-26 16:42:39 -07:00
+++ b/include/linux/usb_otg.h   2004-08-26 16:42:39 -07:00
@@ -114,3 +114,5 @@
 }
 
 
+/* for OTG controller drivers (and maybe other stuff) */
+extern int usb_bus_start_enum(struct usb_bus *bus, unsigned port_num);



-------------------------------------------------------
SF.Net email is sponsored by Shop4tech.com-Lowest price on Blank Media
100pk Sonic DVD-R 4x for only $29 -100pk Sonic DVD+R for only $33
Save 50% off Retail on Ink & Toner - Free Shipping and Free Gift.
http://www.shop4tech.com/z/Inkjet_Cartridges/9_108_r285
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to