-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
MIPS: BCM63XX: move nvram functions into their own file
Refactor nvram related functions into its own unit for easier expansion and exposure of the values to other drivers. Signed-off-by: Jonas Gorski <jonas.gorski@gmail.com> Patchwork: http://patchwork.linux-mips.org/patch/4516 Signed-off-by: John Crispin <blogic@openwrt.org>
- Loading branch information
Jonas Gorski
authored and
John Crispin
committed
Nov 9, 2012
1 parent
ba00e2e
commit e7e333c
Showing
5 changed files
with
154 additions
and
80 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,6 +1,7 @@ | ||
obj-y += clk.o cpu.o cs.o gpio.o irq.o prom.o reset.o setup.o \ | ||
timer.o dev-dsp.o dev-enet.o dev-flash.o dev-pcmcia.o \ | ||
dev-rng.o dev-spi.o dev-uart.o dev-wdt.o dev-usb-usbd.o | ||
obj-y += clk.o cpu.o cs.o gpio.o irq.o nvram.o prom.o reset.o \ | ||
setup.o timer.o dev-dsp.o dev-enet.o dev-flash.o \ | ||
dev-pcmcia.o dev-rng.o dev-spi.o dev-uart.o dev-wdt.o \ | ||
dev-usb-usbd.o | ||
obj-$(CONFIG_EARLY_PRINTK) += early_printk.o | ||
|
||
obj-y += boards/ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,104 @@ | ||
/* | ||
* 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) 2008 Maxime Bizon <mbizon@freebox.fr> | ||
* Copyright (C) 2008 Florian Fainelli <florian@openwrt.org> | ||
* Copyright (C) 2012 Jonas Gorski <jonas.gorski@gmail.com> | ||
*/ | ||
|
||
#define pr_fmt(fmt) "bcm63xx_nvram: " fmt | ||
|
||
#include <linux/init.h> | ||
#include <linux/export.h> | ||
#include <linux/kernel.h> | ||
#include <linux/if_ether.h> | ||
|
||
#include <bcm63xx_nvram.h> | ||
|
||
/* | ||
* 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[ETH_ALEN]; | ||
u8 reserved2[2]; | ||
u32 checksum_old; | ||
u8 reserved3[720]; | ||
u32 checksum_high; | ||
}; | ||
|
||
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) | ||
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 *oui; | ||
int count; | ||
|
||
if (mac_addr_used >= nvram.mac_addr_count) { | ||
pr_err("not enough mac addresses\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) { | ||
pr_err("unable to fetch mac address\n"); | ||
return -ENODEV; | ||
} | ||
} | ||
|
||
mac_addr_used++; | ||
return 0; | ||
} | ||
EXPORT_SYMBOL(bcm63xx_nvram_get_mac_address); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,35 @@ | ||
#ifndef BCM63XX_NVRAM_H | ||
#define BCM63XX_NVRAM_H | ||
|
||
#include <linux/types.h> | ||
|
||
/** | ||
* bcm63xx_nvram_init() - initializes nvram | ||
* @nvram: address of the nvram data | ||
* | ||
* Initialized the local nvram copy from the target address and checks | ||
* its checksum. | ||
* | ||
* Returns 0 on success. | ||
*/ | ||
int __init bcm63xx_nvram_init(void *nvram); | ||
|
||
/** | ||
* bcm63xx_nvram_get_name() - returns the board name according to nvram | ||
* | ||
* Returns the board name field from nvram. Note that it might not be | ||
* null terminated if it is exactly 16 bytes long. | ||
*/ | ||
u8 *bcm63xx_nvram_get_name(void); | ||
|
||
/** | ||
* bcm63xx_nvram_get_mac_address() - register & return a new mac address | ||
* @mac: pointer to array for allocated mac | ||
* | ||
* Registers and returns a mac address from the allocated macs from nvram. | ||
* | ||
* Returns 0 on success. | ||
*/ | ||
int bcm63xx_nvram_get_mac_address(u8 *mac); | ||
|
||
#endif /* BCM63XX_NVRAM_H */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters