/* * open routine. returns zero if successful, else error code */ int mbppopen(dev_t dev, int flags, int mode, struct lwp *l) { int card = MAGMA_CARD(dev); int port = MAGMA_PORT(dev); struct mbpp_softc *ms; struct mbpp_port *mp; int s; if ((ms = device_lookup_private(&mbpp_cd, card)) == NULL || port >= ms->ms_nports ) return(ENXIO); mp = &ms->ms_port[port]; s = spltty(); if( ISSET(mp->mp_flags, MBPPF_OPEN) ) { splx(s); return(EBUSY); } SET(mp->mp_flags, MBPPF_OPEN); splx(s); /* set defaults */ mp->mp_burst = MBPP_BURST; mp->mp_timeout = mbpp_mstohz(MBPP_TIMEOUT); mp->mp_delay = mbpp_mstohz(MBPP_DELAY); /* init chips */ if( mp->mp_cd1400 ) { /* CD1400 */ struct cd1400 *cd = mp->mp_cd1400; /* set up CD1400 channel */ s = spltty(); cd1400_write_reg(cd, CD1400_CAR, 0); cd1400_write_ccr(cd, CD1400_CCR_CMDRESET); cd1400_write_reg(cd, CD1400_LIVR, (1<<3)); splx(s); } else { /* CD1190 */ mp->mp_flags = 0; return (ENXIO); } return (0); }
/* * 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); }