Annotation of lucent/sys/src/9/pc/f002537, revision 1.1.1.1

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

unix.superglobalmegacorp.com

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