|
|
1.1 ! root 1: /* ct.c 4.6 81/07/05 */ ! 2: ! 3: #include "ct.h" ! 4: #if NCT > 0 ! 5: /* ! 6: * GP DR11C driver used for C/A/T ! 7: * ! 8: * BUGS: ! 9: * This driver hasn't been tested in 4.1bsd ! 10: */ ! 11: ! 12: #include "../h/param.h" ! 13: #include "../h/systm.h" ! 14: #include "../h/pte.h" ! 15: #include "../h/map.h" ! 16: #include "../h/buf.h" ! 17: #include "../h/ubareg.h" ! 18: #include "../h/ubavar.h" ! 19: #include "../h/conf.h" ! 20: #include "../h/dir.h" ! 21: #include "../h/user.h" ! 22: ! 23: #define PCAT (PZERO+9) ! 24: #define CATHIWAT 100 ! 25: #define CATLOWAT 30 ! 26: ! 27: struct ct_softc { ! 28: int sc_openf; ! 29: struct clist sc_oq; ! 30: } ct_softc[NCT]; ! 31: ! 32: struct ctdevice { ! 33: short ctcsr; ! 34: short ctbuf; ! 35: }; ! 36: ! 37: int ctprobe(), ctattach(), ctintr(); ! 38: struct uba_device *ctdinfo[NCT]; ! 39: u_short ctstd[] = { 0 }; ! 40: struct uba_driver ctdriver = ! 41: { ctprobe, 0, ctattach, 0, ctstd, "ct", ctdinfo }; ! 42: ! 43: #define CTUNIT(dev) (minor(dev)) ! 44: ! 45: ctprobe(reg) ! 46: caddr_t reg; ! 47: { ! 48: register int br, cvec; /* value-result */ ! 49: register struct ctdevice *ctaddr = (struct ctdevice *)reg; ! 50: ! 51: ctaddr->ctcsr = IENABLE; ! 52: DELAY(10000); ! 53: ctaddr->ctcsr = 0; ! 54: } ! 55: ! 56: /*ARGSUSED*/ ! 57: ctattach(ui) ! 58: register struct uba_device *ui; ! 59: { ! 60: ! 61: } ! 62: ! 63: ctopen(dev) ! 64: dev_t dev; ! 65: { ! 66: register struct ct_softc *sc; ! 67: register struct uba_device *ui; ! 68: register struct ctdevice *ctaddr; ! 69: ! 70: if (CTUNIT(dev) >= NCT || (ui = ctdinfo[CTUNIT(dev)]) == 0 || ! 71: ui->ui_alive == 0 || (sc = &ct_softc[CTUNIT(dev)])->sc_openf) { ! 72: u.u_error = ENXIO; ! 73: return; ! 74: } ! 75: sc->sc_openf = 1; ! 76: ctaddr->ctcsr |= IENABLE; ! 77: } ! 78: ! 79: ctclose(dev) ! 80: dev_t dev; ! 81: { ! 82: ! 83: ct_softc[CTUNIT(dev)].sc_openf = 0; ! 84: ctintr(dev); ! 85: } ! 86: ! 87: ctwrite(dev) ! 88: dev_t dev; ! 89: { ! 90: register struct ct_softc *sc = &ct_softc[CTUNIT(dev)]; ! 91: register int c; ! 92: ! 93: while ((c=cpass()) >= 0) { ! 94: (void) spl5(); ! 95: while (sc->sc_oq.c_cc > CATHIWAT) ! 96: sleep((caddr_t)&sc->sc_oq, PCAT); ! 97: while (putc(c, &sc->sc_oq) < 0) ! 98: sleep((caddr_t)&lbolt, PCAT); ! 99: ctintr(dev); ! 100: (void) spl0(); ! 101: } ! 102: } ! 103: ! 104: ctintr(dev) ! 105: dev_t dev; ! 106: { ! 107: register int c; ! 108: register struct ct_softc *sc = &ct_softc[CTUNIT(dev)]; ! 109: register struct ctdevice *ctaddr = ! 110: (struct ctdevice *)ctdinfo[CTUNIT(dev)]->ui_addr; ! 111: ! 112: if (ctaddr->ctcsr&DONE) { ! 113: if ((c = getc(&sc->sc_oq)) >= 0) { ! 114: #if MH135A ! 115: c |= (c & 01) << 8; /* for dr11c bug */ ! 116: #endif ! 117: ctaddr->ctbuf = c; ! 118: if (sc->sc_oq.c_cc==0 || sc->sc_oq.c_cc==CATLOWAT) ! 119: wakeup(&sc->sc_oq); ! 120: } else { ! 121: if (sc->sc_openf==0) ! 122: ctaddr->ctcsr = 0; ! 123: } ! 124: } ! 125: ! 126: } ! 127: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.