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