This patch (as915) combines the public routine usb_port_suspend() and
the private routine __usb_port_suspend() into a single function.
Propagating the change into the OTG HNP handler requires a slight
addition to the OTG whitelist checking code: A device not attached to
the OTG port should always count as "targeted".

Signed-off-by: Alan Stern <[EMAIL PROTECTED]>
CC: David Brownell <[EMAIL PROTECTED]>

---

Index: usb-2.6/drivers/usb/core/hub.c
===================================================================
--- usb-2.6.orig/drivers/usb/core/hub.c
+++ usb-2.6/drivers/usb/core/hub.c
@@ -1334,7 +1334,6 @@ static void show_string(struct usb_devic
 
 #ifdef CONFIG_USB_OTG
 #include "otg_whitelist.h"
-static int __usb_port_suspend(struct usb_device *, int port1);
 #endif
 
 /**
@@ -1443,7 +1442,7 @@ int usb_new_device(struct usb_device *ud
                 * (Includes HNP test device.)
                 */
                if (udev->bus->b_hnp_enable || udev->bus->is_b_host) {
-                       err = __usb_port_suspend(udev, udev->bus->otg_port);
+                       err = usb_port_suspend(udev);
                        if (err < 0)
                                dev_dbg(&udev->dev, "HNP fail, %d\n", err);
                }
@@ -1687,6 +1686,23 @@ static int hub_port_suspend(struct usb_h
 }
 
 /*
+ * usb_port_suspend - suspend a usb device's upstream port
+ * @udev: device that's no longer in active use
+ * Context: must be able to sleep; device not locked; pm locks held
+ *
+ * Suspends a USB device that isn't in active use, conserving power.
+ * Devices may wake out of a suspend, if anything important happens,
+ * using the remote wakeup mechanism.  They may also be taken out of
+ * suspend by the host, using usb_port_resume().  It's also routine
+ * to disconnect devices while they are suspended.
+ *
+ * This only affects the USB hardware for a device; its interfaces
+ * (and, for hubs, child devices) must already have been suspended.
+ *
+ * Suspending OTG devices may trigger HNP, if that's been enabled
+ * between a pair of dual-role devices.  That will change roles, such
+ * as from A-Host to A-Peripheral or from B-Host back to B-Peripheral.
+ *
  * Devices on USB hub ports have only one "suspend" state, corresponding
  * to ACPI D2, "may cause the device to lose some context".
  * State transitions include:
@@ -1703,21 +1719,19 @@ static int hub_port_suspend(struct usb_h
  * If CONFIG_USB_SUSPEND isn't enabled, devices only really suspend when
  * the root hub for their bus goes into global suspend ... so we don't
  * (falsely) update the device power state to say it suspended.
+ *
+ * Returns 0 on success, else negative errno.
  */
-static int __usb_port_suspend (struct usb_device *udev, int port1)
+int usb_port_suspend(struct usb_device *udev)
 {
        int     status = 0;
 
-       /* caller owns the udev device lock */
-       if (port1 < 0)
-               return port1;
-
        /* we change the device's upstream USB link,
         * but root hubs have no upstream USB link.
         */
        if (udev->parent)
-               status = hub_port_suspend(hdev_to_hub(udev->parent), port1,
-                               udev);
+               status = hub_port_suspend(hdev_to_hub(udev->parent),
+                               udev->portnum, udev);
        else {
                dev_dbg(&udev->dev, "usb %ssuspend\n",
                                udev->auto_pm ? "auto-" : "");
@@ -1727,31 +1741,6 @@ static int __usb_port_suspend (struct us
 }
 
 /*
- * usb_port_suspend - suspend a usb device's upstream port
- * @udev: device that's no longer in active use
- * Context: must be able to sleep; device not locked; pm locks held
- *
- * Suspends a USB device that isn't in active use, conserving power.
- * Devices may wake out of a suspend, if anything important happens,
- * using the remote wakeup mechanism.  They may also be taken out of
- * suspend by the host, using usb_port_resume().  It's also routine
- * to disconnect devices while they are suspended.
- *
- * This only affects the USB hardware for a device; its interfaces
- * (and, for hubs, child devices) must already have been suspended.
- *
- * Suspending OTG devices may trigger HNP, if that's been enabled
- * between a pair of dual-role devices.  That will change roles, such
- * as from A-Host to A-Peripheral or from B-Host back to B-Peripheral.
- *
- * Returns 0 on success, else negative errno.
- */
-int usb_port_suspend(struct usb_device *udev)
-{
-       return __usb_port_suspend(udev, udev->portnum);
-}
-
-/*
  * If the USB "suspend" state is in use (rather than "global suspend"),
  * many devices will be individually taken out of suspend state using
  * special" resume" signaling.  These routines kick in shortly after
Index: usb-2.6/drivers/usb/core/otg_whitelist.h
===================================================================
--- usb-2.6.orig/drivers/usb/core/otg_whitelist.h
+++ usb-2.6/drivers/usb/core/otg_whitelist.h
@@ -50,6 +50,9 @@ static int is_targeted(struct usb_device
 {
        struct usb_device_id    *id = whitelist_table;
 
+       if (dev->portnum != dev->bus->otg_port)
+               return 1;
+
        /* possible in developer configs only! */
        if (!dev->bus->otg_port)
                return 1;
Index: usb-2.6/drivers/usb/core/usb.h
===================================================================
--- usb-2.6.orig/drivers/usb/core/usb.h
+++ usb-2.6/drivers/usb/core/usb.h
@@ -53,8 +53,16 @@ static inline void usb_pm_unlock(struct 
 
 #else
 
-#define usb_port_suspend(dev)          0
-#define usb_port_resume(dev)           0
+static inline int usb_port_suspend(struct usb_device *udev)
+{
+       return 0;
+}
+
+static inline int usb_port_resume(struct usb_device *udev)
+{
+       return 0;
+}
+
 static inline void usb_pm_lock(struct usb_device *udev) {}
 static inline void usb_pm_unlock(struct usb_device *udev) {}
 


-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
_______________________________________________
linux-usb-devel@lists.sourceforge.net
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to