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 */ |