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

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

1990/1228/sys/src/9/port/devlance.c:23,281990/1229/sys/src/9/port/devlance.c:23,30 (short | long | prev | next)
Created.
rsc Fri Mar 4 12:44:25 2005
1990/0227    
 
1990/0707    
#define NOW (MACHP(0)->ticks*MS2HZ) 
1990/03042    
 
1990/1229    
int plance; 
 
1990/0227    
/* 
 *  Communication with the lance is via a transmit and receive ring of 
 *  message descriptors.  The Initblock contains pointers to and sizes of 
1990/1228/sys/src/9/port/devlance.c:57,681990/1229/sys/src/9/port/devlance.c:59,64
1990/0227    
	 */ 
	Msg	rmr[Nrrb];		/* recieve message ring */ 
	Msg	tmr[Ntrb];		/* transmit message ring */ 
                 
	/* 
1990/1228    
	 *  packet buffers (for SGI IO2 version only) 
1990/0227    
	 */ 
1990/1228    
	Etherpkt	rp[Nrrb]; 
	Etherpkt	tp[Ntrb]; 
1990/0227    
} Lancemem; 
 
/* 
1990/1228/sys/src/9/port/devlance.c:128,1341990/1229/sys/src/9/port/devlance.c:124,129
1990/0911    
	int	sep;		/* separaqtion between shorts in lance ram 
				    as seen by host */ 
	ushort	*lanceram;	/* start of lance ram as seen by host */ 
	ushort	*lanceend;	/* end 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 */ 
1990/1228/sys/src/9/port/devlance.c:145,1541990/1229/sys/src/9/port/devlance.c:140,149
1990/0227    
	int	kstarted; 
	Debqueue dq; 
1990/0911    
 
1990/1228    
	Etherpkt	*rp;		/* receive buffers */ 
	Etherpkt	*tp;		/* transmit buffers */ 
1990/0911    
	uchar	*rpa[Nrrb];	/* receive buffer address in lance space */ 
	uchar	*tpa[Ntrb];	/* transmit buffer address in lance space */ 
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 */ 
 
1990/1228/sys/src/9/port/devlance.c:266,2721990/1229/sys/src/9/port/devlance.c:261,267
1990/03042    
	memcpy(&(t->p), p, sizeof(Dpkt)); 
1990/0227    
	l.dq.next = (l.dq.next+1) % Ndpkt; 
	unlock(&l.dq); 
1990/0427    
/*	{ 
1990/1229    
	if(plance){ 
1990/0427    
		char buf[1024]; 
		if(p->d[0] != 0xff){ 
			sprintpacket(buf, t); 
1990/1228/sys/src/9/port/devlance.c:405,4141990/1229/sys/src/9/port/devlance.c:400,410
1990/0227    
	m = &(LANCEMEM->tmr[l.tc]); 
1990/0911    
	MPs(m->size) = -len; 
	MPus(m->cntflags) = 0; 
	MPus(m->laddr) = LADDR(l.tpa[l.tc]); 
	MPus(m->flags) = OWN|STP|ENP|HADDR(l.tpa[l.tc]); 
1990/1229    
	MPus(m->laddr) = LADDR(&l.ltp[l.tc]); 
	MPus(m->flags) = OWN|STP|ENP|HADDR(&l.ltp[l.tc]); 
1990/0227    
	l.tc = TSUCC(l.tc); 
	*l.rdp = INEA|TDMD; /**/ 
1990/1229    
	wbflush(); 
1990/0227    
	qunlock(&l.tlock); 
} 
 
1990/1228/sys/src/9/port/devlance.c:423,4471990/1229/sys/src/9/port/devlance.c:419,427
1990/03042    
Dirtab lancedir[Ndir]; 
1990/0227    
 
/* 
1990/1228    
 *  configure the lance 
1990/1229    
 *  stop the lance and allocate buffers 
1990/1228    
 */ 
void 
lanceconfig(void *ramstart, void *ramend, void *rap, void *rdp, int sep, 
	void *lancemem, uchar* ea) 
{ 
	l.lanceram = ramstart; 
	l.lanceend = ramend; 
	l.rap = rap; 
	l.rdp = rdp; 
	l.sep = sep; 
	l.lm = lancemem;	/* where lance sees its memory start */ 
	memcpy(l.ea, ea, 6); 
} 
                 
/* 
1990/0227    
 *  stop the lance, disable all ring buffers, and free all staged rcv buffers 
 */ 
void 
lancereset(void) 
{ 
	int i; 
1990/1228/sys/src/9/port/devlance.c:448,4541990/1229/sys/src/9/port/devlance.c:428,439
1990/0911    
	ulong x; 
	int index; 
	static int already; 
1990/1229    
	ushort *lanceaddr; 
	ushort *hostaddr; 
1990/0227    
 
1990/1229    
	l.rap = LANCERAP; 
	l.rdp = LANCERDP; 
 
1990/0227    
	/* 
1990/1228    
	 *  stop the lance 
1990/0227    
	 */ 
1990/1228/sys/src/9/port/devlance.c:457,4941990/1229/sys/src/9/port/devlance.c:442,473
1990/0227    
 
1990/0911    
	if(already == 0){ 
		already = 1; 
		if(ioid < IO3R1){ 
			/* 
			 *  allocate packet buffers in lance memory 
			 */ 
			for(i = 0; i < Nrrb; i++) 
				l.rpa[i] = (uchar *)&l.lm->rp[i]; 
			for(i = 0; i < Ntrb; i++) 
				l.tpa[i] = (uchar *)&l.lm->tp[i]; 
1990/0912    
 
1990/1228    
			l.rp = ((Lancemem *)l.lanceram)->rp; 
			l.tp = ((Lancemem *)l.lanceram)->tp; 
1990/0911    
		} else { 
			/* 
			 *  allocate packet buffers in MP bus memory 
			 *  and map it into lance space 
			 */ 
1990/1228    
			l.rp = (Etherpkt *)ialloc((Nrrb + Ntrb)*sizeof(Etherpkt), 1); 
1990/0911    
			l.tp = l.rp + Nrrb; 
			index = 0x1E00; 
			for(i = 0; i < Nrrb; i++){ 
				x = (ulong)&l.rp[i]; 
				*WRITEMAP = (index<<16) | (x>>12)&0xFFFF; 
				l.rpa[i] = (uchar *)((i<<12) | (x & 0xFFF)); 
				index++; 
			} 
			for(i = 0; i < Ntrb; i++){ 
				x = (ulong)&l.tp[i]; 
				*WRITEMAP = (index<<16) | (x>>12)&0xFFFF; 
				l.tpa[i] = (uchar *)(((i+Nrrb)<<12) | (x & 0xFFF)); 
				index++; 
			} 
		} 
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/1228/sys/src/9/port/devlance.c:536,5431990/1229/sys/src/9/port/devlance.c:515,522
1990/0911    
	for(i = 0; i < Nrrb; i++, m++){ 
1990/1228    
		MPs(m->size) = -sizeof(Etherpkt); 
1990/0911    
		MPus(m->cntflags) = 0; 
		MPus(m->laddr) = LADDR(l.rpa[i]); 
		MPus(m->flags) = HADDR(l.rpa[i]); 
1990/1229    
		MPus(m->laddr) = LADDR(&l.lrp[i]); 
		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/1228/sys/src/9/port/devlance.c:558,5651990/1229/sys/src/9/port/devlance.c:537,544
1990/0911    
	for(i = 0; i < Ntrb; i++, m++){ 
		MPs(m->size) = 0; 
		MPus(m->cntflags) = 0; 
		MPus(m->laddr) = LADDR(l.tpa[i]); 
		MPus(m->flags) = HADDR(l.tpa[i]); 
1990/1229    
		MPus(m->laddr) = LADDR(&l.ltp[i]); 
		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/1228/sys/src/9/port/devlance.c:583,5881990/1229/sys/src/9/port/devlance.c:562,568
1990/0227    
	/* 
	 *  initialize lance, turn on interrupts, turn on transmit and rcv. 
	 */ 
1990/1229    
	wbflush(); 
1990/0227    
	*l.rap = 0; 
	*l.rdp = INEA|INIT|STRT; /**/ 
} 
1990/1228/sys/src/9/port/devlance.c:807,8141990/1229/sys/src/9/port/devlance.c:787,795
1990/0227    
	/* 
	 *  look for rcv'd packets, just wakeup the input process 
	 */ 
1990/0911    
	if(l.rl!=l.rc && (MPus(lm->rmr[l.rl].flags) & OWN)==0) 
1990/1229    
	if(l.rl!=l.rc && (MPus(lm->rmr[l.rl].flags) & OWN)==0){ 
1990/0227    
		wakeup(&l.rr); 
1990/1229    
	} 
1990/0227    
 
	/* 
	 *  look for xmitt'd packets, wake any process waiting for a 
1990/1228/sys/src/9/port/devlance.c:907,9241990/1229/sys/src/9/port/devlance.c:888,903
1990/0227    
			m = &(lm->rmr[l.rc]); 
1990/1228    
			MPs(m->size) = -sizeof(Etherpkt); 
1990/0911    
			MPus(m->cntflags) = 0; 
			MPus(m->laddr) = LADDR(l.rpa[l.rc]); 
			MPus(m->flags) = OWN|HADDR(l.rpa[l.rc]); 
1990/1229    
			MPus(m->laddr) = LADDR(&l.lrp[l.rc]); 
			MPus(m->flags) = OWN|HADDR(&l.lrp[l.rc]); 
1990/0227    
			l.rc = RSUCC(l.rc); 
1990/1229    
			wbflush(); 
1990/0227    
		} 
		sleep(&l.rr, isinput, 0); 
	} 
} 
 
void 
lanceparity(void) 
1990/1229    
lancetoggle() 
1990/0227    
{ 
	print("lance DRAM parity error lmp=%ux\n", l.lmp); 
	MODEREG->promenet &= ~4; 
	MODEREG->promenet |= 4; 
1990/1229    
	plance ^= 1; 
1990/0826    
} 


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