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);
}
|