add erik quanstros yukon2 ethernet driver

This commit is contained in:
cinap_lenrek 2013-07-09 18:52:01 +02:00
parent efe1c9087a
commit 2d101158e4
5 changed files with 2661 additions and 0 deletions

2362
sys/src/9/pc/etheryuk.c Normal file

File diff suppressed because it is too large Load diff

View file

@ -105,6 +105,7 @@ install:V: $p$CONF
$ETHER: etherif.h ../port/netif.h $ETHER: etherif.h ../port/netif.h
$AUDIO: ../port/audioif.h $AUDIO: ../port/audioif.h
ether8003.$O ether8390.$O: ether8390.h ether8003.$O ether8390.$O: ether8390.h
etheryuk.$O: yukdump.h
$VGA mouse.$O: screen.h /sys/include/memdraw.h $VGA mouse.$O: screen.h /sys/include/memdraw.h
devfloppy.$O: floppy.h devfloppy.$O: floppy.h
archmp.$O mp.$O: apbootstrap.h archmp.$O mp.$O: apbootstrap.h

View file

@ -66,6 +66,7 @@ link
# etherm10g pci # etherm10g pci
ethersink ethersink
ethersmc devi82365 cis ethersmc devi82365 cis
etheryuk pci
etherwavelan wavelan devi82365 cis pci etherwavelan wavelan devi82365 cis pci
etheriwl pci wifi etheriwl pci wifi
etherrt2860 pci wifi etherrt2860 pci wifi

View file

@ -67,6 +67,7 @@ link
ethervt6105m pci ethermii ethervt6105m pci ethermii
ethersink ethersink
ethersmc devi82365 cis ethersmc devi82365 cis
etheryuk pci
etherwavelan wavelan devi82365 cis pci etherwavelan wavelan devi82365 cis pci
etheriwl pci wifi etheriwl pci wifi
etherrt2860 pci wifi etherrt2860 pci wifi

296
sys/src/9/pc/yukdump.h Normal file
View file

@ -0,0 +1,296 @@
typedef struct Regdump Regdump;
struct Regdump {
uint offset;
uint size;
char *name;
};
Regdump pcireg[] = {
Pciphy, 32, "Pciphy",
Pciclk, 32, "Pciclk",
Pcistate, 32, "Pcistate",
};
static Regdump gmacreg[] = {
Stat, 16, "Stat",
Ctl, 16, "Ctl",
Txctl, 16, "Txctl",
Rxctl, 16, "Rxctl",
Txflow, 16, "Txflow",
Txparm, 16, "Txparm",
Serctl, 16, "Serctl",
Txirq, 16, "Txirq",
Rxirq, 16, "Rxirq",
Trirq, 16, "Trirq",
Txmask, 16, "Txmask",
Rxmask, 16, "Rxmask",
Trmask, 16, "Trmask",
Smictl, 16, "Smictl",
Smidata, 16, "Smidata",
Phyaddr, 16, "Phyaddr",
Mchash+0, 16, "Mchash",
Mchash+2, 16, "Mchash",
Mchash+4, 16, "Mchash",
Mchash+6, 16, "Mchash",
Ea0, 16, "Ea0",
Ea0+2, 16, "Ea0",
Ea0+4, 16, "Ea0",
Ea1, 16, "Ea1",
Ea1+2, 16, "Ea1",
Ea1+4, 16, "Ea1",
};
static Regdump macreg[] = {
Txactl, 8, "Txactl",
Gfrxctl, 32, "Gfrxctl",
Grxfm, 32, "Grxfm",
Grxft, 32, "Grxft",
Grxtt, 32, "Grxtt",
Gmfctl, 32, "Gmfctl",
Mac, 32, "Mac",
Phy, 32, "Phy",
Irqm, 8, "Irqm",
Linkctl, 8, "Linkctl",
Rxwp, 32, "Rxwp",
Rxrp, 32, "Rxrp",
Rxrlev, 32, "Rxrlev",
};
static Regdump reg[] = {
Ctst, 16, "Ctst",
Pwrctl, 8, "Pwrctl",
Isr, 32, "Isr",
Ism, 32, "Ism",
Hwe, 32, "Hwe",
Hwem, 32, "Hwem",
Isrc2, 32, "Isrc2",
Macadr/2, 16, "Macadr",
Macadr/2+1, 16, "Macadr",
Macadr/2+2, 16, "Macadr",
Pmd, 8, "Pmd",
Maccfg, 8, "Maccfg",
Chip, 8, "Chip",
Ramcnt, 8, "Ramcnt",
Clkgate, 8, "Clkgate",
Hres, 8, "Hres",
Clkctl, 32, "Clkctl",
Tstctl1, 8, "Tstctl1",
Asfcs, 8, "Asfcs",
Asfhost, 32, "Asfhost",
Statctl, 32, "Statctl",
Stattl, 16, "Stattl",
Stataddr, 32, "Stataddr",
Statth, 16, "Statth",
Stathd, 16, "Stathd",
Statwm, 8, "Statwm",
Statiwm, 8, "Statiwm",
};
static char*
dumppci(Ctlr *c, char *p, char *e)
{
int i;
Regdump *r;
r = pcireg;
p = seprint(p, e, "/* pci reg */\n");
for(i = 0; i < nelem(pcireg); i++)
switch(r[i].size){
default:
p = seprint(p, e, "%s: bug size %d\n", r[i].name, r[i].size);
break;
case 32:
p = seprint(p, e, "%s: %.8ux\n", r[i].name, pcicfgr32(c->p, r[i].offset));
break;
}
return p;
}
static char*
dumpgmac(Ctlr *c, char *p, char *e)
{
int i;
Regdump *r;
r = gmacreg;
p = seprint(p, e, "/* gmac reg */\n");
for(i = 0; i < nelem(gmacreg); i++)
switch(r[i].size){
default:
p = seprint(p, e, "%s: bug size %d\n", r[i].name, r[i].size);
break;
case 16:
p = seprint(p, e, "%s: %.4ux\n", r[i].name, gmacread(c, r[i].offset));
break;
case 32:
p = seprint(p, e, "%s: %.8ux\n", r[i].name, gmacread32(c, r[i].offset));
break;
}
return p;
}
static char*
dumpmac(Ctlr *c, char *p, char *e)
{
int i;
Regdump *r;
r = macreg;
p = seprint(p, e, "/* mac reg */\n");
for(i = 0; i < nelem(macreg); i++)
switch(r[i].size){
default:
p = seprint(p, e, "%s: bug size %d\n", r[i].name, r[i].size);
break;
case 8:
p = seprint(p, e, "%s: %.2ux\n", r[i].name, macread8(c, r[i].offset));
break;
case 32:
p = seprint(p, e, "%s: %.8ux\n", r[i].name, macread32(c, r[i].offset));
break;
}
return p;
}
static char*
dumpreg(Ctlr *c, char *p, char *e)
{
int i;
Regdump *r;
r = reg;
p = seprint(p, e, "/* reg */\n");
for(i = 0; i < nelem(reg); i++)
switch(r[i].size){
default:
p = seprint(p, e, "%s: bug size %d\n", r[i].name, r[i].size);
break;
case 8:
p = seprint(p, e, "%s: %.2ux\n", r[i].name, c->reg8[r[i].offset]);
break;
case 16:
p = seprint(p, e, "%s: %.4ux\n", r[i].name, c->reg16[r[i].offset]);
break;
case 32:
p = seprint(p, e, "%s: %.8ux\n", r[i].name, c->reg[r[i].offset]);
break;
}
return p;
}
static char *optab[256] = {
[Orxchks] "rxsum",
[Orxstat] "rxstat",
[Otxidx] "txidx",
};
static char*
rs(uint r)
{
char *s;
s = optab[r & 0xff];
if(s == nil)
s = "";
return s;
}
static int
nblocktab(int qno)
{
uint i;
Block *b;
ilock(&rbtab[qno]);
b = rbtab[qno].b;
for(i = 0;; i++){
if(b == nil)
break;
b = b->next;
}
iunlock(&rbtab[qno]);
return i;
}
static char*
dumpring(Sring *r, Block **t, int qno, char *p, char *e)
{
int m, n;
uint i;
p = seprint(p, e,
"bring: rp %ud wp %ud cnt %ud m %ud : ",
r->rp, r->wp, r->cnt, r->m);
m = -1;
n = 0;
for(i = 0; i < r->cnt; i++){
n += t[i] != nil;
if(m>=0 && t[i] == nil){
p = seprint(p, e, "%ud", m);
if(i != m + 1)
p = seprint(p, e, "-%ud", i-1);
p = seprint(p, e, " ");
m = -1;
}else if(m<0 && t[i] != nil)
m = i;
}
if(m>=0){
p = seprint(p, e, "%ud", m);
if(i != m + 1)
p = seprint(p, e, "-%ud ", i-1);
}
p = seprint(p, e, "n=%d/%d", n, r->cnt);
return seprint(p, e, " list %d\n", nblocktab(qno));
}
/* debug; remove */
static void
descriptorfu(Ether *e, uint qoff)
{
char buf[PRINTSIZE], *p, *f;
uint q, qm1;
Block *b, *a, **bring;
Ctlr *c;
Status *t, *v;
Sring *r;
c = e->ctlr;
f = buf + sizeof buf;
if(qoff == Qtx){
bring = c->tbring;
r = &c->tx;
p = seprint(buf, f, "tx ");
}else{
bring = c->rbring;
r = &c->rx;
p = seprint(buf, f, "rx ");
}
q = prread16(c, qoff + Pgetidx);
print(" getidx %ud\n", q);
if(q >= r->cnt){
q &= r->m;
print(" try getidx %ud\n", q);
}
qm1 = q-1 & r->m;
t = r->r + q;
v = r->r + qm1;
b = bring[q];
a = bring[qm1];
print(" %0.4d %.2ux l=%d p=%#p @%#p\n", q, t->op,
(uint)getle(t->l, 2), KZERO+(ulong)getle(t->status, 4), Pciwaddrl(t));
print(" %0.4d %.2ux l=%d p=%#p @%#p\n", qm1, t->op,
(uint)getle(v->l, 2), KZERO+(ulong)getle(v->status, 4), Pciwaddrl(v));
if(r == &c->rx)
print(" %#p %#p (wp)\n", b? b->wp: 0, a? a->wp: 0);
else
print(" %#p %#p (rp)\n", b? b->rp: 0, a? a->rp: 0);
dumpring(r, bring, c->qno, p, f);
print(" %s", buf);
}