--- a/qemu/hw/usb-uhci.c 2006-04-21 11:15:40.000000000 -0500 +++ b/qemu/hw/usb-uhci.c 2006-04-21 11:17:08.000000000 -0500 @@ -32,6 +32,8 @@ // #define DEBUG // #define DEBUG_PACKET +#define UHCI_CMD_FGR (1 << 4) +#define UHCI_CMD_EGSM (1 << 3) #define UHCI_CMD_GRESET (1 << 2) #define UHCI_CMD_HCRESET (1 << 1) #define UHCI_CMD_RS (1 << 0) @@ -109,7 +111,8 @@ ((s->status & UHCI_STS_USBERR) && (s->intr & (1 << 0))) || ((s->status & UHCI_STS_RD) && (s->intr & (1 << 1))) || (s->status & UHCI_STS_HSERR) || - (s->status & UHCI_STS_HCPERR)) { + (s->status & UHCI_STS_HCPERR) || + ((s->status & UHCI_STS_RD) && (s->intr & (1 << 1)))) { level = 1; } else { level = 0; @@ -188,7 +191,7 @@ /* start frame processing */ qemu_mod_timer(s->frame_timer, qemu_get_clock(vm_clock)); s->status &= ~UHCI_STS_HCHALTED; - } else if (!(val & UHCI_CMD_RS) && !(s->cmd & UHCI_CMD_RS)) { + } else if (!(val & UHCI_CMD_RS)) { s->status |= UHCI_STS_HCHALTED; } if (val & UHCI_CMD_GRESET) { @@ -335,6 +338,14 @@ UHCIState *s = hub->opaque; UHCIPort *port; int i; + + // wakeup the controller if suspended + if (s->cmd & UHCI_CMD_EGSM) { + s->cmd |= UHCI_CMD_FGR; + s->status |= UHCI_STS_RD; + uhci_update_irq(s); + } + if (dev) { if( portnum >= NB_PORTS ) { #ifdef DEBUG @@ -575,8 +586,6 @@ if (!(s->cmd & UHCI_CMD_RS)) { qemu_del_timer(s->frame_timer); - /* set hchalted bit in status - UHCI11D 2.1.2 */ - s->status |= UHCI_STS_HCHALTED; return; } frame_addr = s->fl_base_addr + ((s->frnum & 0x3ff) << 2);