Commit c3db8c649c6ab3da2f1411c4c6d61aecea054aa4

Authored by Guennadi Liakhovetski
Committed by Scott Wood
1 parent eafcabd15f

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

... ... @@ -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)