int wdactivate(struct device *self, int act) { struct wd_softc *wd = (void *)self; int rv = 0; switch (act) { case DVACT_SUSPEND: break; case DVACT_POWERDOWN: wd_flushcache(wd, AT_POLL); if (boothowto & RB_POWERDOWN) wd_standby(wd, AT_POLL); break; case DVACT_RESUME: /* * Do two resets separated by a small delay. The * first wakes the controller, the second resets * the channel. */ wdc_disable_intr(wd->drvp->chnl_softc); wdc_reset_channel(wd->drvp, 1); delay(10000); wdc_reset_channel(wd->drvp, 0); wdc_enable_intr(wd->drvp->chnl_softc); wd_get_params(wd, at_poll, &wd->sc_params); break; } return (rv); }
int wdclose(dev_t dev, int flag, int fmt, struct proc *p) { struct wd_softc *wd; int part = DISKPART(dev); wd = wdlookup(DISKUNIT(dev)); if (wd == NULL) return ENXIO; WDCDEBUG_PRINT(("wdclose\n"), DEBUG_FUNCS); disk_lock_nointr(&wd->sc_dk); disk_closepart(&wd->sc_dk, part, fmt); if (wd->sc_dk.dk_openmask == 0) { wd_flushcache(wd, 0); /* XXXX Must wait for I/O to complete! */ } disk_unlock(&wd->sc_dk); device_unref(&wd->sc_dev); return (0); }
int edmcaclose(dev_t dev, int flag, int fmt, struct lwp *l) { struct ed_softc *wd = device_lookup_private(&ed_cd, DISKUNIT(dev)); int part = DISKPART(dev); ATADEBUG_PRINT(("edmcaclose\n"), DEBUG_FUNCS); mutex_enter(&wd->sc_dk.dk_openlock); switch (fmt) { case S_IFCHR: wd->sc_dk.dk_copenmask &= ~(1 << part); break; case S_IFBLK: wd->sc_dk.dk_bopenmask &= ~(1 << part); break; } wd->sc_dk.dk_openmask = wd->sc_dk.dk_copenmask | wd->sc_dk.dk_bopenmask; if (wd->sc_dk.dk_openmask == 0) { #if 0 wd_flushcache(wd, AT_WAIT); #endif /* XXXX Must wait for I/O to complete! */ if (! (wd->sc_flags & WDF_KLABEL)) wd->sc_flags &= ~WDF_LOADED; } mutex_exit(&wd->sc_dk.dk_openlock); return 0; }