+obj-y += cfe_env.o
--- /dev/null
+++ b/arch/mips/bcm47xx/cfe_env.c
-@@ -0,0 +1,229 @@
+@@ -0,0 +1,228 @@
+/*
+ * CFE environment variable access
+ *
+ * @return value of variable or NULL if undefined
+ */
+
-+char*
-+cfe_env_get(unsigned char *nv_buf, char* name)
++char *cfe_env_get(unsigned char *nv_buf, const char *name)
+{
+ int size;
+ unsigned char *buffer;
+
--- a/arch/mips/bcm47xx/nvram.c
+++ b/arch/mips/bcm47xx/nvram.c
-@@ -22,6 +22,8 @@
-
+@@ -37,6 +37,8 @@ struct nvram_header {
static char nvram_buf[NVRAM_SPACE];
+ static size_t nvram_len;
static const u32 nvram_sizes[] = {0x8000, 0xF000, 0x10000};
+static int cfe_env;
+extern char *cfe_env_get(char *nv_buf, const char *name);
static u32 find_nvram_size(void __iomem *end)
{
-@@ -51,6 +53,26 @@ static int nvram_find_and_copy(void __io
+@@ -66,6 +68,26 @@ static int nvram_find_and_copy(void __io
return -EEXIST;
}
+
+ /* XXX: hack for supporting the CFE environment stuff on WGT634U */
+ if (lim >= 8 * 1024 * 1024) {
-+ src = (u32 *) iobase + 8 * 1024 * 1024 - 0x2000;
-+ dst = (u32 *) nvram_buf;
++ src = (u32 *)(iobase + 8 * 1024 * 1024 - 0x2000);
++ dst = (u32 *)nvram_buf;
+
+ if ((*src & 0xff00ff) == 0x000001) {
+ printk("early_nvram_init: WGT634U NVRAM found.\n");
/* TODO: when nvram is on nand flash check for bad blocks first. */
off = FLASH_MIN;
while (off <= lim) {
-@@ -142,6 +164,13 @@ int bcm47xx_nvram_getenv(char *name, cha
- return err;
- }
+@@ -180,6 +202,13 @@ int bcm47xx_nvram_getenv(const char *nam
+ if (!name)
+ return -EINVAL;
+ if (cfe_env) {
+ value = cfe_env_get(nvram_buf, name);
+ return snprintf(val, val_len, "%s", value);
+ }
+
- /* Look for name=value and return value */
- var = &nvram_buf[sizeof(struct nvram_header)];
- end = nvram_buf + sizeof(nvram_buf) - 2;
+ if (!nvram_len) {
+ err = nvram_init();
+ if (err)