diff options
-rw-r--r-- | sys/dev/usb/ohci.c | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/sys/dev/usb/ohci.c b/sys/dev/usb/ohci.c index c0fc284..904fa1e 100644 --- a/sys/dev/usb/ohci.c +++ b/sys/dev/usb/ohci.c @@ -950,6 +950,7 @@ void ohci_power(int why, void *v) { ohci_softc_t *sc = v; + u_int32_t ctl; int s; #ifdef OHCI_DEBUG @@ -961,10 +962,23 @@ ohci_power(int why, void *v) switch (why) { case PWR_SUSPEND: case PWR_STANDBY: - OWRITE4(sc, OHCI_CONTROL, OHCI_HCFS_SUSPEND); + sc->sc_bus.use_polling++; + ctl = OREAD4(sc, OHCI_CONTROL); + ctl = (ctl & ~OHCI_HCFS_MASK) | OHCI_HCFS_SUSPEND; + OWRITE4(sc, OHCI_CONTROL, ctl); + usb_delay_ms(&sc->sc_bus, USB_RESUME_WAIT); + sc->sc_bus.use_polling--; break; case PWR_RESUME: - OWRITE4(sc, OHCI_CONTROL, OHCI_HCFS_RESUME); + sc->sc_bus.use_polling++; + ctl = OREAD4(sc, OHCI_CONTROL); + ctl = (ctl & ~OHCI_HCFS_MASK) | OHCI_HCFS_RESUME; + OWRITE4(sc, OHCI_CONTROL, ctl); + usb_delay_ms(&sc->sc_bus, USB_RESUME_DELAY); + ctl = (ctl & ~OHCI_HCFS_MASK) | OHCI_HCFS_OPERATIONAL; + OWRITE4(sc, OHCI_CONTROL, ctl); + usb_delay_ms(&sc->sc_bus, USB_RESUME_RECOVERY); + sc->sc_bus.use_polling--; break; case PWR_SOFTSUSPEND: case PWR_SOFTSTANDBY: |