|
|
1.1 ! root 1: /* ! 2: * All the goo for PC ethernet cards. ! 3: */ ! 4: typedef struct Card Card; ! 5: typedef struct RingBuf RingBuf; ! 6: typedef struct Type Type; ! 7: typedef struct Ctlr Ctlr; ! 8: ! 9: /* ! 10: * Hardware interface. ! 11: */ ! 12: struct Card { ! 13: ISAConf; ! 14: ! 15: int (*reset)(Ctlr*); ! 16: void (*attach)(Ctlr*); ! 17: ! 18: void *(*read)(Ctlr*, void*, ulong, ulong); ! 19: void *(*write)(Ctlr*, ulong, void*, ulong); ! 20: ! 21: void (*receive)(Ctlr*); ! 22: void (*transmit)(Ctlr*); ! 23: void (*intr)(Ureg*, Ctlr*); ! 24: void (*overflow)(Ctlr*); ! 25: ! 26: uchar bit16; /* true if a 16 bit interface */ ! 27: uchar ram; /* true if card has shared memory */ ! 28: ! 29: ulong dp8390; /* I/O address of 8390 (if any) */ ! 30: ulong data; /* I/O data port if no shared memory */ ! 31: uchar nxtpkt; /* software bndry */ ! 32: uchar tstart; /* 8390 ring addresses */ ! 33: uchar pstart; ! 34: uchar pstop; ! 35: }; ! 36: ! 37: /* ! 38: * Software ring buffer. ! 39: */ ! 40: struct RingBuf { ! 41: uchar owner; ! 42: uchar busy; /* unused */ ! 43: ushort len; ! 44: uchar pkt[sizeof(Etherpkt)]; ! 45: }; ! 46: ! 47: enum { ! 48: Host = 0, /* buffer owned by host */ ! 49: Interface = 1, /* buffer owned by card */ ! 50: ! 51: Nrb = 16, /* default number of receive buffers */ ! 52: Ntb = 1, /* default number of transmit buffers */ ! 53: }; ! 54: ! 55: /* ! 56: * Software controller. ! 57: */ ! 58: struct Ctlr { ! 59: Card card; /* hardware info */ ! 60: int ctlrno; ! 61: char iname[NAMELEN]; ! 62: char oname[NAMELEN]; ! 63: int present; ! 64: ! 65: ushort nrb; /* number of software receive buffers */ ! 66: ushort ntb; /* number of software transmit buffers */ ! 67: RingBuf *rb; /* software receive buffers */ ! 68: RingBuf *tb; /* software transmit buffers */ ! 69: ! 70: ushort rh; /* first receive buffer belonging to host */ ! 71: ushort ri; /* first receive buffer belonging to card */ ! 72: ! 73: ushort th; /* first transmit buffer belonging to host */ ! 74: ushort ti; /* first transmit buffer belonging to card */ ! 75: int tbusy; /* transmitter is busy */ ! 76: ! 77: int inpackets; ! 78: int outpackets; ! 79: int crcs; /* input crc errors */ ! 80: int oerrs; /* output errors */ ! 81: int frames; /* framing errors */ ! 82: int overflows; /* packet overflows */ ! 83: int buffs; /* buffering errors */ ! 84: }; ! 85: ! 86: #define NEXT(x, l) (((x)+1)%(l)) ! 87: #define HOWMANY(x, y) (((x)+((y)-1))/(y)) ! 88: #define ROUNDUP(x, y) (HOWMANY((x), (y))*(y)) ! 89: ! 90: /* ! 91: * The Western Digital 8003 and 8013 series, the NE2000 ! 92: * and the 3Com 503 all use the DP8390 Network Interface ! 93: * Chip. ! 94: */ ! 95: extern void dp8390reset(Ctlr*); ! 96: extern void dp8390attach(Ctlr*); ! 97: extern void dp8390mode(Ctlr*, int); ! 98: extern void dp8390getea(Ctlr*); ! 99: extern void dp8390setea(Ctlr*); ! 100: extern void *dp8390read(Ctlr*, void*, ulong, ulong); ! 101: extern void *dp8390write(Ctlr*, ulong, void*, ulong); ! 102: extern void dp8390receive(Ctlr*); ! 103: extern void dp8390transmit(Ctlr*); ! 104: extern void dp8390intr(Ureg*, Ctlr*); ! 105: extern void dp8390overflow(Ctlr*); ! 106: ! 107: /* ! 108: * The DP8390 needs some time between successive ! 109: * chip selects, so we need special I/O routines. ! 110: * See l.s. ! 111: * These routines only need to be used for accessing ! 112: * the chip registers. Data I/O, either through ! 113: * remote DMA or shared memory, can use the normal ! 114: * routines. ! 115: */ ! 116: extern int dp8390inb(ulong); ! 117: extern void dp8390outb(ulong, uchar); ! 118: ! 119: enum { ! 120: Dp8390BufSz = 256, /* hardware ring buffer size */ ! 121: }; ! 122: ! 123: extern int ne2000reset(Ctlr*); ! 124: extern int ne3210reset(Ctlr*); ! 125: extern int tcm509reset(Ctlr*); ! 126: extern int wd8003reset(Ctlr*);
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.