usb2.0 and usb3.0 devices have different ways to enalbe/disable
remote wakeup. This patch is to put both their operations into
the seperate functions. Otherwise, usb_control_msg() has some
long arguments and are usually nested some indentations. So
encapsulating it into seperate functions would be convienient
to use and more readable.

Signed-off-by: Lan Tianyu <tianyu....@intel.com>
---
Change since v1:
        remove usb_disable_function_remotewakeup() and
call usb_control_msg()  directly in the usb_disable_remote_wakeup()

 drivers/usb/core/hub.c |  136 ++++++++++++++++++++++++------------------------
 1 file changed, 68 insertions(+), 68 deletions(-)

diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
index 29791a6..4c14b04 100644
--- a/drivers/usb/core/hub.c
+++ b/drivers/usb/core/hub.c
@@ -2776,22 +2776,72 @@ void usb_enable_ltm(struct usb_device *udev)
 EXPORT_SYMBOL_GPL(usb_enable_ltm);
 
 #ifdef CONFIG_USB_SUSPEND
-/*
- * usb_disable_function_remotewakeup - disable usb3.0
- * device's function remote wakeup
- * @udev: target device
- *
- * Assume there's only one function on the USB 3.0
- * device and disable remote wake for the first
- * interface. FIXME if the interface association
- * descriptor shows there's more than one function.
- */
-static int usb_disable_function_remotewakeup(struct usb_device *udev)
+static int usb_disable_remote_wakeup(struct usb_device *udev)
 {
-       return usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
-                               USB_REQ_CLEAR_FEATURE, USB_RECIP_INTERFACE,
-                               USB_INTRF_FUNC_SUSPEND, 0, NULL, 0,
+       int status = 0;
+       u16 devstatus;
+
+       if (udev->speed != USB_SPEED_SUPER) {
+               status = usb_get_status(udev, USB_RECIP_DEVICE, 0, &devstatus);
+               le16_to_cpus(&devstatus);
+               if (!status && devstatus & (1 << USB_DEVICE_REMOTE_WAKEUP))
+                       status = usb_control_msg(udev,
+                                       usb_sndctrlpipe(udev, 0),
+                                       USB_REQ_CLEAR_FEATURE,
+                                       USB_RECIP_DEVICE,
+                                       USB_DEVICE_REMOTE_WAKEUP, 0,
+                                       NULL, 0,
+                                       USB_CTRL_SET_TIMEOUT);
+       } else {
+               /*
+                * Assume there's only one function on the USB 3.0
+                * device and disable remote wake for the first
+                * interface. FIXME if the interface association
+                * descriptor shows there's more than one function.
+                */
+               status = usb_get_status(udev, USB_RECIP_INTERFACE, 0,
+                               &devstatus);
+               le16_to_cpus(&devstatus);
+               if (!status && devstatus &
+                         (USB_INTRF_STAT_FUNC_RW_CAP | USB_INTRF_STAT_FUNC_RW))
+                       status = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
+                                       USB_REQ_CLEAR_FEATURE,
+                                       USB_RECIP_INTERFACE,
+                                       USB_INTRF_FUNC_SUSPEND, 0,
+                                       NULL, 0,
+                                       USB_CTRL_SET_TIMEOUT);
+       }
+
+       return status;
+}
+
+static int usb_enable_remote_wakeup(struct usb_device *udev)
+{
+       int status;
+
+       if (udev->speed != USB_SPEED_SUPER) {
+               status = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
+                               USB_REQ_SET_FEATURE, USB_RECIP_DEVICE,
+                               USB_DEVICE_REMOTE_WAKEUP, 0,
+                               NULL, 0,
+                               USB_CTRL_SET_TIMEOUT);
+       } else {
+               /* Assume there's only one function on the USB 3.0
+                * device and enable remote wake for the first
+                * interface. FIXME if the interface association
+                * descriptor shows there's more than one function.
+                */
+               status = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
+                               USB_REQ_SET_FEATURE,
+                               USB_RECIP_INTERFACE,
+                               USB_INTRF_FUNC_SUSPEND,
+                               USB_INTRF_FUNC_SUSPEND_RW |
+                               USB_INTRF_FUNC_SUSPEND_LP,
+                               NULL, 0,
                                USB_CTRL_SET_TIMEOUT);
+       }
+
+       return status;
 }
 
 /*
@@ -2853,27 +2903,7 @@ int usb_port_suspend(struct usb_device *udev, 
pm_message_t msg)
         * we don't explicitly enable it here.
         */
        if (udev->do_remote_wakeup) {
-               if (!hub_is_superspeed(hub->hdev)) {
-                       status = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
-                                       USB_REQ_SET_FEATURE, USB_RECIP_DEVICE,
-                                       USB_DEVICE_REMOTE_WAKEUP, 0,
-                                       NULL, 0,
-                                       USB_CTRL_SET_TIMEOUT);
-               } else {
-                       /* Assume there's only one function on the USB 3.0
-                        * device and enable remote wake for the first
-                        * interface. FIXME if the interface association
-                        * descriptor shows there's more than one function.
-                        */
-                       status = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
-                                       USB_REQ_SET_FEATURE,
-                                       USB_RECIP_INTERFACE,
-                                       USB_INTRF_FUNC_SUSPEND,
-                                       USB_INTRF_FUNC_SUSPEND_RW |
-                                       USB_INTRF_FUNC_SUSPEND_LP,
-                                       NULL, 0,
-                                       USB_CTRL_SET_TIMEOUT);
-               }
+               status = usb_enable_remote_wakeup(udev);
                if (status) {
                        dev_dbg(&udev->dev, "won't remote wakeup, status %d\n",
                                        status);
@@ -2908,19 +2938,8 @@ int usb_port_suspend(struct usb_device *udev, 
pm_message_t msg)
                dev_dbg(hub->intfdev, "can't suspend port %d, status %d\n",
                                port1, status);
                /* paranoia:  "should not happen" */
-               if (udev->do_remote_wakeup) {
-                       if (!hub_is_superspeed(hub->hdev)) {
-                               (void) usb_control_msg(udev,
-                                               usb_sndctrlpipe(udev, 0),
-                                               USB_REQ_CLEAR_FEATURE,
-                                               USB_RECIP_DEVICE,
-                                               USB_DEVICE_REMOTE_WAKEUP, 0,
-                                               NULL, 0,
-                                               USB_CTRL_SET_TIMEOUT);
-                       } else
-                               (void) usb_disable_function_remotewakeup(udev);
-
-               }
+               if (udev->do_remote_wakeup)
+                       (void)usb_disable_remote_wakeup(udev);
 
                /* Try to enable USB2 hardware LPM again */
                if (udev->usb2_hw_lpm_capable == 1)
@@ -3012,26 +3031,7 @@ static int finish_port_resume(struct usb_device *udev)
         * udev->reset_resume
         */
        } else if (udev->actconfig && !udev->reset_resume) {
-               if (!hub_is_superspeed(udev->parent)) {
-                       le16_to_cpus(&devstatus);
-                       if (devstatus & (1 << USB_DEVICE_REMOTE_WAKEUP))
-                               status = usb_control_msg(udev,
-                                               usb_sndctrlpipe(udev, 0),
-                                               USB_REQ_CLEAR_FEATURE,
-                                               USB_RECIP_DEVICE,
-                                               USB_DEVICE_REMOTE_WAKEUP, 0,
-                                               NULL, 0,
-                                               USB_CTRL_SET_TIMEOUT);
-               } else {
-                       status = usb_get_status(udev, USB_RECIP_INTERFACE, 0,
-                                       &devstatus);
-                       le16_to_cpus(&devstatus);
-                       if (!status && devstatus & (USB_INTRF_STAT_FUNC_RW_CAP
-                                       | USB_INTRF_STAT_FUNC_RW))
-                               status =
-                                       usb_disable_function_remotewakeup(udev);
-               }
-
+               status = usb_disable_remote_wakeup(udev);
                if (status)
                        dev_dbg(&udev->dev,
                                "disable remote wakeup, status %d\n",
-- 
1.7.9.5

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to