static int load_param_value(void) { unsigned char *addr = NULL; unsigned int err = 0, dev_id = 0; addr = vmalloc(PARAM_LEN); if (!addr) return -ENOMEM; err = BML_Open(dev_id); if (err) { printk(KERN_ERR "%s: open error\n", __FUNCTION__); goto fail; } err = read_param_block(dev_id, addr, BLOCK_OFFSET_MAIN); if (err) { printk(KERN_ERR "%s: read param error\n", __FUNCTION__); goto fail; } if (is_valid_param((status_t *)addr)) { memcpy(¶m_status, addr, sizeof(status_t)); } else { printk(KERN_ERR "%s: no param info in first param block\n", __FUNCTION__); err = read_param_block(dev_id, addr, BLOCK_OFFSET_BACKUP); if (err) { printk(KERN_ERR "%s: read backup param error\n", __FUNCTION__); goto fail; } if (is_valid_param((status_t *)addr)) { memcpy(¶m_status, addr, sizeof(status_t)); } else { printk(KERN_ERR "%s: no param info in backup param block\n", __FUNCTION__); err = -1; } } fail: vfree(addr); BML_Close(dev_id); return err; }
int save_param_value(void) { unsigned int err = 0, dev_id = 0; unsigned char *addr = NULL; addr = vmalloc(PARAM_LEN); if (!addr) return -ENOMEM; err = BML_Open(dev_id); if (err) { printk(KERN_ERR "%s: open error\n", __FUNCTION__); goto fail; } // if MAIN is not broken, copy MAIN to BACKUP err = read_param_block(dev_id, addr, BLOCK_OFFSET_MAIN); if (err) { printk(KERN_ERR "%s: read param error\n", __FUNCTION__); goto fail; } if (is_valid_param((status_t *)addr)) { err = write_param_block(dev_id, addr, BLOCK_OFFSET_BACKUP); if (err) { printk(KERN_ERR "%s: write backup param error\n", __FUNCTION__); goto fail; } } else printk(KERN_ERR "%s: main block is invalid, not backing up.\n", __FUNCTION__); // update MAIN memset(addr, 0, PARAM_LEN); memcpy(addr, ¶m_status, sizeof(status_t)); err = write_param_block(dev_id, addr, BLOCK_OFFSET_MAIN); if (err) { printk(KERN_ERR "%s: write param error\n", __FUNCTION__); goto fail; } fail: vfree(addr); BML_Close(dev_id); return err; }
static int load_param_value(void) { unsigned char *addr = NULL; unsigned int ret = 0; struct mtd_info *mtd; unsigned int retlen; addr = vmalloc(PARAM_LEN); if (!addr) return -ENOMEM; preempt_enable(); mtd = get_mtd_device_nm("param"); if (IS_ERR(mtd)) { printk("(%s)Cannot find param partition.\n",__func__); goto fail; } ret = mtd->read(mtd, 0x30000, PARAM_LEN, &retlen, addr); if (ret || retlen != PARAM_LEN) { printk("(%s)Failed to read param block.\n", __func__); put_mtd_device(mtd); goto fail; } if (is_valid_param((param_status_t *)addr)) { printk("param is valid\n"); memcpy(¶m_status, addr, sizeof(param_status_t)); } put_mtd_device(mtd); fail: vfree(addr); preempt_disable(); return ret; }