Commit c3db8c649c6ab3da2f1411c4c6d61aecea054aa4
Committed by
Scott Wood
1 parent
eafcabd15f
Exists in
master
and in
54 other branches
NAND: Do not write or read a whole block if it is larger than the environment
Environment can be smaller than NAND block size, do not need to read a whole block and minimum for writing is one page. Also remove an unused variable. Signed-off-by: Guennadi Liakhovetski <lg@denx.de> Signed-off-by: Scott Wood <scottwood@freescale.com>
Showing 1 changed file with 9 additions and 9 deletions Side-by-side Diff
common/env_nand.c
... | ... | @@ -159,22 +159,23 @@ |
159 | 159 | { |
160 | 160 | size_t end = offset + CFG_ENV_RANGE; |
161 | 161 | size_t amount_saved = 0; |
162 | - size_t blocksize; | |
162 | + size_t blocksize, len; | |
163 | 163 | |
164 | 164 | u_char *char_ptr; |
165 | 165 | |
166 | 166 | blocksize = nand_info[0].erasesize; |
167 | + len = min(blocksize, CFG_ENV_SIZE); | |
167 | 168 | |
168 | 169 | while (amount_saved < CFG_ENV_SIZE && offset < end) { |
169 | 170 | if (nand_block_isbad(&nand_info[0], offset)) { |
170 | 171 | offset += blocksize; |
171 | 172 | } else { |
172 | 173 | char_ptr = &buf[amount_saved]; |
173 | - if (nand_write(&nand_info[0], offset, &blocksize, | |
174 | + if (nand_write(&nand_info[0], offset, &len, | |
174 | 175 | char_ptr)) |
175 | 176 | return 1; |
176 | 177 | offset += blocksize; |
177 | - amount_saved += blocksize; | |
178 | + amount_saved += len; | |
178 | 179 | } |
179 | 180 | } |
180 | 181 | if (amount_saved != CFG_ENV_SIZE) |
181 | 182 | |
182 | 183 | |
183 | 184 | |
... | ... | @@ -261,21 +262,22 @@ |
261 | 262 | { |
262 | 263 | size_t end = offset + CFG_ENV_RANGE; |
263 | 264 | size_t amount_loaded = 0; |
264 | - size_t blocksize; | |
265 | + size_t blocksize, len; | |
265 | 266 | |
266 | 267 | u_char *char_ptr; |
267 | 268 | |
268 | 269 | blocksize = nand_info[0].erasesize; |
270 | + len = min(blocksize, CFG_ENV_SIZE); | |
269 | 271 | |
270 | 272 | while (amount_loaded < CFG_ENV_SIZE && offset < end) { |
271 | 273 | if (nand_block_isbad(&nand_info[0], offset)) { |
272 | 274 | offset += blocksize; |
273 | 275 | } else { |
274 | 276 | char_ptr = &buf[amount_loaded]; |
275 | - if (nand_read(&nand_info[0], offset, &blocksize, char_ptr)) | |
277 | + if (nand_read(&nand_info[0], offset, &len, char_ptr)) | |
276 | 278 | return 1; |
277 | 279 | offset += blocksize; |
278 | - amount_loaded += blocksize; | |
280 | + amount_loaded += len; | |
279 | 281 | } |
280 | 282 | } |
281 | 283 | if (amount_loaded != CFG_ENV_SIZE) |
282 | 284 | |
283 | 285 | |
... | ... | @@ -345,12 +347,10 @@ |
345 | 347 | void env_relocate_spec (void) |
346 | 348 | { |
347 | 349 | #if !defined(ENV_IS_EMBEDDED) |
348 | - size_t total; | |
349 | 350 | int ret; |
350 | 351 | |
351 | - total = CFG_ENV_SIZE; | |
352 | 352 | ret = readenv(CFG_ENV_OFFSET, (u_char *) env_ptr); |
353 | - if (ret || total != CFG_ENV_SIZE) | |
353 | + if (ret) | |
354 | 354 | return use_default(); |
355 | 355 | |
356 | 356 | if (crc32(0, env_ptr->data, ENV_SIZE) != env_ptr->crc) |