|
|
1.1 ! root 1: #ifndef ECBOOT ! 2: #ifndef lint ! 3: static char sccsid[] = "@(#)if_ec.c 1.1 86/02/03 Copyr 1983 Sun Micro"; ! 4: #endif ! 5: #endif ! 6: ! 7: /* ! 8: * Copyright (c) 1983 by Sun Microsystems, Inc. ! 9: */ ! 10: ! 11: #include "saio.h" ! 12: #include "param.h" ! 13: #include "../h/socket.h" ! 14: #include "../net/if.h" ! 15: #include "../netinet/in.h" ! 16: #include "../netinet/if_ether.h" ! 17: #include "../sunif/if_ecreg.h" ! 18: #include "../mon/sunromvec.h" ! 19: ! 20: #define millitime() (*romp->v_nmiclock) ! 21: ! 22: int ecxmit(), ecpoll(), ecreset(); ! 23: ! 24: unsigned int ecstd[] = { 0xE0000, 0xE2000 }; ! 25: #define NSTD 2 ! 26: ! 27: struct ec_softc { ! 28: char es_proto[PROTOSCRATCH]; /* for higher protocols */ ! 29: struct ecdevice *es_ec; ! 30: struct saioreq *es_sip; ! 31: }; ! 32: ! 33: struct devinfo ecinfo = { ! 34: sizeof(struct ecdevice), /* size */ ! 35: 0, /* DMA */ ! 36: sizeof(struct ec_softc), /* software */ ! 37: NSTD, ! 38: ecstd, ! 39: MAP_MBMEM, ! 40: 0, /* transfer size handled by ND */ ! 41: }; ! 42: ! 43: int xxprobe(), xxboot(), ecopen(), nullsys(), etherstrategy(); ! 44: int nullsys(); ! 45: ! 46: struct boottab ecdriver = { ! 47: "ec", xxprobe, xxboot, ecopen, nullsys, ! 48: etherstrategy, "ec: 3COM Ethernet", &ecinfo, ! 49: }; ! 50: ! 51: struct saif ecif = { ! 52: ecxmit, ! 53: ecpoll, ! 54: ecreset, ! 55: }; ! 56: ! 57: #define CSRSET(v) ec->ec_csr = (ec->ec_csr & EC_INTPA) | (v) ! 58: #define CSRCLR(v) ec->ec_csr = ec->ec_csr & (EC_INTPA & ~(v)) ! 59: ! 60: ecopen(sip) ! 61: struct saioreq *sip; ! 62: { ! 63: register struct ec_softc *es; ! 64: ! 65: es = (struct ec_softc *)sip->si_devdata; ! 66: es->es_ec = (struct ecdevice *)sip->si_devaddr; ! 67: es->es_sip = sip; ! 68: sip->si_sif = &ecif; ! 69: ecreset(es); ! 70: return (etheropen(sip)); ! 71: } ! 72: ! 73: ! 74: ecreset(es) ! 75: register struct ec_softc *es; ! 76: { ! 77: register struct ecdevice *ec = es->es_ec; ! 78: ! 79: ec->ec_csr = EC_RESET; ! 80: DELAY(20); ! 81: myetheraddr(&ec->ec_aram); ! 82: CSRSET(EC_AMSW); ! 83: CSRSET(EC_PA | EC_ABSW | EC_BBSW); ! 84: } ! 85: ! 86: ecxmit(es, buf, count) ! 87: struct ec_softc *es; ! 88: caddr_t buf; ! 89: int count; ! 90: { ! 91: register struct ecdevice *ec = es->es_ec; ! 92: caddr_t cp; ! 93: int time = millitime() + 500; /* .5 seconds */ ! 94: short mask = -1, back; ! 95: ! 96: cp = (caddr_t)&ec->ec_abuf[-count]; ! 97: bcopy(buf, cp, count); ! 98: *(short *)(ec->ec_tbuf) = cp - (caddr_t)ec->ec_tbuf; ! 99: CSRSET(EC_TBSW); ! 100: for (;;) { ! 101: if (millitime() > time) { ! 102: ecreset(es); ! 103: return (-1); ! 104: } ! 105: if (ec->ec_csr & EC_JAM) { ! 106: mask <<= 1; ! 107: if (mask == 0) { ! 108: ecreset(es); ! 109: return (-1); ! 110: } ! 111: back = -(millitime() & ~mask); ! 112: if (back == 0) ! 113: back = -(0x5555 & ~mask); ! 114: ec->ec_back = back; ! 115: CSRSET(EC_JAM); ! 116: } ! 117: if ((ec->ec_csr & EC_TBSW) == 0) ! 118: return (0); ! 119: } ! 120: } ! 121: ! 122: ecpoll(es, buf) ! 123: struct ec_softc *es; ! 124: char *buf; ! 125: { ! 126: register struct ecdevice *ec = es->es_ec; ! 127: short len, *sp; ! 128: int xbsw = 0; ! 129: ! 130: if ((ec->ec_csr & EC_ABSW) == 0) { ! 131: sp = (short *)ec->ec_abuf; ! 132: xbsw = EC_ABSW; ! 133: } else if ((ec->ec_csr & EC_BBSW) == 0) { ! 134: sp = (short *)ec->ec_bbuf; ! 135: xbsw = EC_BBSW; ! 136: } else ! 137: return (0); ! 138: len = *sp++ & EC_DOFF; ! 139: bcopy((char *)sp, buf, len); ! 140: CSRSET(xbsw); ! 141: return (len); ! 142: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.