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

1994/0107/carrera/devether.c (diff list | history)

1993/1231/sys/src/9/carrera/devether.c:271,2761994/0107/sys/src/9/carrera/devether.c:271,277 (short | long | prev | next)
1993/0904    
	 */ 
	WR(cr, Rst); 
1993/0905    
	WR(dcr, 0x2423);	/* 5-19 Carrera manual */ 
1994/0107    
	WR(cr, 0); 
1993/0903    
 
1993/0904    
	/* 
	 * Initialise the receive resource area (RRA) and 
1993/1231/sys/src/9/carrera/devether.c:379,3891994/0107/sys/src/9/carrera/devether.c:380,387
1993/0904    
	WR(cdc, 1); 
 
1993/0906    
	/* 
	 * End the reset 
	 * Load the Resource Descriptors and Cam contents 
	 */ 
	WR(cr, 0); 
                 
	WR(cr, Rrra); 
	while(RD(cr) & Rrra) 
		; 
1993/1231/sys/src/9/carrera/devether.c:397,4031994/0107/sys/src/9/carrera/devether.c:395,401
1993/0904    
	 * and interrupt-mask registers. 
	 * The SONIC is now initialised, but not enabled. 
	 */ 
	WR(rcr, Err|Rnt|Brd); 
1994/0107    
	WR(rcr, Brd); 
1993/0904    
	WR(tcr, 0); 
	WR(imr, AllIntr); 
1993/0903    
} 
1993/1231/sys/src/9/carrera/devether.c:437,4421994/0107/sys/src/9/carrera/devether.c:435,441
1993/0903    
etherintr(void) 
{ 
1993/0906    
	Ether *c; 
1994/0107    
	ushort *s; 
1993/0904    
	ulong status; 
	TXpkt *txpkt; 
	RXpkt *rxpkt; 
1993/1231/sys/src/9/carrera/devether.c:448,4551994/0107/sys/src/9/carrera/devether.c:447,466
1993/0904    
		if(status == 0) 
			break; 
 
1993/1219    
		/* Clear the interrupt cause */ 
1993/0904    
		WR(isr, status); 
1994/0107    
		/* 
		 * Warnings that something is atoe. 
		 */ 
		if(status & Hbl){ 
			WR(isr, Hbl); 
			status &= ~Hbl; 
			print("sonic: cd heartbeat lost\n"); 
		} 
		if(status & Br){ 
WR(cr, Rst); 
			print("sonic: bus retry occurred\n"); 
(*(void(*)(void))0xA001C020)(); 
			status &= ~Br; 
		} 
1993/0904    
	 
		/* 
		 * Transmission complete, for good or bad. 
1993/1231/sys/src/9/carrera/devether.c:470,4751994/0107/sys/src/9/carrera/devether.c:481,487
1993/0906    
				c->ti = NEXT(c->ti, Ntb); 
				txpkt = &c->tda[c->ti]; 
1993/0904    
			} 
1994/0107    
			WR(isr, status & (Txdn|Txer)); 
1993/0904    
			status &= ~(Txdn|Txer); 
1993/1212    
			if(isoutbuf(c)) 
				wakeup(&c->tr); 
1993/1231/sys/src/9/carrera/devether.c:500,5051994/0107/sys/src/9/carrera/devether.c:512,518
1993/0904    
			else 
1993/0906    
				c->buffs++; 
1993/0904    
	 
1994/0107    
			rxpkt->status  = 0; 
1993/0904    
			/* 
			 * Finished with this packet, it becomes the 
			 * last free packet in the ring, so give it Eol, 
1993/1231/sys/src/9/carrera/devether.c:506,5181994/0107/sys/src/9/carrera/devether.c:519,533
1993/0904    
			 * and take the Eol bit off the previous packet. 
			 * Move the ring index on. 
			 */ 
			rxpkt->link |= Eol; 
1994/0107    
			wus(&rxpkt->link,  rxpkt->link|Eol); 
1993/0904    
			rxpkt->owner = Interface; 
1993/0906    
			c->rda[PREV(c->rh, Nrb)].link &= ~Eol; 
1994/0107    
			s = &c->rda[PREV(c->rh, Nrb)].link; 
			wus(s, *s & ~Eol); 
1993/0906    
			c->rh = NEXT(c->rh, Nrb); 
1993/0904    
	 
1993/0906    
			rxpkt = &c->rda[c->rh]; 
1993/0903    
		} 
1994/0107    
		WR(isr, status & (Pktrx|Rde)); 
1993/0904    
		status &= ~(Pktrx|Rde); 
1993/0903    
 
1993/0904    
	noinput: 
1993/1231/sys/src/9/carrera/devether.c:520,5421994/0107/sys/src/9/carrera/devether.c:535,549
1993/0904    
		 * We get a 'load CAM done' interrupt 
		 * after initialisation. Ignore it. 
1993/0903    
		 */ 
1993/0904    
		if(status & Lcd) 
1994/0107    
		if(status & Lcd) { 
			WR(isr, Lcd); 
1993/0904    
			status &= ~Lcd; 
	                 
		/* 
1993/1212    
		 * Warnings that something is atoe. 
1993/0904    
		 */ 
		if(status & Hbl){ 
1993/0906    
			print("sonic: cd heartbeat lost\n"); 
1993/0904    
			status &= ~Hbl; 
1993/0903    
		} 
1993/0904    
		if(status & Br){ 
1993/1218    
			print("sonic: bus retry occurred\n"); 
1993/0904    
			status &= ~Br; 
		} 
	 
		if(status & AllIntr) 
1994/0107    
		if(status & AllIntr) { 
			WR(isr, status); 
1993/0906    
			print("sonic #%lux\n", status); 
1994/0107    
		} 
1993/0903    
	} 
} 
 
1993/1231/sys/src/9/carrera/devether.c:716,7211994/0107/sys/src/9/carrera/devether.c:723,729
1993/0903    
etherwrite(Chan *c, void *buf, long n, ulong offset) 
{ 
1993/0906    
	Pbuf *p; 
1994/0107    
	ushort *s; 
1993/0904    
	TXpkt *txpkt; 
	Ether *ctlr = ether[0]; 
1993/0903    
 
1993/1231/sys/src/9/carrera/devether.c:733,7381994/0107/sys/src/9/carrera/devether.c:741,747
1993/1202    
		return n; 
 
1993/0904    
	qlock(&ctlr->tlock); 
1994/0107    
	ctlr->outpackets++; 
1993/0918    
	if(waserror()) { 
		qunlock(&ctlr->tlock); 
		nexterror(); 
1993/1231/sys/src/9/carrera/devether.c:755,7631994/0107/sys/src/9/carrera/devether.c:764,773
1993/0904    
		txpkt = &ctlr->tda[ctlr->th]; 
		txpkt->size = n; 
		txpkt->fsize = n; 
		txpkt->link |= Eol; 
1994/0107    
		wus(&txpkt->link, txpkt->link|Eol); 
1993/0904    
		txpkt->status = Interface; 
		ctlr->tda[PREV(ctlr->th, Ntb)].link &= ~Eol; 
1994/0107    
		s = &ctlr->tda[PREV(ctlr->th, Ntb)].link; 
		wus(s, *s & ~Eol); 
1993/0904    
 
		ctlr->th = NEXT(ctlr->th, Ntb); 
		WR(cr, Txp); 


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