add erik quanstros yukon2 ethernet driver
This commit is contained in:
parent
efe1c9087a
commit
2d101158e4
5 changed files with 2661 additions and 0 deletions
2362
sys/src/9/pc/etheryuk.c
Normal file
2362
sys/src/9/pc/etheryuk.c
Normal file
File diff suppressed because it is too large
Load diff
|
@ -105,6 +105,7 @@ install:V: $p$CONF
|
|||
$ETHER: etherif.h ../port/netif.h
|
||||
$AUDIO: ../port/audioif.h
|
||||
ether8003.$O ether8390.$O: ether8390.h
|
||||
etheryuk.$O: yukdump.h
|
||||
$VGA mouse.$O: screen.h /sys/include/memdraw.h
|
||||
devfloppy.$O: floppy.h
|
||||
archmp.$O mp.$O: apbootstrap.h
|
||||
|
|
|
@ -66,6 +66,7 @@ link
|
|||
# etherm10g pci
|
||||
ethersink
|
||||
ethersmc devi82365 cis
|
||||
etheryuk pci
|
||||
etherwavelan wavelan devi82365 cis pci
|
||||
etheriwl pci wifi
|
||||
etherrt2860 pci wifi
|
||||
|
|
|
@ -67,6 +67,7 @@ link
|
|||
ethervt6105m pci ethermii
|
||||
ethersink
|
||||
ethersmc devi82365 cis
|
||||
etheryuk pci
|
||||
etherwavelan wavelan devi82365 cis pci
|
||||
etheriwl pci wifi
|
||||
etherrt2860 pci wifi
|
||||
|
|
296
sys/src/9/pc/yukdump.h
Normal file
296
sys/src/9/pc/yukdump.h
Normal 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);
|
||||
}
|
Loading…
Reference in a new issue