int _nvram_read_mtd(unsigned char *buf) { int ret = ra_mtd_read_nm(MTD_NVRAM_NAME, NVRAM_MTD_OFFSET, NVRAM_SPACE, buf); if (ret) { return -EIO; } return 0; }
static int init_nvram_block(int index) { unsigned long from; int i, j, len; char *p, *q; i = index; RANV_PRINT("--> nvram_init %d\n", index); RANV_CHECK_INDEX(-1); if (fb[index].valid) return -EINVAL; //read crc from flash from = fb[i].flash_offset; len = sizeof(fb[i].env.crc); ra_mtd_read_nm(RALINK_NVRAM_MTDNAME, from, len, (unsigned char *)&fb[i].env.crc); //read data from flash from = from + len; len = fb[i].flash_max_len - len; fb[i].env.data = (char *)kmalloc(len, GFP_KERNEL); if (!fb[i].env.data) return -ENOMEM; ra_mtd_read_nm(RALINK_NVRAM_MTDNAME, from, len, (unsigned char *)fb[i].env.data); //check crc if (nv_crc32(0, fb[i].env.data, len) != fb[i].env.crc) { RANV_PRINT("Bad CRC %x, ignore values in flash.\n", (unsigned int)fb[i].env.crc); memset(fb[index].env.data, 0, len); //kfree(fb[i].env.data); fb[i].valid = 1; fb[i].dirty = 0; return -1; } //parse env to cache p = fb[i].env.data; for (j = 0; j < MAX_CACHE_ENTRY; j++) { if (NULL == (q = strchr(p, '='))) { RANV_PRINT("parsed failed - cannot find '='\n"); break; } *q = '\0'; //strip '=' fb[i].cache[j].name = kstrdup(p, GFP_KERNEL); //printk(" %d '%s'->", i, p); p = q + 1; //value if (NULL == (q = strchr(p, '\0'))) { RANV_PRINT("parsed failed - cannot find '\\0'\n"); break; } fb[i].cache[j].value = kstrdup(p, GFP_KERNEL); //printk("'%s'\n", p); p = q + 1; //next entry if (p - fb[i].env.data + 1 >= len) { //end of block break; } if (*p == '\0') { //end of env break; } } if (j == MAX_CACHE_ENTRY) RANV_PRINT("run out of env cache, please increase MAX_CACHE_ENTRY\n"); fb[i].valid = 1; fb[i].dirty = 0; return 0; }