Ejemplo n.º 1
0
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);
}
Ejemplo n.º 2
0
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);
}
Ejemplo n.º 3
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;
}