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

1991/0828/port/devlance.c (diff list | history)

1991/0621/sys/src/9/port/devlance.c:183,1891991/0828/sys/src/9/port/devlance.c:183,191 (short | long | prev | next)
1990/0227    
 *  predeclared 
 */ 
1991/0621    
static void lancekproc(void *); 
static void lancestart(int); 
1991/0828    
static void lancestart(int, int); 
static void lancedump(void); 
 
1990/0227    
/* 
 *  lance stream module definition 
 */ 
1991/0621/sys/src/9/port/devlance.c:228,2341991/0828/sys/src/9/port/devlance.c:230,236
1991/0621    
		qlock(&l); 
		l.prom--; 
		if(l.prom == 0) 
			lancestart(0); 
1991/0828    
			lancestart(0, 1); 
1991/0621    
		qunlock(&l); 
	} 
1990/0721    
	qlock(et); 
1991/0621/sys/src/9/port/devlance.c:266,2721991/0828/sys/src/9/port/devlance.c:268,274
1991/0621    
			qlock(&l); 
			l.prom++; 
			if(l.prom == 1) 
				lancestart(PROM); 
1991/0828    
				lancestart(PROM, 1); 
1991/0621    
			qunlock(&l); 
1990/0227    
		} 
		freeb(bp); 
1991/0621/sys/src/9/port/devlance.c:283,2951991/0828/sys/src/9/port/devlance.c:285,299
1990/0227    
	 *  only one transmitter at a time 
	 */ 
	qlock(&l.tlock); 
1991/0828    
	if(waserror()){ 
		qunlock(&l.tlock); 
		nexterror(); 
	} 
1990/0227    
 
	/* 
	 *  Wait till we get an output buffer 
	 */ 
	if(TSUCC(l.tc) == l.tl){ 
		sleep(&l.tr, isobuf, (void *)0); 
	} 
1991/0828    
	sleep(&l.tr, isobuf, (void *)0); 
1990/0911    
	p = &l.tp[l.tc]; 
1990/0227    
 
	/* 
1991/0621/sys/src/9/port/devlance.c:335,3401991/0828/sys/src/9/port/devlance.c:339,345
1990/0227    
	*l.rdp = INEA|TDMD; /**/ 
1990/1229    
	wbflush(); 
1990/0227    
	qunlock(&l.tlock); 
1991/0828    
	poperror(); 
1990/0227    
} 
 
/* 
1991/0621/sys/src/9/port/devlance.c:377,3831991/0828/sys/src/9/port/devlance.c:382,388
1990/0227    
 *  It may be used to restart a dead lance. 
 */ 
static void 
1991/0621    
lancestart(int mode) 
1991/0828    
lancestart(int mode, int dolock) 
1990/0227    
{ 
	int i; 
1990/1228    
	Etherpkt *p; 
1991/0621/sys/src/9/port/devlance.c:388,3951991/0828/sys/src/9/port/devlance.c:393,402
1991/0621    
	 *   wait till both receiver and transmitter are 
	 *   quiescent 
	 */ 
	qlock(&l.tlock); 
	qlock(&l.rlock); 
1991/0828    
	if(dolock){ 
		qlock(&l.tlock); 
		qlock(&l.rlock); 
	} 
1991/0621    
 
1990/0227    
	lancereset(); 
1991/0621    
	l.rl = 0; 
1991/0621/sys/src/9/port/devlance.c:509,5151991/0828/sys/src/9/port/devlance.c:516,522
1990/0227    
	if(l.kstarted == 0){ 
1990/0911    
		kproc("lancekproc", lancekproc, 0);/**/ 
1990/0227    
		l.kstarted = 1; 
1991/0621    
		lancestart(0); 
1991/0828    
		lancestart(0, 1); 
1990/0227    
	} 
1991/0316    
	return devattach('l', spec); 
1990/0227    
} 
1991/0621/sys/src/9/port/devlance.c:625,6301991/0828/sys/src/9/port/devlance.c:632,638
1990/0911    
	int i; 
1990/0227    
	ushort csr; 
1990/0911    
	Lancemem *lm = LANCEMEM; 
1991/0828    
	static int misses; 
1990/0227    
 
	csr = *l.rdp; 
 
1991/0621/sys/src/9/port/devlance.c:638,6431991/0828/sys/src/9/port/devlance.c:646,653
1990/0227    
	 */ 
1991/0108    
	if(csr & (BABL|MISS|MERR)){ 
1990/0227    
		print("lance err %ux\n", csr); 
1991/0828    
		if(csr & MISS) 
			lancedump(); 
1991/0108    
	} 
1990/0227    
 
1990/1231    
	if(csr & IDON){ 
1991/0621/sys/src/9/port/devlance.c:650,6551991/0828/sys/src/9/port/devlance.c:660,666
1990/0227    
	 *  look for rcv'd packets, just wakeup the input process 
	 */ 
1990/1229    
	if(l.rl!=l.rc && (MPus(lm->rmr[l.rl].flags) & OWN)==0){ 
1991/0828    
		misses = 0; 
1990/0227    
		wakeup(&l.rr); 
1990/1229    
	} 
1990/0227    
 
1991/0621/sys/src/9/port/devlance.c:756,7591991/0828/sys/src/9/port/devlance.c:767,776
1991/0621    
		qunlock(&l.rlock); 
1990/0227    
		sleep(&l.rr, isinput, 0); 
	} 
1991/0828    
} 
 
static void 
lancedump(void) 
{ 
	print("l.rl %d l.rc %d l.tl %d l.tc %d\n", l.rl, l.rc, l.tl, l.tc); 
1990/0826    
} 


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