summaryrefslogtreecommitdiffstats
path: root/arch/mips
diff options
context:
space:
mode:
authorRafał Miłecki <zajec5@gmail.com>2015-06-06 17:16:23 -0400
committerRalf Baechle <ralf@linux-mips.org>2015-06-21 15:54:32 -0400
commit94a0535baf4d78246f5e35c347d484baef8aeb2e (patch)
tree1cc72f38cf2338b2d36404c688661982ef92d41b /arch/mips
parentcb2224d7c40e3d2dfc6f4a1676cd817acc79f012 (diff)
MIPS: BCM47xx: Add helper variable for storing NVRAM length
This simplifies code just a bit (also maybe makes it a bit more intuitive?) and will allow us to stop storing header. Right now we copy whole NVRAM including its header to the internal buffer. It is not needed to store a header as we don't access all these details like CRC, flags, etc. The next improvement that should follow is copying only the real contents. Signed-off-by: Rafał Miłecki <zajec5@gmail.com> Acked-by: Hauke Mehrtens <hauke@hauke-m.de> Cc: linux-mips@linux-mips.org Cc: Arend van Spriel <arend@broadcom.com> Cc: Hante Meuleman <meuleman@broadcom.com> Patchwork: https://patchwork.linux-mips.org/patch/10535/ Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
Diffstat (limited to 'arch/mips')
-rw-r--r--arch/mips/bcm47xx/nvram.c37
1 files changed, 16 insertions, 21 deletions
diff --git a/arch/mips/bcm47xx/nvram.c b/arch/mips/bcm47xx/nvram.c
index 2ed762ed4006..9ccdce816f84 100644
--- a/arch/mips/bcm47xx/nvram.c
+++ b/arch/mips/bcm47xx/nvram.c
@@ -35,6 +35,7 @@ struct nvram_header {
35}; 35};
36 36
37static char nvram_buf[NVRAM_SPACE]; 37static char nvram_buf[NVRAM_SPACE];
38static size_t nvram_len;
38static const u32 nvram_sizes[] = {0x8000, 0xF000, 0x10000}; 39static const u32 nvram_sizes[] = {0x8000, 0xF000, 0x10000};
39 40
40static u32 find_nvram_size(void __iomem *end) 41static u32 find_nvram_size(void __iomem *end)
@@ -60,7 +61,7 @@ static int nvram_find_and_copy(void __iomem *iobase, u32 lim)
60 u32 *src, *dst; 61 u32 *src, *dst;
61 u32 size; 62 u32 size;
62 63
63 if (nvram_buf[0]) { 64 if (nvram_len) {
64 pr_warn("nvram already initialized\n"); 65 pr_warn("nvram already initialized\n");
65 return -EEXIST; 66 return -EEXIST;
66 } 67 }
@@ -99,17 +100,18 @@ found:
99 for (i = 0; i < sizeof(struct nvram_header); i += 4) 100 for (i = 0; i < sizeof(struct nvram_header); i += 4)
100 *dst++ = __raw_readl(src++); 101 *dst++ = __raw_readl(src++);
101 header = (struct nvram_header *)nvram_buf; 102 header = (struct nvram_header *)nvram_buf;
102 if (header->len > size) { 103 nvram_len = header->len;
104 if (nvram_len > size) {
103 pr_err("The nvram size according to the header seems to be bigger than the partition on flash\n"); 105 pr_err("The nvram size according to the header seems to be bigger than the partition on flash\n");
104 header->len = size; 106 nvram_len = size;
105 } 107 }
106 if (header->len >= NVRAM_SPACE) { 108 if (nvram_len >= NVRAM_SPACE) {
107 pr_err("nvram on flash (%i bytes) is bigger than the reserved space in memory, will just copy the first %i bytes\n", 109 pr_err("nvram on flash (%i bytes) is bigger than the reserved space in memory, will just copy the first %i bytes\n",
108 header->len, NVRAM_SPACE - 1); 110 header->len, NVRAM_SPACE - 1);
109 header->len = NVRAM_SPACE - 1; 111 nvram_len = NVRAM_SPACE - 1;
110 } 112 }
111 /* proceed reading data after header */ 113 /* proceed reading data after header */
112 for (; i < header->len; i += 4) 114 for (; i < nvram_len; i += 4)
113 *dst++ = readl(src++); 115 *dst++ = readl(src++);
114 nvram_buf[NVRAM_SPACE - 1] = '\0'; 116 nvram_buf[NVRAM_SPACE - 1] = '\0';
115 117
@@ -144,7 +146,6 @@ static int nvram_init(void)
144#ifdef CONFIG_MTD 146#ifdef CONFIG_MTD
145 struct mtd_info *mtd; 147 struct mtd_info *mtd;
146 struct nvram_header header; 148 struct nvram_header header;
147 struct nvram_header *pheader;
148 size_t bytes_read; 149 size_t bytes_read;
149 int err; 150 int err;
150 151
@@ -155,20 +156,16 @@ static int nvram_init(void)
155 err = mtd_read(mtd, 0, sizeof(header), &bytes_read, (uint8_t *)&header); 156 err = mtd_read(mtd, 0, sizeof(header), &bytes_read, (uint8_t *)&header);
156 if (!err && header.magic == NVRAM_MAGIC && 157 if (!err && header.magic == NVRAM_MAGIC &&
157 header.len > sizeof(header)) { 158 header.len > sizeof(header)) {
158 if (header.len >= NVRAM_SPACE) { 159 nvram_len = header.len;
160 if (nvram_len >= NVRAM_SPACE) {
159 pr_err("nvram on flash (%i bytes) is bigger than the reserved space in memory, will just copy the first %i bytes\n", 161 pr_err("nvram on flash (%i bytes) is bigger than the reserved space in memory, will just copy the first %i bytes\n",
160 header.len, NVRAM_SPACE); 162 header.len, NVRAM_SPACE);
161 header.len = NVRAM_SPACE - 1; 163 nvram_len = NVRAM_SPACE - 1;
162 } 164 }
163 165
164 err = mtd_read(mtd, 0, header.len, &bytes_read, 166 err = mtd_read(mtd, 0, nvram_len, &nvram_len,
165 (u8 *)nvram_buf); 167 (u8 *)nvram_buf);
166 if (err) 168 return err;
167 return err;
168
169 pheader = (struct nvram_header *)nvram_buf;
170 pheader->len = header.len;
171 return 0;
172 } 169 }
173#endif 170#endif
174 171
@@ -183,7 +180,7 @@ int bcm47xx_nvram_getenv(const char *name, char *val, size_t val_len)
183 if (!name) 180 if (!name)
184 return -EINVAL; 181 return -EINVAL;
185 182
186 if (!nvram_buf[0]) { 183 if (!nvram_len) {
187 err = nvram_init(); 184 err = nvram_init();
188 if (err) 185 if (err)
189 return err; 186 return err;
@@ -231,16 +228,14 @@ char *bcm47xx_nvram_get_contents(size_t *nvram_size)
231{ 228{
232 int err; 229 int err;
233 char *nvram; 230 char *nvram;
234 struct nvram_header *header;
235 231
236 if (!nvram_buf[0]) { 232 if (!nvram_len) {
237 err = nvram_init(); 233 err = nvram_init();
238 if (err) 234 if (err)
239 return NULL; 235 return NULL;
240 } 236 }
241 237
242 header = (struct nvram_header *)nvram_buf; 238 *nvram_size = nvram_len - sizeof(struct nvram_header);
243 *nvram_size = header->len - sizeof(struct nvram_header);
244 nvram = vmalloc(*nvram_size); 239 nvram = vmalloc(*nvram_size);
245 if (!nvram) 240 if (!nvram)
246 return NULL; 241 return NULL;