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