diff options
author | Rafał Miłecki <zajec5@gmail.com> | 2015-06-06 17:16:23 -0400 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 2015-06-21 15:54:32 -0400 |
commit | 94a0535baf4d78246f5e35c347d484baef8aeb2e (patch) | |
tree | 1cc72f38cf2338b2d36404c688661982ef92d41b /arch/mips | |
parent | cb2224d7c40e3d2dfc6f4a1676cd817acc79f012 (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.c | 37 |
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 | ||
37 | static char nvram_buf[NVRAM_SPACE]; | 37 | static char nvram_buf[NVRAM_SPACE]; |
38 | static size_t nvram_len; | ||
38 | static const u32 nvram_sizes[] = {0x8000, 0xF000, 0x10000}; | 39 | static const u32 nvram_sizes[] = {0x8000, 0xF000, 0x10000}; |
39 | 40 | ||
40 | static u32 find_nvram_size(void __iomem *end) | 41 | static 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; |