xref: /plan9-contrib/sys/src/9/pc/ether8390.h (revision 7dd7cddf99dd7472612f1413b4da293630e6b1bc)
1*7dd7cddfSDavid du Colombier /*
2*7dd7cddfSDavid du Colombier  * Ctlr for the boards using the National Semiconductor DP8390
3*7dd7cddfSDavid du Colombier  * and SMC 83C90 Network Interface Controller.
4*7dd7cddfSDavid du Colombier  * Common code is in ether8390.c.
5*7dd7cddfSDavid du Colombier  */
6*7dd7cddfSDavid du Colombier typedef struct {
7*7dd7cddfSDavid du Colombier 	Lock;
8*7dd7cddfSDavid du Colombier 
9*7dd7cddfSDavid du Colombier 	ulong	port;			/* I/O address of 8390 */
10*7dd7cddfSDavid du Colombier 	ulong	data;			/* I/O data port if no shared memory */
11*7dd7cddfSDavid du Colombier 
12*7dd7cddfSDavid du Colombier 	uchar	width;			/* data transfer width in bytes */
13*7dd7cddfSDavid du Colombier 	uchar	ram;			/* true if card has shared memory */
14*7dd7cddfSDavid du Colombier 	uchar	dummyrr;		/* do dummy remote read */
15*7dd7cddfSDavid du Colombier 
16*7dd7cddfSDavid du Colombier 	uchar	nxtpkt;			/* receive: software bndry */
17*7dd7cddfSDavid du Colombier 	uchar	pstart;
18*7dd7cddfSDavid du Colombier 	uchar	pstop;
19*7dd7cddfSDavid du Colombier 
20*7dd7cddfSDavid du Colombier 	int	txbusy;			/* transmit */
21*7dd7cddfSDavid du Colombier 	uchar	tstart;			/* 8390 ring addresses */
22*7dd7cddfSDavid du Colombier 
23*7dd7cddfSDavid du Colombier 	uchar	mar[8];			/* shadow multicast address registers */
24*7dd7cddfSDavid du Colombier 	int	mref[64];		/* reference counts for multicast groups */
25*7dd7cddfSDavid du Colombier } Dp8390;
26*7dd7cddfSDavid du Colombier 
27*7dd7cddfSDavid du Colombier #define Dp8390BufSz	256
28*7dd7cddfSDavid du Colombier 
29*7dd7cddfSDavid du Colombier extern int dp8390reset(Ether*);
30*7dd7cddfSDavid du Colombier extern void *dp8390read(Dp8390*, void*, ulong, ulong);
31*7dd7cddfSDavid du Colombier extern void dp8390getea(Ether*, uchar*);
32*7dd7cddfSDavid du Colombier extern void dp8390setea(Ether*);
33*7dd7cddfSDavid du Colombier 
34*7dd7cddfSDavid du Colombier /*
35*7dd7cddfSDavid du Colombier  * x86-specific code.
36*7dd7cddfSDavid du Colombier  */
37*7dd7cddfSDavid du Colombier #define regr(c, r)	inb((c)->port+(r))
38*7dd7cddfSDavid du Colombier #define regw(c, r, v)	outb((c)->port+(r), (v))
39*7dd7cddfSDavid du Colombier 
40*7dd7cddfSDavid du Colombier static void
rdread(Dp8390 * ctlr,void * to,int len)41*7dd7cddfSDavid du Colombier rdread(Dp8390* ctlr, void* to, int len)
42*7dd7cddfSDavid du Colombier {
43*7dd7cddfSDavid du Colombier 	switch(ctlr->width){
44*7dd7cddfSDavid du Colombier 	default:
45*7dd7cddfSDavid du Colombier 		panic("dp8390 rdread: width %d\n", ctlr->width);
46*7dd7cddfSDavid du Colombier 		break;
47*7dd7cddfSDavid du Colombier 
48*7dd7cddfSDavid du Colombier 	case 2:
49*7dd7cddfSDavid du Colombier 		inss(ctlr->data, to, len/2);
50*7dd7cddfSDavid du Colombier 		break;
51*7dd7cddfSDavid du Colombier 
52*7dd7cddfSDavid du Colombier 	case 1:
53*7dd7cddfSDavid du Colombier 		insb(ctlr->data, to, len);
54*7dd7cddfSDavid du Colombier 		break;
55*7dd7cddfSDavid du Colombier 	}
56*7dd7cddfSDavid du Colombier }
57*7dd7cddfSDavid du Colombier 
58*7dd7cddfSDavid du Colombier static void
rdwrite(Dp8390 * ctlr,void * from,int len)59*7dd7cddfSDavid du Colombier rdwrite(Dp8390* ctlr, void* from, int len)
60*7dd7cddfSDavid du Colombier {
61*7dd7cddfSDavid du Colombier 	switch(ctlr->width){
62*7dd7cddfSDavid du Colombier 	default:
63*7dd7cddfSDavid du Colombier 		panic("dp8390 rdwrite: width %d\n", ctlr->width);
64*7dd7cddfSDavid du Colombier 		break;
65*7dd7cddfSDavid du Colombier 
66*7dd7cddfSDavid du Colombier 	case 2:
67*7dd7cddfSDavid du Colombier 		outss(ctlr->data, from, len/2);
68*7dd7cddfSDavid du Colombier 		break;
69*7dd7cddfSDavid du Colombier 
70*7dd7cddfSDavid du Colombier 	case 1:
71*7dd7cddfSDavid du Colombier 		outsb(ctlr->data, from, len);
72*7dd7cddfSDavid du Colombier 		break;
73*7dd7cddfSDavid du Colombier 	}
74*7dd7cddfSDavid du Colombier }
75