|
@@ -18,6 +18,7 @@
|
|
|
#include <bcm63xx_dev_uart.h>
|
|
|
#include <bcm63xx_regs.h>
|
|
|
#include <bcm63xx_io.h>
|
|
|
+#include <bcm63xx_nvram.h>
|
|
|
#include <bcm63xx_dev_pci.h>
|
|
|
#include <bcm63xx_dev_enet.h>
|
|
|
#include <bcm63xx_dev_dsp.h>
|
|
@@ -29,8 +30,6 @@
|
|
|
|
|
|
#define PFX "board_bcm963xx: "
|
|
|
|
|
|
-static struct bcm963xx_nvram nvram;
|
|
|
-static unsigned int mac_addr_used;
|
|
|
static struct board_info board;
|
|
|
|
|
|
/*
|
|
@@ -715,51 +714,15 @@ const char *board_get_name(void)
|
|
|
return board.name;
|
|
|
}
|
|
|
|
|
|
-/*
|
|
|
- * register & return a new board mac address
|
|
|
- */
|
|
|
-static int board_get_mac_address(u8 *mac)
|
|
|
-{
|
|
|
- u8 *oui;
|
|
|
- int count;
|
|
|
-
|
|
|
- if (mac_addr_used >= nvram.mac_addr_count) {
|
|
|
- printk(KERN_ERR PFX "not enough mac address\n");
|
|
|
- return -ENODEV;
|
|
|
- }
|
|
|
-
|
|
|
- memcpy(mac, nvram.mac_addr_base, ETH_ALEN);
|
|
|
- oui = mac + ETH_ALEN/2 - 1;
|
|
|
- count = mac_addr_used;
|
|
|
-
|
|
|
- while (count--) {
|
|
|
- u8 *p = mac + ETH_ALEN - 1;
|
|
|
-
|
|
|
- do {
|
|
|
- (*p)++;
|
|
|
- if (*p != 0)
|
|
|
- break;
|
|
|
- p--;
|
|
|
- } while (p != oui);
|
|
|
-
|
|
|
- if (p == oui) {
|
|
|
- printk(KERN_ERR PFX "unable to fetch mac address\n");
|
|
|
- return -ENODEV;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- mac_addr_used++;
|
|
|
- return 0;
|
|
|
-}
|
|
|
-
|
|
|
/*
|
|
|
* early init callback, read nvram data from flash and checksum it
|
|
|
*/
|
|
|
void __init board_prom_init(void)
|
|
|
{
|
|
|
- unsigned int check_len, i;
|
|
|
- u8 *boot_addr, *cfe, *p;
|
|
|
+ unsigned int i;
|
|
|
+ u8 *boot_addr, *cfe;
|
|
|
char cfe_version[32];
|
|
|
+ char *board_name;
|
|
|
u32 val;
|
|
|
|
|
|
/* read base address of boot chip select (0)
|
|
@@ -782,27 +745,15 @@ void __init board_prom_init(void)
|
|
|
strcpy(cfe_version, "unknown");
|
|
|
printk(KERN_INFO PFX "CFE version: %s\n", cfe_version);
|
|
|
|
|
|
- /* extract nvram data */
|
|
|
- memcpy(&nvram, boot_addr + BCM963XX_NVRAM_OFFSET, sizeof(nvram));
|
|
|
-
|
|
|
- /* check checksum before using data */
|
|
|
- if (nvram.version <= 4)
|
|
|
- check_len = offsetof(struct bcm963xx_nvram, checksum_old);
|
|
|
- else
|
|
|
- check_len = sizeof(nvram);
|
|
|
- val = 0;
|
|
|
- p = (u8 *)&nvram;
|
|
|
- while (check_len--)
|
|
|
- val += *p;
|
|
|
- if (val) {
|
|
|
+ if (bcm63xx_nvram_init(boot_addr + BCM963XX_NVRAM_OFFSET)) {
|
|
|
printk(KERN_ERR PFX "invalid nvram checksum\n");
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
+ board_name = bcm63xx_nvram_get_name();
|
|
|
/* find board by name */
|
|
|
for (i = 0; i < ARRAY_SIZE(bcm963xx_boards); i++) {
|
|
|
- if (strncmp(nvram.name, bcm963xx_boards[i]->name,
|
|
|
- sizeof(nvram.name)))
|
|
|
+ if (strncmp(board_name, bcm963xx_boards[i]->name, 16))
|
|
|
continue;
|
|
|
/* copy, board desc array is marked initdata */
|
|
|
memcpy(&board, bcm963xx_boards[i], sizeof(board));
|
|
@@ -812,7 +763,7 @@ void __init board_prom_init(void)
|
|
|
/* bail out if board is not found, will complain later */
|
|
|
if (!board.name[0]) {
|
|
|
char name[17];
|
|
|
- memcpy(name, nvram.name, 16);
|
|
|
+ memcpy(name, board_name, 16);
|
|
|
name[16] = 0;
|
|
|
printk(KERN_ERR PFX "unknown bcm963xx board: %s\n",
|
|
|
name);
|
|
@@ -890,11 +841,11 @@ int __init board_register_devices(void)
|
|
|
bcm63xx_pcmcia_register();
|
|
|
|
|
|
if (board.has_enet0 &&
|
|
|
- !board_get_mac_address(board.enet0.mac_addr))
|
|
|
+ !bcm63xx_nvram_get_mac_address(board.enet0.mac_addr))
|
|
|
bcm63xx_enet_register(0, &board.enet0);
|
|
|
|
|
|
if (board.has_enet1 &&
|
|
|
- !board_get_mac_address(board.enet1.mac_addr))
|
|
|
+ !bcm63xx_nvram_get_mac_address(board.enet1.mac_addr))
|
|
|
bcm63xx_enet_register(1, &board.enet1);
|
|
|
|
|
|
if (board.has_usbd)
|
|
@@ -907,7 +858,7 @@ int __init board_register_devices(void)
|
|
|
* do this after registering enet devices
|
|
|
*/
|
|
|
#ifdef CONFIG_SSB_PCIHOST
|
|
|
- if (!board_get_mac_address(bcm63xx_sprom.il0mac)) {
|
|
|
+ if (!bcm63xx_nvram_get_mac_address(bcm63xx_sprom.il0mac)) {
|
|
|
memcpy(bcm63xx_sprom.et0mac, bcm63xx_sprom.il0mac, ETH_ALEN);
|
|
|
memcpy(bcm63xx_sprom.et1mac, bcm63xx_sprom.il0mac, ETH_ALEN);
|
|
|
if (ssb_arch_register_fallback_sprom(
|