diff options
| -rw-r--r-- | sys/src/9/pc/etherm10g.c | 1 | ||||
| -rw-r--r-- | sys/src/9/pc/wavelan.c | 1 | ||||
| -rw-r--r-- | sys/src/9/port/devether.c | 73 | ||||
| -rw-r--r-- | sys/src/9/port/etherif.h | 1 | ||||
| -rw-r--r-- | sys/src/9/port/netif.c | 2 | ||||
| -rw-r--r-- | sys/src/9/xen/etherxen.c | 1 | ||||
| -rw-r--r-- | sys/src/9/zynq/dat.h | 3 |
7 files changed, 48 insertions, 34 deletions
diff --git a/sys/src/9/pc/etherm10g.c b/sys/src/9/pc/etherm10g.c index fe55f3bc9..941808b63 100644 --- a/sys/src/9/pc/etherm10g.c +++ b/sys/src/9/pc/etherm10g.c @@ -1614,7 +1614,6 @@ m10gpnp(Ether *e) memmove(e->ea, c->ra, Eaddrlen); e->attach = m10gattach; - e->detach = m10gshutdown; e->transmit = m10gtransmit; e->interrupt = m10ginterrupt; e->ifstat = m10gifstat; diff --git a/sys/src/9/pc/wavelan.c b/sys/src/9/pc/wavelan.c index e2df7acd0..5e3c87a16 100644 --- a/sys/src/9/pc/wavelan.c +++ b/sys/src/9/pc/wavelan.c @@ -1234,7 +1234,6 @@ wavelanreset(Ether* ether, Ctlr *ctlr) ether->ctlr = ctlr; ether->mbps = 10; ether->attach = w_attach; - ether->detach = w_detach; ether->transmit = w_transmit; ether->ifstat = w_ifstat; ether->ctl = w_ctl; diff --git a/sys/src/9/port/devether.c b/sys/src/9/port/devether.c index 766242e01..abc56f325 100644 --- a/sys/src/9/port/devether.c +++ b/sys/src/9/port/devether.c @@ -14,23 +14,35 @@ extern int eipfmt(Fmt*); extern ushort ipcsum(uchar *); static Ether *etherxx[MaxEther]; +static Ether *etherprobe(int cardno, int ctlrno, char *conf); Chan* etherattach(char* spec) { ulong ctlrno; - char *p; + char *conf; Chan *chan; ctlrno = 0; - if(spec && *spec){ - ctlrno = strtoul(spec, &p, 0); - if((ctlrno == 0 && p == spec) || *p || (ctlrno >= MaxEther)) - error(Ebadarg); + if(*spec){ + ctlrno = strtoul(spec, &conf, 0); + if(ctlrno >= MaxEther) + error(Enodev); + if(conf == spec) + error(Ebadspec); + if(*conf){ + if(*conf != ':') + error(Ebadspec); + *conf++ = 0; + if(!iseve()) + error(Enoattach); + if(etherxx[ctlrno] != nil) + error(Einuse); + etherxx[ctlrno] = etherprobe(-1, ctlrno, conf); + } } - if(etherxx[ctlrno] == 0) + if(etherxx[ctlrno] == nil) error(Enodev); - chan = devattach('l', spec); if(waserror()){ chanfree(chan); @@ -350,7 +362,7 @@ addethercard(char* t, int (*r)(Ether*)) } static Ether* -etherprobe(int cardno, int ctlrno) +etherprobe(int cardno, int ctlrno, char *conf) { int i, lg; ulong mb, bsz; @@ -370,36 +382,41 @@ etherprobe(int cardno, int ctlrno) ether->maxmtu = ETHERMAXTU; if(cardno < 0){ - if(isaconfig("ether", ctlrno, ether) == 0){ - free(ether); - return nil; - } - for(cardno = 0; cards[cardno].type; cardno++){ - if(cistrcmp(cards[cardno].type, ether->type)) - continue; - for(i = 0; i < ether->nopt; i++){ - if(strncmp(ether->opt[i], "ea=", 3)) - continue; + if(conf != nil){ + kstrdup(ðer->type, conf); + ether->nopt = tokenize(ether->type, ether->opt, nelem(ether->opt)); + if(ether->nopt < 1) + goto Nope; + memmove(ðer->opt[0], ðer->opt[1], --ether->nopt*sizeof(ether->opt[0])); + } else if(isaconfig("ether", ctlrno, ether) == 0) + goto Nope; + + for(cardno = 0; cards[cardno].type != nil; cardno++) + if(cistrcmp(cards[cardno].type, ether->type) == 0) + break; + if(cards[cardno].type == nil) + goto Nope; + + for(i = 0; i < ether->nopt; i++){ + if(strncmp(ether->opt[i], "ea=", 3) == 0){ if(parseether(ether->ea, ðer->opt[i][3])) memset(ether->ea, 0, Eaddrlen); } - break; } } - - if(cardno >= MaxEther || cards[cardno].type == nil){ - free(ether); - return nil; - } + if(cardno >= MaxEther || cards[cardno].type == nil) + goto Nope; snprint(ether->name, sizeof(ether->name), "ether%d", ctlrno); if(cards[cardno].reset(ether) < 0){ +Nope: + if(conf != nil) free(ether->type); /* see kstrdup() above */ free(ether); return nil; } + ether->type = cards[cardno].type; 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); + ctlrno, ether->type, ether->mbps, ether->port, ether->irq, ether->ea); /* compute log10(ether->mbps) into lg */ for(lg = 0, mb = ether->mbps; mb >= 10; lg++) @@ -439,7 +456,7 @@ etherreset(void) fmtinstall('E', eipfmt); for(ctlrno = 0; ctlrno < MaxEther; ctlrno++){ - if((ether = etherprobe(-1, ctlrno)) == nil) + if((ether = etherprobe(-1, ctlrno, nil)) == nil) continue; etherxx[ctlrno] = ether; } @@ -451,7 +468,7 @@ etherreset(void) ctlrno++; continue; } - if((ether = etherprobe(cardno, ctlrno)) == nil){ + if((ether = etherprobe(cardno, ctlrno, nil)) == nil){ cardno++; continue; } diff --git a/sys/src/9/port/etherif.h b/sys/src/9/port/etherif.h index d846eb582..5ce7ce786 100644 --- a/sys/src/9/port/etherif.h +++ b/sys/src/9/port/etherif.h @@ -20,7 +20,6 @@ struct Ether { int maxmtu; void (*attach)(Ether*); /* filled in by reset routine */ - void (*detach)(Ether*); void (*transmit)(Ether*); long (*ifstat)(Ether*, void*, long, ulong); long (*ctl)(Ether*, void*, long); /* custom ctl messages */ diff --git a/sys/src/9/port/netif.c b/sys/src/9/port/netif.c index 4b818938e..48bcdd405 100644 --- a/sys/src/9/port/netif.c +++ b/sys/src/9/port/netif.c @@ -80,7 +80,7 @@ netifgen(Chan *c, char*, Dirtab *vp, int, int i, Dir *dp) break; case 1: q.path = Naddrqid; - devdir(c, q, "addr", 0, eve, 0666, dp); + devdir(c, q, "addr", 0, eve, 0444, dp); break; case 2: q.path = Nstatqid; diff --git a/sys/src/9/xen/etherxen.c b/sys/src/9/xen/etherxen.c index 8d3fc4c26..fa13a16e6 100644 --- a/sys/src/9/xen/etherxen.c +++ b/sys/src/9/xen/etherxen.c @@ -474,7 +474,6 @@ pnp(Ether* ether) memmove(ether->ea, ea, sizeof ether->ea); ether->mbps = 100; // XXX what speed? ether->attach = etherxenattach; - ether->detach = nil; ether->transmit = etherxentransmit; ether->irq = -1; ether->tbdf = BUSUNKNOWN; diff --git a/sys/src/9/zynq/dat.h b/sys/src/9/zynq/dat.h index 811b23407..b18a5551d 100644 --- a/sys/src/9/zynq/dat.h +++ b/sys/src/9/zynq/dat.h @@ -159,13 +159,14 @@ struct Mach int stack[1]; }; +#define NISAOPT 8 struct ISAConf { char *type; ulong port; int irq; int nopt; - char *opt[1]; + char *opt[NISAOPT]; }; #define BUSUNKNOWN -1 |
