summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/dev/usb/ohci.c18
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:
OpenPOWER on IntegriCloud