1 /* ct.c 4.9 82/08/22 */ 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/tty.h" 15 #include "../h/pte.h" 16 #include "../h/map.h" 17 #include "../h/buf.h" 18 #include "../h/ubareg.h" 19 #include "../h/ubavar.h" 20 #include "../h/conf.h" 21 #include "../h/dir.h" 22 #include "../h/user.h" 23 24 #define PCAT (PZERO+9) 25 #define CATHIWAT 100 26 #define CATLOWAT 30 27 28 struct ct_softc { 29 int sc_openf; 30 struct clist sc_oq; 31 } ct_softc[NCT]; 32 33 struct ctdevice { 34 short ctcsr; 35 short ctbuf; 36 }; 37 38 int ctprobe(), ctattach(), ctintr(); 39 struct uba_device *ctdinfo[NCT]; 40 u_short ctstd[] = { 0 }; 41 struct uba_driver ctdriver = 42 { ctprobe, 0, ctattach, 0, ctstd, "ct", ctdinfo }; 43 44 #define CTUNIT(dev) (minor(dev)) 45 46 ctprobe(reg) 47 caddr_t reg; 48 { 49 register int br, cvec; /* value-result */ 50 register struct ctdevice *ctaddr = (struct ctdevice *)reg; 51 52 #ifdef lint 53 br = 0; cvec = br; br = cvec; 54 ctintr(0); 55 #endif 56 ctaddr->ctcsr = IENABLE; 57 DELAY(10000); 58 ctaddr->ctcsr = 0; 59 return (sizeof (struct ctdevice)); 60 } 61 62 /*ARGSUSED*/ 63 ctattach(ui) 64 register struct uba_device *ui; 65 { 66 67 } 68 69 ctopen(dev) 70 dev_t dev; 71 { 72 register struct ct_softc *sc; 73 register struct uba_device *ui; 74 register struct ctdevice *ctaddr; 75 76 if (CTUNIT(dev) >= NCT || (ui = ctdinfo[CTUNIT(dev)]) == 0 || 77 ui->ui_alive == 0 || (sc = &ct_softc[CTUNIT(dev)])->sc_openf) { 78 u.u_error = ENXIO; 79 return; 80 } 81 sc->sc_openf = 1; 82 ctaddr->ctcsr |= IENABLE; 83 } 84 85 ctclose(dev) 86 dev_t dev; 87 { 88 89 ct_softc[CTUNIT(dev)].sc_openf = 0; 90 ctintr(dev); 91 } 92 93 ctwrite(dev, uio) 94 dev_t dev; 95 struct uio *uio; 96 { 97 register struct ct_softc *sc = &ct_softc[CTUNIT(dev)]; 98 register int c; 99 100 while ((c=cupass(uio)) >= 0) { 101 (void) spl5(); 102 while (sc->sc_oq.c_cc > CATHIWAT) 103 sleep((caddr_t)&sc->sc_oq, PCAT); 104 while (putc(c, &sc->sc_oq) < 0) 105 sleep((caddr_t)&lbolt, PCAT); 106 ctintr(dev); 107 (void) spl0(); 108 } 109 } 110 111 ctintr(dev) 112 dev_t dev; 113 { 114 register int c; 115 register struct ct_softc *sc = &ct_softc[CTUNIT(dev)]; 116 register struct ctdevice *ctaddr = 117 (struct ctdevice *)ctdinfo[CTUNIT(dev)]->ui_addr; 118 119 if (ctaddr->ctcsr&DONE) { 120 if ((c = getc(&sc->sc_oq)) >= 0) { 121 ctaddr->ctbuf = c; 122 if (sc->sc_oq.c_cc==0 || sc->sc_oq.c_cc==CATLOWAT) 123 wakeup(&sc->sc_oq); 124 } else { 125 if (sc->sc_openf==0) 126 ctaddr->ctcsr = 0; 127 } 128 } 129 130 } 131 #endif 132