|
|
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: enum { ! 13: SelectWindow = 0x01, /* SelectWindow command */ ! 14: ! 15: Command = 0x0E, /* all windows */ ! 16: Status = 0x0E, ! 17: ! 18: ManufacturerID = 0x00, /* window 0 */ ! 19: ProductID = 0x02, ! 20: ConfigControl = 0x04, ! 21: AddressConfig = 0x06, ! 22: ResourceConfig = 0x08, ! 23: EEPROMcmd = 0x0A, ! 24: EEPROMdata = 0x0C, ! 25: }; ! 26: ! 27: #define COMMAND(port, cmd, a) outs(port+Command, ((cmd)<<11)|(a)) ! 28: ! 29: extern int ether509reset(Ctlr*); ! 30: ! 31: static int ! 32: reset(Ctlr *ctlr) ! 33: { ! 34: int slot; ! 35: int port; ! 36: ushort x; ! 37: ! 38: if(ctlr->card.irq == 0) ! 39: ctlr->card.irq = 10; ! 40: if(ctlr->card.port == 0) ! 41: ctlr->card.port = 0x240; ! 42: port = ctlr->card.port; ! 43: ! 44: slot = pcmspecial("3C589", &ctlr->card); ! 45: if(slot < 0) ! 46: return -1; ! 47: ! 48: /* set Window 0 configuration registers */ ! 49: COMMAND(port, SelectWindow, 0); ! 50: ! 51: /* ROM size & base - must be set before we can access ROM */ ! 52: /* transceiver type (for now always 10baseT) */ ! 53: x = ins(port + AddressConfig); ! 54: outs(port + AddressConfig, x & 0x20); ! 55: ! 56: /* IRQ must be 3 on 3C589 */ ! 57: x = ins(port + ResourceConfig); ! 58: outs(port + ResourceConfig, 0x3f00 | (x&0xfff)); ! 59: ! 60: /* move product ID to register */ ! 61: while(ins(port+EEPROMcmd) & 0x8000) ! 62: ; ! 63: outs(port+EEPROMcmd, (2<<6)|3); ! 64: while(ins(port+EEPROMcmd) & 0x8000) ! 65: ; ! 66: x = ins(port+EEPROMdata); ! 67: outs(port + ProductID, x); ! 68: ! 69: if(ether509reset(ctlr) < 0){ ! 70: pcmspecialclose(slot); ! 71: return -1; ! 72: } ! 73: return 0; ! 74: } ! 75: ! 76: void ! 77: ether589link(void) ! 78: { ! 79: addethercard("3C589", reset); ! 80: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.