1*8472Sroot /* ct.c 4.10 82/10/10 */ 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" 182621Swnj #include "../h/conf.h" 192621Swnj #include "../h/dir.h" 202621Swnj #include "../h/user.h" 212621Swnj 22*8472Sroot #include "../vaxuba/ubareg.h" 23*8472Sroot #include "../vaxuba/ubavar.h" 24*8472Sroot 252621Swnj #define PCAT (PZERO+9) 262621Swnj #define CATHIWAT 100 272621Swnj #define CATLOWAT 30 282621Swnj 293201Swnj struct ct_softc { 303201Swnj int sc_openf; 313201Swnj struct clist sc_oq; 323201Swnj } ct_softc[NCT]; 332621Swnj 343201Swnj struct ctdevice { 353201Swnj short ctcsr; 363201Swnj short ctbuf; 372621Swnj }; 382621Swnj 393201Swnj int ctprobe(), ctattach(), ctintr(); 403201Swnj struct uba_device *ctdinfo[NCT]; 413201Swnj u_short ctstd[] = { 0 }; 423201Swnj struct uba_driver ctdriver = 433201Swnj { ctprobe, 0, ctattach, 0, ctstd, "ct", ctdinfo }; 442621Swnj 453217Swnj #define CTUNIT(dev) (minor(dev)) 463217Swnj 473201Swnj ctprobe(reg) 483201Swnj caddr_t reg; 493201Swnj { 503936Sbugs register int br, cvec; /* value-result */ 513201Swnj register struct ctdevice *ctaddr = (struct ctdevice *)reg; 523201Swnj 534932Swnj #ifdef lint 544932Swnj br = 0; cvec = br; br = cvec; 554932Swnj ctintr(0); 564932Swnj #endif 573201Swnj ctaddr->ctcsr = IENABLE; 583201Swnj DELAY(10000); 593201Swnj ctaddr->ctcsr = 0; 607409Skre return (sizeof (struct ctdevice)); 613201Swnj } 623201Swnj 633217Swnj /*ARGSUSED*/ 643217Swnj ctattach(ui) 653217Swnj register struct uba_device *ui; 663217Swnj { 673217Swnj 683217Swnj } 693217Swnj 702621Swnj ctopen(dev) 713201Swnj dev_t dev; 722621Swnj { 733201Swnj register struct ct_softc *sc; 743201Swnj register struct uba_device *ui; 753201Swnj register struct ctdevice *ctaddr; 763201Swnj 773201Swnj if (CTUNIT(dev) >= NCT || (ui = ctdinfo[CTUNIT(dev)]) == 0 || 783201Swnj ui->ui_alive == 0 || (sc = &ct_softc[CTUNIT(dev)])->sc_openf) { 792621Swnj u.u_error = ENXIO; 803201Swnj return; 813201Swnj } 823201Swnj sc->sc_openf = 1; 833201Swnj ctaddr->ctcsr |= IENABLE; 842621Swnj } 852621Swnj 863201Swnj ctclose(dev) 873201Swnj dev_t dev; 882621Swnj { 893201Swnj 903201Swnj ct_softc[CTUNIT(dev)].sc_openf = 0; 913201Swnj ctintr(dev); 922621Swnj } 932621Swnj 947831Sroot ctwrite(dev, uio) 953201Swnj dev_t dev; 967831Sroot struct uio *uio; 972621Swnj { 983201Swnj register struct ct_softc *sc = &ct_softc[CTUNIT(dev)]; 993201Swnj register int c; 1002621Swnj 1017831Sroot while ((c=cupass(uio)) >= 0) { 1023101Swnj (void) spl5(); 1033201Swnj while (sc->sc_oq.c_cc > CATHIWAT) 1043201Swnj sleep((caddr_t)&sc->sc_oq, PCAT); 1053201Swnj while (putc(c, &sc->sc_oq) < 0) 1062621Swnj sleep((caddr_t)&lbolt, PCAT); 1073201Swnj ctintr(dev); 1083101Swnj (void) spl0(); 1092621Swnj } 1102621Swnj } 1112621Swnj 1123201Swnj ctintr(dev) 1133201Swnj dev_t dev; 1142621Swnj { 1152621Swnj register int c; 1163201Swnj register struct ct_softc *sc = &ct_softc[CTUNIT(dev)]; 1173201Swnj register struct ctdevice *ctaddr = 1183201Swnj (struct ctdevice *)ctdinfo[CTUNIT(dev)]->ui_addr; 1192621Swnj 1203201Swnj if (ctaddr->ctcsr&DONE) { 1213201Swnj if ((c = getc(&sc->sc_oq)) >= 0) { 1223201Swnj ctaddr->ctbuf = c; 1233201Swnj if (sc->sc_oq.c_cc==0 || sc->sc_oq.c_cc==CATLOWAT) 1243201Swnj wakeup(&sc->sc_oq); 1252621Swnj } else { 1263201Swnj if (sc->sc_openf==0) 1273201Swnj ctaddr->ctcsr = 0; 1282621Swnj } 1292621Swnj } 1302621Swnj 1312621Swnj } 1322621Swnj #endif 133