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

1.1     ! root        1: #include "u.h"
        !             2: #include "lib.h"
        !             3: #include "mem.h"
        !             4: #include "dat.h"
        !             5: #include "fns.h"
        !             6: #include "io.h"
        !             7: 
        !             8: #include "ether.h"
        !             9: 
        !            10: /*
        !            11:  * Driver written for the 'Notebook Computer Ethernet LAN Adapter',
        !            12:  * a plug-in to the bus-slot on the rear of the Gateway NOMAD 425DXL
        !            13:  * laptop. The manual says NE2000 compatible.
        !            14:  * The interface appears to be pretty well described in the National
        !            15:  * Semiconductor Local Area Network Databook (1992) as one of the
        !            16:  * AT evaluation cards.
        !            17:  *
        !            18:  * The NE2000 is really just a DP8390[12] plus a data port
        !            19:  * and a reset port.
        !            20:  */
        !            21: enum {
        !            22:        Data            = 0x10,         /* offset from I/O base of data port */
        !            23:        Reset           = 0x18,         /* offset from I/O base of reset port */
        !            24: };
        !            25: 
        !            26: int
        !            27: ne2000reset(Ctlr *ctlr)
        !            28: {
        !            29:        ushort buf[16];
        !            30:        int i;
        !            31: 
        !            32:        /*
        !            33:         * Set up the software configuration.
        !            34:         * Use defaults for port, irq, mem and size
        !            35:         * if not specified.
        !            36:         */
        !            37:        if(ctlr->card.port == 0)
        !            38:                ctlr->card.port = 0x300;
        !            39:        if(ctlr->card.irq == 0)
        !            40:                ctlr->card.irq = 2;
        !            41:        if(ctlr->card.mem == 0)
        !            42:                ctlr->card.mem = 0x4000;
        !            43:        if(ctlr->card.size == 0)
        !            44:                ctlr->card.size = 16*1024;
        !            45: 
        !            46:        ctlr->card.reset = ne2000reset;
        !            47:        ctlr->card.attach = dp8390attach;
        !            48:        ctlr->card.read = dp8390read;
        !            49:        ctlr->card.write = dp8390write;
        !            50:        ctlr->card.receive = dp8390receive;
        !            51:        ctlr->card.transmit = dp8390transmit;
        !            52:        ctlr->card.intr = dp8390intr;
        !            53:        ctlr->card.overflow = dp8390overflow;
        !            54: 
        !            55:        ctlr->card.bit16 = 1;
        !            56:        ctlr->card.dp8390 = ctlr->card.port;
        !            57:        ctlr->card.data = ctlr->card.port+Data;
        !            58: 
        !            59:        ctlr->card.tstart = HOWMANY(ctlr->card.mem, Dp8390BufSz);
        !            60:        ctlr->card.pstart = ctlr->card.tstart + HOWMANY(sizeof(Etherpkt), Dp8390BufSz);
        !            61:        ctlr->card.pstop = ctlr->card.tstart + HOWMANY(ctlr->card.size, Dp8390BufSz);
        !            62: 
        !            63:        /*
        !            64:         * Reset the board. This is done by doing a read
        !            65:         * followed by a write to the Reset address.
        !            66:         */
        !            67:        buf[0] = inb(ctlr->card.port+Reset);
        !            68:        delay(2);
        !            69:        outb(ctlr->card.port+Reset, buf[0]);
        !            70:        
        !            71:        /*
        !            72:         * Init the (possible) chip, then use the (possible)
        !            73:         * chip to read the (possible) PROM for ethernet address
        !            74:         * and a marker byte.
        !            75:         * We could just look at the DP8390 command register after
        !            76:         * initialisation has been tried, but that wouldn't be
        !            77:         * enough, there are other ethernet boards which could
        !            78:         * match.
        !            79:         */
        !            80:        dp8390reset(ctlr);
        !            81:        memset(buf, 0, sizeof(buf));
        !            82:        dp8390read(ctlr, buf, 0, sizeof(buf));
        !            83:        if((buf[0x0E] & 0xFF) != 0x57 || (buf[0x0F] & 0xFF) != 0x57)
        !            84:                return -1;
        !            85: 
        !            86:        /*
        !            87:         * Stupid machine. We asked for shorts, we got shorts,
        !            88:         * although the PROM is a byte array.
        !            89:         * Now we can set the ethernet address.
        !            90:         */
        !            91:        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){
        !            92:                for(i = 0; i < sizeof(ctlr->card.ea); i++)
        !            93:                        ctlr->card.ea[i] = buf[i];
        !            94:        }
        !            95:        dp8390setea(ctlr);
        !            96: 
        !            97:        return 0;
        !            98: }

unix.superglobalmegacorp.com

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