From 5b753c1d01c6af23d7d37d37d9de30da8a971084 Mon Sep 17 00:00:00 2001 From: Jonas Gorski Date: Sat, 12 May 2012 22:51:08 +0200 Subject: [PATCH 60/79] MIPS: BCM63XX: move nvram related functions into their own file Signed-off-by: Jonas Gorski --- arch/mips/bcm63xx/Makefile | 6 +- arch/mips/bcm63xx/boards/board_bcm963xx.c | 74 +++-------------- arch/mips/bcm63xx/nvram.c | 84 ++++++++++++++++++++ arch/mips/include/asm/mach-bcm63xx/bcm63xx_nvram.h | 34 ++++++++ .../mips/include/asm/mach-bcm63xx/board_bcm963xx.h | 17 ---- 5 files changed, 134 insertions(+), 81 deletions(-) create mode 100644 arch/mips/bcm63xx/nvram.c create mode 100644 arch/mips/include/asm/mach-bcm63xx/bcm63xx_nvram.h --- a/arch/mips/bcm63xx/Makefile +++ b/arch/mips/bcm63xx/Makefile @@ -1,6 +1,6 @@ -obj-y += clk.o cpu.o cs.o gpio.o irq.o prom.o setup.o timer.o \ - dev-dsp.o dev-enet.o dev-flash.o dev-hsspi.o dev-pcmcia.o \ - dev-rng.o dev-spi.o dev-uart.o dev-usb-ehci.o \ +obj-y += clk.o cpu.o cs.o gpio.o irq.o nvram.o prom.o setup.o \ + timer.o dev-dsp.o dev-enet.o dev-flash.o dev-hsspi.o \ + dev-pcmcia.o dev-rng.o dev-spi.o dev-uart.o dev-usb-ehci.o \ dev-usb-ohci.o dev-wdt.o obj-$(CONFIG_EARLY_PRINTK) += early_printk.o --- a/arch/mips/bcm63xx/boards/board_bcm963xx.c +++ b/arch/mips/bcm63xx/boards/board_bcm963xx.c @@ -21,6 +21,7 @@ #include #include #include +#include #include #include #include @@ -41,8 +42,6 @@ #define CFE_OFFSET_64K 0x10000 #define CFE_OFFSET_128K 0x20000 -static struct bcm963xx_nvram nvram; -static unsigned int mac_addr_used; static struct board_info board; /* @@ -696,50 +695,16 @@ 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 *p; - 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); - p = mac + ETH_ALEN - 1; - count = mac_addr_used; - - while (count--) { - do { - (*p)++; - if (*p != 0) - break; - p--; - } while (p != mac); - } - - if (p == mac) { - printk(KERN_ERR PFX "unable to fetch mac address\n"); - return -ENODEV; - } - - mac_addr_used++; - return 0; -} - static void __init boardid_fixup(u8 *boot_addr) { struct bcm_tag *tag = (struct bcm_tag *)(boot_addr + CFE_OFFSET_64K); + char *board_name = (char *)bcm63xx_nvram_get_name(); /* check if bcm_tag is at 64k offset */ - if (strncmp(nvram.name, tag->board_id, BOARDID_LEN) != 0) { + if (strncmp(board_name, tag->board_id, BOARDID_LEN) != 0) { /* else try 128k */ tag = (struct bcm_tag *)(boot_addr + CFE_OFFSET_128K); - if (strncmp(nvram.name, tag->board_id, BOARDID_LEN) != 0) { + if (strncmp(board_name, tag->board_id, BOARDID_LEN) != 0) { /* No tag found */ printk(KERN_DEBUG "No bcm_tag found!\n"); return; @@ -749,9 +714,9 @@ static void __init boardid_fixup(u8 *boo if (tag->information1[0] != '+') return; - strncpy(nvram.name, &tag->information1[1], BOARDID_LEN); + strncpy(board_name, &tag->information1[1], BOARDID_LEN); - printk(KERN_INFO "Overriding boardid with '%s'\n", nvram.name); + printk(KERN_INFO "Overriding boardid with '%s'\n", board_name); } /* @@ -759,9 +724,10 @@ static void __init boardid_fixup(u8 *boo */ 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) @@ -786,32 +752,19 @@ 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) { - printk(KERN_ERR PFX "invalid nvram checksum\n"); + if (bcm63xx_nvram_init(boot_addr + BCM963XX_NVRAM_OFFSET)) return; - } if (strcmp(cfe_version, "unknown") != 0) { /* cfe present */ boardid_fixup(boot_addr); } + 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, + BCM63XX_NVRAM_NAMELEN)) continue; /* copy, board desc array is marked initdata */ memcpy(&board, bcm963xx_boards[i], sizeof(board)); @@ -821,7 +774,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); @@ -914,15 +867,15 @@ 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_enetsw && - !board_get_mac_address(board.enetsw.mac_addr)) + !bcm63xx_nvram_get_mac_address(board.enetsw.mac_addr)) bcm63xx_enetsw_register(&board.enetsw); if (board.has_ehci0) @@ -938,7 +891,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( --- /dev/null +++ b/arch/mips/bcm63xx/nvram.c @@ -0,0 +1,84 @@ +/* + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + * + * Copyright (C) 2012 Jonas Gorski + */ + +#define pr_fmt(fmt) "bcm63xx_nvram: " fmt + +#include +#include +#include + +#include + +static struct bcm963xx_nvram nvram; +static int mac_addr_used; + +int __init bcm63xx_nvram_init(void *addr) +{ + unsigned int check_len; + u8 *p; + u32 val; + + /* extract nvram data */ + memcpy(&nvram, addr, 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) { + pr_err("invalid nvram checksum\n"); + return -EINVAL; + } + + return 0; +} + +u8 *bcm63xx_nvram_get_name(void) +{ + return nvram.name; +} +EXPORT_SYMBOL(bcm63xx_nvram_get_name); + +int bcm63xx_nvram_get_mac_address(u8 *mac) +{ + u8 *p; + int count; + + if (mac_addr_used >= nvram.mac_addr_count) { + pr_err("not enough mac address\n"); + return -ENODEV; + } + + memcpy(mac, nvram.mac_addr_base, ETH_ALEN); + p = mac + ETH_ALEN - 1; + count = mac_addr_used; + + while (count--) { + do { + (*p)++; + if (*p != 0) + break; + p--; + } while (p != mac); + } + + if (p == mac) { + pr_err("unable to fetch mac address\n"); + return -ENODEV; + } + + mac_addr_used++; + return 0; +} +EXPORT_SYMBOL(bcm63xx_nvram_get_mac_address); --- /dev/null +++ b/arch/mips/include/asm/mach-bcm63xx/bcm63xx_nvram.h @@ -0,0 +1,34 @@ +#ifndef BCM63XX_NVRAM_H +#define BCM63XX_NVRAM_H + +#include + +#define BCM63XX_NVRAM_NAMELEN 16 + +/* + * nvram structure + */ +struct bcm963xx_nvram { + u32 version; + u8 reserved1[256]; + u8 name[BCM63XX_NVRAM_NAMELEN]; + u32 main_tp_number; + u32 psi_size; + u32 mac_addr_count; + u8 mac_addr_base[ETH_ALEN]; + u8 reserved2[2]; + u32 checksum_old; + u8 reserved3[720]; + u32 checksum_high; +}; + +int __init bcm63xx_nvram_init(void *); + +u8 *bcm63xx_nvram_get_name(void); + +/* + * register & return a new board mac address + */ +int bcm63xx_nvram_get_mac_address(u8 *mac); + +#endif /* BCM63XX_NVRAM_H */ --- a/arch/mips/include/asm/mach-bcm63xx/board_bcm963xx.h +++ b/arch/mips/include/asm/mach-bcm63xx/board_bcm963xx.h @@ -15,23 +15,6 @@ #define BCM963XX_NVRAM_OFFSET 0x580 /* - * nvram structure - */ -struct bcm963xx_nvram { - u32 version; - u8 reserved1[256]; - u8 name[16]; - u32 main_tp_number; - u32 psi_size; - u32 mac_addr_count; - u8 mac_addr_base[6]; - u8 reserved2[2]; - u32 checksum_old; - u8 reserved3[720]; - u32 checksum_high; -}; - -/* * board definition */ struct board_info {