xref: /csrg-svn/sys/vax/uba/ct.c (revision 4932)
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