/* * ioctl routine */ int mbppioctl(dev_t dev, u_long cmd, void *data, int flags, struct lwp *l) { struct mbpp_softc *ms = device_lookup_private(&mbpp_cd, MAGMA_CARD(dev)); struct mbpp_port *mp = &ms->ms_port[MAGMA_PORT(dev)]; struct mbpp_param *bp; int error = 0; int s; switch(cmd) { case MBPPIOCSPARAM: bp = (struct mbpp_param *)data; if( bp->bp_burst < MBPP_BURST_MIN || bp->bp_burst > MBPP_BURST_MAX || bp->bp_delay < MBPP_DELAY_MIN || bp->bp_delay > MBPP_DELAY_MIN ) { error = EINVAL; } else { mp->mp_burst = bp->bp_burst; mp->mp_timeout = mbpp_mstohz(bp->bp_timeout); mp->mp_delay = mbpp_mstohz(bp->bp_delay); } break; case MBPPIOCGPARAM: bp = (struct mbpp_param *)data; bp->bp_burst = mp->mp_burst; bp->bp_timeout = mbpp_hztoms(mp->mp_timeout); bp->bp_delay = mbpp_hztoms(mp->mp_delay); break; case MBPPIOCGSTAT: /* XXX make this more generic */ s = spltty(); cd1400_write_reg(mp->mp_cd1400, CD1400_CAR, 0); *(int *)data = cd1400_read_reg(mp->mp_cd1400, CD1400_PSVR); splx(s); break; default: error = ENOTTY; } return(error); }
/* * ioctl routine */ int mbppioctl(dev_t dev, u_long cmd, caddr_t data, int flags, struct proc *p) { struct mbpp_softc *ms = mbpp_cd.cd_devs[MAGMA_CARD(dev)]; struct mbpp_port *mp = &ms->ms_port[MAGMA_PORT(dev)]; struct bpp_param *bp; int error = 0; int s; switch(cmd) { case BPPIOCSPARAM: bp = (struct bpp_param *)data; if (bp->bp_burst < BPP_BURST_MIN || bp->bp_burst > BPP_BURST_MAX || bp->bp_delay < BPP_DELAY_MIN || bp->bp_delay > BPP_DELAY_MIN) { error = EINVAL; } else { mp->mp_burst = bp->bp_burst; mp->mp_timeout = mbpp_mstohz(bp->bp_timeout); mp->mp_delay = mbpp_mstohz(bp->bp_delay); } break; case BPPIOCGPARAM: bp = (struct bpp_param *)data; bp->bp_burst = mp->mp_burst; bp->bp_timeout = mbpp_hztoms(mp->mp_timeout); bp->bp_delay = mbpp_hztoms(mp->mp_delay); break; case BPPIOCGSTAT: /* XXX make this more generic */ s = spltty(); CD1400_WRITE_REG(mp->mp_cd1400, CD1400_CAR, 0); *(int *)data = CD1400_READ_REG(mp->mp_cd1400, CD1400_PSVR); splx(s); break; default: error = ENOTTY; } return (error); }