From d6e0e9c402e215dc5659ad525e3e652501f76810 Mon Sep 17 00:00:00 2001 From: cinap_lenrek Date: Sun, 11 Feb 2018 18:08:03 +0100 Subject: [PATCH] kernel: move devether and wifi to port/ the only architecture dependence of devether was enabling interrupts, which is now done at the end of the driver's reset() function now. the wifi stack and dummy ethersink also go to port/. do the IRQ2->IRQ9 hack for pc kernels in intrenabale(), so not every caller of intrenable() has to be aware of it. --- sys/src/9/kw/archkw.c | 13 +- sys/src/9/kw/devether.c | 502 ---------------------------- sys/src/9/kw/ether1116.c | 26 +- sys/src/9/kw/etherif.h | 55 ---- sys/src/9/kw/ethermii.c | 2 +- sys/src/9/kw/mem.h | 5 +- sys/src/9/kw/mkfile | 2 +- sys/src/9/kw/mmu.c | 2 +- sys/src/9/mtx/devether.c | 447 ------------------------- sys/src/9/mtx/ether2114x.c | 6 +- sys/src/9/mtx/etherif.h | 35 -- sys/src/9/mtx/mkfile | 2 +- sys/src/9/omap/archomap.c | 2 +- sys/src/9/omap/dat.h | 2 + sys/src/9/omap/devether.c | 504 ----------------------------- sys/src/9/omap/dma.c | 2 +- sys/src/9/omap/ether9221.c | 7 +- sys/src/9/omap/etherif.h | 41 --- sys/src/9/omap/mem.h | 7 +- sys/src/9/omap/mkfile | 2 +- sys/src/9/omap/mmu.c | 2 +- sys/src/9/omap/screen.c | 2 +- sys/src/9/pc/ether2000.c | 2 +- sys/src/9/pc/ether2114x.c | 6 +- sys/src/9/pc/ether589.c | 3 +- sys/src/9/pc/ether79c970.c | 6 +- sys/src/9/pc/ether8003.c | 2 +- sys/src/9/pc/ether8139.c | 6 +- sys/src/9/pc/ether8169.c | 5 +- sys/src/9/pc/ether82543gc.c | 3 +- sys/src/9/pc/ether82557.c | 6 +- sys/src/9/pc/ether82563.c | 6 +- sys/src/9/pc/ether82598.c | 5 +- sys/src/9/pc/ether83815.c | 7 +- sys/src/9/pc/ether8390.c | 5 +- sys/src/9/pc/etherbcm.c | 7 +- sys/src/9/pc/etherdp83820.c | 5 +- sys/src/9/pc/etherec2t.c | 2 +- sys/src/9/pc/etherelnk3.c | 6 +- sys/src/9/pc/etherga620.c | 6 +- sys/src/9/pc/etherif.h | 39 --- sys/src/9/pc/etherigbe.c | 5 +- sys/src/9/pc/etheriwl.c | 8 +- sys/src/9/pc/etherm10g.c | 3 +- sys/src/9/pc/ethermii.c | 2 +- sys/src/9/pc/etherrt2860.c | 9 +- sys/src/9/pc/ethersmc.c | 7 +- sys/src/9/pc/ethervgbe.c | 7 +- sys/src/9/pc/ethervirtio.c | 5 +- sys/src/9/pc/ethervt6102.c | 5 +- sys/src/9/pc/ethervt6105m.c | 5 +- sys/src/9/pc/etherwavelan.c | 2 +- sys/src/9/pc/etherwpi.c | 8 +- sys/src/9/pc/etheryuk.c | 5 +- sys/src/9/pc/mkfile | 10 +- sys/src/9/pc/trap.c | 11 +- sys/src/9/pc/usbehcipc.c | 10 - sys/src/9/pc/usbohci.c | 8 - sys/src/9/pc/usbuhci.c | 8 - sys/src/9/pc/wavelan.c | 6 +- sys/src/9/pc64/mkfile | 12 +- sys/src/9/pc64/trap.c | 11 + sys/src/9/port/devaoe.c | 2 +- sys/src/9/{pc => port}/devether.c | 45 +-- sys/src/9/{pc => port}/ethersink.c | 7 +- sys/src/9/port/portmkfile | 3 + sys/src/9/{pc => port}/wifi.c | 5 +- sys/src/9/{pc => port}/wifi.h | 0 sys/src/9/ppc/devether.c | 446 ------------------------- sys/src/9/ppc/etherfcc.c | 5 +- sys/src/9/ppc/etherif.h | 35 -- sys/src/9/ppc/ethersaturn.c | 8 +- sys/src/9/ppc/mkfile | 3 +- sys/src/9/sgi/dat.h | 11 + sys/src/9/sgi/devether.c | 489 ---------------------------- sys/src/9/sgi/etherif.h | 40 --- sys/src/9/sgi/etherseeq.c | 8 +- sys/src/9/sgi/fns.h | 1 + sys/src/9/sgi/indy | 4 +- sys/src/9/sgi/main.c | 6 + sys/src/9/teg2/archtegra.c | 2 +- sys/src/9/teg2/devether.c | 502 ---------------------------- sys/src/9/teg2/ether8169.c | 6 +- sys/src/9/teg2/etherif.h | 42 --- sys/src/9/teg2/ethermii.c | 2 +- sys/src/9/teg2/mem.h | 6 +- sys/src/9/teg2/mkfile | 2 +- sys/src/9/teg2/mmu.c | 2 +- sys/src/9/xen/etherxen.c | 6 +- sys/src/9/xen/mkfile | 4 +- sys/src/9/xen/xenpcf | 2 +- sys/src/9/zynq/dat.h | 9 +- sys/src/9/zynq/devether.c | 489 ---------------------------- sys/src/9/zynq/etherif.h | 40 --- sys/src/9/zynq/etherzynq.c | 6 +- sys/src/9/zynq/main.c | 2 +- 96 files changed, 237 insertions(+), 3945 deletions(-) delete mode 100644 sys/src/9/kw/devether.c delete mode 100644 sys/src/9/kw/etherif.h delete mode 100644 sys/src/9/mtx/devether.c delete mode 100644 sys/src/9/mtx/etherif.h delete mode 100644 sys/src/9/omap/devether.c delete mode 100644 sys/src/9/omap/etherif.h delete mode 100644 sys/src/9/pc/etherif.h rename sys/src/9/{pc => port}/devether.c (92%) rename sys/src/9/{pc => port}/ethersink.c (89%) rename sys/src/9/{pc => port}/wifi.c (99%) rename sys/src/9/{pc => port}/wifi.h (100%) delete mode 100644 sys/src/9/ppc/devether.c delete mode 100644 sys/src/9/ppc/etherif.h delete mode 100644 sys/src/9/sgi/devether.c delete mode 100644 sys/src/9/sgi/etherif.h delete mode 100644 sys/src/9/teg2/devether.c delete mode 100644 sys/src/9/teg2/etherif.h delete mode 100644 sys/src/9/zynq/devether.c delete mode 100644 sys/src/9/zynq/etherif.h diff --git a/sys/src/9/kw/archkw.c b/sys/src/9/kw/archkw.c index d6fd700fa..bcffd5e4c 100644 --- a/sys/src/9/kw/archkw.c +++ b/sys/src/9/kw/archkw.c @@ -11,7 +11,7 @@ #include "io.h" #include "../port/netif.h" -#include "etherif.h" +#include "../port/etherif.h" #include "../port/flashif.h" #include "arm.h" @@ -395,17 +395,6 @@ archkwlink(void) { } -int -archether(unsigned ctlno, Ether *ether) -{ - if(ctlno >= 2) - return -1; - ether->type = "88e1116"; - ether->port = ctlno; -// ether->mbps = 1000; - return 1; -} - /* LED/USB gpios */ enum { /* diff --git a/sys/src/9/kw/devether.c b/sys/src/9/kw/devether.c deleted file mode 100644 index b70d85310..000000000 --- a/sys/src/9/kw/devether.c +++ /dev/null @@ -1,502 +0,0 @@ -#include "u.h" -#include "../port/lib.h" -#include "mem.h" -#include "dat.h" -#include "fns.h" -#include "io.h" -#include "../port/error.h" - -#include "../port/netif.h" -#include "etherif.h" - -extern int archether(unsigned ctlno, Ether *ether); - -static Ether *etherxx[MaxEther]; - -Chan* -etherattach(char* spec) -{ - int ctlrno; - char *p; - Chan *chan; - - ctlrno = 0; - if(spec && *spec){ - ctlrno = strtoul(spec, &p, 0); - if((ctlrno == 0 && p == spec) || *p != 0) - error(Ebadarg); - if(ctlrno < 0 || ctlrno >= MaxEther) - error(Ebadarg); - } - if(etherxx[ctlrno] == 0) - error(Enodev); - - chan = devattach('l', spec); - if(waserror()){ - chanfree(chan); - nexterror(); - } - chan->dev = ctlrno; - if(etherxx[ctlrno]->attach) - etherxx[ctlrno]->attach(etherxx[ctlrno]); - poperror(); - return chan; -} - -static Walkqid* -etherwalk(Chan* chan, Chan* nchan, char** name, int nname) -{ - return netifwalk(etherxx[chan->dev], chan, nchan, name, nname); -} - -static int -etherstat(Chan* chan, uchar* dp, int n) -{ - return netifstat(etherxx[chan->dev], chan, dp, n); -} - -static Chan* -etheropen(Chan* chan, int omode) -{ - return netifopen(etherxx[chan->dev], chan, omode); -} - -static Chan* -ethercreate(Chan*, char*, int, ulong) -{ - error(Eperm); - return 0; -} - -static void -etherclose(Chan* chan) -{ - netifclose(etherxx[chan->dev], chan); -} - -static long -etherread(Chan* chan, void* buf, long n, vlong off) -{ - Ether *ether; - ulong offset = off; - - ether = etherxx[chan->dev]; - if((chan->qid.type & QTDIR) == 0 && ether->ifstat){ - /* - * With some controllers it is necessary to reach - * into the chip to extract statistics. - */ - if(NETTYPE(chan->qid.path) == Nifstatqid) - return ether->ifstat(ether, buf, n, offset); - else if(NETTYPE(chan->qid.path) == Nstatqid) - ether->ifstat(ether, buf, 0, offset); - } - - return netifread(ether, chan, buf, n, offset); -} - -static Block* -etherbread(Chan* chan, long n, ulong offset) -{ - return netifbread(etherxx[chan->dev], chan, n, offset); -} - -static int -etherwstat(Chan* chan, uchar* dp, int n) -{ - return netifwstat(etherxx[chan->dev], chan, dp, n); -} - -static void -etherrtrace(Netfile* f, Etherpkt* pkt, int len) -{ - int i, n; - Block *bp; - - if(qwindow(f->in) <= 0) - return; - if(len > 58) - n = 58; - else - n = len; - bp = iallocb(64); - if(bp == nil) - return; - memmove(bp->wp, pkt->d, n); - i = TK2MS(MACHP(0)->ticks); - bp->wp[58] = len>>8; - bp->wp[59] = len; - bp->wp[60] = i>>24; - bp->wp[61] = i>>16; - bp->wp[62] = i>>8; - bp->wp[63] = i; - bp->wp += 64; - qpass(f->in, bp); -} - -Block* -etheriq(Ether* ether, Block* bp, int fromwire) -{ - Etherpkt *pkt; - ushort type; - int len, multi, tome, fromme; - Netfile **ep, *f, **fp, *fx; - Block *xbp; - - ether->inpackets++; - - pkt = (Etherpkt*)bp->rp; - len = BLEN(bp); - type = (pkt->type[0]<<8)|pkt->type[1]; - fx = 0; - ep = ðer->f[Ntypes]; - - multi = pkt->d[0] & 1; - /* check for valid multicast addresses */ - if(multi && memcmp(pkt->d, ether->bcast, sizeof(pkt->d)) != 0 && ether->prom == 0){ - if(!activemulti(ether, pkt->d, sizeof(pkt->d))){ - if(fromwire){ - freeb(bp); - bp = 0; - } - return bp; - } - } - - /* is it for me? */ - tome = memcmp(pkt->d, ether->ea, sizeof(pkt->d)) == 0; - fromme = memcmp(pkt->s, ether->ea, sizeof(pkt->s)) == 0; - - /* - * Multiplex the packet to all the connections which want it. - * If the packet is not to be used subsequently (fromwire != 0), - * attempt to simply pass it into one of the connections, thereby - * saving a copy of the data (usual case hopefully). - */ - for(fp = ether->f; fp < ep; fp++){ - if(f = *fp) - if(f->type == type || f->type < 0) - if(tome || multi || f->prom){ - /* Don't want to hear loopback or bridged packets */ - if(f->bridge && (tome || !fromwire && !fromme)) - continue; - if(!f->headersonly){ - if(fromwire && fx == 0) - fx = f; - else if(xbp = iallocb(len)){ - memmove(xbp->wp, pkt, len); - xbp->wp += len; - if(qpass(f->in, xbp) < 0) - ether->soverflows++; - } - else - ether->soverflows++; - } - else - etherrtrace(f, pkt, len); - } - } - - if(fx){ - if(qpass(fx->in, bp) < 0) - ether->soverflows++; - return 0; - } - if(fromwire){ - freeb(bp); - return 0; - } - - return bp; -} - -static int -etheroq(Ether* ether, Block* bp) -{ - int len, loopback; - Etherpkt *pkt; - - ether->outpackets++; - - /* - * Check if the packet has to be placed back onto the input queue, - * i.e. if it's a loopback or broadcast packet or the interface is - * in promiscuous mode. - * If it's a loopback packet indicate to etheriq that the data isn't - * needed and return, etheriq will pass-on or free the block. - * To enable bridging to work, only packets that were originated - * by this interface are fed back. - */ - pkt = (Etherpkt*)bp->rp; - len = BLEN(bp); - loopback = memcmp(pkt->d, ether->ea, sizeof(pkt->d)) == 0; - if(loopback || memcmp(pkt->d, ether->bcast, sizeof(pkt->d)) == 0 || ether->prom) - if(etheriq(ether, bp, loopback) == 0) - return len; - - qbwrite(ether->oq, bp); - if(ether->transmit != nil) - ether->transmit(ether); - return len; -} - -static long -etherwrite(Chan* chan, void* buf, long n, vlong) -{ - Ether *ether; - Block *bp; - int nn, onoff; - Cmdbuf *cb; - - ether = etherxx[chan->dev]; - if(NETTYPE(chan->qid.path) != Ndataqid) { - nn = netifwrite(ether, chan, buf, n); - if(nn >= 0) - return nn; - cb = parsecmd(buf, n); - if(strcmp(cb->f[0], "nonblocking") == 0){ - if(cb->nf <= 1) - onoff = 1; - else - onoff = atoi(cb->f[1]); - qnoblock(ether->oq, onoff); - free(cb); - return n; - } - free(cb); - if(ether->ctl!=nil) - return ether->ctl(ether,buf,n); - - error(Ebadctl); - } - - if(n > ether->maxmtu) - error(Etoobig); - if(n < ether->minmtu) - error(Etoosmall); - - bp = allocb(n); - if(waserror()){ - freeb(bp); - nexterror(); - } - memmove(bp->rp, buf, n); - if(!ether->f[NETID(chan->qid.path)]->bridge) - memmove(bp->rp+Eaddrlen, ether->ea, Eaddrlen); - poperror(); - bp->wp += n; - - return etheroq(ether, bp); -} - -static long -etherbwrite(Chan* chan, Block* bp, ulong) -{ - Ether *ether; - long n; - - n = BLEN(bp); - if(NETTYPE(chan->qid.path) != Ndataqid){ - if(waserror()) { - freeb(bp); - nexterror(); - } - n = etherwrite(chan, bp->rp, n, 0); - poperror(); - freeb(bp); - return n; - } - ether = etherxx[chan->dev]; - - if(n > ether->maxmtu){ - freeb(bp); - error(Etoobig); - } - if(n < ether->minmtu){ - freeb(bp); - error(Etoosmall); - } - - return etheroq(ether, bp); -} - -static struct { - char* type; - int (*reset)(Ether*); -} cards[MaxEther+1]; - -void -addethercard(char* t, int (*r)(Ether*)) -{ - static int ncard; - - if(ncard == MaxEther) - panic("too many ether cards"); - cards[ncard].type = t; - cards[ncard].reset = r; - ncard++; -} - -static void -etherreset(void) -{ - Ether *ether; - int i, n, ctlrno; - char name[KNAMELEN], buf[128]; - - for(ether = 0, ctlrno = 0; ctlrno < MaxEther; ctlrno++){ - if(ether == 0) - ether = malloc(sizeof(Ether)); - memset(ether, 0, sizeof(Ether)); - ether->ctlrno = ctlrno; - ether->mbps = 10; - ether->minmtu = ETHERMINTU; - ether->maxmtu = ETHERMAXTU; - - if(archether(ctlrno, ether) <= 0) - continue; - - for(n = 0; cards[n].type; n++){ - if(cistrcmp(cards[n].type, ether->type)) - continue; - for(i = 0; i < ether->nopt; i++){ - if(cistrncmp(ether->opt[i], "ea=", 3) == 0){ - if(parseether(ether->ea, ðer->opt[i][3]) == -1) - memset(ether->ea, 0, Eaddrlen); - }else if(cistrcmp(ether->opt[i], "fullduplex") == 0 || - cistrcmp(ether->opt[i], "10BASE-TFD") == 0) - ether->fullduplex = 1; - else if(cistrcmp(ether->opt[i], "100BASE-TXFD") == 0) - ether->mbps = 100; - } - if(cards[n].reset(ether)) - break; - snprint(name, sizeof(name), "ether%d", ctlrno); - - if(ether->interrupt != nil) - intrenable(Irqlo, ether->irq, ether->interrupt, - ether, name); - - i = snprint(buf, sizeof buf, - "#l%d: %s: %dMbps port %#lux irq %d", - ctlrno, ether->type, ether->mbps, ether->port, - ether->irq); - if(ether->mem) - i += snprint(buf+i, sizeof buf - i, - " addr %#lux", PADDR(ether->mem)); - if(ether->size) - i += snprint(buf+i, sizeof buf - i, - " size %#luX", ether->size); - i += snprint(buf+i, sizeof buf - i, - ": %2.2ux%2.2ux%2.2ux%2.2ux%2.2ux%2.2ux", - ether->ea[0], ether->ea[1], ether->ea[2], - ether->ea[3], ether->ea[4], ether->ea[5]); - snprint(buf+i, sizeof buf - i, "\n"); - print("%s", buf); - - if(ether->mbps >= 1000) - netifinit(ether, name, Ntypes, 4*1024*1024); - else if(ether->mbps >= 100) - netifinit(ether, name, Ntypes, 1024*1024); - else - netifinit(ether, name, Ntypes, 65*1024); - if(ether->oq == 0) - ether->oq = qopen(ether->limit, Qmsg, 0, 0); - if(ether->oq == 0) - panic("etherreset %s", name); - ether->alen = Eaddrlen; - memmove(ether->addr, ether->ea, Eaddrlen); - memset(ether->bcast, 0xFF, Eaddrlen); - - etherxx[ctlrno] = ether; - ether = 0; - break; - } - } - if(ether) - free(ether); -} - -static void -ethershutdown(void) -{ - Ether *ether; - int i; - - for(i = 0; i < MaxEther; i++){ - ether = etherxx[i]; - if(ether == nil) - continue; - if(ether->shutdown == nil) { - print("#l%d: no shutdown function\n", i); - continue; - } - (*ether->shutdown)(ether); - } -} - -#define POLY 0xedb88320 - -/* really slow 32 bit crc for ethers */ -ulong -ethercrc(uchar *p, int len) -{ - int i, j; - ulong crc, b; - - crc = 0xffffffff; - for(i = 0; i < len; i++){ - b = *p++; - for(j = 0; j < 8; j++){ - crc = (crc>>1) ^ (((crc^b) & 1) ? POLY : 0); - b >>= 1; - } - } - return crc; -} - -void -dumpoq(Queue *oq) -{ - if (oq == nil) - print("no outq! "); - else if (qisclosed(oq)) - print("outq closed "); - else if (qfull(oq)) - print("outq full "); - else - print("outq %d ", qlen(oq)); -} - -void -dumpnetif(Netif *netif) -{ - print("netif %s ", netif->name); - print("limit %d mbps %d link %d ", - netif->limit, netif->mbps, netif->link); - print("inpkts %lld outpkts %lld errs %d\n", - netif->inpackets, netif->outpackets, - netif->crcs + netif->oerrs + netif->frames + netif->overflows + - netif->buffs + netif->soverflows); -} - -Dev etherdevtab = { - 'l', - "ether", - - etherreset, - devinit, - ethershutdown, - etherattach, - etherwalk, - etherstat, - etheropen, - ethercreate, - etherclose, - etherread, - etherbread, - etherwrite, - etherbwrite, - devremove, - etherwstat, -}; diff --git a/sys/src/9/kw/ether1116.c b/sys/src/9/kw/ether1116.c index 9e54ef173..9987593f0 100644 --- a/sys/src/9/kw/ether1116.c +++ b/sys/src/9/kw/ether1116.c @@ -16,8 +16,8 @@ #include "io.h" #include "../port/error.h" #include "../port/netif.h" +#include "../port/etherif.h" -#include "etherif.h" #include "ethermii.h" #include "../ip/ip.h" @@ -144,6 +144,9 @@ struct Ctlr { Mii *mii; int port; + int linkchg; /* link status changed? */ + uvlong starttime; /* last activity time */ + /* stats */ ulong intrs; ulong newintrs; @@ -579,14 +582,16 @@ dump(uchar *bp, long max) static void etheractive(Ether *ether) { - ether->starttime = TK2MS(MACHP(0)->ticks)/1000; + Ctlr *ctlr = ether->ctlr; + ctlr->starttime = TK2MS(MACHP(0)->ticks)/1000; } static void ethercheck(Ether *ether) { - if (ether->starttime != 0 && - TK2MS(MACHP(0)->ticks)/1000 - ether->starttime > Etherstuck) { + Ctlr *ctlr = ether->ctlr; + if (ctlr->starttime != 0 && + TK2MS(MACHP(0)->ticks)/1000 - ctlr->starttime > Etherstuck) { etheractive(ether); if (ether->ctlrno == 0) /* only complain about main ether */ iprint("#l%d: ethernet stuck\n", ether->ctlrno); @@ -833,7 +838,7 @@ interrupt(Ureg*, void *arg) */ if(irqe & IEphystschg) { ether->link = (reg->ps0 & PS0linkup) != 0; - ether->linkchg = 1; + ctlr->linkchg = 1; } if(irqe & IEtxerrq(Qno)) ether->oerrs++; @@ -858,10 +863,10 @@ interrupt(Ureg*, void *arg) irq &= ~(Irxerr | Irxerrq(Qno)); } - if(ether->linkchg && (reg->ps1 & PS1an_done)) { + if(ctlr->linkchg && (reg->ps1 & PS1an_done)) { handled++; ether->link = (reg->ps0 & PS0linkup) != 0; - ether->linkchg = 0; + ctlr->linkchg = 0; } ctlr->newintrs++; @@ -1652,7 +1657,6 @@ ifstat(Ether *ether, void *a, long n, ulong off) p = seprint(p, e, "transmitted broadcast frames: %lud\n", ctlr->txbcastpkt); p = seprint(p, e, "transmitted multicast frames: %lud\n", ctlr->txmcastpkt); p = seprint(p, e, "transmit frames dropped by collision: %lud\n", ctlr->txcollpktdrop); - p = seprint(p, e, "misaligned buffers: %lud\n", ether->pktsmisaligned); p = seprint(p, e, "bad mac control frames: %lud\n", ctlr->badmacctlpkts); p = seprint(p, e, "transmitted flow control messages: %lud\n", ctlr->txflctl); @@ -1689,7 +1693,7 @@ reset(Ether *ether) ether->irq = IRQ0gbe1sum; break; default: - panic("ether1116: bad ether ctlr #%d", ether->ctlrno); + return -1; } ctlr->reg = (Gbereg*)soc.ether[ether->ctlrno]; @@ -1728,7 +1732,6 @@ iprint("ether1116: reset: zero ether->ea\n"); ether->attach = attach; ether->transmit = transmit; - ether->interrupt = interrupt; ether->ifstat = ifstat; ether->shutdown = shutdown; ether->ctl = ctl; @@ -1736,6 +1739,9 @@ iprint("ether1116: reset: zero ether->ea\n"); ether->arg = ether; ether->promiscuous = promiscuous; ether->multicast = multicast; + + intrenable(Irqlo, ether->irq, interrupt, ether, ether->name); + return 0; } diff --git a/sys/src/9/kw/etherif.h b/sys/src/9/kw/etherif.h deleted file mode 100644 index 35d131fe3..000000000 --- a/sys/src/9/kw/etherif.h +++ /dev/null @@ -1,55 +0,0 @@ -enum -{ - MaxEther = 2, - Ntypes = 8, -}; - -typedef struct Ether Ether; -struct Ether { - RWlock; /* TO DO */ - ISAConf; /* hardware info */ - int ctlrno; - int minmtu; - int maxmtu; - uchar ea[Eaddrlen]; - void *address; - int tbusy; - - void (*attach)(Ether*); /* filled in by reset routine */ - void (*closed)(Ether*); - void (*detach)(Ether*); - void (*transmit)(Ether*); - void (*interrupt)(Ureg*, void*); - long (*ifstat)(Ether*, void*, long, ulong); - long (*ctl)(Ether*, void*, long); /* custom ctl messages */ - void (*power)(Ether*, int); /* power on/off */ - void (*shutdown)(Ether*); /* shutdown hardware before reboot */ - void *ctlr; - int pcmslot; /* PCMCIA */ - int fullduplex; /* non-zero if full duplex */ - int linkchg; /* link status changed? */ - uvlong starttime; /* last activity time */ - - Queue* oq; - - /* statistics */ - ulong interrupts; - ulong dmarxintr; - ulong dmatxintr; - ulong promisc; - ulong pktsdropped; - ulong pktsmisaligned; - ulong resets; /* after initialisation */ - ulong bcasts; /* broadcast pkts rcv'd */ - ulong mcasts; /* multicast pkts rcv'd */ - - Netif; -}; - -extern Block* etheriq(Ether*, Block*, int); -extern void addethercard(char*, int(*)(Ether*)); -extern ulong ethercrc(uchar*, int); -extern int parseether(uchar*, char*); - -#define NEXT(x, l) (((x)+1)%(l)) -#define PREV(x, l) (((x) == 0) ? (l)-1: (x)-1) diff --git a/sys/src/9/kw/ethermii.c b/sys/src/9/kw/ethermii.c index 90b219b3f..16d766ef4 100644 --- a/sys/src/9/kw/ethermii.c +++ b/sys/src/9/kw/ethermii.c @@ -6,8 +6,8 @@ #include "io.h" #include "../port/error.h" #include "../port/netif.h" +#include "../port/etherif.h" -#include "etherif.h" #include "ethermii.h" int diff --git a/sys/src/9/kw/mem.h b/sys/src/9/kw/mem.h index 3cc93a381..775933bc3 100644 --- a/sys/src/9/kw/mem.h +++ b/sys/src/9/kw/mem.h @@ -5,9 +5,6 @@ #define MiB 1048576u /* Mebi 0x0000000000100000 */ #define GiB 1073741824u /* Gibi 000000000040000000 */ -#define HOWMANY(x, y) (((x)+((y)-1))/(y)) -#define ROUNDUP(x, y) (HOWMANY((x), (y))*(y)) /* ceiling */ -#define ROUNDDN(x, y) (((x)/(y))*(y)) /* floor */ #define MIN(a, b) ((a) < (b)? (a): (b)) #define MAX(a, b) ((a) > (b)? (a): (b)) @@ -36,7 +33,7 @@ */ #define BY2PG (4*KiB) /* bytes per page */ #define PGSHIFT 12 /* log(BY2PG) */ -#define PGROUND(s) ROUNDUP(s, BY2PG) +#define PGROUND(s) ROUND(s, BY2PG) #define ROUND(s, sz) (((s)+(sz-1))&~(sz-1)) #define MAXMACH 1 /* max # cpus system can run */ diff --git a/sys/src/9/kw/mkfile b/sys/src/9/kw/mkfile index 8134b3bb2..2f5af40d2 100644 --- a/sys/src/9/kw/mkfile +++ b/sys/src/9/kw/mkfile @@ -124,7 +124,7 @@ arch.$O clock.$O fpiarm.$O main.$O mmu.$O screen.$O sdscsi.$O syscall.$O \ trap.$O: /$objtype/include/ureg.h archkw.$O devether.$O ether1116.$O ethermii.$O: \ - etherif.h ethermii.h ../port/netif.h + ethermii.h ../port/etherif.h ../port/netif.h archkw.$O devflash.$O flashkw.$O: ../port/flashif.h fpi.$O fpiarm.$O fpimem.$O: fpi.h l.$O lexception.$O lproc.$O mmu.$O: arm.s arm.h mem.h diff --git a/sys/src/9/kw/mmu.c b/sys/src/9/kw/mmu.c index cd633d992..72db1fb65 100644 --- a/sys/src/9/kw/mmu.c +++ b/sys/src/9/kw/mmu.c @@ -465,7 +465,7 @@ vmap(uintptr pa, usize size) o = pa & (BY2PG-1); pa -= o; size += o; - size = ROUNDUP(size, BY2PG); + size = PGROUND(size); va = kseg0|pa; pae = mmukmap(va, pa, size); diff --git a/sys/src/9/mtx/devether.c b/sys/src/9/mtx/devether.c deleted file mode 100644 index a15609508..000000000 --- a/sys/src/9/mtx/devether.c +++ /dev/null @@ -1,447 +0,0 @@ -#include "u.h" -#include "../port/lib.h" -#include "mem.h" -#include "dat.h" -#include "fns.h" -#include "io.h" -#include "ureg.h" -#include "../port/error.h" -#include "../port/netif.h" - -#include "etherif.h" - -static Ether *etherxx[MaxEther]; - -Chan* -etherattach(char* spec) -{ - ulong ctlrno; - char *p; - Chan *chan; - - ctlrno = 0; - if(spec && *spec){ - ctlrno = strtoul(spec, &p, 0); - if((ctlrno == 0 && p == spec) || *p || (ctlrno >= MaxEther)) - error(Ebadarg); - } - if(etherxx[ctlrno] == 0) - error(Enodev); - - chan = devattach('l', spec); - chan->dev = ctlrno; - if(etherxx[ctlrno]->attach) - etherxx[ctlrno]->attach(etherxx[ctlrno]); - return chan; -} - -static Walkqid* -etherwalk(Chan* chan, Chan* nchan, char** name, int nname) -{ - return netifwalk(etherxx[chan->dev], chan, nchan, name, nname); -} - -static int -etherstat(Chan* chan, uchar* dp, int n) -{ - return netifstat(etherxx[chan->dev], chan, dp, n); -} - -static Chan* -etheropen(Chan* chan, int omode) -{ - return netifopen(etherxx[chan->dev], chan, omode); -} - -static Chan* -ethercreate(Chan*, char*, int, ulong) -{ - error(Eperm); - return 0; -} - -static void -etherclose(Chan* chan) -{ - netifclose(etherxx[chan->dev], chan); -} - -static long -etherread(Chan* chan, void* buf, long n, vlong off) -{ - Ether *ether; - ulong offset = off; - - ether = etherxx[chan->dev]; - if((chan->qid.type & QTDIR) == 0 && ether->ifstat){ - /* - * With some controllers it is necessary to reach - * into the chip to extract statistics. - */ - if(NETTYPE(chan->qid.path) == Nifstatqid) - return ether->ifstat(ether, buf, n, offset); - else if(NETTYPE(chan->qid.path) == Nstatqid) - ether->ifstat(ether, buf, 0, offset); - } - - return netifread(ether, chan, buf, n, offset); -} - -static Block* -etherbread(Chan* chan, long n, ulong offset) -{ - return netifbread(etherxx[chan->dev], chan, n, offset); -} - -static int -etherwstat(Chan* chan, uchar* dp, int n) -{ - return netifwstat(etherxx[chan->dev], chan, dp, n); -} - -static void -etherrtrace(Netfile* f, Etherpkt* pkt, int len) -{ - int i, n; - Block *bp; - - if(qwindow(f->in) <= 0) - return; - if(len > 58) - n = 58; - else - n = len; - bp = iallocb(64); - if(bp == nil) - return; - memmove(bp->wp, pkt->d, n); - i = TK2MS(MACHP(0)->ticks); - bp->wp[58] = len>>8; - bp->wp[59] = len; - bp->wp[60] = i>>24; - bp->wp[61] = i>>16; - bp->wp[62] = i>>8; - bp->wp[63] = i; - bp->wp += 64; - qpass(f->in, bp); -} - -Block* -etheriq(Ether* ether, Block* bp, int fromwire) -{ - Etherpkt *pkt; - ushort type; - int len, multi, tome, fromme; - Netfile **ep, *f, **fp, *fx; - Block *xbp; - - ether->inpackets++; - - pkt = (Etherpkt*)bp->rp; - len = BLEN(bp); - type = (pkt->type[0]<<8)|pkt->type[1]; - fx = 0; - ep = ðer->f[Ntypes]; - - multi = pkt->d[0] & 1; - /* check for valid multicast addresses */ - if(multi && memcmp(pkt->d, ether->bcast, sizeof(pkt->d)) && ether->prom == 0){ - if(!activemulti(ether, pkt->d, sizeof(pkt->d))){ - if(fromwire){ - freeb(bp); - bp = 0; - } - return bp; - } - } - - /* is it for me? */ - tome = memcmp(pkt->d, ether->ea, sizeof(pkt->d)) == 0; - fromme = memcmp(pkt->s, ether->ea, sizeof(pkt->s)) == 0; - - /* - * Multiplex the packet to all the connections which want it. - * If the packet is not to be used subsequently (fromwire != 0), - * attempt to simply pass it into one of the connections, thereby - * saving a copy of the data (usual case hopefully). - */ - for(fp = ether->f; fp < ep; fp++){ - if(f = *fp) - if(f->type == type || f->type < 0) - if(tome || multi || f->prom){ - /* Don't want to hear loopback or bridged packets */ - if(f->bridge && (tome || !fromwire && !fromme)) - continue; - if(!f->headersonly){ - if(fromwire && fx == 0) - fx = f; - else if(xbp = iallocb(len)){ - memmove(xbp->wp, pkt, len); - xbp->wp += len; - qpass(f->in, xbp); - } - else - ether->soverflows++; - } - else - etherrtrace(f, pkt, len); - } - } - - if(fx){ - if(qpass(fx->in, bp) < 0) - ether->soverflows++; - return 0; - } - if(fromwire){ - freeb(bp); - return 0; - } - - return bp; -} - -static int -etheroq(Ether* ether, Block* bp) -{ - int len, loopback; - Etherpkt *pkt; - - ether->outpackets++; - - /* - * Check if the packet has to be placed back onto the input queue, - * i.e. if it's a loopback or broadcast packet or the interface is - * in promiscuous mode. - * If it's a loopback packet indicate to etheriq that the data isn't - * needed and return, etheriq will pass-on or free the block. - * To enable bridging to work, only packets that were originated - * by this interface are fed back. - */ - pkt = (Etherpkt*)bp->rp; - len = BLEN(bp); - loopback = memcmp(pkt->d, ether->ea, sizeof(pkt->d)) == 0; - if(loopback || memcmp(pkt->d, ether->bcast, sizeof(pkt->d)) == 0 || ether->prom) - if(etheriq(ether, bp, loopback) == 0) - return len; - - qbwrite(ether->oq, bp); - if(ether->transmit != nil) - ether->transmit(ether); - return len; -} - -static long -etherwrite(Chan* chan, void* buf, long n, vlong) -{ - Ether *ether; - Block *bp; - int nn; - - ether = etherxx[chan->dev]; - if(NETTYPE(chan->qid.path) != Ndataqid) { - nn = netifwrite(ether, chan, buf, n); - if(nn >= 0) - return nn; - - if(n == sizeof("nonblocking")-1 && strncmp((char*)buf, "nonblocking", n) == 0){ - qnoblock(ether->oq, 1); - return n; - } - - if(ether->ctl!=nil) - return ether->ctl(ether,buf,n); - - error(Ebadctl); - } - - if(n > ether->maxmtu) - error(Etoobig); - if(n < ether->minmtu) - error(Etoosmall); - - bp = allocb(n); - if(waserror()){ - freeb(bp); - nexterror(); - } - memmove(bp->rp, buf, n); - if(!ether->f[NETID(chan->qid.path)]->bridge) - memmove(bp->rp+Eaddrlen, ether->ea, Eaddrlen); - poperror(); - bp->wp += n; - - return etheroq(ether, bp); -} - -static long -etherbwrite(Chan* chan, Block* bp, ulong) -{ - Ether *ether; - long n; - - n = BLEN(bp); - if(NETTYPE(chan->qid.path) != Ndataqid){ - if(waserror()) { - freeb(bp); - nexterror(); - } - n = etherwrite(chan, bp->rp, n, 0); - poperror(); - freeb(bp); - return n; - } - ether = etherxx[chan->dev]; - - if(n > ether->maxmtu){ - freeb(bp); - error(Etoobig); - } - if(n < ether->minmtu){ - freeb(bp); - error(Etoosmall); - } - - return etheroq(ether, bp); -} - -static struct { - char* type; - int (*reset)(Ether*); -} cards[MaxEther+1]; - -void -addethercard(char* t, int (*r)(Ether*)) -{ - static int ncard; - - if(ncard == MaxEther) - panic("too many ether cards"); - cards[ncard].type = t; - cards[ncard].reset = r; - ncard++; -} - -static void -etherreset(void) -{ - Ether *ether; - int i, n, ctlrno; - char name[32], buf[128]; - - for(ether = 0, ctlrno = 0; ctlrno < MaxEther; ctlrno++){ - if(ether == 0) - ether = malloc(sizeof(Ether)); - memset(ether, 0, sizeof(Ether)); - ether->ctlrno = ctlrno; - ether->tbdf = BUSUNKNOWN; - ether->mbps = 10; - ether->minmtu = ETHERMINTU; - ether->maxmtu = ETHERMAXTU; - if(isaconfig("ether", ctlrno, ether) == 0) - continue; - for(n = 0; cards[n].type; n++){ - if(cistrcmp(cards[n].type, ether->type)) - continue; - for(i = 0; i < ether->nopt; i++){ - if(strncmp(ether->opt[i], "ea=", 3)) - continue; - if(parseether(ether->ea, ðer->opt[i][3]) == -1) - memset(ether->ea, 0, Eaddrlen); - } - if(cards[n].reset(ether)) - break; - - /* - * IRQ2 doesn't really exist, it's used to gang the interrupt - * controllers together. A device set to IRQ2 will appear on - * the second interrupt controller as IRQ9. - */ - if(ether->irq == 2 && BUSTYPE(ether->tbdf) != BusPCI) - ether->irq = 9; - snprint(name, sizeof(name), "ether%d", ctlrno); - - /* - * If ether->irq is <0, it is a hack to indicate no interrupt - * used by ethersink. - */ - if(ether->irq >= 0) - intrenable(ether->irq, ether->interrupt, ether, ether->tbdf, name); - - i = sprint(buf, "#l%d: %s: %dMbps port 0x%luX irq %d", - ctlrno, ether->type, ether->mbps, ether->port, ether->irq); - if(ether->mem) - i += sprint(buf+i, " addr 0x%luX", PADDR(ether->mem)); - if(ether->size) - i += sprint(buf+i, " size 0x%luX", ether->size); - i += sprint(buf+i, ": %2.2ux%2.2ux%2.2ux%2.2ux%2.2ux%2.2ux", - ether->ea[0], ether->ea[1], ether->ea[2], - ether->ea[3], ether->ea[4], ether->ea[5]); - sprint(buf+i, "\n"); - print(buf); - - if(ether->mbps >= 100){ - netifinit(ether, name, Ntypes, 256*1024); - if(ether->oq == 0) - ether->oq = qopen(256*1024, Qmsg, 0, 0); - } - else{ - netifinit(ether, name, Ntypes, 65*1024); - if(ether->oq == 0) - ether->oq = qopen(65*1024, Qmsg, 0, 0); - } - if(ether->oq == 0) - panic("etherreset %s", name); - ether->alen = Eaddrlen; - memmove(ether->addr, ether->ea, Eaddrlen); - memset(ether->bcast, 0xFF, Eaddrlen); - - etherxx[ctlrno] = ether; - ether = 0; - break; - } - } - if(ether) - free(ether); -} - -#define POLY 0xedb88320 - -/* really slow 32 bit crc for ethers */ -ulong -ethercrc(uchar *p, int len) -{ - int i, j; - ulong crc, b; - - crc = 0xffffffff; - for(i = 0; i < len; i++){ - b = *p++; - for(j = 0; j < 8; j++){ - crc = (crc>>1) ^ (((crc^b) & 1) ? POLY : 0); - b >>= 1; - } - } - return crc; -} - -Dev etherdevtab = { - 'l', - "ether", - - etherreset, - devinit, - devshutdown, - etherattach, - etherwalk, - etherstat, - etheropen, - ethercreate, - etherclose, - etherread, - etherbread, - etherwrite, - etherbwrite, - devremove, - etherwstat, -}; diff --git a/sys/src/9/mtx/ether2114x.c b/sys/src/9/mtx/ether2114x.c index b5dbfff06..a02c0eb52 100644 --- a/sys/src/9/mtx/ether2114x.c +++ b/sys/src/9/mtx/ether2114x.c @@ -16,8 +16,7 @@ #include "io.h" #include "../port/error.h" #include "../port/netif.h" - -#include "etherif.h" +#include "../port/etherif.h" #define DEBUG (0) #define debug if(DEBUG)print @@ -1654,12 +1653,13 @@ ether->irq = 2; /* arrrrrgh */ */ ether->attach = attach; ether->transmit = transmit; - ether->interrupt = interrupt; ether->ifstat = ifstat; ether->arg = ether; ether->promiscuous = promiscuous; + intrenable(ether->irq, interrupt, ether, ether->tbdf, ether->name); + return 0; } diff --git a/sys/src/9/mtx/etherif.h b/sys/src/9/mtx/etherif.h deleted file mode 100644 index 34fa2cc02..000000000 --- a/sys/src/9/mtx/etherif.h +++ /dev/null @@ -1,35 +0,0 @@ -enum { - MaxEther = 24, - Ntypes = 8, -}; - -typedef struct Ether Ether; -struct Ether { - ISAConf; /* hardware info */ - - int ctlrno; - int tbdf; /* type+busno+devno+funcno */ - int minmtu; - int maxmtu; - uchar ea[Eaddrlen]; - - void (*attach)(Ether*); /* filled in by reset routine */ - void (*transmit)(Ether*); - void (*interrupt)(Ureg*, void*); - long (*ifstat)(Ether*, void*, long, ulong); - long (*ctl)(Ether*, void*, long); /* custom ctl messages */ - void *ctlr; - - Queue* oq; - - Netif; -}; - -extern Block* etheriq(Ether*, Block*, int); -extern void addethercard(char*, int(*)(Ether*)); -extern ulong ethercrc(uchar*, int); - -#define NEXT(x, l) (((x)+1)%(l)) -#define PREV(x, l) (((x) == 0) ? (l)-1: (x)-1) -#define HOWMANY(x, y) (((x)+((y)-1))/(y)) -#define ROUNDUP(x, y) (HOWMANY((x), (y))*(y)) diff --git a/sys/src/9/mtx/mkfile b/sys/src/9/mtx/mkfile index daa4b3e81..10bbb6e02 100644 --- a/sys/src/9/mtx/mkfile +++ b/sys/src/9/mtx/mkfile @@ -82,7 +82,7 @@ devether.$O: /$objtype/include/ureg.h main.$O: /$objtype/include/ureg.h errstr.h init.h trap.$O: /$objtype/include/ureg.h -$ETHER: etherif.h ../port/netif.h +$ETHER: ../port/etherif.h ../port/netif.h init.h: initcode /sys/src/libc/9syscall/sys.h $AS initcode diff --git a/sys/src/9/omap/archomap.c b/sys/src/9/omap/archomap.c index 2c3665010..05179999d 100644 --- a/sys/src/9/omap/archomap.c +++ b/sys/src/9/omap/archomap.c @@ -15,7 +15,7 @@ #include "arm.h" #include "../port/netif.h" -#include "etherif.h" +#include "../port/etherif.h" #include "../port/flashif.h" #include "../port/usb.h" #include "../port/portusbehci.h" diff --git a/sys/src/9/omap/dat.h b/sys/src/9/omap/dat.h index c54d03204..710134f56 100644 --- a/sys/src/9/omap/dat.h +++ b/sys/src/9/omap/dat.h @@ -240,6 +240,8 @@ struct ISAConf { char *opt[NISAOPT]; }; +#define BUSUNKNOWN -1 + #define MACHP(n) (machaddr[n]) /* diff --git a/sys/src/9/omap/devether.c b/sys/src/9/omap/devether.c deleted file mode 100644 index c4315fa73..000000000 --- a/sys/src/9/omap/devether.c +++ /dev/null @@ -1,504 +0,0 @@ -#include "u.h" -#include "../port/lib.h" -#include "mem.h" -#include "dat.h" -#include "fns.h" -#include "io.h" -#include "../port/error.h" - -#include "../port/netif.h" -#include "etherif.h" - -extern int archether(unsigned ctlno, Ether *ether); - -static Ether *etherxx[MaxEther]; - -Chan* -etherattach(char* spec) -{ - int ctlrno; - char *p; - Chan *chan; - - ctlrno = 0; - if(spec && *spec){ - ctlrno = strtoul(spec, &p, 0); - if((ctlrno == 0 && p == spec) || *p != 0) - error(Ebadarg); - if(ctlrno < 0 || ctlrno >= MaxEther) - error(Ebadarg); - } - if(etherxx[ctlrno] == 0) - error(Enodev); - - chan = devattach('l', spec); - if(waserror()){ - chanfree(chan); - nexterror(); - } - chan->dev = ctlrno; - if(etherxx[ctlrno]->attach) - etherxx[ctlrno]->attach(etherxx[ctlrno]); - poperror(); - return chan; -} - -static Walkqid* -etherwalk(Chan* chan, Chan* nchan, char** name, int nname) -{ - return netifwalk(etherxx[chan->dev], chan, nchan, name, nname); -} - -static int -etherstat(Chan* chan, uchar* dp, int n) -{ - return netifstat(etherxx[chan->dev], chan, dp, n); -} - -static Chan* -etheropen(Chan* chan, int omode) -{ - return netifopen(etherxx[chan->dev], chan, omode); -} - -static Chan* -ethercreate(Chan*, char*, int, ulong) -{ - error(Eperm); - return 0; -} - -static void -etherclose(Chan* chan) -{ - netifclose(etherxx[chan->dev], chan); -} - -static long -etherread(Chan* chan, void* buf, long n, vlong off) -{ - Ether *ether; - ulong offset = off; - - ether = etherxx[chan->dev]; - if((chan->qid.type & QTDIR) == 0 && ether->ifstat){ - /* - * With some controllers it is necessary to reach - * into the chip to extract statistics. - */ - if(NETTYPE(chan->qid.path) == Nifstatqid) - return ether->ifstat(ether, buf, n, offset); - else if(NETTYPE(chan->qid.path) == Nstatqid) - ether->ifstat(ether, buf, 0, offset); - } - - return netifread(ether, chan, buf, n, offset); -} - -static Block* -etherbread(Chan* chan, long n, ulong offset) -{ - return netifbread(etherxx[chan->dev], chan, n, offset); -} - -static int -etherwstat(Chan* chan, uchar* dp, int n) -{ - return netifwstat(etherxx[chan->dev], chan, dp, n); -} - -static void -etherrtrace(Netfile* f, Etherpkt* pkt, int len) -{ - int i, n; - Block *bp; - - if(qwindow(f->in) <= 0) - return; - if(len > 58) - n = 58; - else - n = len; - bp = iallocb(64); - if(bp == nil) - return; - memmove(bp->wp, pkt->d, n); - i = TK2MS(MACHP(0)->ticks); - bp->wp[58] = len>>8; - bp->wp[59] = len; - bp->wp[60] = i>>24; - bp->wp[61] = i>>16; - bp->wp[62] = i>>8; - bp->wp[63] = i; - bp->wp += 64; - qpass(f->in, bp); -} - -Block* -etheriq(Ether* ether, Block* bp, int fromwire) -{ - Etherpkt *pkt; - ushort type; - int len, multi, tome, fromme; - Netfile **ep, *f, **fp, *fx; - Block *xbp; - - ether->inpackets++; - - pkt = (Etherpkt*)bp->rp; - len = BLEN(bp); - type = (pkt->type[0]<<8)|pkt->type[1]; - fx = 0; - ep = ðer->f[Ntypes]; - - multi = pkt->d[0] & 1; - /* check for valid multicast addresses */ - if(multi && memcmp(pkt->d, ether->bcast, sizeof(pkt->d)) != 0 && - ether->prom == 0){ - if(!activemulti(ether, pkt->d, sizeof(pkt->d))){ - if(fromwire){ - freeb(bp); - bp = 0; - } - return bp; - } - } - /* is it for me? */ - tome = memcmp(pkt->d, ether->ea, sizeof(pkt->d)) == 0; - fromme = memcmp(pkt->s, ether->ea, sizeof(pkt->s)) == 0; - - /* - * Multiplex the packet to all the connections which want it. - * If the packet is not to be used subsequently (fromwire != 0), - * attempt to simply pass it into one of the connections, thereby - * saving a copy of the data (usual case hopefully). - */ - for(fp = ether->f; fp < ep; fp++){ - if((f = *fp) != nil && (f->type == type || f->type < 0) && - (tome || multi || f->prom)){ - /* Don't want to hear loopback or bridged packets */ - if(f->bridge && (tome || !fromwire && !fromme)) - continue; - if(!f->headersonly){ - if(fromwire && fx == 0) - fx = f; - else if(xbp = iallocb(len)){ - memmove(xbp->wp, pkt, len); - xbp->wp += len; - if(qpass(f->in, xbp) < 0) - ether->soverflows++; - } - else - ether->soverflows++; - } - else - etherrtrace(f, pkt, len); - } - } - - if(fx){ - if(qpass(fx->in, bp) < 0) - ether->soverflows++; - return 0; - } - if(fromwire){ - freeb(bp); - return 0; - } - return bp; -} - -static int -etheroq(Ether* ether, Block* bp) -{ - int len, loopback; - Etherpkt *pkt; - - ether->outpackets++; - - /* - * Check if the packet has to be placed back onto the input queue, - * i.e. if it's a loopback or broadcast packet or the interface is - * in promiscuous mode. - * If it's a loopback packet indicate to etheriq that the data isn't - * needed and return, etheriq will pass-on or free the block. - * To enable bridging to work, only packets that were originated - * by this interface are fed back. - */ - pkt = (Etherpkt*)bp->rp; - len = BLEN(bp); - loopback = memcmp(pkt->d, ether->ea, sizeof(pkt->d)) == 0; - if(loopback || memcmp(pkt->d, ether->bcast, sizeof(pkt->d)) == 0 || ether->prom) - if(etheriq(ether, bp, loopback) == 0) - return len; - - qbwrite(ether->oq, bp); - if(ether->transmit != nil) - ether->transmit(ether); - return len; -} - -static long -etherwrite(Chan* chan, void* buf, long n, vlong) -{ - Ether *ether; - Block *bp; - int nn, onoff; - Cmdbuf *cb; - - ether = etherxx[chan->dev]; - if(NETTYPE(chan->qid.path) != Ndataqid) { - nn = netifwrite(ether, chan, buf, n); - if(nn >= 0) - return nn; - cb = parsecmd(buf, n); - if(cb->f[0] && strcmp(cb->f[0], "nonblocking") == 0){ - if(cb->nf <= 1) - onoff = 1; - else - onoff = atoi(cb->f[1]); - qnoblock(ether->oq, onoff); - free(cb); - return n; - } - free(cb); - if(ether->ctl!=nil) - return ether->ctl(ether,buf,n); - - error(Ebadctl); - } - - if(n > ether->maxmtu) - error(Etoobig); - if(n < ether->minmtu) - error(Etoosmall); - - bp = allocb(n); - if(waserror()){ - freeb(bp); - nexterror(); - } - memmove(bp->rp, buf, n); - if(!ether->f[NETID(chan->qid.path)]->bridge) - memmove(bp->rp+Eaddrlen, ether->ea, Eaddrlen); - poperror(); - bp->wp += n; - - return etheroq(ether, bp); -} - -static long -etherbwrite(Chan* chan, Block* bp, ulong) -{ - Ether *ether; - long n; - - n = BLEN(bp); - if(NETTYPE(chan->qid.path) != Ndataqid){ - if(waserror()) { - freeb(bp); - nexterror(); - } - n = etherwrite(chan, bp->rp, n, 0); - poperror(); - freeb(bp); - return n; - } - ether = etherxx[chan->dev]; - - if(n > ether->maxmtu){ - freeb(bp); - error(Etoobig); - } - if(n < ether->minmtu){ - freeb(bp); - error(Etoosmall); - } - - return etheroq(ether, bp); -} - -static struct { - char* type; - int (*reset)(Ether*); -} cards[MaxEther+1]; - -void -addethercard(char* t, int (*r)(Ether*)) -{ - static int ncard; - - if(ncard == MaxEther) - panic("too many ether cards"); - cards[ncard].type = t; - cards[ncard].reset = r; - ncard++; -} - -static void -etherreset(void) -{ - Ether *ether; - int i, n, ctlrno; - char name[KNAMELEN], buf[128]; - - for(ether = 0, ctlrno = 0; ctlrno < MaxEther; ctlrno++){ - if(ether == 0) - ether = malloc(sizeof(Ether)); - memset(ether, 0, sizeof(Ether)); - ether->ctlrno = ctlrno; - ether->mbps = 10; - ether->minmtu = ETHERMINTU; - ether->maxmtu = ETHERMAXTU; - - if(archether(ctlrno, ether) <= 0) - continue; - - if(isaconfig("ether", ctlrno, ether) == 0){ -// free(ether); -// return nil; - continue; - } - for(n = 0; cards[n].type; n++){ - if(cistrcmp(cards[n].type, ether->type)) - continue; - for(i = 0; i < ether->nopt; i++) - if(cistrncmp(ether->opt[i], "ea=", 3) == 0){ - if(parseether(ether->ea, - ðer->opt[i][3]) == -1) - memset(ether->ea, 0, Eaddrlen); - } else if(cistrcmp(ether->opt[i], - "100BASE-TXFD") == 0) - ether->mbps = 100; - if(cards[n].reset(ether)) - break; - snprint(name, sizeof(name), "ether%d", ctlrno); - - if(ether->interrupt != nil && ether->irq >= 0) - intrenable(ether->irq, ether->interrupt, - ether, 0, name); - - i = snprint(buf, sizeof buf, - "#l%d: %s: %dMbps port %#lux irq %d", - ctlrno, ether->type, ether->mbps, ether->port, - ether->irq); - if(ether->mem) - i += snprint(buf+i, sizeof buf - i, - " addr %#lux", PADDR(ether->mem)); - if(ether->size) - i += snprint(buf+i, sizeof buf - i, - " size %#luX", ether->size); - i += snprint(buf+i, sizeof buf - i, - ": %2.2ux%2.2ux%2.2ux%2.2ux%2.2ux%2.2ux", - ether->ea[0], ether->ea[1], ether->ea[2], - ether->ea[3], ether->ea[4], ether->ea[5]); - snprint(buf+i, sizeof buf - i, "\n"); - iprint("%s", buf); /* it may be too early for print */ - - if(ether->mbps >= 1000) - netifinit(ether, name, Ntypes, 4*1024*1024); - else if(ether->mbps >= 100) - netifinit(ether, name, Ntypes, 1024*1024); - else - netifinit(ether, name, Ntypes, 65*1024); - if(ether->oq == 0) - ether->oq = qopen(ether->limit, Qmsg, 0, 0); - if(ether->oq == 0) - panic("etherreset %s", name); - ether->alen = Eaddrlen; - memmove(ether->addr, ether->ea, Eaddrlen); - memset(ether->bcast, 0xFF, Eaddrlen); - - etherxx[ctlrno] = ether; - ether = 0; - break; - } - } - if(ether) - free(ether); -} - -static void -ethershutdown(void) -{ - Ether *ether; - int i; - - for(i = 0; i < MaxEther; i++){ - ether = etherxx[i]; - if(ether == nil) - continue; - if(ether->shutdown == nil) { - print("#l%d: no shutdown function\n", i); - continue; - } - (*ether->shutdown)(ether); - } -} - - -#define POLY 0xedb88320 - -/* really slow 32 bit crc for ethers */ -ulong -ethercrc(uchar *p, int len) -{ - int i, j; - ulong crc, b; - - crc = 0xffffffff; - for(i = 0; i < len; i++){ - b = *p++; - for(j = 0; j < 8; j++){ - crc = (crc>>1) ^ (((crc^b) & 1) ? POLY : 0); - b >>= 1; - } - } - return crc; -} - -void -dumpoq(Queue *oq) -{ - if (oq == nil) - print("no outq! "); - else if (qisclosed(oq)) - print("outq closed "); - else if (qfull(oq)) - print("outq full "); - else - print("outq %d ", qlen(oq)); -} - -void -dumpnetif(Netif *netif) -{ - print("netif %s ", netif->name); - print("limit %d mbps %d link %d ", - netif->limit, netif->mbps, netif->link); - print("inpkts %lld outpkts %lld errs %d\n", - netif->inpackets, netif->outpackets, - netif->crcs + netif->oerrs + netif->frames + netif->overflows + - netif->buffs + netif->soverflows); -} - -Dev etherdevtab = { - 'l', - "ether", - - etherreset, - devinit, - ethershutdown, - etherattach, - etherwalk, - etherstat, - etheropen, - ethercreate, - etherclose, - etherread, - etherbread, - etherwrite, - etherbwrite, - devremove, - etherwstat, -}; diff --git a/sys/src/9/omap/dma.c b/sys/src/9/omap/dma.c index 385fcd45d..99a36d2c8 100644 --- a/sys/src/9/omap/dma.c +++ b/sys/src/9/omap/dma.c @@ -235,7 +235,7 @@ dmastart(void *to, int tmode, void *from, int fmode, uint len, Rendez *rend, *done = 0; iunlock(&alloclck); - ruplen = ROUNDUP(len, sizeof(ulong)); + ruplen = ROUND(len, sizeof(ulong)); assert(to != from); cp = regs->chan + chan; diff --git a/sys/src/9/omap/ether9221.c b/sys/src/9/omap/ether9221.c index 9f7a571aa..36ac8785b 100644 --- a/sys/src/9/omap/ether9221.c +++ b/sys/src/9/omap/ether9221.c @@ -18,8 +18,7 @@ #include "io.h" #include "../port/error.h" #include "../port/netif.h" - -#include "etherif.h" +#include "../port/etherif.h" /* currently using kprocs is a lot slower than not (87 s. to boot vs 60) */ #undef USE_KPROCS @@ -943,7 +942,6 @@ smcpnp(Ether* edev) */ edev->attach = smcattach; edev->transmit = smctransmitcall; - edev->interrupt = smcinterrupt; edev->ifstat = smcifstat; /* edev->ctl = smcctl; /* no ctl msgs supported */ @@ -951,6 +949,9 @@ smcpnp(Ether* edev) edev->promiscuous = smcpromiscuous; edev->multicast = smcmulticast; edev->shutdown = smcshutdown; + + intrenable(edev->irq, smcinterrupt, edev, 0, edev->name); + return 0; } diff --git a/sys/src/9/omap/etherif.h b/sys/src/9/omap/etherif.h deleted file mode 100644 index dbc1721bf..000000000 --- a/sys/src/9/omap/etherif.h +++ /dev/null @@ -1,41 +0,0 @@ -enum -{ - MaxEther = 4, - Ntypes = 8, -}; - -typedef struct Ether Ether; -struct Ether { - RWlock; - ISAConf; /* hardware info */ - - int ctlrno; - int minmtu; - int maxmtu; - - Netif; - - void (*attach)(Ether*); /* filled in by reset routine */ - void (*detach)(Ether*); - void (*transmit)(Ether*); - void (*interrupt)(Ureg*, void*); - long (*ifstat)(Ether*, void*, long, ulong); - long (*ctl)(Ether*, void*, long); /* custom ctl messages */ - void (*power)(Ether*, int); /* power on/off */ - void (*shutdown)(Ether*); /* shutdown hardware before reboot */ - - void* ctlr; - uchar ea[Eaddrlen]; - void* address; - int irq; - - Queue* oq; -}; - -extern Block* etheriq(Ether*, Block*, int); -extern void addethercard(char*, int(*)(Ether*)); -extern ulong ethercrc(uchar*, int); -extern int parseether(uchar*, char*); - -#define NEXT(x, l) (((x)+1)%(l)) -#define PREV(x, l) (((x) == 0) ? (l)-1: (x)-1) diff --git a/sys/src/9/omap/mem.h b/sys/src/9/omap/mem.h index f2cbd31e5..744589dc0 100644 --- a/sys/src/9/omap/mem.h +++ b/sys/src/9/omap/mem.h @@ -5,9 +5,6 @@ #define MiB 1048576u /* Mebi 0x0000000000100000 */ #define GiB 1073741824u /* Gibi 000000000040000000 */ -#define HOWMANY(x, y) (((x)+((y)-1))/(y)) -#define ROUNDUP(x, y) (HOWMANY((x), (y))*(y)) /* ceiling */ -#define ROUNDDN(x, y) (((x)/(y))*(y)) /* floor */ #define MIN(a, b) ((a) < (b)? (a): (b)) #define MAX(a, b) ((a) > (b)? (a): (b)) @@ -36,7 +33,7 @@ */ #define BY2PG (4*KiB) /* bytes per page */ #define PGSHIFT 12 /* log(BY2PG) */ -#define PGROUND(s) ROUNDUP(s, BY2PG) +#define PGROUND(s) ROUND(s, BY2PG) #define ROUND(s, sz) (((s)+(sz-1))&~(sz-1)) #define MAXMACH 1 /* max # cpus system can run */ @@ -71,7 +68,7 @@ #define UZERO 0 /* user segment */ #define UTZERO (UZERO+BY2PG) /* user text start */ -#define UTROUND(t) ROUNDUP((t), BY2PG) + /* moved USTKTOP down to 512MB to keep MMIO space out of user space. */ #define USTKTOP 0x20000000 /* user segment end +1 */ #define USTKSIZE (8*1024*1024) /* user stack size */ diff --git a/sys/src/9/omap/mkfile b/sys/src/9/omap/mkfile index c5b1f94c1..0695e8cfa 100644 --- a/sys/src/9/omap/mkfile +++ b/sys/src/9/omap/mkfile @@ -101,7 +101,7 @@ CFLAGS= -I. -I../port $CFLAGS # hack to compile private sysproc.c (e.g.) arch.$O clock.$O fpiarm.$O main.$O mmu.$O screen.$O sdscsi.$O syscall.$O \ trap.$O: /$objtype/include/ureg.h -archomap.$O devether.$0 ether9221.$O: etherif.h ../port/netif.h +archomap.$O devether.$0 ether9221.$O: ../port/etherif.h ../port/netif.h archomap.$O devflash.$O flashbeagle.$O flashigep.$O: ../port/flashif.h ecc.$O flashbeagle.$O flashigep.$O: ../port/nandecc.h io.h fpi.$O fpiarm.$O fpimem.$O: fpi.h diff --git a/sys/src/9/omap/mmu.c b/sys/src/9/omap/mmu.c index b24d00249..9b2084caf 100644 --- a/sys/src/9/omap/mmu.c +++ b/sys/src/9/omap/mmu.c @@ -439,7 +439,7 @@ vmap(uintptr pa, usize size) o = pa & (BY2PG-1); pa -= o; size += o; - size = ROUNDUP(size, BY2PG); + size = PGROUND(size); va = kseg0|pa; pae = mmukmap(va, pa, size); diff --git a/sys/src/9/omap/screen.c b/sys/src/9/omap/screen.c index bc4a64b80..7d36a0fe4 100644 --- a/sys/src/9/omap/screen.c +++ b/sys/src/9/omap/screen.c @@ -257,7 +257,7 @@ configdispc(void) (sp->vsw-1); dispc->pol_req = Ipc | Ihs | Ivs | Acb; - dispc->divisor = 1 << 16 | HOWMANY(432000, sp->pixelclock); + dispc->divisor = 1 << 16 | ((432000+sp->pixelclock-1)/sp->pixelclock); dispc->lcdsize = (sp->ht - 1) << 16 | (sp->wid - 1); coherence(); diff --git a/sys/src/9/pc/ether2000.c b/sys/src/9/pc/ether2000.c index 7c5c25db7..6cebf4f9f 100644 --- a/sys/src/9/pc/ether2000.c +++ b/sys/src/9/pc/ether2000.c @@ -6,8 +6,8 @@ #include "io.h" #include "../port/error.h" #include "../port/netif.h" +#include "../port/etherif.h" -#include "etherif.h" #include "ether8390.h" /* diff --git a/sys/src/9/pc/ether2114x.c b/sys/src/9/pc/ether2114x.c index fbbfab210..6c4cdee9f 100644 --- a/sys/src/9/pc/ether2114x.c +++ b/sys/src/9/pc/ether2114x.c @@ -16,8 +16,7 @@ #include "io.h" #include "../port/error.h" #include "../port/netif.h" - -#include "etherif.h" +#include "../port/etherif.h" #define DEBUG (0) #define debug if(DEBUG)print @@ -1818,7 +1817,6 @@ reset(Ether* ether) */ ether->attach = attach; ether->transmit = transmit; - ether->interrupt = interrupt; ether->ifstat = ifstat; ether->arg = ether; @@ -1826,6 +1824,8 @@ reset(Ether* ether) ether->multicast = multicast; ether->promiscuous = promiscuous; + intrenable(ether->irq, interrupt, ether, ether->tbdf, ether->name); + return 0; } diff --git a/sys/src/9/pc/ether589.c b/sys/src/9/pc/ether589.c index 4cc03fd69..e366a52a9 100644 --- a/sys/src/9/pc/ether589.c +++ b/sys/src/9/pc/ether589.c @@ -11,8 +11,7 @@ #include "io.h" #include "../port/error.h" #include "../port/netif.h" - -#include "etherif.h" +#include "../port/etherif.h" enum { /* all windows */ CommandR = 0x000E, diff --git a/sys/src/9/pc/ether79c970.c b/sys/src/9/pc/ether79c970.c index a0577f818..21c35e23b 100644 --- a/sys/src/9/pc/ether79c970.c +++ b/sys/src/9/pc/ether79c970.c @@ -12,8 +12,7 @@ #include "io.h" #include "../port/error.h" #include "../port/netif.h" - -#include "etherif.h" +#include "../port/etherif.h" enum { Lognrdre = 6, @@ -672,7 +671,6 @@ reset(Ether* ether) */ ether->attach = attach; ether->transmit = transmit; - ether->interrupt = interrupt; ether->ifstat = ifstat; ether->arg = ether; @@ -680,6 +678,8 @@ reset(Ether* ether) ether->multicast = multicast; // ether->shutdown = shutdown; + intrenable(ether->irq, interrupt, ether, ether->tbdf, ether->name); + return 0; } diff --git a/sys/src/9/pc/ether8003.c b/sys/src/9/pc/ether8003.c index 606968f04..871c26cad 100644 --- a/sys/src/9/pc/ether8003.c +++ b/sys/src/9/pc/ether8003.c @@ -6,8 +6,8 @@ #include "io.h" #include "../port/error.h" #include "../port/netif.h" +#include "../port/etherif.h" -#include "etherif.h" #include "ether8390.h" /* diff --git a/sys/src/9/pc/ether8139.c b/sys/src/9/pc/ether8139.c index 258869d9e..588caea54 100644 --- a/sys/src/9/pc/ether8139.c +++ b/sys/src/9/pc/ether8139.c @@ -11,8 +11,7 @@ #include "io.h" #include "../port/error.h" #include "../port/netif.h" - -#include "etherif.h" +#include "../port/etherif.h" enum { /* registers */ Idr0 = 0x0000, /* MAC address */ @@ -817,7 +816,6 @@ rtl8139pnp(Ether* edev) edev->attach = rtl8139attach; edev->transmit = rtl8139transmit; - edev->interrupt = rtl8139interrupt; edev->ifstat = rtl8139ifstat; edev->arg = edev; @@ -825,6 +823,8 @@ rtl8139pnp(Ether* edev) edev->multicast = rtl8139multicast; // edev->shutdown = rtl8139shutdown; + intrenable(edev->irq, rtl8139interrupt, edev, edev->tbdf, edev->name); + /* * This should be much more dynamic but will do for now. */ diff --git a/sys/src/9/pc/ether8169.c b/sys/src/9/pc/ether8169.c index 734608ab9..0fe6bc578 100644 --- a/sys/src/9/pc/ether8169.c +++ b/sys/src/9/pc/ether8169.c @@ -15,8 +15,8 @@ #include "io.h" #include "../port/error.h" #include "../port/netif.h" +#include "../port/etherif.h" -#include "etherif.h" #include "ethermii.h" enum { /* registers */ @@ -1207,7 +1207,6 @@ rtl8169pnp(Ether* edev) edev->attach = rtl8169attach; edev->transmit = rtl8169transmit; - edev->interrupt = rtl8169interrupt; edev->ifstat = rtl8169ifstat; edev->arg = edev; @@ -1216,6 +1215,8 @@ rtl8169pnp(Ether* edev) rtl8169link(edev); + intrenable(edev->irq, rtl8169interrupt, edev, edev->tbdf, edev->name); + return 0; } diff --git a/sys/src/9/pc/ether82543gc.c b/sys/src/9/pc/ether82543gc.c index a17075de1..9d974aeea 100644 --- a/sys/src/9/pc/ether82543gc.c +++ b/sys/src/9/pc/ether82543gc.c @@ -18,8 +18,7 @@ #include "io.h" #include "../port/error.h" #include "../port/netif.h" - -#include "etherif.h" +#include "../port/etherif.h" enum { Ctrl = 0x00000000, /* Device Control */ diff --git a/sys/src/9/pc/ether82557.c b/sys/src/9/pc/ether82557.c index 267b036ea..aaebd1916 100644 --- a/sys/src/9/pc/ether82557.c +++ b/sys/src/9/pc/ether82557.c @@ -16,8 +16,7 @@ #include "io.h" #include "../port/error.h" #include "../port/netif.h" - -#include "etherif.h" +#include "../port/etherif.h" enum { Nrfd = 64, /* receive frame area */ @@ -1332,7 +1331,6 @@ reset(Ether* ether) */ ether->attach = attach; ether->transmit = transmit; - ether->interrupt = interrupt; ether->ifstat = ifstat; ether->shutdown = shutdown; @@ -1340,6 +1338,8 @@ reset(Ether* ether) ether->multicast = multicast; ether->arg = ether; + intrenable(ether->irq, interrupt, ether, ether->tbdf, ether->name); + return 0; } diff --git a/sys/src/9/pc/ether82563.c b/sys/src/9/pc/ether82563.c index d7a8ce7db..d792897fb 100644 --- a/sys/src/9/pc/ether82563.c +++ b/sys/src/9/pc/ether82563.c @@ -11,8 +11,7 @@ #include "io.h" #include "../port/error.h" #include "../port/netif.h" - -#include "etherif.h" +#include "../port/etherif.h" /* * note: the 82575, 82576 and 82580 are operated using registers aliased @@ -2105,7 +2104,6 @@ pnp(Ether *edev, int type) */ edev->attach = i82563attach; // edev->transmit = i82563transmit; - edev->interrupt = i82563interrupt; edev->ifstat = i82563ifstat; edev->ctl = i82563ctl; @@ -2114,6 +2112,8 @@ pnp(Ether *edev, int type) edev->shutdown = i82563shutdown; edev->multicast = i82563multicast; + intrenable(edev->irq, i82563interrupt, edev, edev->tbdf, edev->name); + return 0; } diff --git a/sys/src/9/pc/ether82598.c b/sys/src/9/pc/ether82598.c index 609b372b2..65c1d7fc6 100644 --- a/sys/src/9/pc/ether82598.c +++ b/sys/src/9/pc/ether82598.c @@ -10,7 +10,7 @@ #include "io.h" #include "../port/error.h" #include "../port/netif.h" -#include "etherif.h" +#include "../port/etherif.h" /* * // comments note conflicts with 82563-style drivers, @@ -953,12 +953,13 @@ pnp(Ether *e) e->attach = attach; e->ctl = ctl; e->ifstat = ifstat; - e->interrupt = interrupt; e->multicast = multicast; e->promiscuous = promiscuous; e->shutdown = shutdown; e->transmit = transmit; + intrenable(e->irq, interrupt, e, e->tbdf, e->name); + return 0; } diff --git a/sys/src/9/pc/ether83815.c b/sys/src/9/pc/ether83815.c index a17f2d0e6..6d54d668a 100644 --- a/sys/src/9/pc/ether83815.c +++ b/sys/src/9/pc/ether83815.c @@ -24,8 +24,7 @@ #include "io.h" #include "../port/error.h" #include "../port/netif.h" - -#include "etherif.h" +#include "../port/etherif.h" #define DEBUG 0 #define debug if(DEBUG)print @@ -1219,13 +1218,15 @@ reset(Ether* ether) */ ether->attach = attach; ether->transmit = transmit; - ether->interrupt = interrupt; ether->ifstat = ifstat; ether->arg = ether; ether->promiscuous = promiscuous; ether->multicast = multicast; ether->shutdown = shutdown; + + intrenable(ether->irq, interrupt, ether, ether->tbdf, ether->name); + return 0; } diff --git a/sys/src/9/pc/ether8390.c b/sys/src/9/pc/ether8390.c index f38d6900a..2df1e37e0 100644 --- a/sys/src/9/pc/ether8390.c +++ b/sys/src/9/pc/ether8390.c @@ -10,8 +10,8 @@ #include "io.h" #include "../port/error.h" #include "../port/netif.h" +#include "../port/etherif.h" -#include "etherif.h" #include "ether8390.h" enum { /* NIC core registers */ @@ -801,12 +801,13 @@ dp8390reset(Ether* ether) */ ether->attach = attach; ether->transmit = transmit; - ether->interrupt = interrupt; ether->ifstat = 0; ether->promiscuous = promiscuous; ether->multicast = multicast; ether->arg = ether; + intrenable(ether->irq, interrupt, ether, ether->tbdf, ether->name); + return 0; } diff --git a/sys/src/9/pc/etherbcm.c b/sys/src/9/pc/etherbcm.c index 41ffd55c9..edb6b417e 100644 --- a/sys/src/9/pc/etherbcm.c +++ b/sys/src/9/pc/etherbcm.c @@ -15,8 +15,7 @@ #include "io.h" #include "../port/error.h" #include "../port/netif.h" - -#include "etherif.h" +#include "../port/etherif.h" #define Rbsz ROUNDUP(sizeof(Etherpkt)+4, 4) @@ -873,7 +872,6 @@ again: edev->port = ctlr->port; edev->irq = ctlr->pdev->intl; edev->tbdf = ctlr->pdev->tbdf; - edev->interrupt = bcminterrupt; edev->transmit = bcmtransmit; edev->multicast = bcmmulticast; edev->promiscuous = bcmpromiscuous; @@ -884,6 +882,9 @@ again: edev->ctlr = nil; goto again; } + + intrenable(edev->irq, bcminterrupt, edev, edev->tbdf, edev->name); + return 0; } diff --git a/sys/src/9/pc/etherdp83820.c b/sys/src/9/pc/etherdp83820.c index a9bed75e9..3d1fb3457 100644 --- a/sys/src/9/pc/etherdp83820.c +++ b/sys/src/9/pc/etherdp83820.c @@ -12,8 +12,8 @@ #include "io.h" #include "../port/error.h" #include "../port/netif.h" +#include "../port/etherif.h" -#include "etherif.h" #include "ethermii.h" enum { /* Registers */ @@ -1232,7 +1232,6 @@ dp83820pnp(Ether* edev) edev->attach = dp83820attach; edev->transmit = dp83820transmit; - edev->interrupt = dp83820interrupt; edev->ifstat = dp83820ifstat; edev->arg = edev; @@ -1240,6 +1239,8 @@ dp83820pnp(Ether* edev) edev->multicast = dp83820multicast; edev->shutdown = dp83820shutdown; + intrenable(edev->irq, dp83820interrupt, edev, edev->tbdf, edev->name); + return 0; } diff --git a/sys/src/9/pc/etherec2t.c b/sys/src/9/pc/etherec2t.c index 1a9a34ed2..b22619c22 100644 --- a/sys/src/9/pc/etherec2t.c +++ b/sys/src/9/pc/etherec2t.c @@ -9,8 +9,8 @@ #include "io.h" #include "../port/error.h" #include "../port/netif.h" +#include "../port/etherif.h" -#include "etherif.h" #include "ether8390.h" enum { diff --git a/sys/src/9/pc/etherelnk3.c b/sys/src/9/pc/etherelnk3.c index cf20943e0..46cd99269 100644 --- a/sys/src/9/pc/etherelnk3.c +++ b/sys/src/9/pc/etherelnk3.c @@ -16,8 +16,7 @@ #include "io.h" #include "../port/error.h" #include "../port/netif.h" - -#include "etherif.h" +#include "../port/etherif.h" #define XCVRDEBUG if(0)print @@ -2124,7 +2123,6 @@ etherelnk3reset(Ether* ether) */ ether->attach = attach; ether->transmit = transmit; - ether->interrupt = interrupt; ether->ifstat = ifstat; ether->promiscuous = promiscuous; @@ -2132,6 +2130,8 @@ etherelnk3reset(Ether* ether) ether->shutdown = shutdown; ether->arg = ether; + intrenable(ether->irq, interrupt, ether, ether->tbdf, ether->name); + return 0; } diff --git a/sys/src/9/pc/etherga620.c b/sys/src/9/pc/etherga620.c index 4c132b10c..bda3b9c28 100644 --- a/sys/src/9/pc/etherga620.c +++ b/sys/src/9/pc/etherga620.c @@ -18,10 +18,9 @@ #include "io.h" #include "../port/error.h" #include "../port/netif.h" +#include "../port/etherif.h" #define malign(n) xspanalloc((n), 32, 0) - -#include "etherif.h" #include "etherga620fw.h" enum { @@ -1260,7 +1259,6 @@ ga620pnp(Ether* edev) */ edev->attach = ga620attach; edev->transmit = ga620transmit; - edev->interrupt = ga620interrupt; edev->ifstat = ga620ifstat; edev->ctl = ga620ctl; @@ -1269,6 +1267,8 @@ ga620pnp(Ether* edev) edev->multicast = ga620multicast; edev->shutdown = ga620shutdown; + intrenable(edev->irq, ga620interrupt, edev, edev->tbdf, edev->name); + return 0; } diff --git a/sys/src/9/pc/etherif.h b/sys/src/9/pc/etherif.h deleted file mode 100644 index d9ae2b3af..000000000 --- a/sys/src/9/pc/etherif.h +++ /dev/null @@ -1,39 +0,0 @@ -enum { - MaxEther = 64, - Ntypes = 8, -}; - -typedef struct Ether Ether; -struct Ether { - ISAConf; /* hardware info */ - - int ctlrno; - int tbdf; /* type+busno+devno+funcno */ - int minmtu; - int maxmtu; - uchar ea[Eaddrlen]; - - void (*attach)(Ether*); /* filled in by reset routine */ - void (*detach)(Ether*); - void (*transmit)(Ether*); - void (*interrupt)(Ureg*, void*); - long (*ifstat)(Ether*, void*, long, ulong); - long (*ctl)(Ether*, void*, long); /* custom ctl messages */ - void (*power)(Ether*, int); /* power on/off */ - void (*shutdown)(Ether*); /* shutdown hardware before reboot */ - void *ctlr; - - Queue* oq; - - Netif; -}; - -extern Block* etheriq(Ether*, Block*, int); -extern void addethercard(char*, int(*)(Ether*)); -extern ulong ethercrc(uchar*, int); -extern int parseether(uchar*, char*); - -#define NEXT(x, l) (((x)+1)%(l)) -#define PREV(x, l) (((x) == 0) ? (l)-1: (x)-1) -#define HOWMANY(x, y) (((x)+((y)-1))/(y)) -#define ROUNDUP(x, y) (HOWMANY((x), (y))*(y)) diff --git a/sys/src/9/pc/etherigbe.c b/sys/src/9/pc/etherigbe.c index 81d30bb9e..bd7738d10 100644 --- a/sys/src/9/pc/etherigbe.c +++ b/sys/src/9/pc/etherigbe.c @@ -24,8 +24,8 @@ #include "io.h" #include "../port/error.h" #include "../port/netif.h" +#include "../port/etherif.h" -#include "etherif.h" #include "ethermii.h" enum { @@ -2020,7 +2020,6 @@ igbepnp(Ether* edev) */ edev->attach = igbeattach; edev->transmit = igbetransmit; - edev->interrupt = igbeinterrupt; edev->ifstat = igbeifstat; edev->ctl = igbectl; @@ -2029,6 +2028,8 @@ igbepnp(Ether* edev) edev->shutdown = igbeshutdown; edev->multicast = igbemulticast; + intrenable(edev->irq, igbeinterrupt, edev, edev->tbdf, edev->name); + return 0; } diff --git a/sys/src/9/pc/etheriwl.c b/sys/src/9/pc/etheriwl.c index 34be54337..2f5dd18cd 100644 --- a/sys/src/9/pc/etheriwl.c +++ b/sys/src/9/pc/etheriwl.c @@ -14,9 +14,8 @@ #include "io.h" #include "../port/error.h" #include "../port/netif.h" - -#include "etherif.h" -#include "wifi.h" +#include "../port/etherif.h" +#include "../port/wifi.h" enum { MaxQueue = 24*1024, /* total buffer is 2*MaxQueue: 48k at 22Mbit ≅ 20ms */ @@ -2534,7 +2533,6 @@ again: edev->irq = ctlr->pdev->intl; edev->tbdf = ctlr->pdev->tbdf; edev->arg = edev; - edev->interrupt = iwlinterrupt; edev->attach = iwlattach; edev->ifstat = iwlifstat; edev->ctl = iwlctl; @@ -2547,6 +2545,8 @@ again: edev->ctlr = nil; goto again; } + + intrenable(edev->irq, iwlinterrupt, edev, edev->tbdf, edev->name); return 0; } diff --git a/sys/src/9/pc/etherm10g.c b/sys/src/9/pc/etherm10g.c index 255461d8c..e4ddffb7c 100644 --- a/sys/src/9/pc/etherm10g.c +++ b/sys/src/9/pc/etherm10g.c @@ -14,8 +14,7 @@ #include "io.h" #include "../port/error.h" #include "../port/netif.h" - -#include "../pc/etherif.h" +#include "../port/etherif.h" #ifndef KiB #define KiB 1024u /* Kibi 0x0000000000000400 */ diff --git a/sys/src/9/pc/ethermii.c b/sys/src/9/pc/ethermii.c index 90b219b3f..16d766ef4 100644 --- a/sys/src/9/pc/ethermii.c +++ b/sys/src/9/pc/ethermii.c @@ -6,8 +6,8 @@ #include "io.h" #include "../port/error.h" #include "../port/netif.h" +#include "../port/etherif.h" -#include "etherif.h" #include "ethermii.h" int diff --git a/sys/src/9/pc/etherrt2860.c b/sys/src/9/pc/etherrt2860.c index 2311611e8..5ee17a6c4 100644 --- a/sys/src/9/pc/etherrt2860.c +++ b/sys/src/9/pc/etherrt2860.c @@ -14,9 +14,8 @@ #include "io.h" #include "../port/error.h" #include "../port/netif.h" - -#include "etherif.h" -#include "wifi.h" +#include "../port/etherif.h" +#include "../port/wifi.h" /* for consistency */ typedef signed char s8int; @@ -3544,7 +3543,6 @@ again: edev->irq = ctlr->pdev->intl; edev->tbdf = ctlr->pdev->tbdf; edev->arg = edev; - edev->interrupt = rt2860interrupt; edev->attach = rt2860attach; edev->ifstat = rt2860ifstat; edev->ctl = rt2860ctl; @@ -3556,6 +3554,9 @@ again: edev->ctlr = nil; goto again; } + + intrenable(edev->irq, rt2860interrupt, edev, edev->tbdf, edev->name); + return 0; } diff --git a/sys/src/9/pc/ethersmc.c b/sys/src/9/pc/ethersmc.c index 64dcd0075..627632a9a 100644 --- a/sys/src/9/pc/ethersmc.c +++ b/sys/src/9/pc/ethersmc.c @@ -10,7 +10,7 @@ #include "io.h" #include "../port/error.h" #include "../port/netif.h" -#include "etherif.h" +#include "../port/etherif.h" enum { IoSize = 0x10, /* port pool size */ @@ -766,12 +766,15 @@ reset(Ether* ether) ether->attach = attach; ether->transmit = transmit; - ether->interrupt = interrupt; ether->ifstat = ifstat; ether->promiscuous = promiscuous; ether->multicast = multicast; ether->arg = ether; + iunlock(ctlr); + + intrenable(ether->irq, interrupt, ether, ether->tbdf, ether->name); + return 0; } diff --git a/sys/src/9/pc/ethervgbe.c b/sys/src/9/pc/ethervgbe.c index 0506ff829..993265399 100644 --- a/sys/src/9/pc/ethervgbe.c +++ b/sys/src/9/pc/ethervgbe.c @@ -29,8 +29,8 @@ #include "io.h" #include "../port/error.h" #include "../port/netif.h" +#include "../port/etherif.h" -#include "etherif.h" #include "ethermii.h" #define DEBUG @@ -1137,14 +1137,15 @@ vgbepnp(Ether* edev) memmove(edev->ea, ctlr->ea, Eaddrlen); edev->attach = vgbeattach; edev->transmit = vgbetransmit; - edev->interrupt = vgbeinterrupt; edev->ifstat = vgbeifstat; // edev->promiscuous = vgbepromiscuous; edev->multicast = vgbemulticast; // edev->shutdown = vgbeshutdown; edev->ctl = vgbectl; - edev->arg = edev; + + intrenable(edev->irq, vgbeinterrupt, edev, edev->tbdf, edev->name); + return 0; } diff --git a/sys/src/9/pc/ethervirtio.c b/sys/src/9/pc/ethervirtio.c index f62dd9a71..c3463fa20 100644 --- a/sys/src/9/pc/ethervirtio.c +++ b/sys/src/9/pc/ethervirtio.c @@ -6,7 +6,7 @@ #include "io.h" #include "../port/error.h" #include "../port/netif.h" -#include "etherif.h" +#include "../port/etherif.h" /* * virtio ethernet driver @@ -661,7 +661,6 @@ reset(Ether* edev) edev->attach = attach; edev->shutdown = shutdown; - edev->interrupt = interrupt; edev->ifstat = ifstat; if((ctlr->feat & (Fctrlvq|Fctrlrx)) == (Fctrlvq|Fctrlrx)){ @@ -669,6 +668,8 @@ reset(Ether* edev) edev->promiscuous = promiscuous; } + intrenable(edev->irq, interrupt, edev, edev->tbdf, edev->name); + return 0; } diff --git a/sys/src/9/pc/ethervt6102.c b/sys/src/9/pc/ethervt6102.c index 2e7b65c0a..30862c3ca 100644 --- a/sys/src/9/pc/ethervt6102.c +++ b/sys/src/9/pc/ethervt6102.c @@ -17,8 +17,8 @@ #include "io.h" #include "../port/error.h" #include "../port/netif.h" +#include "../port/etherif.h" -#include "etherif.h" #include "ethermii.h" enum { @@ -1032,7 +1032,6 @@ vt6102pnp(Ether* edev) */ edev->attach = vt6102attach; edev->transmit = vt6102transmit; - edev->interrupt = vt6102interrupt; edev->ifstat = vt6102ifstat; edev->ctl = nil; @@ -1040,6 +1039,8 @@ vt6102pnp(Ether* edev) edev->promiscuous = vt6102promiscuous; edev->multicast = vt6102multicast; + intrenable(edev->irq, vt6102interrupt, edev, edev->tbdf, edev->name); + return 0; } diff --git a/sys/src/9/pc/ethervt6105m.c b/sys/src/9/pc/ethervt6105m.c index 357dc72ed..19ee569e9 100644 --- a/sys/src/9/pc/ethervt6105m.c +++ b/sys/src/9/pc/ethervt6105m.c @@ -20,8 +20,8 @@ #include "io.h" #include "../port/error.h" #include "../port/netif.h" +#include "../port/etherif.h" -#include "etherif.h" #include "ethermii.h" enum { @@ -1200,7 +1200,6 @@ vt6105Mpnp(Ether* edev) */ edev->attach = vt6105Mattach; edev->transmit = vt6105Mtransmit; - edev->interrupt = vt6105Minterrupt; edev->ifstat = vt6105Mifstat; edev->ctl = nil; @@ -1210,6 +1209,8 @@ vt6105Mpnp(Ether* edev) edev->maxmtu = ETHERMAXTU+Bslop; + intrenable(edev->irq, vt6105Minterrupt, edev, edev->tbdf, edev->name); + return 0; } diff --git a/sys/src/9/pc/etherwavelan.c b/sys/src/9/pc/etherwavelan.c index 4aa0c80eb..2562b0576 100644 --- a/sys/src/9/pc/etherwavelan.c +++ b/sys/src/9/pc/etherwavelan.c @@ -8,7 +8,7 @@ #include "io.h" #include "../port/error.h" #include "../port/netif.h" -#include "etherif.h" +#include "../port/etherif.h" #include "wavelan.h" diff --git a/sys/src/9/pc/etherwpi.c b/sys/src/9/pc/etherwpi.c index b86a51c5f..ce989636a 100644 --- a/sys/src/9/pc/etherwpi.c +++ b/sys/src/9/pc/etherwpi.c @@ -6,9 +6,8 @@ #include "io.h" #include "../port/error.h" #include "../port/netif.h" - -#include "etherif.h" -#include "wifi.h" +#include "../port/etherif.h" +#include "../port/wifi.h" enum { MaxQueue = 24*1024, /* total buffer is 2*MaxQueue: 48k at 22Mbit ≅ 20ms */ @@ -1846,7 +1845,6 @@ again: edev->irq = ctlr->pdev->intl; edev->tbdf = ctlr->pdev->tbdf; edev->arg = edev; - edev->interrupt = wpiinterrupt; edev->attach = wpiattach; edev->ifstat = wpiifstat; edev->ctl = wpictl; @@ -1860,6 +1858,8 @@ again: goto again; } + intrenable(edev->irq, wpiinterrupt, edev, edev->tbdf, edev->name); + return 0; } diff --git a/sys/src/9/pc/etheryuk.c b/sys/src/9/pc/etheryuk.c index d679b83b5..edfbfbd8c 100644 --- a/sys/src/9/pc/etheryuk.c +++ b/sys/src/9/pc/etheryuk.c @@ -10,7 +10,7 @@ #include "io.h" #include "../port/error.h" #include "../port/netif.h" -#include "etherif.h" +#include "../port/etherif.h" #define Pciwaddrh(x) 0 #define Pciwaddrl(x) PCIWADDR(x) @@ -2247,12 +2247,13 @@ pnp(Ether *e) e->attach = attach; e->ctl = ctl; e->ifstat = ifstat; - e->interrupt = interrupt; e->multicast = multicast; e->promiscuous = promiscuous; e->shutdown = shutdown; e->transmit = nil; + intrenable(e->irq, interrupt, e, e->tbdf, e->name); + return 0; } diff --git a/sys/src/9/pc/mkfile b/sys/src/9/pc/mkfile index d19412262..9c029a7a7 100644 --- a/sys/src/9/pc/mkfile +++ b/sys/src/9/pc/mkfile @@ -100,7 +100,7 @@ install:V: $p$CONF <../port/portmkfile <|../port/mkbootrules $CONF -$ETHER: etherif.h ../port/netif.h +$ETHER: ../port/etherif.h ../port/netif.h $AUDIO: ../port/audioif.h ether8003.$O ether8390.$O: ether8390.h etheryuk.$O: yukdump.h @@ -122,11 +122,9 @@ usbehci.$O usbehcipc.$O: usbehci.h trap.$O: /sys/include/tos.h uartaxp.$O: uartaxp.i etherm10g.$O: etherm10g2k.i etherm10g4k.i -etheriwl.$O: wifi.h -etherwpi.$O: wifi.h -etherrt2860.$O: wifi.h -wifi.$O: wifi.h etherif.h ../port/netif.h /sys/include/libsec.h -wifi.$O: ../ip/ip.h ../ip/ipv6.h +etheriwl.$O: ../port/wifi.h +etherwpi.$O: ../port/wifi.h +etherrt2860.$O: ../port/wifi.h init.h:D: ../port/initcode.c init9.c $CC ../port/initcode.c diff --git a/sys/src/9/pc/trap.c b/sys/src/9/pc/trap.c index 60b612d6d..b76afaff2 100644 --- a/sys/src/9/pc/trap.c +++ b/sys/src/9/pc/trap.c @@ -40,13 +40,20 @@ intrenable(int irq, void (*f)(Ureg*, void*), void* a, int tbdf, char *name) irq, tbdf, name); return; } - if(tbdf != BUSUNKNOWN && (irq == 0xff || irq == 0)){ print("intrenable: got unassigned irq %d, tbdf 0x%uX for %s\n", irq, tbdf, name); irq = -1; } + /* + * IRQ2 doesn't really exist, it's used to gang the interrupt + * controllers together. A device set to IRQ2 will appear on + * the second interrupt controller as IRQ9. + */ + if(irq == 2) + irq = 9; + if((v = xalloc(sizeof(Vctl))) == nil) panic("intrenable: out of memory"); v->isintr = 1; @@ -83,6 +90,8 @@ intrdisable(int irq, void (*f)(Ureg *, void *), void *a, int tbdf, char *name) Vctl **pv, *v; int vno; + if(irq == 2) + irq = 9; if(arch->intrvecno == nil || (tbdf != BUSUNKNOWN && (irq == 0xff || irq == 0))){ /* * on APIC machine, irq is pretty meaningless diff --git a/sys/src/9/pc/usbehcipc.c b/sys/src/9/pc/usbehcipc.c index ed8eafab7..082117c31 100644 --- a/sys/src/9/pc/usbehcipc.c +++ b/sys/src/9/pc/usbehcipc.c @@ -272,16 +272,6 @@ reset(Hci *hp) ehcilinkage(hp); hp->shutdown = shutdown; hp->debug = setdebug; - if(hp->interrupt == nil) - return 0; - - /* - * IRQ2 doesn't really exist, it's used to gang the interrupt - * controllers together. A device set to IRQ2 will appear on - * the second interrupt controller as IRQ9. - */ - if(hp->irq == 2) - hp->irq = 9; intrenable(hp->irq, hp->interrupt, hp, hp->tbdf, hp->type); return 0; diff --git a/sys/src/9/pc/usbohci.c b/sys/src/9/pc/usbohci.c index 41c0b9b2e..588a9cebb 100644 --- a/sys/src/9/pc/usbohci.c +++ b/sys/src/9/pc/usbohci.c @@ -2608,14 +2608,6 @@ reset(Hci *hp) hp->shutdown = shutdown; hp->debug = usbdebug; hp->type = "ohci"; - - /* - * IRQ2 doesn't really exist, it's used to gang the interrupt - * controllers together. A device set to IRQ2 will appear on - * the second interrupt controller as IRQ9. - */ - if(hp->irq == 2) - hp->irq = 9; intrenable(hp->irq, hp->interrupt, hp, hp->tbdf, hp->type); return 0; diff --git a/sys/src/9/pc/usbuhci.c b/sys/src/9/pc/usbuhci.c index 9d4bb0670..64ab0379a 100644 --- a/sys/src/9/pc/usbuhci.c +++ b/sys/src/9/pc/usbuhci.c @@ -2345,14 +2345,6 @@ reset(Hci *hp) hp->shutdown = shutdown; hp->debug = setdebug; hp->type = "uhci"; - - /* - * IRQ2 doesn't really exist, it's used to gang the interrupt - * controllers together. A device set to IRQ2 will appear on - * the second interrupt controller as IRQ9. - */ - if(hp->irq == 2) - hp->irq = 9; intrenable(hp->irq, hp->interrupt, hp, hp->tbdf, hp->type); return 0; diff --git a/sys/src/9/pc/wavelan.c b/sys/src/9/pc/wavelan.c index 74437194a..abd616c07 100644 --- a/sys/src/9/pc/wavelan.c +++ b/sys/src/9/pc/wavelan.c @@ -25,7 +25,8 @@ #include "io.h" #include "../port/error.h" #include "../port/netif.h" -#include "etherif.h" +#include "../port/etherif.h" + #include "wavelan.h" enum @@ -1234,7 +1235,6 @@ wavelanreset(Ether* ether, Ctlr *ctlr) ether->mbps = 10; ether->attach = w_attach; ether->detach = w_detach; - ether->interrupt = w_interrupt; ether->transmit = w_transmit; ether->ifstat = w_ifstat; ether->ctl = w_ctl; @@ -1244,6 +1244,8 @@ wavelanreset(Ether* ether, Ctlr *ctlr) ether->scanbs = w_scanbs; ether->arg = ether; + intrenable(ether->irq, w_interrupt, ether, ether->tbdf, ether->name); + DEBUG("#l%d: irq %d port %lx type %s", ether->ctlrno, ether->irq, ether->port, ether->type); DEBUG(" %2.2ux%2.2ux%2.2ux%2.2ux%2.2ux%2.2ux\n", diff --git a/sys/src/9/pc64/mkfile b/sys/src/9/pc64/mkfile index 00a9ad206..9b9c0c069 100644 --- a/sys/src/9/pc64/mkfile +++ b/sys/src/9/pc64/mkfile @@ -83,7 +83,7 @@ install:V: $p$CONF # copies generated by the rule below -PCHEADERS=wifi.h usbehci.h screen.h etherif.h ethermii.h mp.h io.h ahci.h \ +PCHEADERS=usbehci.h screen.h ethermii.h mp.h io.h ahci.h \ yukdump.h REPCH=`{echo $PCHEADERS | sed 's/\.h//g; s/ /|/g'} @@ -100,7 +100,7 @@ REPCC=`{../port/mkfilelist ../pc} l.$O apbootstrap.$O: mem.h -$ETHER: etherif.h ../port/netif.h +$ETHER: ../port/etherif.h ../port/netif.h $AUDIO: ../port/audioif.h ether8003.$O ether8390.$O: ether8390.h etheryuk.$O: yukdump.h @@ -122,11 +122,9 @@ usbehci.$O usbehcipc.$O: usbehci.h trap.$O: /sys/include/tos.h ethermii.$O: ethermii.h -etheriwl.$O: wifi.h -etherwpi.$O: wifi.h -etherrt2860.$O: wifi.h -wifi.$O: wifi.h etherif.h ../port/netif.h /sys/include/libsec.h -wifi.$O: ../ip/ip.h ../ip/ipv6.h +etheriwl.$O: ../port/wifi.h +etherwpi.$O: ../port/wifi.h +etherrt2860.$O: ../port/wifi.h init.h:D: ../port/initcode.c ../pc/init9.c $CC ../port/initcode.c diff --git a/sys/src/9/pc64/trap.c b/sys/src/9/pc64/trap.c index 387467aa5..1944f43bd 100644 --- a/sys/src/9/pc64/trap.c +++ b/sys/src/9/pc64/trap.c @@ -47,6 +47,15 @@ intrenable(int irq, void (*f)(Ureg*, void*), void* a, int tbdf, char *name) irq = -1; } + + /* + * IRQ2 doesn't really exist, it's used to gang the interrupt + * controllers together. A device set to IRQ2 will appear on + * the second interrupt controller as IRQ9. + */ + if(irq == 2) + irq = 9; + if((v = xalloc(sizeof(Vctl))) == nil) panic("intrenable: out of memory"); v->isintr = 1; @@ -83,6 +92,8 @@ intrdisable(int irq, void (*f)(Ureg *, void *), void *a, int tbdf, char *name) Vctl **pv, *v; int vno; + if(irq == 2) + irq = 9; if(arch->intrvecno == nil || (tbdf != BUSUNKNOWN && (irq == 0xff || irq == 0))){ /* * on APIC machine, irq is pretty meaningless diff --git a/sys/src/9/port/devaoe.c b/sys/src/9/port/devaoe.c index 5c01c922d..ab329e434 100644 --- a/sys/src/9/port/devaoe.c +++ b/sys/src/9/port/devaoe.c @@ -12,7 +12,7 @@ #include "ureg.h" #include "../port/error.h" #include "../port/netif.h" -#include "etherif.h" +#include "../port/etherif.h" #include "../ip/ip.h" #include "../port/aoe.h" #include diff --git a/sys/src/9/pc/devether.c b/sys/src/9/port/devether.c similarity index 92% rename from sys/src/9/pc/devether.c rename to sys/src/9/port/devether.c index d7cc76546..46fb55aed 100644 --- a/sys/src/9/pc/devether.c +++ b/sys/src/9/port/devether.c @@ -8,8 +8,9 @@ #include "ureg.h" #include "../port/error.h" #include "../port/netif.h" +#include "../port/etherif.h" -#include "etherif.h" +extern int eipfmt(Fmt*); static Ether *etherxx[MaxEther]; @@ -348,7 +349,6 @@ etherprobe(int cardno, int ctlrno) int i, lg; ulong mb, bsz; Ether *ether; - char buf[128], name[32]; ether = malloc(sizeof(Ether)); if(ether == nil){ @@ -356,8 +356,9 @@ etherprobe(int cardno, int ctlrno) return nil; } memset(ether, 0, sizeof(Ether)); - ether->ctlrno = ctlrno; ether->tbdf = BUSUNKNOWN; + ether->irq = -1; + ether->ctlrno = ctlrno; ether->mbps = 10; ether->minmtu = ETHERMINTU; ether->maxmtu = ETHERMAXTU; @@ -384,38 +385,15 @@ etherprobe(int cardno, int ctlrno) free(ether); return nil; } + snprint(ether->name, sizeof(ether->name), "ether%d", ctlrno); if(cards[cardno].reset(ether) < 0){ free(ether); return nil; } - /* - * IRQ2 doesn't really exist, it's used to gang the interrupt - * controllers together. A device set to IRQ2 will appear on - * the second interrupt controller as IRQ9. - */ - if(ether->irq == 2) - ether->irq = 9; - snprint(name, sizeof(name), "ether%d", ctlrno); - - /* - * If ether->irq is <0, it is a hack to indicate no interrupt - * used by ethersink. - */ - if(ether->irq >= 0) - intrenable(ether->irq, ether->interrupt, ether, ether->tbdf, name); - - i = sprint(buf, "#l%d: %s: %dMbps port 0x%luX irq %d", - ctlrno, cards[cardno].type, ether->mbps, ether->port, ether->irq); - if(ether->mem) - i += sprint(buf+i, " addr 0x%luX", ether->mem); - if(ether->size) - i += sprint(buf+i, " size 0x%luX", ether->size); - i += sprint(buf+i, ": %2.2ux%2.2ux%2.2ux%2.2ux%2.2ux%2.2ux", - ether->ea[0], ether->ea[1], ether->ea[2], - ether->ea[3], ether->ea[4], ether->ea[5]); - sprint(buf+i, "\n"); - print(buf); + print("#l%d: %s: %dMbps port 0x%luX irq %d ea %E\n", + ctlrno, cards[cardno].type, + ether->mbps, ether->port, ether->irq, ether->ea); /* compute log10(ether->mbps) into lg */ for(lg = 0, mb = ether->mbps; mb >= 10; lg++) @@ -429,13 +407,14 @@ etherprobe(int cardno, int ctlrno) while (bsz > mainmem->maxsize / 8 && bsz > 128*1024) bsz /= 2; - netifinit(ether, name, Ntypes, bsz); + netifinit(ether, ether->name, Ntypes, bsz); if(ether->oq == nil) { ether->oq = qopen(bsz, Qmsg, 0, 0); ether->limit = bsz; } if(ether->oq == nil) - panic("etherreset %s: can't allocate output queue of %ld bytes", name, bsz); + panic("etherreset %s: can't allocate output queue of %ld bytes", ether->name, bsz); + ether->alen = Eaddrlen; memmove(ether->addr, ether->ea, Eaddrlen); memset(ether->bcast, 0xFF, Eaddrlen); @@ -449,6 +428,8 @@ etherreset(void) Ether *ether; int cardno, ctlrno; + fmtinstall('E', eipfmt); + for(ctlrno = 0; ctlrno < MaxEther; ctlrno++){ if((ether = etherprobe(-1, ctlrno)) == nil) continue; diff --git a/sys/src/9/pc/ethersink.c b/sys/src/9/port/ethersink.c similarity index 89% rename from sys/src/9/pc/ethersink.c rename to sys/src/9/port/ethersink.c index dd701804f..a005af3a8 100644 --- a/sys/src/9/pc/ethersink.c +++ b/sys/src/9/port/ethersink.c @@ -10,7 +10,7 @@ #include "io.h" #include "../port/error.h" #include "../port/netif.h" -#include "etherif.h" +#include "../port/etherif.h" static long ctl(Ether *ether, void *buf, long n) @@ -40,16 +40,11 @@ nop(Ether*) static int reset(Ether* ether) { - uchar ea[Eaddrlen]; - if(ether->type==nil) return -1; - memset(ea, 0, sizeof ea); ether->mbps = 1000; ether->attach = nop; ether->transmit = nop; - ether->irq = -1; - ether->interrupt = nil; ether->ifstat = nil; ether->ctl = ctl; ether->promiscuous = nil; diff --git a/sys/src/9/port/portmkfile b/sys/src/9/port/portmkfile index 1e15f04b1..45e0a9bc1 100644 --- a/sys/src/9/port/portmkfile +++ b/sys/src/9/port/portmkfile @@ -101,3 +101,6 @@ devaoe.$O sdaoe.$O: /sys/include/fis.h sysproc.$O: /sys/include/a.out.h syscallfmt.$O: /sys/src/libc/9syscall/sys.h devusb.$O: ../port/usb.h +devether.$O: ../port/etherif.h ../port/netif.h +wifi.$O: ../port/etherif.h ../port/netif.h ../port/wifi.h /sys/include/libsec.h +wifi.$O: ../ip/ip.h ../ip/ipv6.h diff --git a/sys/src/9/pc/wifi.c b/sys/src/9/port/wifi.c similarity index 99% rename from sys/src/9/pc/wifi.c rename to sys/src/9/port/wifi.c index e1ad29927..cd70b2ad4 100644 --- a/sys/src/9/pc/wifi.c +++ b/sys/src/9/port/wifi.c @@ -7,9 +7,8 @@ #include "ureg.h" #include "../port/error.h" #include "../port/netif.h" - -#include "etherif.h" -#include "wifi.h" +#include "../port/etherif.h" +#include "../port/wifi.h" #include diff --git a/sys/src/9/pc/wifi.h b/sys/src/9/port/wifi.h similarity index 100% rename from sys/src/9/pc/wifi.h rename to sys/src/9/port/wifi.h diff --git a/sys/src/9/ppc/devether.c b/sys/src/9/ppc/devether.c deleted file mode 100644 index 6cd311840..000000000 --- a/sys/src/9/ppc/devether.c +++ /dev/null @@ -1,446 +0,0 @@ -#include "u.h" -#include "../port/lib.h" -#include "mem.h" -#include "dat.h" -#include "fns.h" -#include "io.h" -#include "ureg.h" -#include "../port/error.h" -#include "../port/netif.h" - -#include "etherif.h" - -static Ether *etherxx[MaxEther]; -extern uchar etheraddr[]; - -Chan* -etherattach(char* spec) -{ - ulong ctlrno; - char *p; - Chan *chan; - - ctlrno = 0; - if(spec && *spec){ - ctlrno = strtoul(spec, &p, 0); - if((ctlrno == 0 && p == spec) || *p || (ctlrno >= MaxEther)) - error(Ebadarg); - } - if(etherxx[ctlrno] == 0) - error(Enodev); - - chan = devattach('l', spec); - chan->dev = ctlrno; - if(etherxx[ctlrno]->attach) - etherxx[ctlrno]->attach(etherxx[ctlrno]); - return chan; -} - -static Walkqid* -etherwalk(Chan* chan, Chan* nchan, char** name, int nname) -{ - return netifwalk(etherxx[chan->dev], chan, nchan, name, nname); -} - -static int -etherstat(Chan* chan, uchar* dp, int n) -{ - return netifstat(etherxx[chan->dev], chan, dp, n); -} - -static Chan* -etheropen(Chan* chan, int omode) -{ - return netifopen(etherxx[chan->dev], chan, omode); -} - -static Chan* -ethercreate(Chan*, char*, int, ulong) -{ - error(Eperm); - return 0; -} - -static void -etherclose(Chan* chan) -{ - netifclose(etherxx[chan->dev], chan); -} - -static long -etherread(Chan* chan, void* buf, long n, vlong off) -{ - Ether *ether; - ulong offset = off; - - ether = etherxx[chan->dev]; - if((chan->qid.type & QTDIR) == 0 && ether->ifstat){ - /* - * With some controllers it is necessary to reach - * into the chip to extract statistics. - */ - if(NETTYPE(chan->qid.path) == Nifstatqid) - return ether->ifstat(ether, buf, n, offset); - else if(NETTYPE(chan->qid.path) == Nstatqid) - ether->ifstat(ether, buf, 0, offset); - } - - return netifread(ether, chan, buf, n, offset); -} - -static Block* -etherbread(Chan* chan, long n, ulong offset) -{ - return netifbread(etherxx[chan->dev], chan, n, offset); -} - -static int -etherwstat(Chan* chan, uchar* dp, int n) -{ - return netifwstat(etherxx[chan->dev], chan, dp, n); -} - -static void -etherrtrace(Netfile* f, Etherpkt* pkt, int len) -{ - int i, n; - Block *bp; - - if(qwindow(f->in) <= 0) - return; - if(len > 58) - n = 58; - else - n = len; - bp = iallocb(64); - if(bp == nil) - return; - memmove(bp->wp, pkt->d, n); - i = TK2MS(MACHP(0)->ticks); - bp->wp[58] = len>>8; - bp->wp[59] = len; - bp->wp[60] = i>>24; - bp->wp[61] = i>>16; - bp->wp[62] = i>>8; - bp->wp[63] = i; - bp->wp += 64; - qpass(f->in, bp); -} - -Block* -etheriq(Ether* ether, Block* bp, int fromwire) -{ - Etherpkt *pkt; - ushort type; - int len, multi, tome, fromme; - Netfile **ep, *f, **fp, *fx; - Block *xbp; - - ether->inpackets++; - - pkt = (Etherpkt*)bp->rp; - len = BLEN(bp); - type = (pkt->type[0]<<8)|pkt->type[1]; - fx = 0; - ep = ðer->f[Ntypes]; - - multi = pkt->d[0] & 1; - /* check for valid multicast addresses */ - if(multi && memcmp(pkt->d, ether->bcast, sizeof(pkt->d)) && ether->prom == 0){ - if(!activemulti(ether, pkt->d, sizeof(pkt->d))){ - if(fromwire){ - freeb(bp); - bp = 0; - } - return bp; - } - } - - /* is it for me? */ - tome = memcmp(pkt->d, ether->ea, sizeof(pkt->d)) == 0; - fromme = memcmp(pkt->s, ether->ea, sizeof(pkt->s)) == 0; - - /* - * Multiplex the packet to all the connections which want it. - * If the packet is not to be used subsequently (fromwire != 0), - * attempt to simply pass it into one of the connections, thereby - * saving a copy of the data (usual case hopefully). - */ - for(fp = ether->f; fp < ep; fp++){ - if(f = *fp) - if(f->type == type || f->type < 0) - if(tome || multi || f->prom){ - /* Don't want to hear loopback or bridged packets */ - if(f->bridge && (tome || !fromwire && !fromme)) - continue; - if(!f->headersonly){ - if(fromwire && fx == 0) - fx = f; - else if(xbp = iallocb(len)){ - memmove(xbp->wp, pkt, len); - xbp->wp += len; - qpass(f->in, xbp); - } - else - ether->soverflows++; - } - else - etherrtrace(f, pkt, len); - } - } - - if(fx){ - if(qpass(fx->in, bp) < 0) - ether->soverflows++; - return 0; - } - if(fromwire){ - freeb(bp); - return 0; - } - - return bp; -} - -static int -etheroq(Ether* ether, Block* bp) -{ - int len, loopback; - Etherpkt *pkt; - - ether->outpackets++; - - /* - * Check if the packet has to be placed back onto the input queue, - * i.e. if it's a loopback or broadcast packet or the interface is - * in promiscuous mode. - * If it's a loopback packet indicate to etheriq that the data isn't - * needed and return, etheriq will pass-on or free the block. - * To enable bridging to work, only packets that were originated - * by this interface are fed back. - */ - pkt = (Etherpkt*)bp->rp; - len = BLEN(bp); - loopback = memcmp(pkt->d, ether->ea, sizeof(pkt->d)) == 0; - if(loopback || memcmp(pkt->d, ether->bcast, sizeof(pkt->d)) == 0 || ether->prom) - if(etheriq(ether, bp, loopback) == 0) - return len; - - qbwrite(ether->oq, bp); - if(ether->transmit != nil) - ether->transmit(ether); - return len; -} - -static long -etherwrite(Chan* chan, void* buf, long n, vlong) -{ - Ether *ether; - Block *bp; - int nn; - - ether = etherxx[chan->dev]; - if(NETTYPE(chan->qid.path) != Ndataqid) { - nn = netifwrite(ether, chan, buf, n); - if(nn >= 0) - return nn; - if(n == sizeof("nonblocking")-1 && strncmp((char*)buf, "nonblocking", n) == 0){ - qnoblock(ether->oq, 1); - return n; - } - if(ether->ctl!=nil) - return ether->ctl(ether,buf,n); - - error(Ebadctl); - } - - if(n > ether->maxmtu) - error(Etoobig); - if(n < ether->minmtu) - error(Etoosmall); - - bp = allocb(n); - if(waserror()){ - freeb(bp); - nexterror(); - } - memmove(bp->rp, buf, n); - if(!ether->f[NETID(chan->qid.path)]->bridge) - memmove(bp->rp+Eaddrlen, ether->ea, Eaddrlen); - poperror(); - bp->wp += n; - - return etheroq(ether, bp); -} - -static long -etherbwrite(Chan* chan, Block* bp, ulong) -{ - Ether *ether; - long n; - - n = BLEN(bp); - if(NETTYPE(chan->qid.path) != Ndataqid){ - if(waserror()) { - freeb(bp); - nexterror(); - } - n = etherwrite(chan, bp->rp, n, 0); - poperror(); - freeb(bp); - return n; - } - ether = etherxx[chan->dev]; - - if(n > ether->maxmtu){ - freeb(bp); - error(Etoobig); - } - if(n < ether->minmtu){ - freeb(bp); - error(Etoosmall); - } - - return etheroq(ether, bp); -} - -static struct { - char* type; - int (*reset)(Ether*); -} cards[MaxEther+1]; - -void -addethercard(char* t, int (*r)(Ether*)) -{ - static int ncard; - - if(ncard == MaxEther) - panic("too many ether cards"); - cards[ncard].type = t; - cards[ncard].reset = r; - ncard++; -} - -static void -etherreset(void) -{ - Ether *ether; - int i, n, ctlrno; - char name[32], buf[128]; - - for(ether = 0, ctlrno = 0; ctlrno < MaxEther; ctlrno++){ - if(ether == 0) - ether = malloc(sizeof(Ether)); - memset(ether, 0, sizeof(Ether)); - ether->ctlrno = ctlrno; - ether->tbdf = BUSUNKNOWN; - ether->mbps = 10; - ether->minmtu = ETHERMINTU; - ether->maxmtu = ETHERMAXTU; - if(isaconfig("ether", ctlrno, ether) == 0) - continue; - for(n = 0; cards[n].type; n++){ - if(cistrcmp(cards[n].type, ether->type)) - continue; - memmove(ether->ea, etheraddr, 6); - for(i = 0; i < ether->nopt; i++){ - if(strncmp(ether->opt[i], "ea=", 3)) - continue; - if(parseether(ether->ea, ðer->opt[i][3]) == -1) - memset(ether->ea, 0, Eaddrlen); - } - if(cards[n].reset(ether)) - break; - - /* - * IRQ2 doesn't really exist, it's used to gang the interrupt - * controllers together. A device set to IRQ2 will appear on - * the second interrupt controller as IRQ9. - */ - if(ether->irq == 2 && BUSTYPE(ether->tbdf) != BusPCI) - ether->irq = 9; - snprint(name, sizeof(name), "ether%d", ctlrno); - - /* - * If ether->irq is <0, it is a hack to indicate no interrupt - * used by ethersink. - */ - if(ether->irq >= 0) - intrenable(ether->irq, ether->interrupt, ether, name); - i = sprint(buf, "#l%d: %s: %dMbps port 0x%luX irq %d", - ctlrno, ether->type, ether->mbps, ether->port, ether->irq); - if(ether->mem) - i += sprint(buf+i, " addr 0x%luX", PADDR(ether->mem)); - if(ether->size) - i += sprint(buf+i, " size 0x%luX", ether->size); - i += sprint(buf+i, ": %2.2ux%2.2ux%2.2ux%2.2ux%2.2ux%2.2ux", - ether->ea[0], ether->ea[1], ether->ea[2], - ether->ea[3], ether->ea[4], ether->ea[5]); - sprint(buf+i, "\n"); - print(buf); - - if(ether->mbps >= 100){ - netifinit(ether, name, Ntypes, 256*1024); - if(ether->oq == 0) - ether->oq = qopen(256*1024, Qmsg, 0, 0); - } - else{ - netifinit(ether, name, Ntypes, 65*1024); - if(ether->oq == 0) - ether->oq = qopen(65*1024, Qmsg, 0, 0); - } - if(ether->oq == 0) - panic("etherreset %s", name); - ether->alen = Eaddrlen; - memmove(ether->addr, ether->ea, Eaddrlen); - memset(ether->bcast, 0xFF, Eaddrlen); - - etherxx[ctlrno] = ether; - ether = 0; - break; - } - } - if(ether) - free(ether); -} - -#define POLY 0xedb88320 - -/* really slow 32 bit crc for ethers */ -ulong -ethercrc(uchar *p, int len) -{ - int i, j; - ulong crc, b; - - crc = 0xffffffff; - for(i = 0; i < len; i++){ - b = *p++; - for(j = 0; j < 8; j++){ - crc = (crc>>1) ^ (((crc^b) & 1) ? POLY : 0); - b >>= 1; - } - } - return crc; -} - -Dev etherdevtab = { - 'l', - "ether", - - etherreset, - devinit, - devshutdown, - etherattach, - etherwalk, - etherstat, - etheropen, - ethercreate, - etherclose, - etherread, - etherbread, - etherwrite, - etherbwrite, - devremove, - etherwstat, -}; diff --git a/sys/src/9/ppc/etherfcc.c b/sys/src/9/ppc/etherfcc.c index 0b2e1f21e..ca254bf45 100644 --- a/sys/src/9/ppc/etherfcc.c +++ b/sys/src/9/ppc/etherfcc.c @@ -11,8 +11,8 @@ #include "imm.h" #include "../port/error.h" #include "../port/netif.h" +#include "../port/etherif.h" -#include "etherif.h" #include "../ppc/ethermii.h" #define DBG 1 @@ -719,7 +719,6 @@ reset(Ether* ether) ether->mbps = 100; /* TO DO: could be 10mbps */ ether->attach = attach; ether->transmit = transmit; - ether->interrupt = interrupt; ether->ifstat = ifstat; ether->arg = ether; @@ -736,6 +735,8 @@ reset(Ether* ether) return -1; } + intrenable(ether->irq, interrupt, ether, ether->name); + return 0; } diff --git a/sys/src/9/ppc/etherif.h b/sys/src/9/ppc/etherif.h deleted file mode 100644 index 34fa2cc02..000000000 --- a/sys/src/9/ppc/etherif.h +++ /dev/null @@ -1,35 +0,0 @@ -enum { - MaxEther = 24, - Ntypes = 8, -}; - -typedef struct Ether Ether; -struct Ether { - ISAConf; /* hardware info */ - - int ctlrno; - int tbdf; /* type+busno+devno+funcno */ - int minmtu; - int maxmtu; - uchar ea[Eaddrlen]; - - void (*attach)(Ether*); /* filled in by reset routine */ - void (*transmit)(Ether*); - void (*interrupt)(Ureg*, void*); - long (*ifstat)(Ether*, void*, long, ulong); - long (*ctl)(Ether*, void*, long); /* custom ctl messages */ - void *ctlr; - - Queue* oq; - - Netif; -}; - -extern Block* etheriq(Ether*, Block*, int); -extern void addethercard(char*, int(*)(Ether*)); -extern ulong ethercrc(uchar*, int); - -#define NEXT(x, l) (((x)+1)%(l)) -#define PREV(x, l) (((x) == 0) ? (l)-1: (x)-1) -#define HOWMANY(x, y) (((x)+((y)-1))/(y)) -#define ROUNDUP(x, y) (HOWMANY((x), (y))*(y)) diff --git a/sys/src/9/ppc/ethersaturn.c b/sys/src/9/ppc/ethersaturn.c index 893835f87..a439b4215 100644 --- a/sys/src/9/ppc/ethersaturn.c +++ b/sys/src/9/ppc/ethersaturn.c @@ -6,9 +6,9 @@ #include "io.h" #include "../port/error.h" #include "../port/netif.h" -#include "msaturn.h" +#include "../port/etherif.h" -#include "etherif.h" +#include "msaturn.h" enum{ Etcr = Saturn + 0x0c00, @@ -209,7 +209,6 @@ reset(Ether* ether) ether->ctlr = ctlr; ether->transmit = transmit; - ether->interrupt = interrupt; ether->irq = Vecether; ether->arg = ether; memmove(ether->ea, (ushort*)Emacaddr0, Eaddrlen); @@ -218,6 +217,9 @@ reset(Ether* ether) *eimr = Ei_rxdone|Ei_txretry|Ei_txdone; iprint("reset: ercr %.4uX\n", *ercr); + + intrenable(ether->irq, interrupt, ether, ether->name); + return 0; } diff --git a/sys/src/9/ppc/mkfile b/sys/src/9/ppc/mkfile index 50416598d..97457c142 100644 --- a/sys/src/9/ppc/mkfile +++ b/sys/src/9/ppc/mkfile @@ -52,7 +52,6 @@ OBJ=\ HFILES=\ dat.h\ errstr.h\ - etherif.h\ fns.h\ init.h\ io.h\ @@ -94,7 +93,7 @@ clock.$O devether.$O main.$O trap.$O: /$objtype/include/ureg.h %.$O: $HFILES -$ETHER: etherif.h ../port/netif.h +$ETHER: ../port/etherif.h ../port/netif.h init.h: ../port/initcode.c init9.s $CC ../port/initcode.c diff --git a/sys/src/9/sgi/dat.h b/sys/src/9/sgi/dat.h index 741ca5655..126eb3793 100644 --- a/sys/src/9/sgi/dat.h +++ b/sys/src/9/sgi/dat.h @@ -13,6 +13,7 @@ typedef struct PMMU PMMU; typedef struct Softtlb Softtlb; typedef struct Ureg Ureg; typedef struct Proc Proc; +typedef struct ISAConf ISAConf; typedef uvlong Tval; #define MAXSYSARG 5 /* for mount(fd, afd, mpt, flag, arg) */ @@ -70,6 +71,16 @@ struct Conf int keyboard; }; +struct ISAConf +{ + char *type; + ulong port; + int irq; + int nopt; + char *opt[1]; +}; +#define BUSUNKNOWN -1 + /* * floating point registers */ diff --git a/sys/src/9/sgi/devether.c b/sys/src/9/sgi/devether.c deleted file mode 100644 index 235447048..000000000 --- a/sys/src/9/sgi/devether.c +++ /dev/null @@ -1,489 +0,0 @@ -#include "u.h" -#include "../port/lib.h" -#include "mem.h" -#include "dat.h" -#include "fns.h" -#include "io.h" -#include "pool.h" -#include "ureg.h" -#include "../port/error.h" -#include "../port/netif.h" - -#include "etherif.h" - -static Ether *etherxx[MaxEther]; - -Chan* -etherattach(char* spec) -{ - ulong ctlrno; - char *p; - Chan *chan; - - ctlrno = 0; - if(spec && *spec){ - ctlrno = strtoul(spec, &p, 0); - if((ctlrno == 0 && p == spec) || *p || (ctlrno >= MaxEther)) - error(Ebadarg); - } - if(etherxx[ctlrno] == 0) - error(Enodev); - - chan = devattach('l', spec); - if(waserror()){ - chanfree(chan); - nexterror(); - } - chan->dev = ctlrno; - if(etherxx[ctlrno]->attach) - etherxx[ctlrno]->attach(etherxx[ctlrno]); - poperror(); - return chan; -} - -static Walkqid* -etherwalk(Chan* chan, Chan* nchan, char** name, int nname) -{ - return netifwalk(etherxx[chan->dev], chan, nchan, name, nname); -} - -static int -etherstat(Chan* chan, uchar* dp, int n) -{ - return netifstat(etherxx[chan->dev], chan, dp, n); -} - -static Chan* -etheropen(Chan* chan, int omode) -{ - return netifopen(etherxx[chan->dev], chan, omode); -} - -static Chan* -ethercreate(Chan*, char*, int, ulong) -{ - error(Eperm); - return 0; -} - -static void -etherclose(Chan* chan) -{ - netifclose(etherxx[chan->dev], chan); -} - -static long -etherread(Chan* chan, void* buf, long n, vlong off) -{ - Ether *ether; - ulong offset = off; - - ether = etherxx[chan->dev]; - if((chan->qid.type & QTDIR) == 0 && ether->ifstat){ - /* - * With some controllers it is necessary to reach - * into the chip to extract statistics. - */ - if(NETTYPE(chan->qid.path) == Nifstatqid) - return ether->ifstat(ether, buf, n, offset); - else if(NETTYPE(chan->qid.path) == Nstatqid) - ether->ifstat(ether, buf, 0, offset); - } - - return netifread(ether, chan, buf, n, offset); -} - -static Block* -etherbread(Chan* chan, long n, ulong offset) -{ - return netifbread(etherxx[chan->dev], chan, n, offset); -} - -static int -etherwstat(Chan* chan, uchar* dp, int n) -{ - return netifwstat(etherxx[chan->dev], chan, dp, n); -} - -static void -etherrtrace(Netfile* f, Etherpkt* pkt, int len) -{ - int i, n; - Block *bp; - - if(qwindow(f->in) <= 0) - return; - if(len > 58) - n = 58; - else - n = len; - bp = iallocb(64); - if(bp == nil) - return; - memmove(bp->wp, pkt->d, n); - i = TK2MS(MACHP(0)->ticks); - bp->wp[58] = len>>8; - bp->wp[59] = len; - bp->wp[60] = i>>24; - bp->wp[61] = i>>16; - bp->wp[62] = i>>8; - bp->wp[63] = i; - bp->wp += 64; - qpass(f->in, bp); -} - -Block* -etheriq(Ether* ether, Block* bp, int fromwire) -{ - Etherpkt *pkt; - ushort type; - int len, multi, tome, fromme; - Netfile **ep, *f, **fp, *fx; - Block *xbp; - - ether->inpackets++; - - pkt = (Etherpkt*)bp->rp; - len = BLEN(bp); - type = (pkt->type[0]<<8)|pkt->type[1]; - fx = 0; - ep = ðer->f[Ntypes]; - - multi = pkt->d[0] & 1; - /* check for valid multicast addresses */ - if(multi && memcmp(pkt->d, ether->bcast, sizeof(pkt->d)) != 0 && ether->prom == 0){ - if(!activemulti(ether, pkt->d, sizeof(pkt->d))){ - if(fromwire){ - freeb(bp); - bp = 0; - } - return bp; - } - } - - /* is it for me? */ - tome = memcmp(pkt->d, ether->ea, sizeof(pkt->d)) == 0; - fromme = memcmp(pkt->s, ether->ea, sizeof(pkt->s)) == 0; - - /* - * Multiplex the packet to all the connections which want it. - * If the packet is not to be used subsequently (fromwire != 0), - * attempt to simply pass it into one of the connections, thereby - * saving a copy of the data (usual case hopefully). - */ - for(fp = ether->f; fp < ep; fp++){ - if(f = *fp) - if(f->type == type || f->type < 0) - if(tome || multi || f->prom){ - /* Don't want to hear loopback or bridged packets */ - if(f->bridge && (tome || !fromwire && !fromme)) - continue; - if(!f->headersonly){ - if(fromwire && fx == 0) - fx = f; - else if(xbp = iallocb(len)){ - memmove(xbp->wp, pkt, len); - xbp->wp += len; - if(qpass(f->in, xbp) < 0) { - // print("soverflow for f->in\n"); - ether->soverflows++; - } - } - else { - // print("soverflow iallocb\n"); - ether->soverflows++; - } - } - else - etherrtrace(f, pkt, len); - } - } - - if(fx){ - if(qpass(fx->in, bp) < 0) { - // print("soverflow for fx->in\n"); - ether->soverflows++; - } - return 0; - } - if(fromwire){ - freeb(bp); - return 0; - } - - return bp; -} - -static int -etheroq(Ether* ether, Block* bp) -{ - int len, loopback; - Etherpkt *pkt; - - ether->outpackets++; - - /* - * Check if the packet has to be placed back onto the input queue, - * i.e. if it's a loopback or broadcast packet or the interface is - * in promiscuous mode. - * If it's a loopback packet indicate to etheriq that the data isn't - * needed and return, etheriq will pass-on or free the block. - * To enable bridging to work, only packets that were originated - * by this interface are fed back. - */ - pkt = (Etherpkt*)bp->rp; - len = BLEN(bp); - loopback = memcmp(pkt->d, ether->ea, sizeof(pkt->d)) == 0; - if(loopback || memcmp(pkt->d, ether->bcast, sizeof(pkt->d)) == 0 || ether->prom) - if(etheriq(ether, bp, loopback) == 0) - return len; - - qbwrite(ether->oq, bp); - if(ether->transmit != nil) - ether->transmit(ether); - return len; -} - -static long -etherwrite(Chan* chan, void* buf, long n, vlong) -{ - Ether *ether; - Block *bp; - int nn, onoff; - Cmdbuf *cb; - - ether = etherxx[chan->dev]; - if(NETTYPE(chan->qid.path) != Ndataqid) { - nn = netifwrite(ether, chan, buf, n); - if(nn >= 0) - return nn; - cb = parsecmd(buf, n); - if(cb->f[0] && strcmp(cb->f[0], "nonblocking") == 0){ - if(cb->nf <= 1) - onoff = 1; - else - onoff = atoi(cb->f[1]); - qnoblock(ether->oq, onoff); - free(cb); - return n; - } - free(cb); - if(ether->ctl!=nil) - return ether->ctl(ether,buf,n); - - error(Ebadctl); - } - - if(n > ether->maxmtu) - error(Etoobig); - if(n < ether->minmtu) - error(Etoosmall); - - bp = allocb(n); - if(waserror()){ - freeb(bp); - nexterror(); - } - memmove(bp->rp, buf, n); - if(!ether->f[NETID(chan->qid.path)]->bridge) - memmove(bp->rp+Eaddrlen, ether->ea, Eaddrlen); - poperror(); - bp->wp += n; - - return etheroq(ether, bp); -} - -static long -etherbwrite(Chan* chan, Block* bp, ulong) -{ - Ether *ether; - long n; - - n = BLEN(bp); - if(NETTYPE(chan->qid.path) != Ndataqid){ - if(waserror()) { - freeb(bp); - nexterror(); - } - n = etherwrite(chan, bp->rp, n, 0); - poperror(); - freeb(bp); - return n; - } - ether = etherxx[chan->dev]; - - if(n > ether->maxmtu){ - freeb(bp); - error(Etoobig); - } - if(n < ether->minmtu){ - freeb(bp); - error(Etoosmall); - } - - return etheroq(ether, bp); -} - -static struct { - char* type; - int (*reset)(Ether*); -} cards[MaxEther+1]; - -void -addethercard(char* t, int (*r)(Ether*)) -{ - static int ncard; - - if(ncard == MaxEther) - panic("too many ether cards"); - cards[ncard].type = t; - cards[ncard].reset = r; - ncard++; -} - -static Ether* -etherprobe(int cardno, int ctlrno) -{ - int i, lg; - ulong mb, bsz; - Ether *ether; - char buf[128], name[32]; - - ether = malloc(sizeof(Ether)); - if(ether == nil){ - print("etherprobe: no memory for Ether\n"); - return nil; - } - memset(ether, 0, sizeof(Ether)); - ether->ctlrno = ctlrno; - ether->mbps = 10; - ether->minmtu = ETHERMINTU; - ether->maxmtu = ETHERMAXTU; - - if(cardno >= MaxEther || cards[cardno].type == nil){ - free(ether); - return nil; - } - if(cards[cardno].reset(ether) < 0){ - free(ether); - return nil; - } - - snprint(name, sizeof(name), "ether%d", ctlrno); - - intrenable(ether->irqlevel, ether->interrupt, ether); - - i = sprint(buf, "#l%d: %s: %dMbps port 0x%luX irq %d", - ctlrno, cards[cardno].type, ether->mbps, ether->port, ether->irq); - i += sprint(buf+i, ": %2.2ux%2.2ux%2.2ux%2.2ux%2.2ux%2.2ux", - ether->ea[0], ether->ea[1], ether->ea[2], - ether->ea[3], ether->ea[4], ether->ea[5]); - sprint(buf+i, "\n"); - print(buf); - - /* compute log10(ether->mbps) into lg */ - for(lg = 0, mb = ether->mbps; mb >= 10; lg++) - mb /= 10; - if (lg > 0) - lg--; - if (lg > 14) /* 2^(14+17) = 2³¹ */ - lg = 14; - /* allocate larger output queues for higher-speed interfaces */ - bsz = 1UL << (lg + 17); /* 2¹⁷ = 128K, bsz = 2ⁿ × 128K */ - while (bsz > mainmem->maxsize / 8 && bsz > 128*1024) - bsz /= 2; - - netifinit(ether, name, Ntypes, bsz); - if(ether->oq == nil) { - ether->oq = qopen(bsz, Qmsg, 0, 0); - ether->limit = bsz; - } - if(ether->oq == nil) - panic("etherreset %s: can't allocate output queue of %ld bytes", name, bsz); - ether->alen = Eaddrlen; - memmove(ether->addr, ether->ea, Eaddrlen); - memset(ether->bcast, 0xFF, Eaddrlen); - - return ether; -} - -static void -etherreset(void) -{ - Ether *ether; - int cardno, ctlrno; - - cardno = ctlrno = 0; - while(cards[cardno].type != nil && ctlrno < MaxEther){ - if(etherxx[ctlrno] != nil){ - ctlrno++; - continue; - } - if((ether = etherprobe(cardno, ctlrno)) == nil){ - cardno++; - continue; - } - etherxx[ctlrno] = ether; - ctlrno++; - } -} - -static void -ethershutdown(void) -{ - Ether *ether; - int i; - - for(i = 0; i < MaxEther; i++){ - ether = etherxx[i]; - if(ether == nil) - continue; - if(ether->shutdown == nil) { - print("#l%d: no shutdown function\n", i); - continue; - } - (*ether->shutdown)(ether); - } -} - - -#define POLY 0xedb88320 - -/* really slow 32 bit crc for ethers */ -ulong -ethercrc(uchar *p, int len) -{ - int i, j; - ulong crc, b; - - crc = 0xffffffff; - for(i = 0; i < len; i++){ - b = *p++; - for(j = 0; j < 8; j++){ - crc = (crc>>1) ^ (((crc^b) & 1) ? POLY : 0); - b >>= 1; - } - } - return crc; -} - -Dev etherdevtab = { - 'l', - "ether", - - etherreset, - devinit, - ethershutdown, - etherattach, - etherwalk, - etherstat, - etheropen, - ethercreate, - etherclose, - etherread, - etherbread, - etherwrite, - etherbwrite, - devremove, - etherwstat, -}; diff --git a/sys/src/9/sgi/etherif.h b/sys/src/9/sgi/etherif.h deleted file mode 100644 index 035dd64cb..000000000 --- a/sys/src/9/sgi/etherif.h +++ /dev/null @@ -1,40 +0,0 @@ -enum { - MaxEther = 1, - Ntypes = 8, -}; - -typedef struct Ether Ether; -struct Ether { - - int ctlrno; - int minmtu; - int maxmtu; - uchar ea[Eaddrlen]; - - int irq, irqlevel; - uintptr port; - - void (*attach)(Ether*); /* filled in by reset routine */ - void (*detach)(Ether*); - void (*transmit)(Ether*); - void (*interrupt)(Ureg*, void*); - long (*ifstat)(Ether*, void*, long, ulong); - long (*ctl)(Ether*, void*, long); /* custom ctl messages */ - void (*power)(Ether*, int); /* power on/off */ - void (*shutdown)(Ether*); /* shutdown hardware before reboot */ - void *ctlr; - - Queue* oq; - - Netif; -}; - -extern Block* etheriq(Ether*, Block*, int); -extern void addethercard(char*, int(*)(Ether*)); -extern ulong ethercrc(uchar*, int); -extern int parseether(uchar*, char*); - -#define NEXT(x, l) (((x)+1)%(l)) -#define PREV(x, l) (((x) == 0) ? (l)-1: (x)-1) -#define HOWMANY(x, y) (((x)+((y)-1))/(y)) -#define ROUNDUP(x, y) (HOWMANY((x), (y))*(y)) diff --git a/sys/src/9/sgi/etherseeq.c b/sys/src/9/sgi/etherseeq.c index ba5e418ea..52d77b17f 100644 --- a/sys/src/9/sgi/etherseeq.c +++ b/sys/src/9/sgi/etherseeq.c @@ -5,7 +5,7 @@ #include "fns.h" #include "io.h" #include "../port/netif.h" -#include "etherif.h" +#include "../port/etherif.h" typedef struct Hio Hio; typedef struct Desc Desc; @@ -451,19 +451,21 @@ pnp(Ether *edev) edev->ctlr = &ct; edev->port = HPC3_ETHER; edev->irq = IRQENET; - edev->irqlevel = hpc3irqlevel(edev->irq); edev->ctlr = &ct; edev->promiscuous = promiscuous; edev->multicast = multicast; - edev->interrupt = interrupt; edev->attach = attach; edev->arg = edev; edev->mbps = 10; edev->link = 1; + if(init(edev) < 0){ edev->ctlr = nil; return -1; } + + intrenable(hpc3irqlevel(edev->irq), interrupt, edev); + return 0; } diff --git a/sys/src/9/sgi/fns.h b/sys/src/9/sgi/fns.h index dc6902d15..8ae58e938 100644 --- a/sys/src/9/sgi/fns.h +++ b/sys/src/9/sgi/fns.h @@ -22,6 +22,7 @@ ulong getrandom(void); int gettlbp(ulong, ulong*); ulong gettlbvirt(int); int hpc3irqlevel(int); +int isaconfig(char*, int, ISAConf*); void icflush(void *, ulong); void idlehands(void); void introff(int); diff --git a/sys/src/9/sgi/indy b/sys/src/9/sgi/indy index ec5544029..e675e6407 100644 --- a/sys/src/9/sgi/indy +++ b/sys/src/9/sgi/indy @@ -10,8 +10,8 @@ dev env pipe dup - ether netif - ip arp chandial ip ipv6 ipaux iproute netlog nullmedium pktmedium inferno + ether netif + ip arp chandial ip ipv6 ipaux iproute netlog nullmedium pktmedium inferno ssl tls cap diff --git a/sys/src/9/sgi/main.c b/sys/src/9/sgi/main.c index dea690f29..13d7b9888 100644 --- a/sys/src/9/sgi/main.c +++ b/sys/src/9/sgi/main.c @@ -502,3 +502,9 @@ setupwatchpts(Proc *, Watchpt *, int n) if(n > 0) error("no watchpoints"); } + +int +isaconfig(char *, int, ISAConf*) +{ + return 0; +} diff --git a/sys/src/9/teg2/archtegra.c b/sys/src/9/teg2/archtegra.c index 0a486bad3..72e9b0ff2 100644 --- a/sys/src/9/teg2/archtegra.c +++ b/sys/src/9/teg2/archtegra.c @@ -12,7 +12,7 @@ #include "arm.h" #include "../port/netif.h" -#include "etherif.h" +#include "../port/etherif.h" #include "../port/flashif.h" #include "../port/usb.h" #include "../port/portusbehci.h" diff --git a/sys/src/9/teg2/devether.c b/sys/src/9/teg2/devether.c deleted file mode 100644 index ee3e71a6e..000000000 --- a/sys/src/9/teg2/devether.c +++ /dev/null @@ -1,502 +0,0 @@ -#include "u.h" -#include "../port/lib.h" -#include "mem.h" -#include "dat.h" -#include "fns.h" -#include "io.h" -#include "../port/error.h" - -#include "../port/netif.h" -#include "etherif.h" - -static Ether *etherxx[MaxEther]; - -Chan* -etherattach(char* spec) -{ - int ctlrno; - char *p; - Chan *chan; - - ctlrno = 0; - if(spec && *spec){ - ctlrno = strtoul(spec, &p, 0); - if((ctlrno == 0 && p == spec) || *p != 0) - error(Ebadarg); - if(ctlrno < 0 || ctlrno >= MaxEther) - error(Ebadarg); - } - if(etherxx[ctlrno] == 0) - error(Enodev); - - chan = devattach('l', spec); - if(waserror()){ - chanfree(chan); - nexterror(); - } - chan->dev = ctlrno; - if(etherxx[ctlrno]->attach) - etherxx[ctlrno]->attach(etherxx[ctlrno]); - poperror(); - return chan; -} - -static Walkqid* -etherwalk(Chan* chan, Chan* nchan, char** name, int nname) -{ - return netifwalk(etherxx[chan->dev], chan, nchan, name, nname); -} - -static int -etherstat(Chan* chan, uchar* dp, int n) -{ - return netifstat(etherxx[chan->dev], chan, dp, n); -} - -static Chan* -etheropen(Chan* chan, int omode) -{ - return netifopen(etherxx[chan->dev], chan, omode); -} - -static Chan* -ethercreate(Chan*, char*, int, ulong) -{ - error(Eperm); - return 0; -} - -static void -etherclose(Chan* chan) -{ - netifclose(etherxx[chan->dev], chan); -} - -static long -etherread(Chan* chan, void* buf, long n, vlong off) -{ - Ether *ether; - ulong offset = off; - - ether = etherxx[chan->dev]; - if((chan->qid.type & QTDIR) == 0 && ether->ifstat){ - /* - * With some controllers it is necessary to reach - * into the chip to extract statistics. - */ - if(NETTYPE(chan->qid.path) == Nifstatqid) - return ether->ifstat(ether, buf, n, offset); - else if(NETTYPE(chan->qid.path) == Nstatqid) - ether->ifstat(ether, buf, 0, offset); - } - - return netifread(ether, chan, buf, n, offset); -} - -static Block* -etherbread(Chan* chan, long n, ulong offset) -{ - return netifbread(etherxx[chan->dev], chan, n, offset); -} - -static int -etherwstat(Chan* chan, uchar* dp, int n) -{ - return netifwstat(etherxx[chan->dev], chan, dp, n); -} - -static void -etherrtrace(Netfile* f, Etherpkt* pkt, int len) -{ - int i, n; - Block *bp; - - if(qwindow(f->in) <= 0) - return; - if(len > 58) - n = 58; - else - n = len; - bp = iallocb(64); - if(bp == nil) - return; - memmove(bp->wp, pkt->d, n); - i = TK2MS(MACHP(0)->ticks); - bp->wp[58] = len>>8; - bp->wp[59] = len; - bp->wp[60] = i>>24; - bp->wp[61] = i>>16; - bp->wp[62] = i>>8; - bp->wp[63] = i; - bp->wp += 64; - qpass(f->in, bp); -} - -Block* -etheriq(Ether* ether, Block* bp, int fromwire) -{ - Etherpkt *pkt; - ushort type; - int len, multi, tome, fromme; - Netfile **ep, *f, **fp, *fx; - Block *xbp; - - ether->inpackets++; - - pkt = (Etherpkt*)bp->rp; - len = BLEN(bp); - type = (pkt->type[0]<<8)|pkt->type[1]; - fx = 0; - ep = ðer->f[Ntypes]; - - multi = pkt->d[0] & 1; - /* check for valid multicast addresses */ - if(multi && memcmp(pkt->d, ether->bcast, sizeof(pkt->d)) != 0 && - ether->prom == 0){ - if(!activemulti(ether, pkt->d, sizeof(pkt->d))){ - if(fromwire){ - freeb(bp); - bp = 0; - } - return bp; - } - } - /* is it for me? */ - tome = memcmp(pkt->d, ether->ea, sizeof(pkt->d)) == 0; - fromme = memcmp(pkt->s, ether->ea, sizeof(pkt->s)) == 0; - - /* - * Multiplex the packet to all the connections which want it. - * If the packet is not to be used subsequently (fromwire != 0), - * attempt to simply pass it into one of the connections, thereby - * saving a copy of the data (usual case hopefully). - */ - for(fp = ether->f; fp < ep; fp++){ - if((f = *fp) != nil && (f->type == type || f->type < 0) && - (tome || multi || f->prom)){ - /* Don't want to hear loopback or bridged packets */ - if(f->bridge && (tome || !fromwire && !fromme)) - continue; - if(!f->headersonly){ - if(fromwire && fx == 0) - fx = f; - else if(xbp = iallocb(len)){ - memmove(xbp->wp, pkt, len); - xbp->wp += len; - if(qpass(f->in, xbp) < 0) - ether->soverflows++; - } - else - ether->soverflows++; - } - else - etherrtrace(f, pkt, len); - } - } - - if(fx){ - if(qpass(fx->in, bp) < 0) - ether->soverflows++; - return 0; - } - if(fromwire){ - freeb(bp); - return 0; - } - return bp; -} - -static int -etheroq(Ether* ether, Block* bp) -{ - int len, loopback; - Etherpkt *pkt; - - ether->outpackets++; - - /* - * Check if the packet has to be placed back onto the input queue, - * i.e. if it's a loopback or broadcast packet or the interface is - * in promiscuous mode. - * If it's a loopback packet indicate to etheriq that the data isn't - * needed and return, etheriq will pass-on or free the block. - * To enable bridging to work, only packets that were originated - * by this interface are fed back. - */ - pkt = (Etherpkt*)bp->rp; - len = BLEN(bp); - loopback = memcmp(pkt->d, ether->ea, sizeof(pkt->d)) == 0; - if(loopback || memcmp(pkt->d, ether->bcast, sizeof(pkt->d)) == 0 || ether->prom) - if(etheriq(ether, bp, loopback) == 0) - return len; - - qbwrite(ether->oq, bp); - if(ether->transmit != nil) - ether->transmit(ether); - return len; -} - -static long -etherwrite(Chan* chan, void* buf, long n, vlong) -{ - Ether *ether; - Block *bp; - int nn, onoff; - Cmdbuf *cb; - - ether = etherxx[chan->dev]; - if(NETTYPE(chan->qid.path) != Ndataqid) { - nn = netifwrite(ether, chan, buf, n); - if(nn >= 0) - return nn; - cb = parsecmd(buf, n); - if(cb->f[0] && strcmp(cb->f[0], "nonblocking") == 0){ - if(cb->nf <= 1) - onoff = 1; - else - onoff = atoi(cb->f[1]); - qnoblock(ether->oq, onoff); - free(cb); - return n; - } - free(cb); - if(ether->ctl!=nil) - return ether->ctl(ether,buf,n); - - error(Ebadctl); - } - - if(n > ether->maxmtu) - error(Etoobig); - if(n < ether->minmtu) - error(Etoosmall); - - bp = allocb(n); - if(waserror()){ - freeb(bp); - nexterror(); - } - memmove(bp->rp, buf, n); - if(!ether->f[NETID(chan->qid.path)]->bridge) - memmove(bp->rp+Eaddrlen, ether->ea, Eaddrlen); - poperror(); - bp->wp += n; - - return etheroq(ether, bp); -} - -static long -etherbwrite(Chan* chan, Block* bp, ulong) -{ - Ether *ether; - long n; - - n = BLEN(bp); - if(NETTYPE(chan->qid.path) != Ndataqid){ - if(waserror()) { - freeb(bp); - nexterror(); - } - n = etherwrite(chan, bp->rp, n, 0); - poperror(); - freeb(bp); - return n; - } - ether = etherxx[chan->dev]; - - if(n > ether->maxmtu){ - freeb(bp); - error(Etoobig); - } - if(n < ether->minmtu){ - freeb(bp); - error(Etoosmall); - } - - return etheroq(ether, bp); -} - -static struct { - char* type; - int (*reset)(Ether*); -} cards[MaxEther+1]; - -void -addethercard(char* t, int (*r)(Ether*)) -{ - static int ncard; - - if(ncard == MaxEther) - panic("too many ether cards"); - cards[ncard].type = t; - cards[ncard].reset = r; - ncard++; -} - -static void -etherreset(void) -{ - Ether *ether; - int i, n, ctlrno; - char name[KNAMELEN], buf[128]; - - for(ether = 0, ctlrno = 0; ctlrno < MaxEther; ctlrno++){ - if(ether == 0) - ether = malloc(sizeof(Ether)); - memset(ether, 0, sizeof(Ether)); - ether->ctlrno = ctlrno; - ether->mbps = 10; - ether->minmtu = ETHERMINTU; - ether->maxmtu = ETHERMAXTU; - - if(archether(ctlrno, ether) <= 0) - continue; - - if(isaconfig("ether", ctlrno, ether) == 0){ -// free(ether); -// return nil; - continue; - } - for(n = 0; cards[n].type; n++){ - if(cistrcmp(cards[n].type, ether->type)) - continue; - for(i = 0; i < ether->nopt; i++) - if(cistrncmp(ether->opt[i], "ea=", 3) == 0){ - if(parseether(ether->ea, - ðer->opt[i][3]) == -1) - memset(ether->ea, 0, Eaddrlen); - } else if(cistrcmp(ether->opt[i], - "100BASE-TXFD") == 0) - ether->mbps = 100; - if(cards[n].reset(ether)) - break; - snprint(name, sizeof(name), "ether%d", ctlrno); - - if(ether->interrupt != nil && ether->irq >= 0) - intrenable(ether->irq, ether->interrupt, - ether, 0, name); - - i = snprint(buf, sizeof buf, - "#l%d: %s: %dMbps port %#lux irq %d", - ctlrno, ether->type, ether->mbps, ether->port, - ether->irq); - if(ether->mem) - i += snprint(buf+i, sizeof buf - i, - " addr %#lux", PADDR(ether->mem)); - if(ether->size) - i += snprint(buf+i, sizeof buf - i, - " size %#luX", ether->size); - i += snprint(buf+i, sizeof buf - i, - ": %2.2ux%2.2ux%2.2ux%2.2ux%2.2ux%2.2ux", - ether->ea[0], ether->ea[1], ether->ea[2], - ether->ea[3], ether->ea[4], ether->ea[5]); - snprint(buf+i, sizeof buf - i, "\n"); - iprint("%s", buf); /* it may be too early for print */ - - if(ether->mbps >= 1000) - netifinit(ether, name, Ntypes, 4*1024*1024); - else if(ether->mbps >= 100) - netifinit(ether, name, Ntypes, 1024*1024); - else - netifinit(ether, name, Ntypes, 65*1024); - if(ether->oq == 0) - ether->oq = qopen(ether->limit, Qmsg, 0, 0); - if(ether->oq == 0) - panic("etherreset %s", name); - ether->alen = Eaddrlen; - memmove(ether->addr, ether->ea, Eaddrlen); - memset(ether->bcast, 0xFF, Eaddrlen); - - etherxx[ctlrno] = ether; - ether = 0; - break; - } - } - if(ether) - free(ether); -} - -static void -ethershutdown(void) -{ - Ether *ether; - int i; - - for(i = 0; i < MaxEther; i++){ - ether = etherxx[i]; - if(ether == nil) - continue; - if(ether->shutdown == nil) { - print("#l%d: no shutdown function\n", i); - continue; - } - (*ether->shutdown)(ether); - } -} - - -#define POLY 0xedb88320 - -/* really slow 32 bit crc for ethers */ -ulong -ethercrc(uchar *p, int len) -{ - int i, j; - ulong crc, b; - - crc = 0xffffffff; - for(i = 0; i < len; i++){ - b = *p++; - for(j = 0; j < 8; j++){ - crc = (crc>>1) ^ (((crc^b) & 1) ? POLY : 0); - b >>= 1; - } - } - return crc; -} - -void -dumpoq(Queue *oq) -{ - if (oq == nil) - print("no outq! "); - else if (qisclosed(oq)) - print("outq closed "); - else if (qfull(oq)) - print("outq full "); - else - print("outq %d ", qlen(oq)); -} - -void -dumpnetif(Netif *netif) -{ - print("netif %s ", netif->name); - print("limit %d mbps %d link %d ", - netif->limit, netif->mbps, netif->link); - print("inpkts %lld outpkts %lld errs %d\n", - netif->inpackets, netif->outpackets, - netif->crcs + netif->oerrs + netif->frames + netif->overflows + - netif->buffs + netif->soverflows); -} - -Dev etherdevtab = { - 'l', - "ether", - - etherreset, - devinit, - ethershutdown, - etherattach, - etherwalk, - etherstat, - etheropen, - ethercreate, - etherclose, - etherread, - etherbread, - etherwrite, - etherbwrite, - devremove, - etherwstat, -}; diff --git a/sys/src/9/teg2/ether8169.c b/sys/src/9/teg2/ether8169.c index e9aa021cb..1af17840b 100644 --- a/sys/src/9/teg2/ether8169.c +++ b/sys/src/9/teg2/ether8169.c @@ -15,8 +15,8 @@ #include "io.h" #include "../port/error.h" #include "../port/netif.h" +#include "../port/etherif.h" -#include "etherif.h" #include "ethermii.h" typedef struct Ctlr Ctlr; @@ -1655,7 +1655,6 @@ rtl8169pnp(Ether* edev) edev->attach = rtl8169attach; edev->transmit = rtl8169transmit; - edev->interrupt = rtl8169interrupt; edev->ifstat = rtl8169ifstat; edev->arg = edev; @@ -1666,6 +1665,9 @@ rtl8169pnp(Ether* edev) ilock(&ctlr->reglock); rtl8169link(edev); iunlock(&ctlr->reglock); + + intrenable(edev->irq, rtl8169interrupt, edev, 0, edev->name); + return 0; } diff --git a/sys/src/9/teg2/etherif.h b/sys/src/9/teg2/etherif.h deleted file mode 100644 index bae31be07..000000000 --- a/sys/src/9/teg2/etherif.h +++ /dev/null @@ -1,42 +0,0 @@ -enum -{ - MaxEther = 4, - Ntypes = 8, -}; - -typedef struct Ether Ether; -struct Ether { - RWlock; - ISAConf; /* hardware info */ - - int ctlrno; - ulong tbdf; - int minmtu; - int maxmtu; - - Netif; - - void (*attach)(Ether*); /* filled in by reset routine */ - void (*detach)(Ether*); - void (*transmit)(Ether*); - void (*interrupt)(Ureg*, void*); - long (*ifstat)(Ether*, void*, long, ulong); - long (*ctl)(Ether*, void*, long); /* custom ctl messages */ - void (*power)(Ether*, int); /* power on/off */ - void (*shutdown)(Ether*); /* shutdown hardware before reboot */ - - void* ctlr; - uchar ea[Eaddrlen]; - void* address; - int irq; - - Queue* oq; -}; - -extern Block* etheriq(Ether*, Block*, int); -extern void addethercard(char*, int(*)(Ether*)); -extern ulong ethercrc(uchar*, int); -extern int parseether(uchar*, char*); - -#define NEXT(x, l) (((x)+1)%(l)) -#define PREV(x, l) (((x) == 0) ? (l)-1: (x)-1) diff --git a/sys/src/9/teg2/ethermii.c b/sys/src/9/teg2/ethermii.c index 90b219b3f..16d766ef4 100644 --- a/sys/src/9/teg2/ethermii.c +++ b/sys/src/9/teg2/ethermii.c @@ -6,8 +6,8 @@ #include "io.h" #include "../port/error.h" #include "../port/netif.h" +#include "../port/etherif.h" -#include "etherif.h" #include "ethermii.h" int diff --git a/sys/src/9/teg2/mem.h b/sys/src/9/teg2/mem.h index 5243a6dba..c891ae7db 100644 --- a/sys/src/9/teg2/mem.h +++ b/sys/src/9/teg2/mem.h @@ -5,9 +5,6 @@ #define MiB 1048576u /* Mebi 0x0000000000100000 */ #define GiB 1073741824u /* Gibi 000000000040000000 */ -#define HOWMANY(x, y) (((x)+((y)-1))/(y)) -#define ROUNDUP(x, y) (HOWMANY((x), (y))*(y)) /* ceiling */ -#define ROUNDDN(x, y) (((x)/(y))*(y)) /* floor */ #define MIN(a, b) ((a) < (b)? (a): (b)) #define MAX(a, b) ((a) > (b)? (a): (b)) @@ -36,7 +33,7 @@ */ #define BY2PG (4*KiB) /* bytes per page */ #define PGSHIFT 12 /* log(BY2PG) */ -#define PGROUND(s) ROUNDUP(s, BY2PG) +#define PGROUND(s) ROUND(s, BY2PG) #define ROUND(s, sz) (((s)+(sz-1))&~(sz-1)) /* max # of cpus system can run. tegra2 cpu ids are two bits wide. */ @@ -85,7 +82,6 @@ #define UZERO 0 /* user segment */ #define UTZERO (UZERO+BY2PG) /* user text start */ -#define UTROUND(t) ROUNDUP((t), BY2PG) /* * moved USTKTOP down to 1GB to keep MMIO space out of user space. * moved it down another MB to utterly avoid KADDR(stack_base) mapping diff --git a/sys/src/9/teg2/mkfile b/sys/src/9/teg2/mkfile index d964d125f..3f8150af7 100644 --- a/sys/src/9/teg2/mkfile +++ b/sys/src/9/teg2/mkfile @@ -117,7 +117,7 @@ CFLAGS= -I. -I../port $CFLAGS # hack to compile private sysproc.c (e.g.) arch.$O clock.$O fpiarm.$O main.$O mmu.$O screen.$O sdscsi.$O syscall.$O \ trap.$O: /$objtype/include/ureg.h -archtegra.$O devether.$0 ether9221.$O: etherif.h ../port/netif.h +archtegra.$O devether.$0 ether9221.$O: ../port/etherif.h ../port/netif.h archtegra.$O devflash.$O flashtegra.$O flashigep.$O: ../port/flashif.h ecc.$O flashtegra.$O flashigep.$O: ../port/nandecc.h io.h fpi.$O fpiarm.$O fpimem.$O: fpi.h diff --git a/sys/src/9/teg2/mmu.c b/sys/src/9/teg2/mmu.c index 1522c1f23..eabaaa896 100644 --- a/sys/src/9/teg2/mmu.c +++ b/sys/src/9/teg2/mmu.c @@ -693,7 +693,7 @@ vmap(uintptr pa, usize size) o = pa & (BY2PG-1); pa -= o; size += o; - size = ROUNDUP(size, BY2PG); + size = PGROUND(size); va = kseg0|pa; pae = mmukmap(va, pa, size); diff --git a/sys/src/9/xen/etherxen.c b/sys/src/9/xen/etherxen.c index 0f4f2d2c5..62d5e5de5 100644 --- a/sys/src/9/xen/etherxen.c +++ b/sys/src/9/xen/etherxen.c @@ -10,7 +10,7 @@ #include "io.h" #include "../port/error.h" #include "../port/netif.h" -#include "etherif.h" +#include "../port/etherif.h" #define LOG(a) @@ -478,12 +478,14 @@ pnp(Ether* ether) ether->transmit = etherxentransmit; ether->irq = -1; ether->tbdf = BUSUNKNOWN; - ether->interrupt = etherxenintr; ether->ifstat = ifstat; ether->ctl = etherxenctl; ether->promiscuous = nil; ether->multicast = etherxenmulticast; ether->arg = ether; + + intrenable(ether->irq, etherxenintr, ether, ether->tbdf, ether->name); + return 0; } diff --git a/sys/src/9/xen/mkfile b/sys/src/9/xen/mkfile index 3d83df4fb..e7bbe9503 100644 --- a/sys/src/9/xen/mkfile +++ b/sys/src/9/xen/mkfile @@ -114,7 +114,7 @@ install:V: $p$CONF $p$CONF.gz # import lookout / /n/lookout && cp $p$CONF $p$CONF.gz /n/lookout/$objtype/ # copies generated by the rule below -PCHEADERS=uncached.h etherif.h ethermii.h mp.h io.h +PCHEADERS=uncached.h ethermii.h mp.h io.h REPCH=`{echo $PCHEADERS | sed 's/\.h//g; s/ /|/g'} ^($REPCH)\.h:R: '../pc/\1.h' @@ -132,7 +132,7 @@ ptclbsum386.$O: ../pc/ptclbsum386.s $AS $AFLAGS ../pc/ptclbsum386.s # we inherited these.. revisit. -$ETHER: etherif.h ../port/netif.h +$ETHER: ../port/etherif.h ../port/netif.h $SDEV: ../port/sd.h main.$O: init.h reboot.h trap.$O: /sys/include/tos.h diff --git a/sys/src/9/xen/xenpcf b/sys/src/9/xen/xenpcf index 479729163..b6de0768d 100644 --- a/sys/src/9/xen/xenpcf +++ b/sys/src/9/xen/xenpcf @@ -20,7 +20,7 @@ dev xenstore ether netif - ip arp chandial ip ipv6 ipaux iproute netlog nullmedium pktmedium ptclbsum386 inferno + ip arp chandial ip ipv6 ipaux iproute netlog nullmedium pktmedium ptclbsum386 inferno sd diff --git a/sys/src/9/zynq/dat.h b/sys/src/9/zynq/dat.h index 59b60ba19..811b23407 100644 --- a/sys/src/9/zynq/dat.h +++ b/sys/src/9/zynq/dat.h @@ -161,10 +161,11 @@ struct Mach struct ISAConf { - int dummy; - char *type; - ulong port; - int irq; + char *type; + ulong port; + int irq; + int nopt; + char *opt[1]; }; #define BUSUNKNOWN -1 diff --git a/sys/src/9/zynq/devether.c b/sys/src/9/zynq/devether.c deleted file mode 100644 index b9353f01e..000000000 --- a/sys/src/9/zynq/devether.c +++ /dev/null @@ -1,489 +0,0 @@ -#include "u.h" -#include "../port/lib.h" -#include "mem.h" -#include "dat.h" -#include "fns.h" -#include "io.h" -#include "pool.h" -#include "ureg.h" -#include "../port/error.h" -#include "../port/netif.h" - -#include "etherif.h" - -static Ether *etherxx[MaxEther]; - -Chan* -etherattach(char* spec) -{ - ulong ctlrno; - char *p; - Chan *chan; - - ctlrno = 0; - if(spec && *spec){ - ctlrno = strtoul(spec, &p, 0); - if((ctlrno == 0 && p == spec) || *p || (ctlrno >= MaxEther)) - error(Ebadarg); - } - if(etherxx[ctlrno] == 0) - error(Enodev); - - chan = devattach('l', spec); - if(waserror()){ - chanfree(chan); - nexterror(); - } - chan->dev = ctlrno; - if(etherxx[ctlrno]->attach) - etherxx[ctlrno]->attach(etherxx[ctlrno]); - poperror(); - return chan; -} - -static Walkqid* -etherwalk(Chan* chan, Chan* nchan, char** name, int nname) -{ - return netifwalk(etherxx[chan->dev], chan, nchan, name, nname); -} - -static int -etherstat(Chan* chan, uchar* dp, int n) -{ - return netifstat(etherxx[chan->dev], chan, dp, n); -} - -static Chan* -etheropen(Chan* chan, int omode) -{ - return netifopen(etherxx[chan->dev], chan, omode); -} - -static Chan* -ethercreate(Chan*, char*, int, ulong) -{ - error(Eperm); - return 0; -} - -static void -etherclose(Chan* chan) -{ - netifclose(etherxx[chan->dev], chan); -} - -static long -etherread(Chan* chan, void* buf, long n, vlong off) -{ - Ether *ether; - ulong offset = off; - - ether = etherxx[chan->dev]; - if((chan->qid.type & QTDIR) == 0 && ether->ifstat){ - /* - * With some controllers it is necessary to reach - * into the chip to extract statistics. - */ - if(NETTYPE(chan->qid.path) == Nifstatqid) - return ether->ifstat(ether, buf, n, offset); - else if(NETTYPE(chan->qid.path) == Nstatqid) - ether->ifstat(ether, buf, 0, offset); - } - - return netifread(ether, chan, buf, n, offset); -} - -static Block* -etherbread(Chan* chan, long n, ulong offset) -{ - return netifbread(etherxx[chan->dev], chan, n, offset); -} - -static int -etherwstat(Chan* chan, uchar* dp, int n) -{ - return netifwstat(etherxx[chan->dev], chan, dp, n); -} - -static void -etherrtrace(Netfile* f, Etherpkt* pkt, int len) -{ - int i, n; - Block *bp; - - if(qwindow(f->in) <= 0) - return; - if(len > 58) - n = 58; - else - n = len; - bp = iallocb(64); - if(bp == nil) - return; - memmove(bp->wp, pkt->d, n); - i = TK2MS(MACHP(0)->ticks); - bp->wp[58] = len>>8; - bp->wp[59] = len; - bp->wp[60] = i>>24; - bp->wp[61] = i>>16; - bp->wp[62] = i>>8; - bp->wp[63] = i; - bp->wp += 64; - qpass(f->in, bp); -} - -Block* -etheriq(Ether* ether, Block* bp, int fromwire) -{ - Etherpkt *pkt; - ushort type; - int len, multi, tome, fromme; - Netfile **ep, *f, **fp, *fx; - Block *xbp; - - ether->inpackets++; - - pkt = (Etherpkt*)bp->rp; - len = BLEN(bp); - type = (pkt->type[0]<<8)|pkt->type[1]; - fx = 0; - ep = ðer->f[Ntypes]; - - multi = pkt->d[0] & 1; - /* check for valid multicast addresses */ - if(multi && memcmp(pkt->d, ether->bcast, sizeof(pkt->d)) != 0 && ether->prom == 0){ - if(!activemulti(ether, pkt->d, sizeof(pkt->d))){ - if(fromwire){ - freeb(bp); - bp = 0; - } - return bp; - } - } - - /* is it for me? */ - tome = memcmp(pkt->d, ether->ea, sizeof(pkt->d)) == 0; - fromme = memcmp(pkt->s, ether->ea, sizeof(pkt->s)) == 0; - - /* - * Multiplex the packet to all the connections which want it. - * If the packet is not to be used subsequently (fromwire != 0), - * attempt to simply pass it into one of the connections, thereby - * saving a copy of the data (usual case hopefully). - */ - for(fp = ether->f; fp < ep; fp++){ - if(f = *fp) - if(f->type == type || f->type < 0) - if(tome || multi || f->prom){ - /* Don't want to hear loopback or bridged packets */ - if(f->bridge && (tome || !fromwire && !fromme)) - continue; - if(!f->headersonly){ - if(fromwire && fx == 0) - fx = f; - else if(xbp = iallocb(len)){ - memmove(xbp->wp, pkt, len); - xbp->wp += len; - if(qpass(f->in, xbp) < 0) { - // print("soverflow for f->in\n"); - ether->soverflows++; - } - } - else { - // print("soverflow iallocb\n"); - ether->soverflows++; - } - } - else - etherrtrace(f, pkt, len); - } - } - - if(fx){ - if(qpass(fx->in, bp) < 0) { - // print("soverflow for fx->in\n"); - ether->soverflows++; - } - return 0; - } - if(fromwire){ - freeb(bp); - return 0; - } - - return bp; -} - -static int -etheroq(Ether* ether, Block* bp) -{ - int len, loopback; - Etherpkt *pkt; - - ether->outpackets++; - - /* - * Check if the packet has to be placed back onto the input queue, - * i.e. if it's a loopback or broadcast packet or the interface is - * in promiscuous mode. - * If it's a loopback packet indicate to etheriq that the data isn't - * needed and return, etheriq will pass-on or free the block. - * To enable bridging to work, only packets that were originated - * by this interface are fed back. - */ - pkt = (Etherpkt*)bp->rp; - len = BLEN(bp); - loopback = memcmp(pkt->d, ether->ea, sizeof(pkt->d)) == 0; - if(loopback || memcmp(pkt->d, ether->bcast, sizeof(pkt->d)) == 0 || ether->prom) - if(etheriq(ether, bp, loopback) == 0) - return len; - - qbwrite(ether->oq, bp); - if(ether->transmit != nil) - ether->transmit(ether); - return len; -} - -static long -etherwrite(Chan* chan, void* buf, long n, vlong) -{ - Ether *ether; - Block *bp; - int nn, onoff; - Cmdbuf *cb; - - ether = etherxx[chan->dev]; - if(NETTYPE(chan->qid.path) != Ndataqid) { - nn = netifwrite(ether, chan, buf, n); - if(nn >= 0) - return nn; - cb = parsecmd(buf, n); - if(cb->f[0] && strcmp(cb->f[0], "nonblocking") == 0){ - if(cb->nf <= 1) - onoff = 1; - else - onoff = atoi(cb->f[1]); - qnoblock(ether->oq, onoff); - free(cb); - return n; - } - free(cb); - if(ether->ctl!=nil) - return ether->ctl(ether,buf,n); - - error(Ebadctl); - } - - if(n > ether->maxmtu) - error(Etoobig); - if(n < ether->minmtu) - error(Etoosmall); - - bp = allocb(n); - if(waserror()){ - freeb(bp); - nexterror(); - } - memmove(bp->rp, buf, n); - if(!ether->f[NETID(chan->qid.path)]->bridge) - memmove(bp->rp+Eaddrlen, ether->ea, Eaddrlen); - poperror(); - bp->wp += n; - - return etheroq(ether, bp); -} - -static long -etherbwrite(Chan* chan, Block* bp, ulong) -{ - Ether *ether; - long n; - - n = BLEN(bp); - if(NETTYPE(chan->qid.path) != Ndataqid){ - if(waserror()) { - freeb(bp); - nexterror(); - } - n = etherwrite(chan, bp->rp, n, 0); - poperror(); - freeb(bp); - return n; - } - ether = etherxx[chan->dev]; - - if(n > ether->maxmtu){ - freeb(bp); - error(Etoobig); - } - if(n < ether->minmtu){ - freeb(bp); - error(Etoosmall); - } - - return etheroq(ether, bp); -} - -static struct { - char* type; - int (*reset)(Ether*); -} cards[MaxEther+1]; - -void -addethercard(char* t, int (*r)(Ether*)) -{ - static int ncard; - - if(ncard == MaxEther) - panic("too many ether cards"); - cards[ncard].type = t; - cards[ncard].reset = r; - ncard++; -} - -static Ether* -etherprobe(int cardno, int ctlrno) -{ - int i, lg; - ulong mb, bsz; - Ether *ether; - char buf[128], name[32]; - - ether = malloc(sizeof(Ether)); - if(ether == nil){ - print("etherprobe: no memory for Ether\n"); - return nil; - } - memset(ether, 0, sizeof(Ether)); - ether->ctlrno = ctlrno; - ether->mbps = 10; - ether->minmtu = ETHERMINTU; - ether->maxmtu = ETHERMAXTU; - - if(cardno >= MaxEther || cards[cardno].type == nil){ - free(ether); - return nil; - } - if(cards[cardno].reset(ether) < 0){ - free(ether); - return nil; - } - - snprint(name, sizeof(name), "ether%d", ctlrno); - - intrenable(ether->irq, ether->interrupt, ether, ether->irqlevel, name); - - i = sprint(buf, "#l%d: %s: %dMbps port 0x%luX irq %d", - ctlrno, cards[cardno].type, ether->mbps, ether->port, ether->irq); - i += sprint(buf+i, ": %2.2ux%2.2ux%2.2ux%2.2ux%2.2ux%2.2ux", - ether->ea[0], ether->ea[1], ether->ea[2], - ether->ea[3], ether->ea[4], ether->ea[5]); - sprint(buf+i, "\n"); - print(buf); - - /* compute log10(ether->mbps) into lg */ - for(lg = 0, mb = ether->mbps; mb >= 10; lg++) - mb /= 10; - if (lg > 0) - lg--; - if (lg > 14) /* 2^(14+17) = 2³¹ */ - lg = 14; - /* allocate larger output queues for higher-speed interfaces */ - bsz = 1UL << (lg + 17); /* 2¹⁷ = 128K, bsz = 2ⁿ × 128K */ - while (bsz > mainmem->maxsize / 8 && bsz > 128*1024) - bsz /= 2; - - netifinit(ether, name, Ntypes, bsz); - if(ether->oq == nil) { - ether->oq = qopen(bsz, Qmsg, 0, 0); - ether->limit = bsz; - } - if(ether->oq == nil) - panic("etherreset %s: can't allocate output queue of %ld bytes", name, bsz); - ether->alen = Eaddrlen; - memmove(ether->addr, ether->ea, Eaddrlen); - memset(ether->bcast, 0xFF, Eaddrlen); - - return ether; -} - -static void -etherreset(void) -{ - Ether *ether; - int cardno, ctlrno; - - cardno = ctlrno = 0; - while(cards[cardno].type != nil && ctlrno < MaxEther){ - if(etherxx[ctlrno] != nil){ - ctlrno++; - continue; - } - if((ether = etherprobe(cardno, ctlrno)) == nil){ - cardno++; - continue; - } - etherxx[ctlrno] = ether; - ctlrno++; - } -} - -static void -ethershutdown(void) -{ - Ether *ether; - int i; - - for(i = 0; i < MaxEther; i++){ - ether = etherxx[i]; - if(ether == nil) - continue; - if(ether->shutdown == nil) { - print("#l%d: no shutdown function\n", i); - continue; - } - (*ether->shutdown)(ether); - } -} - - -#define POLY 0xedb88320 - -/* really slow 32 bit crc for ethers */ -ulong -ethercrc(uchar *p, int len) -{ - int i, j; - ulong crc, b; - - crc = 0xffffffff; - for(i = 0; i < len; i++){ - b = *p++; - for(j = 0; j < 8; j++){ - crc = (crc>>1) ^ (((crc^b) & 1) ? POLY : 0); - b >>= 1; - } - } - return crc; -} - -Dev etherdevtab = { - 'l', - "ether", - - etherreset, - devinit, - ethershutdown, - etherattach, - etherwalk, - etherstat, - etheropen, - ethercreate, - etherclose, - etherread, - etherbread, - etherwrite, - etherbwrite, - devremove, - etherwstat, -}; diff --git a/sys/src/9/zynq/etherif.h b/sys/src/9/zynq/etherif.h deleted file mode 100644 index 80a39aa8b..000000000 --- a/sys/src/9/zynq/etherif.h +++ /dev/null @@ -1,40 +0,0 @@ -enum { - MaxEther = 1, - Ntypes = 8, -}; - -typedef struct Ether Ether; -struct Ether { - - int ctlrno; - int minmtu; - int maxmtu; - uchar ea[Eaddrlen]; - - int irq, irqlevel; - uintptr port; - - void (*attach)(Ether*); /* filled in by reset routine */ - void (*detach)(Ether*); - void (*transmit)(Ether*); - void (*interrupt)(Ureg*, void*); - long (*ifstat)(Ether*, void*, long, ulong); - long (*ctl)(Ether*, void*, long); /* custom ctl messages */ - void (*power)(Ether*, int); /* power on/off */ - void (*shutdown)(Ether*); /* shutdown hardware before reboot */ - void *ctlr; - - Queue* oq; - - Netif; -}; - -extern Block* etheriq(Ether*, Block*, int); -extern void addethercard(char*, int(*)(Ether*)); -extern ulong ethercrc(uchar*, int); -extern int parseether(uchar*, char*); - -#define NEXT(x, l) (((x)+1)%(l)) -#define PREV(x, l) (((x) == 0) ? (l)-1: (x)-1) -#define HOWMANY(x, y) (((x)+((y)-1))/(y)) -#define ROUNDUP(x, y) (HOWMANY((x), (y))*(y)) diff --git a/sys/src/9/zynq/etherzynq.c b/sys/src/9/zynq/etherzynq.c index de13b9020..0a7465c87 100644 --- a/sys/src/9/zynq/etherzynq.c +++ b/sys/src/9/zynq/etherzynq.c @@ -5,7 +5,7 @@ #include "fns.h" #include "io.h" #include "../port/netif.h" -#include "etherif.h" +#include "../port/etherif.h" #define Rbsz ROUNDUP(sizeof(Etherpkt)+16, 64) @@ -409,9 +409,7 @@ etherpnp(Ether *edev) edev->port = ETH0_BASE; ct.r = vmap(edev->port, BY2PG); edev->irq = ETH0IRQ; - edev->irqlevel = LEVEL; edev->ctlr = &ct; - edev->interrupt = ethirq; edev->transmit = ethtx; edev->attach = ethattach; edev->promiscuous = ethprom; @@ -423,6 +421,8 @@ etherpnp(Ether *edev) edev->ctlr = nil; return -1; } + + intrenable(edev->irq, ethirq, edev, LEVEL, edev->name); return 0; } diff --git a/sys/src/9/zynq/main.c b/sys/src/9/zynq/main.c index 9056f57d8..7670ad326 100644 --- a/sys/src/9/zynq/main.c +++ b/sys/src/9/zynq/main.c @@ -306,7 +306,7 @@ getconf(char *n) int isaconfig(char *, int, ISAConf*) { - return 1; + return 0; } void