|
|
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: * Driver written for the 'national pcmcia ether adapter', NE 4100. ! 14: * The manual says NE2000 compatible. ! 15: * The interface appears to be pretty well described in the National ! 16: * Semiconductor Local Area Network Databook (1992) as one of the ! 17: * AT evaluation cards. ! 18: * ! 19: * The NE2000 is really just a DP8390[12] plus a data port ! 20: * and a reset port. ! 21: */ ! 22: enum { ! 23: Data = 0x10, /* offset from I/O base of data port */ ! 24: Misc = 0x18, /* offset from I/O base of miscellaneous port */ ! 25: Reset = 0x1f, /* offset from I/O base of reset port */ ! 26: }; ! 27: ! 28: ! 29: int ! 30: ne4100reset(Ctlr *ctlr) ! 31: { ! 32: int i, slot; ! 33: uchar x, *p; ! 34: PCMmap *m; ! 35: ! 36: /* ! 37: * Set up the software configuration. ! 38: * Use defaults for port, irq, mem and size ! 39: * if not specified. ! 40: */ ! 41: if(ctlr->card.port == 0) ! 42: ctlr->card.port = 0x320; ! 43: if(ctlr->card.irq == 0) ! 44: ctlr->card.irq = 10; ! 45: if(ctlr->card.irq == 2) ! 46: ctlr->card.irq = 9; ! 47: if(ctlr->card.mem == 0) ! 48: ctlr->card.mem = 0x4000; ! 49: if(ctlr->card.size == 0) ! 50: ctlr->card.size = 16*1024; ! 51: ! 52: ctlr->card.reset = ne4100reset; ! 53: ctlr->card.attach = dp8390attach; ! 54: ctlr->card.mode = dp8390mode; ! 55: ctlr->card.read = dp8390read; ! 56: ctlr->card.write = dp8390write; ! 57: ctlr->card.receive = dp8390receive; ! 58: ctlr->card.transmit = dp8390transmit; ! 59: ctlr->card.intr = dp8390intr; ! 60: ctlr->card.watch = dp8390watch; ! 61: ctlr->card.overflow = dp8390overflow; ! 62: ! 63: ctlr->card.bit16 = 1; ! 64: ctlr->card.dp8390 = ctlr->card.port; ! 65: ctlr->card.data = ctlr->card.port+Data; ! 66: ! 67: ctlr->card.tstart = HOWMANY(ctlr->card.mem, Dp8390BufSz); ! 68: ctlr->card.pstart = ctlr->card.tstart + HOWMANY(sizeof(Etherpkt), Dp8390BufSz); ! 69: ctlr->card.pstop = ctlr->card.tstart + HOWMANY(ctlr->card.size, Dp8390BufSz); ! 70: ! 71: /* see if there's a pcmcia card that looks right */ ! 72: slot = pcmspecial("PC-NIC", &ctlr->card); ! 73: if(slot < 0) ! 74: return -1; ! 75: ! 76: /* reset ST-NIC */ ! 77: x = inb(ctlr->card.port+Reset); ! 78: delay(2); ! 79: outb(ctlr->card.port+Reset, x); ! 80: ! 81: /* enable interrupts */ ! 82: outb(ctlr->card.port + Misc, 1<<6); ! 83: ! 84: /* Init the (possible) chip. */ ! 85: dp8390reset(ctlr); ! 86: ! 87: /* set the ether address */ ! 88: m = pcmmap(slot, 0, 0x1000, 1); ! 89: if(m == 0) ! 90: return -1; ! 91: p = (uchar*)(KZERO|m->isa); ! 92: for(i = 0; i < sizeof(ctlr->ea); i++) ! 93: ctlr->ea[i] = p[0xff0+2*i]; ! 94: pcmunmap(slot, m); ! 95: dp8390setea(ctlr); ! 96: ! 97: return 0; ! 98: } ! 99: ! 100: void ! 101: ether4100link(void) ! 102: { ! 103: addethercard("NE4100", ne4100reset); ! 104: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.