+int readenv (size_t offset, u_char * buf)
+{
+ size_t end = offset + CFG_ENV_RANGE;
+ size_t amount_loaded = 0;
+ size_t blocksize, len;
+
+ u_char *char_ptr;
+
+ blocksize = nand_info[0].erasesize;
+ len = min(blocksize, CFG_ENV_SIZE);
+
+ while (amount_loaded < CFG_ENV_SIZE && offset < end) {
+ if (nand_block_isbad(&nand_info[0], offset)) {
+ offset += blocksize;
+ } else {
+ char_ptr = &buf[amount_loaded];
+ if (nand_read(&nand_info[0], offset, &len, char_ptr))
+ return 1;
+ offset += blocksize;
+ amount_loaded += len;
+ }
+ }
+ if (amount_loaded != CFG_ENV_SIZE)
+ return 1;
+
+ return 0;
+}
+