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

1990/1231/port/devlance.c (diff list | history)

1990/1229/sys/src/9/port/devlance.c:6,251990/1231/sys/src/9/port/devlance.c:6,20 (short | long | prev | next)
1990/0227    
#include	"io.h" 
#include	"errno.h" 
#include	"devtab.h" 
/* 
 *  configuration parameters 
 */ 
1990/1231    
 
1990/0227    
enum { 
	Ntypes=		8,		/* max number of ethernet packet types */ 
1990/0911    
	Ndir=		Ntypes+2,	/* entries in top level directory */ 
1990/0227    
	LogNrrb=	7,		/* log of number of receive buffers */ 
	Nrrb=		(1<<LogNrrb),	/* number of recieve buffers */ 
	LogNtrb=	7,		/* log of number of transmit buffers */ 
	Ntrb=		(1<<LogNtrb),	/* number of transmit buffers */ 
1990/0409    
	Ndpkt=		200,		/* number of debug packets */ 
1990/1231    
	Maxrb=		128,		/* max buffers in a ring */ 
1990/0227    
}; 
#define RSUCC(x) (((x)+1)%Nrrb) 
#define TSUCC(x) (((x)+1)%Ntrb) 
1990/1231    
#define RSUCC(x) (((x)+1)%l.nrrb) 
#define TSUCC(x) (((x)+1)%l.ntrb) 
1990/0227    
 
1990/0707    
#define NOW (MACHP(0)->ticks*MS2HZ) 
1990/03042    
 
1990/1229/sys/src/9/port/devlance.c:40,461990/1231/sys/src/9/port/devlance.c:35,41
1990/0227    
/* 
 *  lance memory map 
 */ 
1990/0911    
typedef struct Lancemem 
1990/1231    
struct Lancemem 
1990/0227    
{ 
	/* 
	 *  initialization block 
1990/1229/sys/src/9/port/devlance.c:57,651990/1231/sys/src/9/port/devlance.c:52,60
1990/0911    
	 *  ring buffers 
	 *  first receive, then transmit 
1990/0227    
	 */ 
	Msg	rmr[Nrrb];		/* recieve message ring */ 
	Msg	tmr[Ntrb];		/* transmit message ring */ 
} Lancemem; 
1990/1231    
	Msg	rmr[Maxrb];		/* recieve message ring */ 
	Msg	tmr[Maxrb];		/* transmit message ring */ 
}; 
1990/0227    
 
/* 
 *  Some macros for dealing with lance memory addresses.  The lance splits 
1990/1229/sys/src/9/port/devlance.c:116,1301990/1231/sys/src/9/port/devlance.c:111,120
1990/0227    
typedef struct { 
	QLock; 
 
1990/1231    
	Lance;			/* host dependent lance params */ 
 
1990/0227    
	int	inited; 
	uchar	ea[6];		/* our ether addr */ 
	uchar	*lmp;		/* location of parity test */ 
	ushort	*rap;		/* lance address register */ 
	ushort	*rdp;		/* lance data register */ 
1990/0911    
	int	sep;		/* separaqtion between shorts in lance ram 
				    as seen by host */ 
	ushort	*lanceram;	/* start of lance ram as seen by host */ 
	Lancemem *lm;		/* start of lance memory as seen by lance */ 
1990/0227    
 
	Rendez	rr;		/* rendezvous for an input buffer */ 
	ushort	rl;		/* first rcv Message belonging to Lance */	 
1990/1229/sys/src/9/port/devlance.c:140,1501990/1231/sys/src/9/port/devlance.c:130,135
1990/0227    
	int	kstarted; 
	Debqueue dq; 
1990/0911    
 
1990/1229    
	Etherpkt	*rp;	/* receive buffers (host address) */ 
	Etherpkt	*tp;	/* transmit buffers (host address) */ 
	Etherpkt	*lrp;	/* receive buffers (lance address) */ 
	Etherpkt	*ltp;	/* transmit buffers (lance address) */ 
1990/0911    
                 
	/* sadistics */ 
 
	int	inpackets; 
1990/1229/sys/src/9/port/devlance.c:154,1611990/1231/sys/src/9/port/devlance.c:139,146
1990/0911    
	int	frames;		/* framing errors */ 
	int	overflows;	/* packet overflows */ 
	int	buffs;		/* buffering errors */ 
1990/0227    
} Lance; 
static Lance l; 
1990/1231    
} SoftLance; 
static SoftLance l; 
1990/0227    
 
/* 
 *  mode bits in the lance initialization block 
1990/1229/sys/src/9/port/devlance.c:431,4381990/1231/sys/src/9/port/devlance.c:416,425
1990/1229    
	ushort *lanceaddr; 
	ushort *hostaddr; 
1990/0227    
 
1990/1229    
	l.rap = LANCERAP; 
	l.rdp = LANCERDP; 
1990/1231    
	if(already == 0){ 
		already = 1; 
		lancesetup(&l); 
	} 
1990/1229    
 
1990/0227    
	/* 
1990/1228    
	 *  stop the lance 
1990/1229/sys/src/9/port/devlance.c:439,4751990/1231/sys/src/9/port/devlance.c:426,431
1990/0227    
	 */ 
1990/1228    
	*l.rap = 0; 
	*l.rdp = STOP; 
1990/0227    
                 
1990/0911    
	if(already == 0){ 
		already = 1; 
1990/0912    
                 
1990/1229    
		/* 
		 *  lance ethernet address 
		 */ 
		lanceeaddr(l.ea); 
                 
		/* 
		 *  lance init block and descriptor rings 
		 */ 
		lancectlmem(&hostaddr, &lanceaddr, &l.sep, sizeof(Lancemem)); 
		l.lanceram = hostaddr; 
		l.lm = (Lancemem*)lanceaddr; 
                 
		/* 
		 *  lance receive buffers 
		 */ 
		lancepktmem(&hostaddr, &lanceaddr, Nrrb*sizeof(Etherpkt)); 
		l.rp = (Etherpkt*)hostaddr; 
		l.lrp = (Etherpkt*)lanceaddr; 
                 
		/* 
		 *  lance xmt buffers 
		 */ 
		lancepktmem(&hostaddr, &lanceaddr, Ntrb*sizeof(Etherpkt)); 
		l.tp = (Etherpkt*)hostaddr; 
		l.ltp = (Etherpkt*)lanceaddr; 
1990/0911    
	} 
                 
1990/0227    
} 
 
/* 
1990/1229/sys/src/9/port/devlance.c:512,5181990/1231/sys/src/9/port/devlance.c:468,474
1990/0227    
	 *  set up rcv message ring 
	 */ 
1990/0911    
	m = lm->rmr; 
	for(i = 0; i < Nrrb; i++, m++){ 
1990/1231    
	for(i = 0; i < l.nrrb; i++, m++){ 
1990/1228    
		MPs(m->size) = -sizeof(Etherpkt); 
1990/0911    
		MPus(m->cntflags) = 0; 
1990/1229    
		MPus(m->laddr) = LADDR(&l.lrp[i]); 
1990/1229/sys/src/9/port/devlance.c:519,5311990/1231/sys/src/9/port/devlance.c:475,487
1990/1229    
		MPus(m->flags) = HADDR(&l.lrp[i]); 
1990/0227    
	} 
1990/0911    
	MPus(lm->rdralow) = LADDR(l.lm->rmr); 
	MPus(lm->rdrahigh) = (LogNrrb<<13)|HADDR(l.lm->rmr); 
1990/1231    
	MPus(lm->rdrahigh) = (l.lognrrb<<13)|HADDR(l.lm->rmr); 
1990/0227    
 
1990/0911    
 
1990/0227    
	/* 
	 *  give the lance all the rcv buffers except one (as a sentinel) 
	 */ 
	l.rc = Nrrb - 1; 
1990/1231    
	l.rc = l.nrrb - 1; 
1990/0911    
	m = lm->rmr; 
	for(i = 0; i < l.rc; i++, m++) 
		MPus(m->flags) |= OWN; 
1990/1229/sys/src/9/port/devlance.c:534,5401990/1231/sys/src/9/port/devlance.c:490,496
1990/0227    
	 *  set up xmit message ring 
	 */ 
1990/0911    
	m = lm->tmr; 
	for(i = 0; i < Ntrb; i++, m++){ 
1990/1231    
	for(i = 0; i < l.ntrb; i++, m++){ 
1990/0911    
		MPs(m->size) = 0; 
		MPus(m->cntflags) = 0; 
1990/1229    
		MPus(m->laddr) = LADDR(&l.ltp[i]); 
1990/1229/sys/src/9/port/devlance.c:541,5471990/1231/sys/src/9/port/devlance.c:497,503
1990/1229    
		MPus(m->flags) = HADDR(&l.ltp[i]); 
1990/0227    
	} 
1990/0911    
	MPus(lm->tdralow) = LADDR(l.lm->tmr); 
	MPus(lm->tdrahigh) = (LogNtrb<<13)|HADDR(l.lm->tmr); 
1990/1231    
	MPus(lm->tdrahigh) = (l.logntrb<<13)|HADDR(l.lm->tmr); 
1990/0227    
 
	/* 
	 *  point lance to the initialization block 
1990/1229/sys/src/9/port/devlance.c:563,5701990/1231/sys/src/9/port/devlance.c:519,528
1990/0227    
	 *  initialize lance, turn on interrupts, turn on transmit and rcv. 
	 */ 
1990/1229    
	wbflush(); 
1990/1231    
	print("starting lance\n"); 
1990/0227    
	*l.rap = 0; 
	*l.rdp = INEA|INIT|STRT; /**/ 
1990/1231    
	print("lance started\n"); 
1990/0227    
} 
 
/* 
1990/1229/sys/src/9/port/devlance.c:781,7881990/1231/sys/src/9/port/devlance.c:739,748
1990/0227    
	if(csr & (BABL|MISS|MERR)) 
		print("lance err %ux\n", csr); 
 
	if(csr & IDON) 
1990/1231    
	if(csr & IDON){ 
		print("lance inited\n"); 
1990/0227    
		l.inited = 1; 
1990/1231    
	} 
1990/0227    
 
	/* 
	 *  look for rcv'd packets, just wakeup the input process 


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