V4/nsys/dmr/cat.c

Compare this file to the similar file:
Show the results in this format:

#
/*
 * GP DR11C driver used for C/A/T
 */

#include "/sys/nsys/param.h"
#include "/sys/nsys/user.h"
#include "/sys/nsys/tty.h"

#define	CATADDR	0167750
#define	PCAT	9

struct {
	int	catlock;
	struct	clist	oq;
} cat;

struct {
	int	catcsr;
	int	catbuf;
};

ctopen(dev)
{
	if (cat.catlock==0) {
		cat.catlock++;
		CATADDR->catcsr =| IENABLE;
	} else
		u.u_error = ENXIO;
}

ctclose(dev)
{
	cat.catlock = 0;
}

ctwrite(dev)
{
	int c;
	extern lbolt;

	spl5();
	while (cpass(&c) >= 0) {
		while (cat.oq.c_cc > 60)
			sleep(&cat.oq, PCAT);
		while (putc(c, &cat.oq) < 0)
			sleep(&lbolt, PCAT);
		catintr();
	}
	spl0();
}

catintr()
{
	register int c;

	if (CATADDR->catcsr&DONE && (c=getc(&cat.oq))>=0) {
		CATADDR->catbuf = c;
		if (cat.oq.c_cc==0 || cat.oq.c_cc==15)
			wakeup(&cat.oq);
	}
}