aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGerd Hoffmann <kraxel@redhat.com>2010-12-15 12:26:59 +0100
committerGerd Hoffmann <kraxel@redhat.com>2011-01-11 17:01:02 +0100
commit34239c7bc972735391ca84283f8c8ad908dc61ef (patch)
treec6c7844b403cc01e301f2d31cc085aae00f249dc
parent9159f6798ebfe0cdcfd1d1fb91c2c08b6d95954a (diff)
usb: hub: remote wakeup support.
This patch makes the usb hub handle remote wakeup requests from devices properly by updating the port status register and forwarding the wakeup to the upstream port. Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
-rw-r--r--hw/usb-hub.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/hw/usb-hub.c b/hw/usb-hub.c
index 8837bd9efe..8a80151da2 100644
--- a/hw/usb-hub.c
+++ b/hw/usb-hub.c
@@ -245,6 +245,17 @@ static void usb_hub_detach(USBPort *port1)
}
}
+static void usb_hub_wakeup(USBDevice *dev)
+{
+ USBHubState *s = dev->port->opaque;
+ USBHubPort *port = &s->ports[dev->port->index];
+
+ if (port->wPortStatus & PORT_STAT_SUSPEND) {
+ port->wPortChange |= PORT_STAT_C_SUSPEND;
+ usb_wakeup(&s->dev);
+ }
+}
+
static void usb_hub_handle_reset(USBDevice *dev)
{
/* XXX: do it */
@@ -502,6 +513,7 @@ static void usb_hub_handle_destroy(USBDevice *dev)
static USBPortOps usb_hub_port_ops = {
.attach = usb_hub_attach,
.detach = usb_hub_detach,
+ .wakeup = usb_hub_wakeup,
};
static int usb_hub_initfn(USBDevice *dev)