Esempio n. 1
0
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(&param_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(&param_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;
}
Esempio n. 2
0
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;
}
Esempio n. 3
0
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(&param_status, addr, sizeof(param_status_t));
	}

	put_mtd_device(mtd);
fail:
	vfree(addr);
        preempt_disable();

	return ret;
}