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