aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Brownell <david-b@pacbell.net>2005-09-12 22:39:39 -0400
committerGreg Kroah-Hartman <gregkh@suse.de>2005-10-28 12:52:50 -0400
commitb94dc6b58667a73eeaf5cfd9c9e90dcd98743c5b (patch)
tree738e4214f3168544bfcde2c46e369b3da5845dfe
parent0ac85241ebc7bf6b86ab498960cc121d53ef69ae (diff)
[PATCH] usb device wakeup flags
This patch teaches "usb_device" about the new driver model wakeup support: - It updates device wakeup capabilities when entering a configuration with the WAKEUP attribute; - During suspend processing it consults the policy bit to see whether it should enable wakeup for that device. (This resolves a FIXME to not assume the answer is always "yes"; some devices lie about supporting remote wakeup.) Support for root hubs and the HCDs is separate (and more complex). Signed-off-by: David Brownell <dbrownell@users.sourceforge.net> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-rw-r--r--drivers/usb/core/hub.c16
1 files changed, 9 insertions, 7 deletions
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
index a12cab5314e9..c3e2024c4347 100644
--- a/drivers/usb/core/hub.c
+++ b/drivers/usb/core/hub.c
@@ -1020,9 +1020,15 @@ void usb_set_device_state(struct usb_device *udev,
1020 spin_lock_irqsave(&device_state_lock, flags); 1020 spin_lock_irqsave(&device_state_lock, flags);
1021 if (udev->state == USB_STATE_NOTATTACHED) 1021 if (udev->state == USB_STATE_NOTATTACHED)
1022 ; /* do nothing */ 1022 ; /* do nothing */
1023 else if (new_state != USB_STATE_NOTATTACHED) 1023 else if (new_state != USB_STATE_NOTATTACHED) {
1024 udev->state = new_state; 1024 udev->state = new_state;
1025 else 1025 if (new_state == USB_STATE_CONFIGURED)
1026 device_init_wakeup(&udev->dev,
1027 (udev->actconfig->desc.bmAttributes
1028 & USB_CONFIG_ATT_WAKEUP));
1029 else if (new_state != USB_STATE_SUSPENDED)
1030 device_init_wakeup(&udev->dev, 0);
1031 } else
1026 recursively_mark_NOTATTACHED(udev); 1032 recursively_mark_NOTATTACHED(udev);
1027 spin_unlock_irqrestore(&device_state_lock, flags); 1033 spin_unlock_irqrestore(&device_state_lock, flags);
1028} 1034}
@@ -1546,11 +1552,7 @@ static int hub_port_suspend(struct usb_hub *hub, int port1,
1546 * NOTE: OTG devices may issue remote wakeup (or SRP) even when 1552 * NOTE: OTG devices may issue remote wakeup (or SRP) even when
1547 * we don't explicitly enable it here. 1553 * we don't explicitly enable it here.
1548 */ 1554 */
1549 if (udev->actconfig 1555 if (device_may_wakeup(&udev->dev)) {
1550 // && FIXME (remote wakeup enabled on this bus)
1551 // ... currently assuming it's always appropriate
1552 && (udev->actconfig->desc.bmAttributes
1553 & USB_CONFIG_ATT_WAKEUP) != 0) {
1554 status = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), 1556 status = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
1555 USB_REQ_SET_FEATURE, USB_RECIP_DEVICE, 1557 USB_REQ_SET_FEATURE, USB_RECIP_DEVICE,
1556 USB_DEVICE_REMOTE_WAKEUP, 0, 1558 USB_DEVICE_REMOTE_WAKEUP, 0,