lkml.org 
[lkml]   [2011]   [May]   [5]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[062/143] USB: retain USB device power/wakeup setting across reconfiguration
    2.6.32-longterm review patch.  If anyone has any objections, please let us know.

    ------------------

    From: Dan Streetman <ddstreet@ieee.org>

    commit 16985408b5c48585762ec3b9b7bae1dec4ad7437 upstream.

    Currently a non-root-hub USB device's wakeup settings are initialized when the
    device is set to a configured state using device_init_wakeup(), but this is not
    correct as wakeup is split into "capable" (can_wakeup) and "enabled"
    (should_wakeup). The settings should be initialized instead in the device
    initialization (usb_new_device) with the "capable" setting disabled and the
    "enabled" setting enabled. The "capable" setting should be set based on the
    device being configured or unconfigured, and "enabled" setting set based on
    the sysfs power/wakeup control.

    This patch retains the sysfs power/wakeup setting of a non-root-hub USB device
    over a USB device re-configuration, which can happen (for example) after a
    suspend/resume cycle.

    Signed-off-by: Dan Streetman <ddstreet@ieee.org>
    Cc: David Brownell <dbrownell@users.sourceforge.net>
    Cc: Alan Stern <stern@rowland.harvard.edu>
    Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
    [bwh: Adjust context for 2.6.32]
    Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
    ---
    drivers/usb/core/hub.c | 16 ++++++++++++----
    1 file changed, 12 insertions(+), 4 deletions(-)

    --- a/drivers/usb/core/hub.c
    +++ b/drivers/usb/core/hub.c
    @@ -1424,11 +1424,11 @@ void usb_set_device_state(struct usb_dev
    || new_state == USB_STATE_SUSPENDED)
    ; /* No change to wakeup settings */
    else if (new_state == USB_STATE_CONFIGURED)
    - device_init_wakeup(&udev->dev,
    + device_set_wakeup_capable(&udev->dev,
    (udev->actconfig->desc.bmAttributes
    & USB_CONFIG_ATT_WAKEUP));
    else
    - device_init_wakeup(&udev->dev, 0);
    + device_set_wakeup_capable(&udev->dev, 0);
    }
    if (udev->state == USB_STATE_SUSPENDED &&
    new_state != USB_STATE_SUSPENDED)
    @@ -1786,10 +1786,18 @@ int usb_new_device(struct usb_device *ud
    {
    int err;

    - /* Increment the parent's count of unsuspended children */
    - if (udev->parent)
    + if (udev->parent) {
    + /* Increment the parent's count of unsuspended children */
    usb_autoresume_device(udev->parent);

    + /* Initialize non-root-hub device wakeup to disabled;
    + * device (un)configuration controls wakeup capable
    + * sysfs power/wakeup controls wakeup enabled/disabled
    + */
    + device_init_wakeup(&udev->dev, 0);
    + device_set_wakeup_enable(&udev->dev, 1);
    + }
    +
    err = usb_enumerate_device(udev); /* Read descriptors */
    if (err < 0)
    goto fail;



    \
     
     \ /
      Last update: 2011-05-06 02:55    [W:0.022 / U:32.908 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site