Annotation of lucent/sys/src/boot/pc/f002812, revision 1.1

1.1     ! root        1: /*
        !             2:  * EAGLE Technology Model NE3210
        !             3:  * 32-Bit EISA BUS Ethernet LAN Adapter.
        !             4:  * Programmer's Reference Guide kindly supplied
        !             5:  * by Artisoft Inc/Eagle Technology.
        !             6:  *
        !             7:  * BUGS:
        !             8:  *     no setting of values from config file;
        !             9:  *     should we worry about doubleword memmove restrictions?
        !            10:  *     no way to use mem addresses > 0xD8000 at present.
        !            11:  */
        !            12: #include "u.h"
        !            13: #include "lib.h"
        !            14: #include "mem.h"
        !            15: #include "dat.h"
        !            16: #include "fns.h"
        !            17: #include "io.h"
        !            18: 
        !            19: #include "ether.h"
        !            20: 
        !            21: enum {                                 /* EISA slot space */
        !            22:        NVLreset        = 0xC84,        /* 0 == reset, 1 == enable */
        !            23:        NVLconfig       = 0xC90,
        !            24: 
        !            25:        DP83902off      = 0x000,        /* offset of DP83902 registers */
        !            26:        Eaddroff        = 0x016,        /* offset of Ethernet address */
        !            27: };
        !            28: 
        !            29: static struct {
        !            30:        ulong   port;
        !            31:        ulong   config;
        !            32: } slotinfo[MaxEISA];
        !            33: 
        !            34: static ulong mem[8] = {
        !            35:        0x00FF0000, 0x00FE0000, 0x000D8000, 0x0FFF0000,
        !            36:        0x0FFE0000, 0x0FFC0000, 0x000D0000, 0x00000000,
        !            37: };
        !            38: 
        !            39: static ulong irq[8] = {
        !            40:        15, 12, 11, 10, 9, 7, 5, 3,
        !            41: };
        !            42: 
        !            43: static struct {
        !            44:        char    *type;
        !            45:        uchar   val;
        !            46: } media[] = {
        !            47:        { "10BaseT",    0x00, },
        !            48:        { "RJ-45",      0x00, },
        !            49:        { "10Base5",    0x80, },
        !            50:        { "AUI",        0x80, },
        !            51:        { "10Base2",    0xC0, },
        !            52:        { "BNC",        0xC0, },
        !            53:        { 0, },
        !            54: };
        !            55: 
        !            56: static void*
        !            57: read(Ctlr *ctlr, void *to, ulong from, ulong len)
        !            58: {
        !            59:        /*
        !            60:         * In this case, 'from' is an index into the shared memory.
        !            61:         */
        !            62:        memmove(to, (void*)(ctlr->card.mem+from), len);
        !            63:        return to;
        !            64: }
        !            65: 
        !            66: static void*
        !            67: write(Ctlr *ctlr, ulong to, void *from, ulong len)
        !            68: {
        !            69:        /*
        !            70:         * In this case, 'to' is an index into the shared memory.
        !            71:         */
        !            72:        memmove((void*)(ctlr->card.mem+to), from, len);
        !            73:        return (void*)to;
        !            74: }
        !            75: 
        !            76: int
        !            77: ne3210reset(Ctlr *ctlr)
        !            78: {
        !            79:        static int already;
        !            80:        int i;
        !            81:        ulong p;
        !            82: 
        !            83:        /*
        !            84:         * First time through, check if this is an EISA machine.
        !            85:         * If not, nothing to do. If it is, run through the slots
        !            86:         * looking for appropriate cards and saving the
        !            87:         * configuration info.
        !            88:         */
        !            89:        if(already == 0){
        !            90:                already = 1;
        !            91:                if(strncmp((char*)(KZERO|0xFFFD9), "EISA", 4))
        !            92:                        return 0;
        !            93: 
        !            94:                for(i = 1; i < MaxEISA; i++){
        !            95:                        p = i*0x1000;
        !            96:                        if(inl(p+EISAconfig) != 0x0118CC3A)
        !            97:                                continue;
        !            98: 
        !            99:                        slotinfo[i].port = p;
        !           100:                        slotinfo[i].config = inb(p+NVLconfig);
        !           101:                }
        !           102:        }
        !           103: 
        !           104:        /*
        !           105:         * Look through the found adapters for one that matches
        !           106:         * the given port address (if any). The possibilties are:
        !           107:         * 1) 0;
        !           108:         * 2) a slot address.
        !           109:         */
        !           110:        i = 0;
        !           111:        if(ctlr->card.port == 0){
        !           112:                for(i = 1; i < MaxEISA; i++){
        !           113:                        if(slotinfo[i].port)
        !           114:                                break;
        !           115:                }
        !           116:        }
        !           117:        else if(ctlr->card.port >= 0x1000){
        !           118:                if((i = (ctlr->card.port>>16)) < MaxEISA){
        !           119:                        if((ctlr->card.port & 0xFFF) || slotinfo[i].port == 0)
        !           120:                                i = 0;
        !           121:                }
        !           122:        }
        !           123:        if(i >= MaxEISA || slotinfo[i].port == 0)
        !           124:                return 0;
        !           125: 
        !           126:        /*
        !           127:         * Set the software configuration using the values obtained.
        !           128:         * For now, ignore any values from the config file.
        !           129:         */
        !           130:        ctlr->card.port = slotinfo[i].port;
        !           131:        ctlr->card.mem = KZERO|mem[slotinfo[i].config & 0x07];
        !           132:        ctlr->card.irq = irq[(slotinfo[i].config>>3) & 0x07];
        !           133:        ctlr->card.size = 32*1024;
        !           134: 
        !           135:        /*
        !           136:         * Set up the stupid DP83902 configuration.
        !           137:         */
        !           138:        ctlr->card.reset = ne3210reset;
        !           139:        ctlr->card.attach = dp8390attach;
        !           140:        ctlr->card.read = read;
        !           141:        ctlr->card.write = write;
        !           142:        ctlr->card.receive = dp8390receive;
        !           143:        ctlr->card.transmit = dp8390transmit;
        !           144:        ctlr->card.intr = dp8390intr;
        !           145:        ctlr->card.bit16 = 1;
        !           146:        ctlr->card.ram = 1;
        !           147: 
        !           148:        ctlr->card.dp8390 = ctlr->card.port+DP83902off;
        !           149:        ctlr->card.tstart = 0;
        !           150:        ctlr->card.pstart = HOWMANY(sizeof(Etherpkt), Dp8390BufSz);
        !           151:        ctlr->card.pstop = HOWMANY(ctlr->card.size, Dp8390BufSz);
        !           152: 
        !           153:        /*
        !           154:         * Reset the board, then
        !           155:         * initialise the DP83902,
        !           156:         * set the ether address.
        !           157:         */
        !           158:        outb(ctlr->card.port+NVLreset, 0x00);
        !           159:        delay(2);
        !           160:        outb(ctlr->card.port+NVLreset, 0x01);
        !           161: 
        !           162:        dp8390reset(ctlr);
        !           163:        if((ctlr->card.ea[0]|ctlr->card.ea[1]|ctlr->card.ea[2]|ctlr->card.ea[3]|ctlr->card.ea[4]|ctlr->card.ea[5]) == 0){
        !           164:                for(i = 0; i < sizeof(ctlr->card.ea); i++)
        !           165:                        ctlr->card.ea[i] = inb(ctlr->card.port+Eaddroff+i);
        !           166:        }
        !           167:        dp8390setea(ctlr);
        !           168: 
        !           169:        return 0;
        !           170: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.