|
|
1.1 ! root 1: #include "u.h" ! 2: #include "../port/lib.h" ! 3: #include "mem.h" ! 4: #include "dat.h" ! 5: #include "fns.h" ! 6: #include "../port/error.h" ! 7: #include "io.h" ! 8: #include "devtab.h" ! 9: ! 10: #include "ether.h" ! 11: ! 12: /* ! 13: * National Semiconductor DP83905 AT/LANTIC. ! 14: * ! 15: * It doesn't seem possible to tell which mode (NE2000 or WD8003) ! 16: * the chip is configured in without a lot of work. For now we'll ! 17: * just assume WD8003 mode. ! 18: * Driver written for the Dauphin DTR-1. ! 19: */ ! 20: enum { /* Shared Memory Compatible Mode */ ! 21: Control1 = 0x00, /* (WO) */ ! 22: ATDetect = 0x01, /* (RO) */ ! 23: Control2 = 0x05, /* (WO) */ ! 24: Lar = 0x08, /* LAN Address Registers */ ! 25: }; ! 26: ! 27: enum { /* Control1 */ ! 28: Rst = 0x80, /* software reset */ ! 29: Meme = 0x40, /* memory enable */ ! 30: }; ! 31: ! 32: enum { /* ATDetect */ ! 33: ATdet = 0x01, /* 8 or 16-bit slot */ ! 34: }; ! 35: ! 36: enum { /* Control2 */ ! 37: Memw = 0x40, /* */ ! 38: M16 = 0x80, /* */ ! 39: }; ! 40: ! 41: static void* ! 42: read(Ctlr *ctlr, void *to, ulong from, ulong len) ! 43: { ! 44: /* ! 45: * In this case, 'from' is an index into the shared memory. ! 46: */ ! 47: memmove(to, (void*)(ctlr->card.mem+from), len); ! 48: return to; ! 49: } ! 50: ! 51: static void* ! 52: write(Ctlr *ctlr, ulong to, void *from, ulong len) ! 53: { ! 54: /* ! 55: * In this case, 'to' is an index into the shared memory. ! 56: */ ! 57: memmove((void*)(ctlr->card.mem+to), from, len); ! 58: return (void*)to; ! 59: } ! 60: ! 61: /* ! 62: * Get configuration parameters, enable memory. ! 63: * There are opportunities here for buckets of code. ! 64: * We'll try to resist. ! 65: */ ! 66: static int ! 67: reset(Ctlr *ctlr) ! 68: { ! 69: int i; ! 70: uchar control1, control2; ! 71: ulong port; ! 72: ! 73: /* ! 74: * Set up the software configuration. ! 75: * Use defaults for port, irq, mem and size if not specified. ! 76: * Defaults are set for the dumb 8003E which can't be ! 77: * autoconfigured. ! 78: */ ! 79: if(ctlr->card.port == 0) ! 80: ctlr->card.port = 0x280; ! 81: if(ctlr->card.irq == 0) ! 82: ctlr->card.irq = 3; ! 83: if(ctlr->card.mem == 0) ! 84: ctlr->card.mem = 0xD0000; ! 85: if(ctlr->card.size == 0) ! 86: ctlr->card.size = 8*1024; ! 87: ! 88: ctlr->card.reset = reset; ! 89: ctlr->card.attach = dp8390attach; ! 90: ctlr->card.mode = dp8390mode; ! 91: ctlr->card.read = read; ! 92: ctlr->card.write = write; ! 93: ctlr->card.receive = dp8390receive; ! 94: ctlr->card.transmit = dp8390transmit; ! 95: ctlr->card.intr = dp8390intr; ! 96: ctlr->card.watch = 0; ! 97: ctlr->card.ram = 1; ! 98: ! 99: port = ctlr->card.port; ! 100: for(i = 0; i < sizeof(ctlr->ea); i++) ! 101: ctlr->ea[i] = inb(port+Lar+i); ! 102: ! 103: control1 = Meme|((ctlr->card.mem>>13) & 0x3F); ! 104: control2 = (ctlr->card.mem>>19) & 0x1F; ! 105: if(ctlr->card.bit16 = (inb(port+ATDetect) & ATdet)) ! 106: control2 |= M16|Memw; ! 107: ctlr->card.mem |= KZERO; ! 108: ! 109: /* ! 110: * Set the DP8390 ring addresses. ! 111: */ ! 112: ctlr->card.dp8390 = port+0x10; ! 113: ctlr->card.tstart = 0; ! 114: ctlr->card.pstart = HOWMANY(sizeof(Etherpkt), Dp8390BufSz); ! 115: ctlr->card.pstop = HOWMANY(ctlr->card.size, Dp8390BufSz); ! 116: ! 117: /* ! 118: * Enable interface RAM, set interface width. ! 119: */ ! 120: outb(port+Control1, control1); ! 121: outb(port+Control2, control2); ! 122: ! 123: /* ! 124: * Finally, init the 8390 and set the ! 125: * ethernet address. ! 126: */ ! 127: dp8390reset(ctlr); ! 128: dp8390setea(ctlr); ! 129: ! 130: return 0; ! 131: } ! 132: ! 133: void ! 134: ether83905link(void) ! 135: { ! 136: addethercard("DP83905", reset); ! 137: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.