1*7831Sroot /* ct.c 4.9 82/08/22 */ 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 524932Swnj #ifdef lint 534932Swnj br = 0; cvec = br; br = cvec; 544932Swnj ctintr(0); 554932Swnj #endif 563201Swnj ctaddr->ctcsr = IENABLE; 573201Swnj DELAY(10000); 583201Swnj ctaddr->ctcsr = 0; 597409Skre return (sizeof (struct ctdevice)); 603201Swnj } 613201Swnj 623217Swnj /*ARGSUSED*/ 633217Swnj ctattach(ui) 643217Swnj register struct uba_device *ui; 653217Swnj { 663217Swnj 673217Swnj } 683217Swnj 692621Swnj ctopen(dev) 703201Swnj dev_t dev; 712621Swnj { 723201Swnj register struct ct_softc *sc; 733201Swnj register struct uba_device *ui; 743201Swnj register struct ctdevice *ctaddr; 753201Swnj 763201Swnj if (CTUNIT(dev) >= NCT || (ui = ctdinfo[CTUNIT(dev)]) == 0 || 773201Swnj ui->ui_alive == 0 || (sc = &ct_softc[CTUNIT(dev)])->sc_openf) { 782621Swnj u.u_error = ENXIO; 793201Swnj return; 803201Swnj } 813201Swnj sc->sc_openf = 1; 823201Swnj ctaddr->ctcsr |= IENABLE; 832621Swnj } 842621Swnj 853201Swnj ctclose(dev) 863201Swnj dev_t dev; 872621Swnj { 883201Swnj 893201Swnj ct_softc[CTUNIT(dev)].sc_openf = 0; 903201Swnj ctintr(dev); 912621Swnj } 922621Swnj 93*7831Sroot ctwrite(dev, uio) 943201Swnj dev_t dev; 95*7831Sroot struct uio *uio; 962621Swnj { 973201Swnj register struct ct_softc *sc = &ct_softc[CTUNIT(dev)]; 983201Swnj register int c; 992621Swnj 100*7831Sroot while ((c=cupass(uio)) >= 0) { 1013101Swnj (void) spl5(); 1023201Swnj while (sc->sc_oq.c_cc > CATHIWAT) 1033201Swnj sleep((caddr_t)&sc->sc_oq, PCAT); 1043201Swnj while (putc(c, &sc->sc_oq) < 0) 1052621Swnj sleep((caddr_t)&lbolt, PCAT); 1063201Swnj ctintr(dev); 1073101Swnj (void) spl0(); 1082621Swnj } 1092621Swnj } 1102621Swnj 1113201Swnj ctintr(dev) 1123201Swnj dev_t dev; 1132621Swnj { 1142621Swnj register int c; 1153201Swnj register struct ct_softc *sc = &ct_softc[CTUNIT(dev)]; 1163201Swnj register struct ctdevice *ctaddr = 1173201Swnj (struct ctdevice *)ctdinfo[CTUNIT(dev)]->ui_addr; 1182621Swnj 1193201Swnj if (ctaddr->ctcsr&DONE) { 1203201Swnj if ((c = getc(&sc->sc_oq)) >= 0) { 1213201Swnj ctaddr->ctbuf = c; 1223201Swnj if (sc->sc_oq.c_cc==0 || sc->sc_oq.c_cc==CATLOWAT) 1233201Swnj wakeup(&sc->sc_oq); 1242621Swnj } else { 1253201Swnj if (sc->sc_openf==0) 1263201Swnj ctaddr->ctcsr = 0; 1272621Swnj } 1282621Swnj } 1292621Swnj 1302621Swnj } 1312621Swnj #endif 132