Example #1
0
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;
}
Example #2
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;
}