diff options
author | Larry Finger <Larry.Finger@lwfinger.net> | 2008-08-20 18:45:06 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2008-08-29 16:24:07 -0400 |
commit | 31ce12fb3ebf88b054deb99ad729e84888bf6125 (patch) | |
tree | c219fa9add1d2e40b446c680f4759d2cd57bf01a /drivers/ssb/pci.c | |
parent | f5fe1fdaae86a74d6977fafd8fdd8697e398dafd (diff) |
ssb: Clean up extraction of MAC addresses from SPROM
Only rev 1 and 2 ssb SPROMs have fields named et0mac and et1mac;
however, all of the extraction routines extract pseudo data for these
fields from regions that are all 1's resulting in a hardware address
of FF:FF:FF:FF:FF:FF. This patch forces such a fill at the beginning of
the data extraction process, and only does the formal extraction if the
SPROM rev is 1 or 2.
Signed-off-by: Larry Finger <Larry.Finger@lwfinger.net>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/ssb/pci.c')
-rw-r--r-- | drivers/ssb/pci.c | 34 |
1 files changed, 14 insertions, 20 deletions
diff --git a/drivers/ssb/pci.c b/drivers/ssb/pci.c index 0de4b5e04505..d5cde051806b 100644 --- a/drivers/ssb/pci.c +++ b/drivers/ssb/pci.c | |||
@@ -327,11 +327,9 @@ static void sprom_extract_r123(struct ssb_sprom *out, const u16 *in) | |||
327 | s8 gain; | 327 | s8 gain; |
328 | u16 loc[3]; | 328 | u16 loc[3]; |
329 | 329 | ||
330 | if (out->revision == 3) { /* rev 3 moved MAC */ | 330 | if (out->revision == 3) /* rev 3 moved MAC */ |
331 | loc[0] = SSB_SPROM3_IL0MAC; | 331 | loc[0] = SSB_SPROM3_IL0MAC; |
332 | loc[1] = SSB_SPROM3_ET0MAC; | 332 | else { |
333 | loc[2] = SSB_SPROM3_ET1MAC; | ||
334 | } else { | ||
335 | loc[0] = SSB_SPROM1_IL0MAC; | 333 | loc[0] = SSB_SPROM1_IL0MAC; |
336 | loc[1] = SSB_SPROM1_ET0MAC; | 334 | loc[1] = SSB_SPROM1_ET0MAC; |
337 | loc[2] = SSB_SPROM1_ET1MAC; | 335 | loc[2] = SSB_SPROM1_ET1MAC; |
@@ -340,13 +338,15 @@ static void sprom_extract_r123(struct ssb_sprom *out, const u16 *in) | |||
340 | v = in[SPOFF(loc[0]) + i]; | 338 | v = in[SPOFF(loc[0]) + i]; |
341 | *(((__be16 *)out->il0mac) + i) = cpu_to_be16(v); | 339 | *(((__be16 *)out->il0mac) + i) = cpu_to_be16(v); |
342 | } | 340 | } |
343 | for (i = 0; i < 3; i++) { | 341 | if (out->revision < 3) { /* only rev 1-2 have et0, et1 */ |
344 | v = in[SPOFF(loc[1]) + i]; | 342 | for (i = 0; i < 3; i++) { |
345 | *(((__be16 *)out->et0mac) + i) = cpu_to_be16(v); | 343 | v = in[SPOFF(loc[1]) + i]; |
346 | } | 344 | *(((__be16 *)out->et0mac) + i) = cpu_to_be16(v); |
347 | for (i = 0; i < 3; i++) { | 345 | } |
348 | v = in[SPOFF(loc[2]) + i]; | 346 | for (i = 0; i < 3; i++) { |
349 | *(((__be16 *)out->et1mac) + i) = cpu_to_be16(v); | 347 | v = in[SPOFF(loc[2]) + i]; |
348 | *(((__be16 *)out->et1mac) + i) = cpu_to_be16(v); | ||
349 | } | ||
350 | } | 350 | } |
351 | SPEX(et0phyaddr, SSB_SPROM1_ETHPHY, SSB_SPROM1_ETHPHY_ET0A, 0); | 351 | SPEX(et0phyaddr, SSB_SPROM1_ETHPHY, SSB_SPROM1_ETHPHY_ET0A, 0); |
352 | SPEX(et1phyaddr, SSB_SPROM1_ETHPHY, SSB_SPROM1_ETHPHY_ET1A, | 352 | SPEX(et1phyaddr, SSB_SPROM1_ETHPHY, SSB_SPROM1_ETHPHY_ET1A, |
@@ -409,19 +409,11 @@ static void sprom_extract_r45(struct ssb_sprom *out, const u16 *in) | |||
409 | il0mac_offset = SSB_SPROM4_IL0MAC; | 409 | il0mac_offset = SSB_SPROM4_IL0MAC; |
410 | else | 410 | else |
411 | il0mac_offset = SSB_SPROM5_IL0MAC; | 411 | il0mac_offset = SSB_SPROM5_IL0MAC; |
412 | /* extract the equivalent of the r1 variables */ | 412 | /* extract the MAC address */ |
413 | for (i = 0; i < 3; i++) { | 413 | for (i = 0; i < 3; i++) { |
414 | v = in[SPOFF(il0mac_offset) + i]; | 414 | v = in[SPOFF(il0mac_offset) + i]; |
415 | *(((__be16 *)out->il0mac) + i) = cpu_to_be16(v); | 415 | *(((__be16 *)out->il0mac) + i) = cpu_to_be16(v); |
416 | } | 416 | } |
417 | for (i = 0; i < 3; i++) { | ||
418 | v = in[SPOFF(SSB_SPROM4_ET0MAC) + i]; | ||
419 | *(((__be16 *)out->et0mac) + i) = cpu_to_be16(v); | ||
420 | } | ||
421 | for (i = 0; i < 3; i++) { | ||
422 | v = in[SPOFF(SSB_SPROM4_ET1MAC) + i]; | ||
423 | *(((__be16 *)out->et1mac) + i) = cpu_to_be16(v); | ||
424 | } | ||
425 | SPEX(et0phyaddr, SSB_SPROM4_ETHPHY, SSB_SPROM4_ETHPHY_ET0A, 0); | 417 | SPEX(et0phyaddr, SSB_SPROM4_ETHPHY, SSB_SPROM4_ETHPHY_ET0A, 0); |
426 | SPEX(et1phyaddr, SSB_SPROM4_ETHPHY, SSB_SPROM4_ETHPHY_ET1A, | 418 | SPEX(et1phyaddr, SSB_SPROM4_ETHPHY, SSB_SPROM4_ETHPHY_ET1A, |
427 | SSB_SPROM4_ETHPHY_ET1A_SHIFT); | 419 | SSB_SPROM4_ETHPHY_ET1A_SHIFT); |
@@ -482,6 +474,8 @@ static int sprom_extract(struct ssb_bus *bus, struct ssb_sprom *out, | |||
482 | 474 | ||
483 | out->revision = in[size - 1] & 0x00FF; | 475 | out->revision = in[size - 1] & 0x00FF; |
484 | ssb_dprintk(KERN_DEBUG PFX "SPROM revision %d detected.\n", out->revision); | 476 | ssb_dprintk(KERN_DEBUG PFX "SPROM revision %d detected.\n", out->revision); |
477 | memset(out->et0mac, 0xFF, 6); /* preset et0 and et1 mac */ | ||
478 | memset(out->et1mac, 0xFF, 6); | ||
485 | if ((bus->chip_id & 0xFF00) == 0x4400) { | 479 | if ((bus->chip_id & 0xFF00) == 0x4400) { |
486 | /* Workaround: The BCM44XX chip has a stupid revision | 480 | /* Workaround: The BCM44XX chip has a stupid revision |
487 | * number stored in the SPROM. | 481 | * number stored in the SPROM. |