/* * Ctlr for the boards using the National Semiconductor DP8390 * and SMC 83C90 Network Interface Controller. * Common code is in ether8390.c. */ typedef struct { Lock; ulong port; /* I/O address of 8390 */ ulong data; /* I/O data port if no shared memory */ uchar width; /* data transfer width in bytes */ uchar ram; /* true if card has shared memory */ uchar dummyrr; /* do dummy remote read */ uchar nxtpkt; /* receive: software bndry */ uchar pstart; uchar pstop; int txbusy; /* transmit */ uchar tstart; /* 8390 ring addresses */ uchar mar[8]; /* shadow multicast address registers */ int mref[64]; /* reference counts for multicast groups */ } Dp8390; #define Dp8390BufSz 256 extern int dp8390reset(Ether*); extern void *dp8390read(Dp8390*, void*, ulong, ulong); extern void dp8390getea(Ether*, uchar*); extern void dp8390setea(Ether*); /* * x86-specific code. */ #define regr(c, r) inb((c)->port+(r)) #define regw(c, r, v) outb((c)->port+(r), (v)) static void insb(int port, void *buf, int len) { int i; uchar *p, *q; p = (uchar*)(port); q = buf; for(i = 0; i < len; i++){ *q++ = *p; } } static void outsb(int port, void *buf, int len) { int i; uchar *p, *q; p = (uchar*)(port); q = buf; for(i = 0; i < len; i++){ *p = *q++; } } static void rdread(Dp8390* ctlr, void* to, int len) { switch(ctlr->width){ default: panic("dp8390 rdread: width %d\n", ctlr->width); break; case 2: inss(ctlr->data, to, len/2); break; case 1: insb(ctlr->data, to, len); break; } } static void rdwrite(Dp8390* ctlr, void* from, int len) { switch(ctlr->width){ default: panic("dp8390 rdwrite: width %d\n", ctlr->width); break; case 2: outss(ctlr->data, from, len/2); break; case 1: outsb(ctlr->data, from, len); break; } }