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, &param_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;
}
Beispiel #2
0
int save_parameter_value(void)
{
	unsigned int err = 0, dev_id = 0;
	unsigned char *addr = NULL;

	addr = kmalloc(PARAM_LEN, GFP_KERNEL);
	if (!addr)
		return -ENOMEM;
	memset(addr, 0, PARAM_LEN);
	memcpy(addr, &param_status, sizeof(status_t));
	
	err = write_param_block(dev_id, addr);
	if (err) {
		printk(KERN_ERR "%s: read param error\n", __FUNCTION__);
		goto fail;
	}

#ifdef DCM_PARAM_DEBUG
	dump_param_status(&param_status);
#endif

fail:
	kfree(addr);
	return err;
}