ether82563: support for i211 with iNVM. (thanks mfny and brennan for testing)
This commit is contained in:
parent
9cf3dc9a25
commit
b3d581752b
1 changed files with 49 additions and 5 deletions
|
@ -105,6 +105,9 @@ enum {
|
||||||
Torl = 0xC0/4, /* Total Octets Received */
|
Torl = 0xC0/4, /* Total Octets Received */
|
||||||
Totl = 0xC8/4, /* Total Octets Transmitted */
|
Totl = 0xC8/4, /* Total Octets Transmitted */
|
||||||
Nstatistics = 0x124/4,
|
Nstatistics = 0x124/4,
|
||||||
|
|
||||||
|
/* iNVM (i211) */
|
||||||
|
Invmdata0 = 0x12120,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum { /* Ctrl */
|
enum { /* Ctrl */
|
||||||
|
@ -128,6 +131,7 @@ enum { /* Status */
|
||||||
enum { /* Eec */
|
enum { /* Eec */
|
||||||
Nvpres = 1<<8,
|
Nvpres = 1<<8,
|
||||||
Autord = 1<<9,
|
Autord = 1<<9,
|
||||||
|
Flupd = 1<<19,
|
||||||
Sec1val = 1<<22,
|
Sec1val = 1<<22,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1687,6 +1691,40 @@ out:
|
||||||
return sum;
|
return sum;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
invmload(Ctlr *c)
|
||||||
|
{
|
||||||
|
int i, a;
|
||||||
|
u32int w;
|
||||||
|
|
||||||
|
memset(c->eeprom, 0xFF, sizeof(c->eeprom));
|
||||||
|
for(i=0; i<64; i++){
|
||||||
|
w = csr32r(c, Invmdata0 + i*4);
|
||||||
|
switch(w & 7){
|
||||||
|
case 0: // uninitialized structure
|
||||||
|
break;
|
||||||
|
case 1: // word auto load
|
||||||
|
a = (w & 0xFE00) >> 9;
|
||||||
|
if(a < nelem(c->eeprom))
|
||||||
|
c->eeprom[a] = w >> 16;
|
||||||
|
continue;
|
||||||
|
case 2: // csr auto load
|
||||||
|
i++;
|
||||||
|
case 3: // phy auto load
|
||||||
|
continue;
|
||||||
|
case 4: // rsa key sha256
|
||||||
|
i += 256/32;
|
||||||
|
case 5: // invalidated structure
|
||||||
|
continue;
|
||||||
|
default:
|
||||||
|
print("invm: %.2x %.8ux\n", i, w);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
defaultea(Ctlr *ctlr, uchar *ra)
|
defaultea(Ctlr *ctlr, uchar *ra)
|
||||||
{
|
{
|
||||||
|
@ -1716,17 +1754,22 @@ static int
|
||||||
i82563reset(Ctlr *ctlr)
|
i82563reset(Ctlr *ctlr)
|
||||||
{
|
{
|
||||||
uchar *ra;
|
uchar *ra;
|
||||||
int i, r;
|
int i, r, flag;
|
||||||
|
|
||||||
if(i82563detach(ctlr))
|
if(i82563detach(ctlr))
|
||||||
return -1;
|
return -1;
|
||||||
if(cttab[ctlr->type].flag & Fload)
|
flag = cttab[ctlr->type].flag;
|
||||||
|
|
||||||
|
if(ctlr->type == i210 && (csr32r(ctlr, Eec) & Flupd) == 0)
|
||||||
|
r = invmload(ctlr);
|
||||||
|
else if(flag & Fload)
|
||||||
r = fload(ctlr);
|
r = fload(ctlr);
|
||||||
else
|
else
|
||||||
r = eeload(ctlr);
|
r = eeload(ctlr);
|
||||||
|
|
||||||
if(r != 0 && r != 0xbaba){
|
if(r != 0 && r != 0xbaba){
|
||||||
print("%s: bad eeprom checksum - %#.4ux", cname(ctlr), r);
|
print("%s: bad eeprom checksum - %#.4ux", cname(ctlr), r);
|
||||||
if(cttab[ctlr->type].flag & Fbadcsum)
|
if(flag & Fbadcsum)
|
||||||
print("; ignored\n");
|
print("; ignored\n");
|
||||||
else {
|
else {
|
||||||
print("\n");
|
print("\n");
|
||||||
|
@ -1747,12 +1790,12 @@ i82563reset(Ctlr *ctlr)
|
||||||
csr32w(ctlr, Mta + i*4, 0);
|
csr32w(ctlr, Mta + i*4, 0);
|
||||||
csr32w(ctlr, Fcal, 0x00C28001);
|
csr32w(ctlr, Fcal, 0x00C28001);
|
||||||
csr32w(ctlr, Fcah, 0x0100);
|
csr32w(ctlr, Fcah, 0x0100);
|
||||||
if((cttab[ctlr->type].flag & Fnofct) == 0)
|
if((flag & Fnofct) == 0)
|
||||||
csr32w(ctlr, Fct, 0x8808);
|
csr32w(ctlr, Fct, 0x8808);
|
||||||
csr32w(ctlr, Fcttv, 0x0100);
|
csr32w(ctlr, Fcttv, 0x0100);
|
||||||
csr32w(ctlr, Fcrtl, ctlr->fcrtl);
|
csr32w(ctlr, Fcrtl, ctlr->fcrtl);
|
||||||
csr32w(ctlr, Fcrth, ctlr->fcrth);
|
csr32w(ctlr, Fcrth, ctlr->fcrth);
|
||||||
if(cttab[ctlr->type].flag & F75)
|
if(flag & F75)
|
||||||
csr32w(ctlr, Eitr, 128<<2); /* 128 ¼ microsecond intervals */
|
csr32w(ctlr, Eitr, 128<<2); /* 128 ¼ microsecond intervals */
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -1919,6 +1962,7 @@ didtype(int d)
|
||||||
case 0x150c: /* untested */
|
case 0x150c: /* untested */
|
||||||
return i82583;
|
return i82583;
|
||||||
case 0x1533: /* copper */
|
case 0x1533: /* copper */
|
||||||
|
case 0x1539: /* i211 copper */
|
||||||
return i210;
|
return i210;
|
||||||
case 0x153a: /* i217-lm */
|
case 0x153a: /* i217-lm */
|
||||||
case 0x153b: /* i217-v */
|
case 0x153b: /* i217-v */
|
||||||
|
|
Loading…
Reference in a new issue