plan 9 kernel history: overview | file list | diff list

1991/0601/port/devscc.c (diff list | history)

1991/0601/sys/src/9/port/devscc.c:197,2081991/0604/sys/src/9/port/devscc.c:197,209 (short | long)
1991/0601    
} 
 
/* 
 *  9600 baud, 1 stop bit, 8 bit chars, no interrupts, 
1991/0604    
 *  default is 9600 baud, 1 stop bit, 8 bit chars, no interrupts, 
1991/0601    
 *  transmit and receive enabled, interrupts disabled. 
 */ 
void 
sccsetup(void) 
1991/0604    
sccsetup(void *addr) 
1991/0601    
{ 
1991/0604    
	SCCdev *dev; 
1991/0601    
	SCC *sp; 
	static int already; 
 
1991/0601/sys/src/9/port/devscc.c:209,2221991/0604/sys/src/9/port/devscc.c:210,224
1991/0601    
	if(already) 
		return; 
	already = 1; 
1991/0604    
	dev = addr; 
1991/0601    
 
	/* 
	 *  get port addresses 
	 */ 
	scc[0].ptr = &SCCADDR->ptra; 
	scc[0].data = &SCCADDR->dataa; 
	scc[1].ptr = &SCCADDR->ptrb; 
	scc[1].data = &SCCADDR->datab; 
1991/0604    
	scc[0].ptr = &dev->ptra; 
	scc[0].data = &dev->dataa; 
	scc[1].ptr = &dev->ptrb; 
	scc[1].data = &dev->datab; 
1991/0601    
 
	for(sp = scc; sp < &scc[2]; sp++){ 
		memset(sp->sticky, 0, sizeof(sp->sticky)); 
1991/0601/sys/src/9/port/devscc.c:331,3411991/0604/sys/src/9/port/devscc.c:333,338
1991/0601    
void 
sccdevice(SCC *sp) 
{ 
	/* 
	 *  turn on both ports 
	 */ 
	sccsetup(); 
                 
	/* 
	 *  set up i/o routines 
	 */ 
1991/0604/sys/src/9/port/devscc.c:101,1071991/0606/sys/src/9/port/devscc.c:101,107 (short | long)
1991/0601    
	Alarm	*a;		/* alarm for waking the kernel process */ 
	int	delay;		/* between character input and waking kproc */ 
 	int	kstarted;	/* kproc started */ 
	uchar	delim[256];	/* characters that act as delimiters */ 
1991/0606    
	uchar	delim[256/8];	/* characters that act as delimiters */ 
1991/0601    
}; 
SCC	scc[2]; 
 
1991/0604/sys/src/9/port/devscc.c:296,3021991/0606/sys/src/9/port/devscc.c:296,302
1991/0601    
				(*cq->putc)(cq, ch); 
			else { 
				putc(cq, ch); 
				if(sp->delim[ch]) 
1991/0606    
				if(sp->delim[ch/8] & (1<<(ch&7)) ) 
1991/0601    
					wakeup(&cq->r); 
			} 
		} 
1991/0604/sys/src/9/port/devscc.c:331,3371991/0606/sys/src/9/port/devscc.c:331,337
1991/0601    
 *  turn on a port's interrupts.  set DTR and RTS 
 */ 
void 
sccdevice(SCC *sp) 
1991/0606    
sccenable(SCC *sp) 
1991/0601    
{ 
	/* 
	 *  set up i/o routines 
1991/0604/sys/src/9/port/devscc.c:371,3771991/0606/sys/src/9/port/devscc.c:371,377
1991/0601    
	sp->nostream = 1; 
	sp->oq = oq; 
	sp->iq = iq; 
	sccdevice(sp); 
1991/0606    
	sccenable(sp); 
1991/0601    
	sccsetbaud(sp, baud); 
} 
 
1991/0604/sys/src/9/port/devscc.c:580,5861991/0606/sys/src/9/port/devscc.c:580,586
1991/0601    
		initq(sp->iq); 
		sp->oq = ialloc(sizeof(IOQ), 0); 
		initq(sp->oq); 
		sccdevice(sp); 
1991/0606    
		sccenable(sp); 
1991/0601    
	} 
} 
 
1991/0606/sys/src/9/port/devscc.c:284,2901991/0607/sys/src/9/port/devscc.c:284,289 (short | long)
1991/0601    
	IOQ *cq; 
 
	if(x & ExtPendB){ 
		/*kprint("scc %d: %2.2ux\n", sp-scc, *sp->ptr);*/ 
		sccwrreg(sp, 0, ResExtPend); 
	} 
	if(x & RxPendB){ 
1991/0606/sys/src/9/port/devscc.c:305,3141991/0607/sys/src/9/port/devscc.c:304,311
1991/0601    
		cq = sp->oq; 
		lock(cq); 
		ch = getc(cq); 
		/*kprint("<%2.2ux>", ch);*/ 
		onepointseven(); 
		if(ch < 0){ 
			/*kprint("<done>", ch);*/ 
			sccwrreg(sp, 0, ResTxPend); 
			sp->printing = 0; 
			wakeup(&cq->r); 
1991/0607/sys/src/9/port/devscc.c:370,3751991/0727/sys/src/9/port/devscc.c:370,383 (short | long)
1991/0601    
	sp->iq = iq; 
1991/0606    
	sccenable(sp); 
1991/0601    
	sccsetbaud(sp, baud); 
1991/0727    
 
	if(iq){ 
		/* 
		 *  Stupid HACK to undo a stupid hack 
		 */  
		if(iq == &kbdq) 
			kbdq.putc = kbdcr2nl; 
	} 
1991/0601    
} 
 
static void	scctimer(Alarm*); 
1991/0727/sys/src/9/port/devscc.c:99,1071991/1003/sys/src/9/port/devscc.c:99,105 (short | long)
1991/0601    
	Queue	*wq;		/* write queue */ 
	Rendez	r;		/* kproc waiting for input */ 
	Alarm	*a;		/* alarm for waking the kernel process */ 
	int	delay;		/* between character input and waking kproc */ 
 	int	kstarted;	/* kproc started */ 
1991/0606    
	uchar	delim[256/8];	/* characters that act as delimiters */ 
1991/0601    
}; 
SCC	scc[2]; 
 
1991/0727/sys/src/9/port/devscc.c:293,3031991/1003/sys/src/9/port/devscc.c:291,298
1991/0601    
			ch = *sp->data; 
			if(cq->putc) 
				(*cq->putc)(cq, ch); 
			else { 
1991/1003    
			else 
1991/0601    
				putc(cq, ch); 
1991/0606    
				if(sp->delim[ch/8] & (1<<(ch&7)) ) 
1991/0601    
					wakeup(&cq->r); 
			} 
		} 
	} 
	if(x & TxPendB){ 
1991/0727/sys/src/9/port/devscc.c:324,3291991/1003/sys/src/9/port/devscc.c:319,337
1991/0601    
	sccintr0(&scc[0], x>>3); 
} 
 
1991/1003    
void 
sccclock(void) 
{ 
	SCC *sp; 
	IOQ *cq; 
 
	for(sp = scc; sp < &scc[2]; sp++){ 
		cq = sp->iq; 
		if(sp->wq && cangetc(cq)) 
			wakeup(&cq->r); 
	} 
} 
 
1991/0601    
/* 
 *  turn on a port's interrupts.  set DTR and RTS 
 */ 
1991/0727/sys/src/9/port/devscc.c:380,3861991/1003/sys/src/9/port/devscc.c:388,393
1991/0727    
	} 
1991/0601    
} 
 
static void	scctimer(Alarm*); 
static int	sccputc(IOQ *, int); 
static void	sccstopen(Queue*, Stream*); 
static void	sccstclose(Queue*); 
1991/0727/sys/src/9/port/devscc.c:395,4331991/1003/sys/src/9/port/devscc.c:402,408
1991/0601    
	"scc" 
}; 
 
/* 
 *  create a helper process per port 
 */ 
static void 
scctimer(Alarm *a) 
{ 
	SCC *sp = a->arg; 
                 
	cancel(a); 
	sp->a = 0; 
	wakeup(&sp->iq->r); 
} 
                 
static int 
sccputc(IOQ *cq, int ch) 
{ 
	SCC *sp = cq->ptr; int r; 
                 
	r = putc(cq, ch); 
                 
	/* 
	 *  pass upstream within sp->delay milliseconds 
	 */ 
	if(sp->a==0){ 
		if(sp->delay == 0) 
			wakeup(&cq->r); 
		else 
			sp->a = alarm(sp->delay, scctimer, sp); 
	} 
	return r; 
} 
                 
static void 
sccstopen(Queue *q, Stream *s) 
{ 
	SCC *sp; 
1991/0727/sys/src/9/port/devscc.c:440,4521991/1003/sys/src/9/port/devscc.c:415,422
1991/0601    
	sp->wq = WR(q); 
	WR(q)->ptr = sp; 
	RD(q)->ptr = sp; 
	sp->delay = 64; 
	sp->iq->putc = sccputc; 
	qunlock(sp); 
 
	/* start with all characters as delimiters */ 
	memset(sp->delim, 1, sizeof(sp->delim)); 
	                 
	if(sp->kstarted == 0){ 
		sp->kstarted = 1; 
		sprint(name, "scc%d", s->id); 
1991/0727/sys/src/9/port/devscc.c:507,5141991/1003/sys/src/9/port/devscc.c:477,483
1991/0601    
			break; 
		case 'W': 
		case 'w': 
			if(n>=0 && n<1000) 
				sp->delay = n; 
1991/1003    
			/* obsolete */ 
1991/0601    
			break; 
		} 
	}else while((m = BLEN(bp)) > 0){ 
1991/1003/sys/src/9/port/devscc.c:524,5401991/1115/sys/src/9/port/devscc.c:524,540 (short | long)
1991/0601    
 
enum{ 
	Qdir=		0, 
	Qtty0=		STREAMQID(0, Sdataqid), 
	Qtty0ctl=	STREAMQID(0, Sctlqid), 
	Qtty1=		STREAMQID(1, Sdataqid), 
	Qtty1ctl=	STREAMQID(1, Sctlqid), 
1991/1115    
	Qeia0=		STREAMQID(0, Sdataqid), 
	Qeia0ctl=	STREAMQID(0, Sctlqid), 
	Qeia1=		STREAMQID(1, Sdataqid), 
	Qeia1ctl=	STREAMQID(1, Sctlqid), 
1991/0601    
}; 
 
Dirtab sccdir[]={ 
	"tty0",		{Qtty0},	0,		0666, 
	"tty0ctl",	{Qtty0ctl},	0,		0666, 
	"tty1",		{Qtty1},	0,		0666, 
	"tty1ctl",	{Qtty1ctl},	0,		0666, 
1991/1115    
	"eia0",		{Qeia0},	0,		0666, 
	"eia0ctl",	{Qeia0ctl},	0,		0666, 
	"eia1",		{Qeia1},	0,		0666, 
	"eia1ctl",	{Qeia1ctl},	0,		0666, 
1991/0601    
}; 
 
#define	NSCC	(sizeof sccdir/sizeof(Dirtab)) 
1991/1003/sys/src/9/port/devscc.c:585,5951991/1115/sys/src/9/port/devscc.c:585,595
1991/0601    
sccstat(Chan *c, char *dp) 
{ 
	switch(c->qid.path){ 
	case Qtty0: 
		streamstat(c, dp, "tty0"); 
1991/1115    
	case Qeia0: 
		streamstat(c, dp, "eia0"); 
1991/0601    
		break; 
	case Qtty1: 
		streamstat(c, dp, "tty1"); 
1991/1115    
	case Qeia1: 
		streamstat(c, dp, "eia1"); 
1991/0601    
		break; 
	default: 
		devstat(c, dp, sccdir, NSCC, devgen); 
1991/1003/sys/src/9/port/devscc.c:603,6141991/1115/sys/src/9/port/devscc.c:603,614
1991/0601    
	SCC *sp; 
 
	switch(c->qid.path){ 
	case Qtty0: 
	case Qtty0ctl: 
1991/1115    
	case Qeia0: 
	case Qeia0ctl: 
1991/0601    
		sp = &scc[0]; 
		break; 
	case Qtty1: 
	case Qtty1ctl: 
1991/1115    
	case Qeia1: 
	case Qeia1ctl: 
1991/0601    
		sp = &scc[1]; 
		break; 
	default: 
1991/1003/sys/src/9/port/devscc.c:627,6321991/1115/sys/src/9/port/devscc.c:627,633
1991/0601    
void 
scccreate(Chan *c, char *name, int omode, ulong perm) 
{ 
1991/1115    
	USED(c, name, omode, perm); 
1991/0601    
	error(Eperm); 
} 
 
1991/1003/sys/src/9/port/devscc.c:645,6541991/1115/sys/src/9/port/devscc.c:646,655
1991/0601    
	switch(c->qid.path&~CHDIR){ 
	case Qdir: 
		return devdirread(c, buf, n, sccdir, NSCC, devgen); 
	case Qtty1ctl: 
1991/1115    
	case Qeia1ctl: 
1991/0601    
		++sp; 
		/* fall through */ 
	case Qtty0ctl: 
1991/1115    
	case Qeia0ctl: 
1991/0601    
		if(offset) 
			return 0; 
		s = splhi(); 
1991/1003/sys/src/9/port/devscc.c:668,6731991/1115/sys/src/9/port/devscc.c:669,675
1991/0601    
void 
sccremove(Chan *c) 
{ 
1991/1115    
	USED(c); 
1991/0601    
	error(Eperm); 
} 
 
1991/1003/sys/src/9/port/devscc.c:674,6781991/1115/sys/src/9/port/devscc.c:676,681
1991/0601    
void 
sccwstat(Chan *c, char *dp) 
{ 
1991/1115    
	USED(c, dp); 
1991/0601    
	error(Eperm); 
} 
1991/1115/sys/src/9/port/devscc.c:89,941991/1225/sys/src/9/port/devscc.c:89,95 (short | long)
1991/0601    
	uchar	*ptr;		/* command/pointer register in Z8530 */ 
	uchar	*data;		/* data register in Z8530 */ 
	int	printing;	/* true if printing */ 
1991/1225    
	ulong	freq;		/* clock frequency */ 
1991/0601    
 
	/* console interface */ 
	int	nostream;	/* can't use the stream interface */ 
1991/1115/sys/src/9/port/devscc.c:101,1081991/1225/sys/src/9/port/devscc.c:102,111
1991/0601    
	Alarm	*a;		/* alarm for waking the kernel process */ 
 	int	kstarted;	/* kproc started */ 
}; 
SCC	scc[2]; 
 
1991/1225    
int	nscc; 
SCC	*scc[8];	/* up to 4 8530's */ 
 
1991/0601    
void 
onepointseven(void) 
{ 
1991/1115/sys/src/9/port/devscc.c:145,1521991/1225/sys/src/9/port/devscc.c:148,158
1991/0601    
{ 
	int brconst; 
 
	brconst = (SCCFREQ+16*rate-1)/(2*16*rate) - 2; 
1991/1225    
	if(rate == 0) 
		errors("bad baud rate"); 
1991/0601    
 
1991/1225    
	brconst = (sp->freq+16*rate-1)/(2*16*rate) - 2; 
 
1991/0601    
	sccwrreg(sp, 12, brconst & 0xff); 
	sccwrreg(sp, 13, (brconst>>8) & 0xff); 
} 
1991/1115/sys/src/9/port/devscc.c:183,1881991/1225/sys/src/9/port/devscc.c:189,196
1991/0601    
void 
sccbreak(SCC *sp, int ms) 
{ 
1991/1225    
	if(ms == 0) 
		ms = 100; 
1991/0601    
	sp->sticky[1] &=~TxIntEna; 
	sccwrreg(sp, 1, 0); 
	sccwrreg(sp, 5, TxBreak|TxEna); 
1991/1115/sys/src/9/port/devscc.c:198,2481991/1225/sys/src/9/port/devscc.c:206,262
1991/0604    
 *  default is 9600 baud, 1 stop bit, 8 bit chars, no interrupts, 
1991/0601    
 *  transmit and receive enabled, interrupts disabled. 
 */ 
1991/1225    
static void 
sccsetup0(SCC *sp) 
{ 
	memset(sp->sticky, 0, sizeof(sp->sticky)); 
 
	/* 
	 *  turn on baud rate generator and set rate to 9600 baud. 
	 *  use 1 stop bit. 
	 */ 
	sp->sticky[14] = BRSource; 
	sccwrreg(sp, 14, 0); 
	sccsetbaud(sp, 9600); 
	sp->sticky[4] = Rx1stop | X16; 
	sccwrreg(sp, 4, 0); 
	sp->sticky[11] = TxClockBR | RxClockBR | TRxCOutBR | TRxCOI; 
	sccwrreg(sp, 11, 0); 
	sp->sticky[14] = BREna | BRSource; 
	sccwrreg(sp, 14, 0); 
 
	/* 
	 *  enable I/O, 8 bits/character 
	 */ 
	sp->sticky[3] = RxEna | Rx8bits; 
	sccwrreg(sp, 3, 0); 
	sp->sticky[5] = TxEna | Tx8bits; 
	sccwrreg(sp, 5, 0); 
} 
1991/0601    
void 
1991/0604    
sccsetup(void *addr) 
1991/1225    
sccsetup(void *addr, ulong freq) 
1991/0601    
{ 
1991/0604    
	SCCdev *dev; 
1991/0601    
	SCC *sp; 
	static int already; 
 
	if(already) 
		return; 
	already = 1; 
1991/0604    
	dev = addr; 
1991/0601    
 
	/* 
	 *  get port addresses 
1991/1225    
	 *  allocate a structure, set port addresses, and setup the line 
1991/0601    
	 */ 
1991/0604    
	scc[0].ptr = &dev->ptra; 
	scc[0].data = &dev->dataa; 
	scc[1].ptr = &dev->ptrb; 
	scc[1].data = &dev->datab; 
1991/0601    
                 
	for(sp = scc; sp < &scc[2]; sp++){ 
		memset(sp->sticky, 0, sizeof(sp->sticky)); 
                 
		/* 
		 *  turn on baud rate generator and set rate to 9600 baud. 
		 *  use 1 stop bit. 
		 */ 
		sp->sticky[14] = BRSource; 
		sccwrreg(sp, 14, 0); 
		sccsetbaud(sp, 9600); 
		sp->sticky[4] = Rx1stop | X16; 
		sccwrreg(sp, 4, 0); 
		sp->sticky[11] = TxClockBR | RxClockBR | TRxCOutBR | TRxCOI; 
		sccwrreg(sp, 11, 0); 
		sp->sticky[14] = BREna | BRSource; 
		sccwrreg(sp, 14, 0); 
                 
		/* 
		 *  enable I/O, 8 bits/character 
		 */ 
		sp->sticky[3] = RxEna | Rx8bits; 
		sccwrreg(sp, 3, 0); 
		sp->sticky[5] = TxEna | Tx8bits; 
		sccwrreg(sp, 5, 0); 
	} 
1991/1225    
	sp = ialloc(sizeof(SCC), 0); 
	scc[nscc] = sp; 
	sp->ptr = &dev->ptra; 
	sp->data = &dev->dataa; 
	sp->freq = freq; 
	sccsetup0(sp); 
	sp = ialloc(sizeof(SCC), 0); 
	scc[nscc+1] = sp; 
	sp->ptr = &dev->ptrb; 
	sp->data = &dev->datab; 
	sp->freq = freq; 
	sccsetup0(sp); 
	nscc += 2; 
1991/0601    
} 
 
/* 
1991/1115/sys/src/9/port/devscc.c:313,3221991/1225/sys/src/9/port/devscc.c:327,342
1991/0601    
sccintr(void) 
{ 
	uchar x; 
1991/1225    
	int i; 
1991/0601    
 
	x = sccrdreg(&scc[0], 3); 
	sccintr0(&scc[1], x); 
	sccintr0(&scc[0], x>>3); 
1991/1225    
	for(i = 0; i < nscc; i += 2){ 
		x = sccrdreg(scc[i], 3); 
		if(x & (ExtPendB|RxPendB|TxPendB)) 
			sccintr0(scc[i+1], x); 
		x = x >> 3; 
		if(x & (ExtPendB|RxPendB|TxPendB)) 
			sccintr0(scc[i], x); 
	} 
1991/0601    
} 
 
1991/1003    
void 
1991/1115/sys/src/9/port/devscc.c:324,3311991/1225/sys/src/9/port/devscc.c:344,353
1991/1003    
{ 
	SCC *sp; 
	IOQ *cq; 
1991/1225    
	int i; 
1991/1003    
 
	for(sp = scc; sp < &scc[2]; sp++){ 
1991/1225    
	for(i = 0; i < nscc; i++){ 
		sp = scc[i]; 
1991/1003    
		cq = sp->iq; 
		if(sp->wq && cangetc(cq)) 
			wakeup(&cq->r); 
1991/1115/sys/src/9/port/devscc.c:371,3771991/1225/sys/src/9/port/devscc.c:393,399
1991/0601    
void 
sccspecial(int port, IOQ *oq, IOQ *iq, int baud) 
{ 
	SCC *sp = &scc[port]; 
1991/1225    
	SCC *sp = scc[port]; 
1991/0601    
 
	sp->nostream = 1; 
	sp->oq = oq; 
1991/1115/sys/src/9/port/devscc.c:410,4161991/1225/sys/src/9/port/devscc.c:432,438
1991/0601    
 
	kprint("sccstopen: q=0x%ux, inuse=%d, type=%d, dev=%d, id=%d\n", 
		q, s->inuse, s->type, s->dev, s->id); 
	sp = &scc[s->id]; 
1991/1225    
	sp = scc[s->id]; 
1991/0601    
	qlock(sp); 
	sp->wq = WR(q); 
	WR(q)->ptr = sp; 
1991/1115/sys/src/9/port/devscc.c:430,4361991/1225/sys/src/9/port/devscc.c:452,457
1991/0601    
	SCC *sp = q->ptr; 
 
	qlock(sp); 
	kprint("sccstclose: q=0x%ux, id=%d\n", q, sp-scc); 
	sp->wq = 0; 
	sp->iq->putc = 0; 
	WR(q)->ptr = 0; 
1991/1115/sys/src/9/port/devscc.c:461,4671991/1225/sys/src/9/port/devscc.c:482,491
1991/0601    
		switch(*bp->rptr){ 
		case 'B': 
		case 'b': 
			sccsetbaud(sp, n); 
1991/1225    
			if(BLEN(bp)>4 && strncmp((char*)(bp->rptr+1), "reak", 4) == 0) 
				sccbreak(sp, 0); 
			else 
				sccsetbaud(sp, n); 
1991/0601    
			break; 
		case 'D': 
		case 'd': 
1991/1115/sys/src/9/port/devscc.c:522,5531991/1225/sys/src/9/port/devscc.c:546,579
1991/0601    
	goto loop; 
} 
 
enum{ 
	Qdir=		0, 
1991/1115    
	Qeia0=		STREAMQID(0, Sdataqid), 
	Qeia0ctl=	STREAMQID(0, Sctlqid), 
	Qeia1=		STREAMQID(1, Sdataqid), 
	Qeia1ctl=	STREAMQID(1, Sctlqid), 
1991/0601    
}; 
1991/1225    
Dirtab *sccdir; 
1991/0601    
 
Dirtab sccdir[]={ 
1991/1115    
	"eia0",		{Qeia0},	0,		0666, 
	"eia0ctl",	{Qeia0ctl},	0,		0666, 
	"eia1",		{Qeia1},	0,		0666, 
	"eia1ctl",	{Qeia1ctl},	0,		0666, 
1991/0601    
}; 
                 
#define	NSCC	(sizeof sccdir/sizeof(Dirtab)) 
                 
/* 
 *  allocate the queues if no one else has 
1991/1225    
 *  create 2 directory entries for each 'sccsetup' ports. 
 *  allocate the queues if no one else has. 
1991/0601    
 */ 
void 
sccreset(void) 
{ 
	SCC *sp; 
1991/1225    
	int i; 
	Dirtab *dp; 
1991/0601    
 
	for(sp = scc; sp < &scc[2]; sp++){ 
1991/1225    
	sccdir = ialloc(2 * nscc * sizeof(Dirtab), 0); 
	dp = sccdir; 
	for(i = 0; i < nscc; i++){ 
		/* 2 directory entries per port */ 
		sprint(dp->name, "eia%d", i); 
		dp->qid.path = STREAMQID(i, Sdataqid); 
		dp->perm = 0666; 
		dp++; 
		sprint(dp->name, "eia%dctl", i); 
		dp->qid.path = STREAMQID(i, Sctlqid); 
		dp->perm = 0666; 
		dp++; 
 
		/* set up queues if a stream port */ 
		sp = scc[i]; 
1991/0601    
		if(sp->nostream) 
			continue; 
		sp->iq = ialloc(sizeof(IOQ), 0); 
1991/1115/sys/src/9/port/devscc.c:578,5981991/1225/sys/src/9/port/devscc.c:604,624
1991/0601    
int 
sccwalk(Chan *c, char *name) 
{ 
	return devwalk(c, name, sccdir, NSCC, devgen); 
1991/1225    
	return devwalk(c, name, sccdir, 2*nscc, devgen); 
1991/0601    
} 
 
void 
sccstat(Chan *c, char *dp) 
{ 
	switch(c->qid.path){ 
1991/1115    
	case Qeia0: 
		streamstat(c, dp, "eia0"); 
1991/1225    
	int i; 
 
	i = STREAMID(c->qid.path); 
	switch(STREAMTYPE(c->qid.path)){ 
	case Sdataqid: 
		streamstat(c, dp, sccdir[2*i].name); 
1991/0601    
		break; 
1991/1115    
	case Qeia1: 
		streamstat(c, dp, "eia1"); 
1991/0601    
		break; 
	default: 
		devstat(c, dp, sccdir, NSCC, devgen); 
1991/1225    
		devstat(c, dp, sccdir, 2*nscc, devgen); 
1991/0601    
		break; 
	} 
} 
1991/1115/sys/src/9/port/devscc.c:602,6271991/1225/sys/src/9/port/devscc.c:628,640
1991/0601    
{ 
	SCC *sp; 
 
	switch(c->qid.path){ 
1991/1115    
	case Qeia0: 
	case Qeia0ctl: 
1991/0601    
		sp = &scc[0]; 
		break; 
1991/1115    
	case Qeia1: 
	case Qeia1ctl: 
1991/0601    
		sp = &scc[1]; 
		break; 
	default: 
		sp = 0; 
		break; 
	} 
                 
	if(sp && sp->nostream) 
		errors("in use"); 
                 
	if((c->qid.path & CHDIR) == 0) 
1991/1225    
	if(c->qid.path != CHDIR){ 
		sp = scc[STREAMID(c->qid.path)]; 
		if(sp->nostream) 
			errors("in use"); 
1991/0601    
		streamopen(c, &sccinfo); 
	return devopen(c, omode, sccdir, NSCC, devgen); 
1991/1225    
	} 
	return devopen(c, omode, sccdir, 2*nscc, devgen); 
1991/0601    
} 
 
void 
1991/1115/sys/src/9/port/devscc.c:641,6631991/1225/sys/src/9/port/devscc.c:654,673
1991/0601    
long 
sccread(Chan *c, void *buf, long n, ulong offset) 
{ 
	SCC *sp = &scc[0]; int s; 
1991/1225    
	SCC *sp; 
	char b[8]; 
1991/0601    
 
	switch(c->qid.path&~CHDIR){ 
	case Qdir: 
		return devdirread(c, buf, n, sccdir, NSCC, devgen); 
1991/1115    
	case Qeia1ctl: 
1991/0601    
		++sp; 
		/* fall through */ 
1991/1115    
	case Qeia0ctl: 
1991/0601    
		if(offset) 
			return 0; 
		s = splhi(); 
		*(uchar *)buf = *sp->ptr; 
		splx(s); 
		return 1; 
1991/1225    
	if(c->qid.path == CHDIR) 
		return devdirread(c, buf, n, sccdir, 2*nscc, devgen); 
 
	switch(STREAMTYPE(c->qid.path)){ 
	case Sdataqid: 
		return streamread(c, buf, n); 
	case Sctlqid: 
		sprint(b, "%d", STREAMID(c->qid.path)); 
		return stringread(buf, n, b, offset); 
1991/0601    
	} 
	return streamread(c, buf, n); 
1991/1225    
	errors("bad qid"); 
1991/0601    
} 
 
long 
1991/1225/sys/src/9/port/devscc.c:4,101992/0111/sys/src/9/port/devscc.c:4,10 (short | long)
Move error.h to ../port. Change errors to actual strings.
rsc Fri Mar 4 12:44:25 2005
1991/0601    
#include	"dat.h" 
#include	"fns.h" 
#include	"io.h" 
#include	"errno.h" 
1992/0111    
#include	"../port/error.h" 
1991/0601    
 
#include	"devtab.h" 
 
1992/0111/sys/src/9/port/devscc.c:149,1551992/0114/sys/src/9/port/devscc.c:149,155 (short | long)
1991/0601    
	int brconst; 
 
1991/1225    
	if(rate == 0) 
		errors("bad baud rate"); 
1992/0114    
		error(Ebadctl); 
1991/0601    
 
1991/1225    
	brconst = (sp->freq+16*rate-1)/(2*16*rate) - 2; 
 
1992/0111/sys/src/9/port/devscc.c:631,6371992/0114/sys/src/9/port/devscc.c:631,637
1991/1225    
	if(c->qid.path != CHDIR){ 
		sp = scc[STREAMID(c->qid.path)]; 
		if(sp->nostream) 
			errors("in use"); 
1992/0114    
			error(Einuse); 
1991/0601    
		streamopen(c, &sccinfo); 
1991/1225    
	} 
	return devopen(c, omode, sccdir, 2*nscc, devgen); 
1992/0111/sys/src/9/port/devscc.c:667,6731992/0114/sys/src/9/port/devscc.c:667,673
1991/1225    
		sprint(b, "%d", STREAMID(c->qid.path)); 
		return stringread(buf, n, b, offset); 
1991/0601    
	} 
1991/1225    
	errors("bad qid"); 
1992/0114    
	error(Egreg); 
1991/0601    
} 
 
long 
1992/0114/sys/src/9/port/devscc.c:101,1101992/0129/sys/src/9/port/devscc.c:101,116 (short | long)
1991/0601    
	Rendez	r;		/* kproc waiting for input */ 
	Alarm	*a;		/* alarm for waking the kernel process */ 
 	int	kstarted;	/* kproc started */ 
1992/0129    
 
	/* idiot flow control */ 
	int	xonoff;		/* true if we obey this tradition */ 
	int	blocked;	/* abstinence */ 
1991/0601    
}; 
 
1991/1225    
int	nscc; 
SCC	*scc[8];	/* up to 4 8530's */ 
1992/0129    
#define CTLS	023 
#define CTLQ	021 
1991/1225    
 
1991/0601    
void 
onepointseven(void) 
1992/0114/sys/src/9/port/devscc.c:272,2781992/0129/sys/src/9/port/devscc.c:278,284
1991/0601    
	x = splhi(); 
	lock(cq); 
	puts(cq, s, n); 
	if(sp->printing == 0){ 
1992/0129    
	if(sp->printing == 0 && sp->blocked==0){ 
1991/0601    
		ch = getc(cq); 
		/*kprint("<start %2.2ux>", ch);*/ 
		if(ch >= 0){ 
1992/0114/sys/src/9/port/devscc.c:303,3081992/0129/sys/src/9/port/devscc.c:309,320
1991/0601    
		while(*sp->ptr&RxReady){ 
			onepointseven(); 
			ch = *sp->data; 
1992/0129    
			if (ch == CTLS && sp->xonoff) 
				sp->blocked = 1; 
			else if (ch == CTLQ && sp->xonoff) { 
				sp->blocked = 0; 
				sccputs(sp->oq, "", 0); 
			} 
1991/0601    
			if(cq->putc) 
				(*cq->putc)(cq, ch); 
1991/1003    
			else 
1992/0114/sys/src/9/port/devscc.c:310,3151992/0129/sys/src/9/port/devscc.c:322,332
1991/0601    
		} 
	} 
	if(x & TxPendB){ 
1992/0129    
		if (sp->blocked) { 
			sccwrreg(sp, 0, ResTxPend); 
			sp->printing = 0; 
			return; 
		} 
1991/0601    
		cq = sp->oq; 
		lock(cq); 
		ch = getc(cq); 
1992/0114/sys/src/9/port/devscc.c:502,5071992/0129/sys/src/9/port/devscc.c:519,528
1991/0601    
		case 'W': 
		case 'w': 
1991/1003    
			/* obsolete */ 
1992/0129    
			break; 
		case 'X': 
		case 'x': 
			sp->xonoff = n; 
1991/0601    
			break; 
		} 
	}else while((m = BLEN(bp)) > 0){ 
1992/0129/sys/src/9/port/devscc.c:1,51992/0321/sys/src/9/port/devscc.c:1,5 (short | long)
Move lib.h to ../port.
rsc Fri Mar 4 12:44:25 2005
1991/0601    
#include	"u.h" 
#include	"lib.h" 
1992/0321    
#include	"../port/lib.h" 
1991/0601    
#include	"mem.h" 
#include	"dat.h" 
#include	"fns.h" 
1992/0321/sys/src/9/port/devscc.c:33,381992/0326/sys/src/9/port/devscc.c:33,42 (short | long)
1991/0601    
	Rx8bits=	3<<6, 
 
	/* wr 4 */ 
1992/0326    
	ParEven=	3<<0, 
	ParOdd=		1<<0, 
	ParOff=		0<<0, 
	ParMask=	3<<0, 
1991/0601    
	SyncMode=	0<<2, 
	Rx1stop=	1<<2, 
	Rx1hstop=	2<<2, 
1992/0321/sys/src/9/port/devscc.c:163,1681992/0326/sys/src/9/port/devscc.c:167,192
1991/0601    
	sccwrreg(sp, 13, (brconst>>8) & 0xff); 
} 
 
1992/0326    
void 
sccparity(SCC *sp, char type) 
{ 
	int val; 
 
	switch(type){ 
	case 'e': 
		val = ParEven; 
		break; 
	case 'o': 
		val = ParOdd; 
		break; 
	default: 
		val = ParOff; 
		break; 
	} 
	sp->sticky[4] = (sp->sticky[4] & ~ParMask) | val; 
	sccwrreg(sp, 4, 0); 
} 
 
1991/0601    
/* 
 *  toggle DTR 
 */ 
1992/0321/sys/src/9/port/devscc.c:507,5121992/0326/sys/src/9/port/devscc.c:531,540
1991/0601    
		case 'D': 
		case 'd': 
			sccdtr(sp, n); 
1992/0326    
			break; 
		case 'P': 
		case 'p': 
			sccparity(sp, *(bp->rptr+1)); 
1991/0601    
			break; 
		case 'K': 
		case 'k': 
1992/0326/sys/src/9/port/devscc.c:451,4571992/0519/sys/src/9/port/devscc.c:451,456 (short | long)
1991/0727    
	} 
1991/0601    
} 
 
static int	sccputc(IOQ *, int); 
static void	sccstopen(Queue*, Stream*); 
static void	sccstclose(Queue*); 
static void	sccoput(Queue*, Block*); 
1992/0519/sys/src/9/port/devscc.c:716,7211992/0522/sys/src/9/port/devscc.c:716,722 (short | long)
1991/1225    
		return stringread(buf, n, b, offset); 
1991/0601    
	} 
1992/0114    
	error(Egreg); 
1992/0522    
	return 0;	/* not reached */ 
1991/0601    
} 
 
long 
1992/0522/sys/src/9/port/devscc.c:103,1091992/0602/sys/src/9/port/devscc.c:103,108 (short | long)
1991/0601    
	/* stream interface */ 
	Queue	*wq;		/* write queue */ 
	Rendez	r;		/* kproc waiting for input */ 
	Alarm	*a;		/* alarm for waking the kernel process */ 
 	int	kstarted;	/* kproc started */ 
1992/0129    
 
	/* idiot flow control */ 
1992/0602/sys/src/9/port/devscc.c:31,361992/0617/sys/src/9/port/devscc.c:31,37 (short | long)
1991/0601    
	Rx7bits=	1<<6, 
	Rx6bits=	2<<6, 
	Rx8bits=	3<<6, 
1992/0617    
	Rxbitmask=	3<<6, 
1991/0601    
 
	/* wr 4 */ 
1992/0326    
	ParEven=	3<<0, 
1992/0602/sys/src/9/port/devscc.c:52,571992/0617/sys/src/9/port/devscc.c:53,59
1991/0601    
	Tx7bits=	1<<5, 
	Tx6bits=	2<<5, 
	Tx8bits=	3<<5, 
1992/0617    
	Txbitmask=	3<<5, 
1991/0601    
 
	/* wr 9 */ 
	IntEna=		1<<3, 
1992/0602/sys/src/9/port/devscc.c:187,1921992/0617/sys/src/9/port/devscc.c:189,228
1992/0326    
} 
 
1991/0601    
/* 
1992/0617    
 *  set bits/character, default 8 
 */ 
void 
sccbits(SCC *sp, int n) 
{ 
	int val; 
	int rbits, tbits; 
 
	switch(n){ 
	case 5: 
		rbits = Rx5bits; 
		tbits = Tx5bits; 
		break; 
	case 6: 
		rbits = Rx6bits; 
		tbits = Tx6bits; 
		break; 
	case 7: 
		rbits = Rx7bits; 
		tbits = Tx7bits; 
		break; 
	case 8: 
	default: 
		rbits = Rx8bits; 
		tbits = Tx8bits; 
		break; 
	} 
	sp->sticky[3] = (sp->sticky[3]&~Rxbitmask) | rbits; 
	sccwrreg(sp, 3, 0); 
	sp->sticky[5] = (sp->sticky[5]&~Txbitmask) | tbits; 
	sccwrreg(sp, 5, 0); 
} 
 
/* 
1991/0601    
 *  toggle DTR 
 */ 
void 
1992/0602/sys/src/9/port/devscc.c:530,5351992/0617/sys/src/9/port/devscc.c:566,576
1991/0601    
		case 'd': 
			sccdtr(sp, n); 
1992/0326    
			break; 
1992/0617    
		case 'L': 
		case 'l': 
			sccbits(sp, n); 
			break; 
 
1992/0326    
		case 'P': 
		case 'p': 
			sccparity(sp, *(bp->rptr+1)); 
1992/0617/sys/src/9/port/devscc.c:298,3031992/0620/sys/src/9/port/devscc.c:298,304 (short | long)
1991/1225    
	sp->sticky[5] = TxEna | Tx8bits; 
	sccwrreg(sp, 5, 0); 
} 
1992/0620    
 
1991/0601    
void 
1991/1225    
sccsetup(void *addr, ulong freq) 
1991/0601    
{ 
1992/0617/sys/src/9/port/devscc.c:309,3211992/0620/sys/src/9/port/devscc.c:310,322
1991/0601    
	/* 
1991/1225    
	 *  allocate a structure, set port addresses, and setup the line 
1991/0601    
	 */ 
1991/1225    
	sp = ialloc(sizeof(SCC), 0); 
1992/0620    
	sp = xalloc(sizeof(SCC)); 
1991/1225    
	scc[nscc] = sp; 
	sp->ptr = &dev->ptra; 
	sp->data = &dev->dataa; 
	sp->freq = freq; 
	sccsetup0(sp); 
	sp = ialloc(sizeof(SCC), 0); 
1992/0620    
	sp = xalloc(sizeof(SCC)); 
1991/1225    
	scc[nscc+1] = sp; 
	sp->ptr = &dev->ptrb; 
	sp->data = &dev->datab; 
1992/0617/sys/src/9/port/devscc.c:647,6531992/0620/sys/src/9/port/devscc.c:648,654
1991/1225    
	int i; 
	Dirtab *dp; 
1991/0601    
 
1991/1225    
	sccdir = ialloc(2 * nscc * sizeof(Dirtab), 0); 
1992/0620    
	sccdir = xalloc(2 * nscc * sizeof(Dirtab)); 
1991/1225    
	dp = sccdir; 
	for(i = 0; i < nscc; i++){ 
		/* 2 directory entries per port */ 
1992/0620/sys/src/9/port/devscc.c:665,6731992/0622/sys/src/9/port/devscc.c:665,673 (short | long)
1991/1225    
		sp = scc[i]; 
1991/0601    
		if(sp->nostream) 
			continue; 
		sp->iq = ialloc(sizeof(IOQ), 0); 
1992/0622    
		sp->iq = xalloc(sizeof(IOQ)); 
1991/0601    
		initq(sp->iq); 
		sp->oq = ialloc(sizeof(IOQ), 0); 
1992/0622    
		sp->oq = xalloc(sizeof(IOQ)); 
1991/0601    
		initq(sp->oq); 
1991/0606    
		sccenable(sp); 
1991/0601    
	} 
1992/0622/sys/src/9/port/devscc.c:754,7601992/0623/sys/src/9/port/devscc.c:754,760 (short | long)
1991/1225    
		return streamread(c, buf, n); 
	case Sctlqid: 
		sprint(b, "%d", STREAMID(c->qid.path)); 
		return stringread(buf, n, b, offset); 
1992/0623    
		return readstr(offset, buf, n, b); 
1991/0601    
	} 
1992/0114    
	error(Egreg); 
1992/0522    
	return 0;	/* not reached */ 
1992/0623/sys/src/9/port/devscc.c:194,2001992/0711/sys/src/9/port/devscc.c:194,199 (short | long)
1992/0617    
void 
sccbits(SCC *sp, int n) 
{ 
	int val; 
	int rbits, tbits; 
 
	switch(n){ 
1992/0623/sys/src/9/port/devscc.c:743,7491992/0711/sys/src/9/port/devscc.c:742,747
1991/0601    
long 
sccread(Chan *c, void *buf, long n, ulong offset) 
{ 
1991/1225    
	SCC *sp; 
	char b[8]; 
1991/0601    
 
1991/1225    
	if(c->qid.path == CHDIR) 
1992/0623/sys/src/9/port/devscc.c:763,7681992/0711/sys/src/9/port/devscc.c:761,767
1991/0601    
long 
sccwrite(Chan *c, void *va, long n, ulong offset) 
{ 
1992/0711    
	USED(offset); 
1991/0601    
	return streamwrite(c, va, n, 0); 
} 
 
1992/0711/sys/src/9/port/devscc.c:486,4911992/0722/sys/src/9/port/devscc.c:486,506 (short | long)
1991/0727    
	} 
1991/0601    
} 
 
1992/0722    
void 
sccrawput(int port, int c) 
{ 
	SCC *sp = scc[port]; 
 
	if(c == '\n') { 
		sccrawput(port, '\r'); 
		delay(100); 
	} 
 
	while((*sp->ptr&TxReady)==0) 
		; 
	*sp->data = c; 
} 
 
1991/0601    
static void	sccstopen(Queue*, Stream*); 
static void	sccstclose(Queue*); 
static void	sccoput(Queue*, Block*); 
1992/0722/sys/src/9/port/devscc.c:718,7241992/0826/sys/src/9/port/devscc.c:718,724 (short | long)
1991/1225    
	i = STREAMID(c->qid.path); 
	switch(STREAMTYPE(c->qid.path)){ 
	case Sdataqid: 
		streamstat(c, dp, sccdir[2*i].name); 
1992/0826    
		streamstat(c, dp, sccdir[2*i].name, sccdir[2*i].perm); 
1991/0601    
		break; 
	default: 
1991/1225    
		devstat(c, dp, sccdir, 2*nscc, devgen); 
1992/0826/sys/src/9/port/devscc.c:271,2771992/0922/sys/src/9/port/devscc.c:271,277 (short | long)
1991/0601    
 *  transmit and receive enabled, interrupts disabled. 
 */ 
1991/1225    
static void 
sccsetup0(SCC *sp) 
1992/0922    
sccsetup0(SCC *sp, int brsource) 
1991/1225    
{ 
	memset(sp->sticky, 0, sizeof(sp->sticky)); 
 
1992/0826/sys/src/9/port/devscc.c:284,2921992/0922/sys/src/9/port/devscc.c:284,294
1991/1225    
	sccsetbaud(sp, 9600); 
	sp->sticky[4] = Rx1stop | X16; 
	sccwrreg(sp, 4, 0); 
	sp->sticky[11] = TxClockBR | RxClockBR | TRxCOutBR | TRxCOI; 
1992/0922    
	sp->sticky[11] = TxClockBR | RxClockBR | TRxCOutBR /*| TRxCOI*/; 
1991/1225    
	sccwrreg(sp, 11, 0); 
	sp->sticky[14] = BREna | BRSource; 
1992/0922    
	sp->sticky[14] = BREna; 
	if(brsource) 
		sp->sticky[14] |= BRSource; 
1991/1225    
	sccwrreg(sp, 14, 0); 
 
	/* 
1992/0826/sys/src/9/port/devscc.c:299,3051992/0922/sys/src/9/port/devscc.c:301,307
1991/1225    
} 
1992/0620    
 
1991/0601    
void 
1991/1225    
sccsetup(void *addr, ulong freq) 
1992/0922    
sccsetup(void *addr, ulong freq, int brsource) 
1991/0601    
{ 
1991/0604    
	SCCdev *dev; 
1991/0601    
	SCC *sp; 
1992/0826/sys/src/9/port/devscc.c:314,3261992/0922/sys/src/9/port/devscc.c:316,328
1991/1225    
	sp->ptr = &dev->ptra; 
	sp->data = &dev->dataa; 
	sp->freq = freq; 
	sccsetup0(sp); 
1992/0922    
	sccsetup0(sp, brsource); 
1992/0620    
	sp = xalloc(sizeof(SCC)); 
1991/1225    
	scc[nscc+1] = sp; 
	sp->ptr = &dev->ptrb; 
	sp->data = &dev->datab; 
	sp->freq = freq; 
	sccsetup0(sp); 
1992/0922    
	sccsetup0(sp, brsource); 
1991/1225    
	nscc += 2; 
1991/0601    
} 
 
1992/0922/sys/src/9/port/devscc.c:98,1041992/1020/sys/src/9/port/devscc.c:98,104 (short | long)
1991/1225    
	ulong	freq;		/* clock frequency */ 
1991/0601    
 
	/* console interface */ 
	int	nostream;	/* can't use the stream interface */ 
1992/1020    
	int	special;	/* can't use the stream interface */ 
1991/0601    
	IOQ	*iq;		/* input character queue */ 
	IOQ	*oq;		/* output character queue */ 
 
1992/0922/sys/src/9/port/devscc.c:473,4791992/1020/sys/src/9/port/devscc.c:473,479
1991/0601    
{ 
1991/1225    
	SCC *sp = scc[port]; 
1991/0601    
 
	sp->nostream = 1; 
1992/1020    
	sp->special = 1; 
1991/0601    
	sp->oq = oq; 
	sp->iq = iq; 
1991/0606    
	sccenable(sp); 
1992/0922/sys/src/9/port/devscc.c:543,5481992/1020/sys/src/9/port/devscc.c:543,551
1991/0601    
{ 
	SCC *sp = q->ptr; 
 
1992/1020    
	if(sp->special) 
		return; 
 
1991/0601    
	qlock(sp); 
	sp->wq = 0; 
	sp->iq->putc = 0; 
1992/0922/sys/src/9/port/devscc.c:679,6851992/1020/sys/src/9/port/devscc.c:682,688
1991/1225    
 
		/* set up queues if a stream port */ 
		sp = scc[i]; 
1991/0601    
		if(sp->nostream) 
1992/1020    
		if(sp->special) 
1991/0601    
			continue; 
1992/0622    
		sp->iq = xalloc(sizeof(IOQ)); 
1991/0601    
		initq(sp->iq); 
1992/0922/sys/src/9/port/devscc.c:735,7411992/1020/sys/src/9/port/devscc.c:738,744
1991/0601    
 
1991/1225    
	if(c->qid.path != CHDIR){ 
		sp = scc[STREAMID(c->qid.path)]; 
		if(sp->nostream) 
1992/1020    
		if(sp->special) 
1992/0114    
			error(Einuse); 
1991/0601    
		streamopen(c, &sccinfo); 
1991/1225    
	} 
1992/1020/sys/src/9/port/devscc.c:96,1011992/1021/sys/src/9/port/devscc.c:96,102 (short | long)
1991/0601    
	uchar	*data;		/* data register in Z8530 */ 
	int	printing;	/* true if printing */ 
1991/1225    
	ulong	freq;		/* clock frequency */ 
1992/1021    
	uchar	mask;		/* bits/char */ 
1991/0601    
 
	/* console interface */ 
1992/1020    
	int	special;	/* can't use the stream interface */ 
1992/1020/sys/src/9/port/devscc.c:198,2161992/1021/sys/src/9/port/devscc.c:199,221
1992/0617    
 
	switch(n){ 
	case 5: 
1992/1021    
		sp->mask = 0x1f; 
1992/0617    
		rbits = Rx5bits; 
		tbits = Tx5bits; 
		break; 
	case 6: 
1992/1021    
		sp->mask = 0x3f; 
1992/0617    
		rbits = Rx6bits; 
		tbits = Tx6bits; 
		break; 
	case 7: 
1992/1021    
		sp->mask = 0x7f; 
1992/0617    
		rbits = Rx7bits; 
		tbits = Tx7bits; 
		break; 
	case 8: 
	default: 
1992/1021    
		sp->mask = 0xff; 
1992/0617    
		rbits = Rx8bits; 
		tbits = Tx8bits; 
		break; 
1992/1020/sys/src/9/port/devscc.c:298,3031992/1021/sys/src/9/port/devscc.c:303,309
1991/1225    
	sccwrreg(sp, 3, 0); 
	sp->sticky[5] = TxEna | Tx8bits; 
	sccwrreg(sp, 5, 0); 
1992/1021    
	sp->mask = 0xff; 
1991/1225    
} 
1992/0620    
 
1991/0601    
void 
1992/1020/sys/src/9/port/devscc.c:369,3751992/1021/sys/src/9/port/devscc.c:375,381
1991/0601    
		cq = sp->iq; 
		while(*sp->ptr&RxReady){ 
			onepointseven(); 
			ch = *sp->data; 
1992/1021    
			ch = *sp->data & sp->mask; 
1992/0129    
			if (ch == CTLS && sp->xonoff) 
				sp->blocked = 1; 
			else if (ch == CTLQ && sp->xonoff) { 
1992/1020/sys/src/9/port/devscc.c:477,4831992/1021/sys/src/9/port/devscc.c:483,490
1991/0601    
	sp->oq = oq; 
	sp->iq = iq; 
1991/0606    
	sccenable(sp); 
1991/0601    
	sccsetbaud(sp, baud); 
1992/1021    
	if(baud) 
		sccsetbaud(sp, baud); 
1991/0727    
 
	if(iq){ 
		/* 
Too many diffs (26 > 25). Stopping.


source code copyright © 1990-2005 Lucent Technologies; see license
Plan 9 distribution
comments to russ cox (rsc@swtch.com)