Commit 96217e315d4ac38daf4a7b8cafa4a9cd13ad4126
1 parent
cfc3475a
Basic USB device resume (root hub only), by Lonnie Mendez.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2449 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
23 additions
and
0 deletions
hw/usb-uhci.c
@@ -26,6 +26,8 @@ | @@ -26,6 +26,8 @@ | ||
26 | //#define DEBUG | 26 | //#define DEBUG |
27 | //#define DEBUG_PACKET | 27 | //#define DEBUG_PACKET |
28 | 28 | ||
29 | +#define UHCI_CMD_FGR (1 << 4) | ||
30 | +#define UHCI_CMD_EGSM (1 << 3) | ||
29 | #define UHCI_CMD_GRESET (1 << 2) | 31 | #define UHCI_CMD_GRESET (1 << 2) |
30 | #define UHCI_CMD_HCRESET (1 << 1) | 32 | #define UHCI_CMD_HCRESET (1 << 1) |
31 | #define UHCI_CMD_RS (1 << 0) | 33 | #define UHCI_CMD_RS (1 << 0) |
@@ -327,6 +329,21 @@ static uint32_t uhci_ioport_readl(void *opaque, uint32_t addr) | @@ -327,6 +329,21 @@ static uint32_t uhci_ioport_readl(void *opaque, uint32_t addr) | ||
327 | return val; | 329 | return val; |
328 | } | 330 | } |
329 | 331 | ||
332 | +/* signal resume if controller suspended */ | ||
333 | +static void uhci_resume (void *opaque) | ||
334 | +{ | ||
335 | + UHCIState *s = (UHCIState *)opaque; | ||
336 | + | ||
337 | + if (!s) | ||
338 | + return; | ||
339 | + | ||
340 | + if (s->cmd & UHCI_CMD_EGSM) { | ||
341 | + s->cmd |= UHCI_CMD_FGR; | ||
342 | + s->status |= UHCI_STS_RD; | ||
343 | + uhci_update_irq(s); | ||
344 | + } | ||
345 | +} | ||
346 | + | ||
330 | static void uhci_attach(USBPort *port1, USBDevice *dev) | 347 | static void uhci_attach(USBPort *port1, USBDevice *dev) |
331 | { | 348 | { |
332 | UHCIState *s = port1->opaque; | 349 | UHCIState *s = port1->opaque; |
@@ -344,6 +361,9 @@ static void uhci_attach(USBPort *port1, USBDevice *dev) | @@ -344,6 +361,9 @@ static void uhci_attach(USBPort *port1, USBDevice *dev) | ||
344 | port->ctrl |= UHCI_PORT_LSDA; | 361 | port->ctrl |= UHCI_PORT_LSDA; |
345 | else | 362 | else |
346 | port->ctrl &= ~UHCI_PORT_LSDA; | 363 | port->ctrl &= ~UHCI_PORT_LSDA; |
364 | + | ||
365 | + uhci_resume(s); | ||
366 | + | ||
347 | port->port.dev = dev; | 367 | port->port.dev = dev; |
348 | /* send the attach message */ | 368 | /* send the attach message */ |
349 | usb_send_msg(dev, USB_MSG_ATTACH); | 369 | usb_send_msg(dev, USB_MSG_ATTACH); |
@@ -358,6 +378,9 @@ static void uhci_attach(USBPort *port1, USBDevice *dev) | @@ -358,6 +378,9 @@ static void uhci_attach(USBPort *port1, USBDevice *dev) | ||
358 | port->ctrl &= ~UHCI_PORT_EN; | 378 | port->ctrl &= ~UHCI_PORT_EN; |
359 | port->ctrl |= UHCI_PORT_ENC; | 379 | port->ctrl |= UHCI_PORT_ENC; |
360 | } | 380 | } |
381 | + | ||
382 | + uhci_resume(s); | ||
383 | + | ||
361 | dev = port->port.dev; | 384 | dev = port->port.dev; |
362 | if (dev) { | 385 | if (dev) { |
363 | /* send the detach message */ | 386 | /* send the detach message */ |