Annotation of lucent/sys/src/boot/pc/ether.c, 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: static Ctlr ether[MaxEther];
        !            11: 
        !            12: static struct {
        !            13:        char    *type;
        !            14:        int     (*reset)(Ctlr*);
        !            15: } cards[] = {
        !            16:        { "NE2000", ne2000reset, },
        !            17:        { "NE3210", ne3210reset, },
        !            18:        { "3C509", tcm509reset, },
        !            19:        { "WD8003", wd8003reset, },
        !            20:        { 0, }
        !            21: };
        !            22: 
        !            23: int
        !            24: etherinit(void)
        !            25: {
        !            26:        Ctlr *ctlr;
        !            27:        int ctlrno, i, mask, n;
        !            28: 
        !            29:        mask = 0;
        !            30:        for(ctlrno = 0; ctlrno < MaxEther; ctlrno++){
        !            31:                ctlr = &ether[ctlrno];
        !            32:                memset(ctlr, 0, sizeof(Ctlr));
        !            33:                if(isaconfig("ether", ctlrno, &ctlr->card) == 0)
        !            34:                        continue;
        !            35:                for(n = 0; cards[n].type; n++){
        !            36:                        if(strcmp(cards[n].type, ctlr->card.type))
        !            37:                                continue;
        !            38:                        ctlr->ctlrno = ctlrno;
        !            39:                        if((*cards[n].reset)(ctlr))
        !            40:                                break;
        !            41: 
        !            42:                        ctlr->present = 1;
        !            43:                        mask |= 1<<ctlrno;
        !            44:                        if(ctlr->card.irq == 2)
        !            45:                                ctlr->card.irq = 9;
        !            46:                        setvec(Int0vec + ctlr->card.irq, ctlr->card.intr, ctlr);
        !            47: 
        !            48:                        print("ether%d: %s: port %lux irq %d addr %lux size %d width %d:",
        !            49:                                ctlr->ctlrno, ctlr->card.type, ctlr->card.port, ctlr->card.irq,
        !            50:                                ctlr->card.mem, ctlr->card.size, ctlr->card.bit16 ? 16: 8);
        !            51:                        for(i = 0; i < sizeof(ctlr->card.ea); i++)
        !            52:                                print(" %2.2ux", ctlr->card.ea[i]);
        !            53:                        print("\n");
        !            54:                
        !            55:                        if(ctlr->nrb == 0)
        !            56:                                ctlr->nrb = Nrb;
        !            57:                        ctlr->rb = ialloc(sizeof(RingBuf)*ctlr->nrb, 0);
        !            58:                        if(ctlr->ntb == 0)
        !            59:                                ctlr->ntb = Ntb;
        !            60:                        ctlr->tb = ialloc(sizeof(RingBuf)*ctlr->ntb, 0);
        !            61: 
        !            62:                        ctlr->rh = 0;
        !            63:                        ctlr->ri = 0;
        !            64:                        for(i = 0; i < ctlr->nrb; i++)
        !            65:                                ctlr->rb[i].owner = Interface;
        !            66:                
        !            67:                        ctlr->th = 0;
        !            68:                        ctlr->ti = 0;
        !            69:                        for(i = 0; i < ctlr->ntb; i++)
        !            70:                                ctlr->tb[i].owner = Host;
        !            71:                
        !            72:                        break;
        !            73:                }
        !            74:        }
        !            75: 
        !            76:        return mask;
        !            77: }
        !            78: 
        !            79: static Ctlr*
        !            80: attach(int ctlrno)
        !            81: {
        !            82:        Ctlr *ctlr;
        !            83: 
        !            84:        if(ctlrno >= MaxEther || ether[ctlrno].present == 0)
        !            85:                return 0;
        !            86: 
        !            87:        ctlr = &ether[ctlrno];
        !            88:        if(ctlr->present == 1){
        !            89:                ctlr->present = 2;
        !            90:                (*ctlr->card.attach)(ctlr);
        !            91:        }
        !            92: 
        !            93:        return ctlr;
        !            94: }
        !            95: 
        !            96: uchar*
        !            97: etheraddr(int ctlrno)
        !            98: {
        !            99:        Ctlr *ctlr;
        !           100: 
        !           101:        if((ctlr = attach(ctlrno)) == 0)
        !           102:                return 0;
        !           103: 
        !           104:        return ctlr->card.ea;
        !           105: }
        !           106: 
        !           107: static int
        !           108: wait(RingBuf *ring, uchar owner, int timo)
        !           109: {
        !           110:        ulong start;
        !           111: 
        !           112:        start = m->ticks;
        !           113:        while(TK2MS(m->ticks - start) < timo){
        !           114:                if(ring->owner != owner)
        !           115:                        return 1;
        !           116:        }
        !           117: 
        !           118:        return 0;
        !           119: }
        !           120: 
        !           121: int
        !           122: etherrxpkt(int ctlrno, Etherpkt *pkt, int timo)
        !           123: {
        !           124:        int n;
        !           125:        Ctlr *ctlr;
        !           126:        RingBuf *ring;
        !           127: 
        !           128:        if((ctlr = attach(ctlrno)) == 0)
        !           129:                return 0;
        !           130: 
        !           131:        ring = &ctlr->rb[ctlr->rh];
        !           132:        if(wait(ring, Interface, timo) == 0){
        !           133:                print("ether%d: rx timeout\n", ctlrno);
        !           134:                return 0;
        !           135:        }
        !           136: 
        !           137:        n = ring->len;
        !           138:        memmove(pkt, ring->pkt, n);
        !           139:        ring->owner = Interface;
        !           140:        ctlr->rh = NEXT(ctlr->rh, ctlr->nrb);
        !           141: 
        !           142:        return n;
        !           143: }
        !           144: 
        !           145: int
        !           146: ethertxpkt(int ctlrno, Etherpkt *pkt, int len, int timo)
        !           147: {
        !           148:        Ctlr *ctlr;
        !           149:        RingBuf *ring;
        !           150: 
        !           151:        if((ctlr = attach(ctlrno)) == 0)
        !           152:                return 0;
        !           153: 
        !           154:        ring = &ctlr->tb[ctlr->th];
        !           155:        memmove(ring->pkt, pkt, len);
        !           156:        if(len < ETHERMINTU){
        !           157:                memset(ring->pkt+len, 0, ETHERMINTU-len);
        !           158:                len = ETHERMINTU;
        !           159:        }
        !           160:        ring->len = len;
        !           161:        ring->owner = Interface;
        !           162:        ctlr->th = NEXT(ctlr->th, ctlr->ntb);
        !           163:        (*ctlr->card.transmit)(ctlr);
        !           164: 
        !           165:        if(wait(ring, Interface, timo) == 0){
        !           166:                print("ether%d: rx timeout\n", ctlrno);
        !           167:                return 0;
        !           168:        }
        !           169: 
        !           170:        return 1;
        !           171: }

unix.superglobalmegacorp.com

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