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; }
static int load_parameter_value(void) { unsigned char *addr = NULL; unsigned int err = 0, dev_id = 0; status_t *status; addr = kmalloc(PARAM_LEN, GFP_KERNEL); if (!addr) return -ENOMEM; err = read_param_block(dev_id, addr); if (err) { printk(KERN_ERR "%s: read param error\n", __FUNCTION__); goto fail; } status = (status_t *)addr; if ((status->param_magic == PARAM_MAGIC) && (status->param_version == PARAM_VERSION)) { memcpy(¶m_status, (char *)status, sizeof(status_t)); } else { printk(KERN_ERR "%s: no param info\n", __FUNCTION__); err = -1; } fail: kfree(addr); 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; }