int parioctl(dev_t dev, u_long cmd, void *data, int flag, struct lwp *l) { struct par_softc *sc = getparsp(UNIT(dev)); struct parparam *pp, *upp; int error = 0; switch (cmd) { case PARIOCGPARAM: pp = &sc->sc_param; upp = (struct parparam *)data; upp->burst = pp->burst; upp->timo = parhztoms(pp->timo); upp->delay = parhztoms(pp->delay); break; case PARIOCSPARAM: pp = &sc->sc_param; upp = (struct parparam *)data; if (upp->burst < PAR_BURST_MIN || upp->burst > PAR_BURST_MAX || upp->delay < PAR_DELAY_MIN || upp->delay > PAR_DELAY_MAX) return(EINVAL); pp->burst = upp->burst; pp->timo = parmstohz(upp->timo); pp->delay = parmstohz(upp->delay); break; default: return(EINVAL); } return (error); }
int paropen(dev_t dev, int flags, int mode, struct lwp *l) { int unit = UNIT(dev); struct par_softc *sc; sc = device_lookup_private(&par_cd, unit); if (sc == NULL || !(sc->sc_flags & PARF_ALIVE)) return(ENXIO); if (sc->sc_flags & PARF_OPEN) return(EBUSY); /* X680x0 can't read */ if ((flags & FREAD) == FREAD) return (EINVAL); sc->sc_flags |= PARF_OPEN; sc->sc_flags |= PARF_OWRITE; sc->sc_burst = PAR_BURST; sc->sc_timo = parmstohz(PAR_TIMO); sc->sc_delay = parmstohz(PAR_DELAY); return(0); }
int paropen(dev_t dev, int flags, int mode, struct lwp *l) { int unit = UNIT(dev); struct par_softc *sc = getparsp(unit); if (unit >= NPAR || (sc->sc_flags & PARF_ALIVE) == 0) return(ENXIO); #ifdef DEBUG if (pardebug & PDB_FOLLOW) { printf("paropen(%llx, %x): flags %x, ", dev, flags, sc->sc_flags); printf ("port = $%x\n", ((ciab.pra ^ CIAB_PRA_SEL) & (CIAB_PRA_SEL|CIAB_PRA_BUSY|CIAB_PRA_POUT))); } #endif if (sc->sc_flags & PARF_OPEN) return(EBUSY); /* can either read or write, but not both */ if ((flags & (FREAD|FWRITE)) == (FREAD|FWRITE)) return EINVAL; sc->sc_flags |= PARF_OPEN; if (flags & FREAD) sc->sc_flags |= PARF_OREAD; else sc->sc_flags |= PARF_OWRITE; sc->sc_burst = PAR_BURST; sc->sc_timo = parmstohz(PAR_TIMO); sc->sc_delay = parmstohz(PAR_DELAY); /* enable interrupts for CIAA-FLG */ ciaa.icr = CIA_ICR_IR_SC | CIA_ICR_FLG; return(0); }