/* * clear flash by writing all 1's value */ int nvram_clear(int index) { unsigned long to; int len; RANV_PRINT("--> nvram_clear %d\n", index); RANV_CHECK_INDEX(-1); ra_nvram_close(index); down(&nvram_sem); //construct all 1s env block len = fb[index].flash_max_len - sizeof(fb[index].env.crc); if (!fb[index].env.data) { fb[index].env.data = (char *)kmalloc(len, GFP_KERNEL); if (!fb[index].env.data) return -ENOMEM; } memset(fb[index].env.data, 0xFF, len); //calculate crc fb[index].env.crc = (unsigned long)nv_crc32(0, (unsigned char *)fb[index].env.data, len); //write crc to flash to = fb[index].flash_offset; len = sizeof(fb[index].env.crc); ra_mtd_write_nm(RALINK_NVRAM_MTDNAME, to, len, (unsigned char *)&fb[index].env.crc); //write all 1s data to flash to = to + len; len = fb[index].flash_max_len - len; ra_mtd_write_nm(RALINK_NVRAM_MTDNAME, to, len, (unsigned char *)fb[index].env.data); RANV_PRINT("clear flash from 0x%x for 0x%x bytes\n", (unsigned int)to, len); fb[index].dirty = 0; fb[index].valid = 1; up(&nvram_sem); return 0; }
int nvram_commit(void) { unsigned long flags; unsigned char *buf; int ret; // Check early commit if (nvram_major < 0) return 0; if (!(buf = kmalloc(NVRAM_SPACE, GFP_KERNEL))) { printk("nvram_commit: out of memory\n"); return -ENOMEM; } /* Regenerate NVRAM */ spin_lock_irqsave(&nvram_lock, flags); ret = _nvram_commit((struct nvram_header *)buf); spin_unlock_irqrestore(&nvram_lock, flags); if (ret) goto done; mutex_lock(&nvram_sem); /* Write partition up to end of data area */ ret = ra_mtd_write_nm(MTD_NVRAM_NAME, NVRAM_MTD_OFFSET, NVRAM_SPACE, buf); if (ret) { printk("nvram_commit: write error\n"); } mutex_unlock(&nvram_sem); done: kfree(buf); return ret; }
int nvram_commit(int index) { unsigned long to; int i, len; char *p; RANV_PRINT("--> nvram_commit %d\n", index); RANV_CHECK_INDEX(-1); down(&nvram_sem); RANV_CHECK_VALID(); counter++; if (!fb[index].dirty) { RANV_PRINT("nothing to be committed\n"); up(&nvram_sem); return 0; } //construct env block len = fb[index].flash_max_len - sizeof(fb[index].env.crc); if (!fb[index].env.data) { fb[index].env.data = (char *)kmalloc(len, GFP_KERNEL); if (!fb[index].env.data) return -ENOMEM; } memset(fb[index].env.data, 0, len); p = fb[index].env.data; for (i = 0; i < MAX_CACHE_ENTRY; i++) { int l; if (!fb[index].cache[i].name || !fb[index].cache[i].value) break; l = strlen(fb[index].cache[i].name) + strlen(fb[index].cache[i].value) + 2; if (p - fb[index].env.data + 2 >= fb[index].flash_max_len) { RANV_ERROR("ENV_BLK_SIZE 0x%x is not enough!", ENV_BLK_SIZE); up(&nvram_sem); return -1; } snprintf(p, l, "%s=%s", fb[index].cache[i].name, fb[index].cache[i].value); p += l; } *p = '\0'; //ending null //calculate crc fb[index].env.crc = (unsigned long)nv_crc32(0, (unsigned char *)fb[index].env.data, len); //write crc to flash to = fb[index].flash_offset; len = sizeof(fb[index].env.crc); ra_mtd_write_nm(RALINK_NVRAM_MTDNAME, to, len, (unsigned char *)&fb[index].env.crc); //write data to flash to = to + len; len = fb[index].flash_max_len - len; ra_mtd_write_nm(RALINK_NVRAM_MTDNAME, to, len, (unsigned char *)fb[index].env.data); fb[index].dirty = 0; up(&nvram_sem); return 0; }