1*4932Swnj /* ct.c 4.7 81/11/18 */ 22621Swnj 33201Swnj #include "ct.h" 42621Swnj #if NCT > 0 52621Swnj /* 62621Swnj * GP DR11C driver used for C/A/T 73936Sbugs * 83936Sbugs * BUGS: 93936Sbugs * This driver hasn't been tested in 4.1bsd 102621Swnj */ 112621Swnj 122621Swnj #include "../h/param.h" 133201Swnj #include "../h/systm.h" 142621Swnj #include "../h/tty.h" 152621Swnj #include "../h/pte.h" 162621Swnj #include "../h/map.h" 172621Swnj #include "../h/buf.h" 183201Swnj #include "../h/ubareg.h" 193201Swnj #include "../h/ubavar.h" 202621Swnj #include "../h/conf.h" 212621Swnj #include "../h/dir.h" 222621Swnj #include "../h/user.h" 232621Swnj 242621Swnj #define PCAT (PZERO+9) 252621Swnj #define CATHIWAT 100 262621Swnj #define CATLOWAT 30 272621Swnj 283201Swnj struct ct_softc { 293201Swnj int sc_openf; 303201Swnj struct clist sc_oq; 313201Swnj } ct_softc[NCT]; 322621Swnj 333201Swnj struct ctdevice { 343201Swnj short ctcsr; 353201Swnj short ctbuf; 362621Swnj }; 372621Swnj 383201Swnj int ctprobe(), ctattach(), ctintr(); 393201Swnj struct uba_device *ctdinfo[NCT]; 403201Swnj u_short ctstd[] = { 0 }; 413201Swnj struct uba_driver ctdriver = 423201Swnj { ctprobe, 0, ctattach, 0, ctstd, "ct", ctdinfo }; 432621Swnj 443217Swnj #define CTUNIT(dev) (minor(dev)) 453217Swnj 463201Swnj ctprobe(reg) 473201Swnj caddr_t reg; 483201Swnj { 493936Sbugs register int br, cvec; /* value-result */ 503201Swnj register struct ctdevice *ctaddr = (struct ctdevice *)reg; 513201Swnj 52*4932Swnj #ifdef lint 53*4932Swnj br = 0; cvec = br; br = cvec; 54*4932Swnj ctintr(0); 55*4932Swnj #endif 563201Swnj ctaddr->ctcsr = IENABLE; 573201Swnj DELAY(10000); 583201Swnj ctaddr->ctcsr = 0; 593201Swnj } 603201Swnj 613217Swnj /*ARGSUSED*/ 623217Swnj ctattach(ui) 633217Swnj register struct uba_device *ui; 643217Swnj { 653217Swnj 663217Swnj } 673217Swnj 682621Swnj ctopen(dev) 693201Swnj dev_t dev; 702621Swnj { 713201Swnj register struct ct_softc *sc; 723201Swnj register struct uba_device *ui; 733201Swnj register struct ctdevice *ctaddr; 743201Swnj 753201Swnj if (CTUNIT(dev) >= NCT || (ui = ctdinfo[CTUNIT(dev)]) == 0 || 763201Swnj ui->ui_alive == 0 || (sc = &ct_softc[CTUNIT(dev)])->sc_openf) { 772621Swnj u.u_error = ENXIO; 783201Swnj return; 793201Swnj } 803201Swnj sc->sc_openf = 1; 813201Swnj ctaddr->ctcsr |= IENABLE; 822621Swnj } 832621Swnj 843201Swnj ctclose(dev) 853201Swnj dev_t dev; 862621Swnj { 873201Swnj 883201Swnj ct_softc[CTUNIT(dev)].sc_openf = 0; 893201Swnj ctintr(dev); 902621Swnj } 912621Swnj 922621Swnj ctwrite(dev) 933201Swnj dev_t dev; 942621Swnj { 953201Swnj register struct ct_softc *sc = &ct_softc[CTUNIT(dev)]; 963201Swnj register int c; 972621Swnj 982621Swnj while ((c=cpass()) >= 0) { 993101Swnj (void) spl5(); 1003201Swnj while (sc->sc_oq.c_cc > CATHIWAT) 1013201Swnj sleep((caddr_t)&sc->sc_oq, PCAT); 1023201Swnj while (putc(c, &sc->sc_oq) < 0) 1032621Swnj sleep((caddr_t)&lbolt, PCAT); 1043201Swnj ctintr(dev); 1053101Swnj (void) spl0(); 1062621Swnj } 1072621Swnj } 1082621Swnj 1093201Swnj ctintr(dev) 1103201Swnj dev_t dev; 1112621Swnj { 1122621Swnj register int c; 1133201Swnj register struct ct_softc *sc = &ct_softc[CTUNIT(dev)]; 1143201Swnj register struct ctdevice *ctaddr = 1153201Swnj (struct ctdevice *)ctdinfo[CTUNIT(dev)]->ui_addr; 1162621Swnj 1173201Swnj if (ctaddr->ctcsr&DONE) { 1183201Swnj if ((c = getc(&sc->sc_oq)) >= 0) { 1193201Swnj ctaddr->ctbuf = c; 1203201Swnj if (sc->sc_oq.c_cc==0 || sc->sc_oq.c_cc==CATLOWAT) 1213201Swnj wakeup(&sc->sc_oq); 1222621Swnj } else { 1233201Swnj if (sc->sc_openf==0) 1243201Swnj ctaddr->ctcsr = 0; 1252621Swnj } 1262621Swnj } 1272621Swnj 1282621Swnj } 1292621Swnj #endif 130