/* Copyright (c) 2015, The Linux Foundation. All rights reserved.

 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are
 * met:
 *   * Redistributions of source code must retain the above copyright
 *     notice, this list of conditions and the following disclaimer.
 *   * Redistributions in binary form must reproduce the above
 *     copyright notice, this list of conditions and the following
 *     disclaimer in the documentation and/or other materials provided
 *     with the distribution.
 *   * Neither the name of The Linux Foundation. nor the names of its
 *     contributors may be used to endorse or promote products derived
 *     from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

#include <stdlib.h>
#include <string.h>
#include <dev/flash-ubi.h>
#include <dev/flash.h>
#include <qpic_nand.h>
#include <rand.h>

static
const uint32_t crc32_table[256] = {
	0x00000000L, 0x77073096L, 0xee0e612cL, 0x990951baL, 0x076dc419L,
	0x706af48fL, 0xe963a535L, 0x9e6495a3L, 0x0edb8832L, 0x79dcb8a4L,
	0xe0d5e91eL, 0x97d2d988L, 0x09b64c2bL, 0x7eb17cbdL, 0xe7b82d07L,
	0x90bf1d91L, 0x1db71064L, 0x6ab020f2L, 0xf3b97148L, 0x84be41deL,
	0x1adad47dL, 0x6ddde4ebL, 0xf4d4b551L, 0x83d385c7L, 0x136c9856L,
	0x646ba8c0L, 0xfd62f97aL, 0x8a65c9ecL, 0x14015c4fL, 0x63066cd9L,
	0xfa0f3d63L, 0x8d080df5L, 0x3b6e20c8L, 0x4c69105eL, 0xd56041e4L,
	0xa2677172L, 0x3c03e4d1L, 0x4b04d447L, 0xd20d85fdL, 0xa50ab56bL,
	0x35b5a8faL, 0x42b2986cL, 0xdbbbc9d6L, 0xacbcf940L, 0x32d86ce3L,
	0x45df5c75L, 0xdcd60dcfL, 0xabd13d59L, 0x26d930acL, 0x51de003aL,
	0xc8d75180L, 0xbfd06116L, 0x21b4f4b5L, 0x56b3c423L, 0xcfba9599L,
	0xb8bda50fL, 0x2802b89eL, 0x5f058808L, 0xc60cd9b2L, 0xb10be924L,
	0x2f6f7c87L, 0x58684c11L, 0xc1611dabL, 0xb6662d3dL, 0x76dc4190L,
	0x01db7106L, 0x98d220bcL, 0xefd5102aL, 0x71b18589L, 0x06b6b51fL,
	0x9fbfe4a5L, 0xe8b8d433L, 0x7807c9a2L, 0x0f00f934L, 0x9609a88eL,
	0xe10e9818L, 0x7f6a0dbbL, 0x086d3d2dL, 0x91646c97L, 0xe6635c01L,
	0x6b6b51f4L, 0x1c6c6162L, 0x856530d8L, 0xf262004eL, 0x6c0695edL,
	0x1b01a57bL, 0x8208f4c1L, 0xf50fc457L, 0x65b0d9c6L, 0x12b7e950L,
	0x8bbeb8eaL, 0xfcb9887cL, 0x62dd1ddfL, 0x15da2d49L, 0x8cd37cf3L,
	0xfbd44c65L, 0x4db26158L, 0x3ab551ceL, 0xa3bc0074L, 0xd4bb30e2L,
	0x4adfa541L, 0x3dd895d7L, 0xa4d1c46dL, 0xd3d6f4fbL, 0x4369e96aL,
	0x346ed9fcL, 0xad678846L, 0xda60b8d0L, 0x44042d73L, 0x33031de5L,
	0xaa0a4c5fL, 0xdd0d7cc9L, 0x5005713cL, 0x270241aaL, 0xbe0b1010L,
	0xc90c2086L, 0x5768b525L, 0x206f85b3L, 0xb966d409L, 0xce61e49fL,
	0x5edef90eL, 0x29d9c998L, 0xb0d09822L, 0xc7d7a8b4L, 0x59b33d17L,
	0x2eb40d81L, 0xb7bd5c3bL, 0xc0ba6cadL, 0xedb88320L, 0x9abfb3b6L,
	0x03b6e20cL, 0x74b1d29aL, 0xead54739L, 0x9dd277afL, 0x04db2615L,
	0x73dc1683L, 0xe3630b12L, 0x94643b84L, 0x0d6d6a3eL, 0x7a6a5aa8L,
	0xe40ecf0bL, 0x9309ff9dL, 0x0a00ae27L, 0x7d079eb1L, 0xf00f9344L,
	0x8708a3d2L, 0x1e01f268L, 0x6906c2feL, 0xf762575dL, 0x806567cbL,
	0x196c3671L, 0x6e6b06e7L, 0xfed41b76L, 0x89d32be0L, 0x10da7a5aL,
	0x67dd4accL, 0xf9b9df6fL, 0x8ebeeff9L, 0x17b7be43L, 0x60b08ed5L,
	0xd6d6a3e8L, 0xa1d1937eL, 0x38d8c2c4L, 0x4fdff252L, 0xd1bb67f1L,
	0xa6bc5767L, 0x3fb506ddL, 0x48b2364bL, 0xd80d2bdaL, 0xaf0a1b4cL,
	0x36034af6L, 0x41047a60L, 0xdf60efc3L, 0xa867df55L, 0x316e8eefL,
	0x4669be79L, 0xcb61b38cL, 0xbc66831aL, 0x256fd2a0L, 0x5268e236L,
	0xcc0c7795L, 0xbb0b4703L, 0x220216b9L, 0x5505262fL, 0xc5ba3bbeL,
	0xb2bd0b28L, 0x2bb45a92L, 0x5cb36a04L, 0xc2d7ffa7L, 0xb5d0cf31L,
	0x2cd99e8bL, 0x5bdeae1dL, 0x9b64c2b0L, 0xec63f226L, 0x756aa39cL,
	0x026d930aL, 0x9c0906a9L, 0xeb0e363fL, 0x72076785L, 0x05005713L,
	0x95bf4a82L, 0xe2b87a14L, 0x7bb12baeL, 0x0cb61b38L, 0x92d28e9bL,
	0xe5d5be0dL, 0x7cdcefb7L, 0x0bdbdf21L, 0x86d3d2d4L, 0xf1d4e242L,
	0x68ddb3f8L, 0x1fda836eL, 0x81be16cdL, 0xf6b9265bL, 0x6fb077e1L,
	0x18b74777L, 0x88085ae6L, 0xff0f6a70L, 0x66063bcaL, 0x11010b5cL,
	0x8f659effL, 0xf862ae69L, 0x616bffd3L, 0x166ccf45L, 0xa00ae278L,
	0xd70dd2eeL, 0x4e048354L, 0x3903b3c2L, 0xa7672661L, 0xd06016f7L,
	0x4969474dL, 0x3e6e77dbL, 0xaed16a4aL, 0xd9d65adcL, 0x40df0b66L,
	0x37d83bf0L, 0xa9bcae53L, 0xdebb9ec5L, 0x47b2cf7fL, 0x30b5ffe9L,
	0xbdbdf21cL, 0xcabac28aL, 0x53b39330L, 0x24b4a3a6L, 0xbad03605L,
	0xcdd70693L, 0x54de5729L, 0x23d967bfL, 0xb3667a2eL, 0xc4614ab8L,
	0x5d681b02L, 0x2a6f2b94L, 0xb40bbe37L, 0xc30c8ea1L, 0x5a05df1bL,
	0x2d02ef8dL
};

static uint32_t mtd_crc32(uint32_t crc, const void *buf, size_t size)
{
	const uint8_t *p = buf;

	while (size--)
		crc = crc32_table[(crc ^ *p++) & 0xff] ^ (crc >> 8);
	return crc;
}

/**
 * check_pattern - check if buffer contains only a certain byte pattern.
 * @buf: buffer to check
 * @patt: the pattern to check
 * @size: buffer size in bytes
 *
 * This function returns %1 if there are only @patt bytes in @buf, and %0 if
 * something else was also found.
 */
int check_pattern(const void *buf, uint8_t patt, int size)
{
	int i;

	for (i = 0; i < size; i++)
		if (((const uint8_t *)buf)[i] != patt)
			return 0;
	return 1;
}

/**
 * calc_data_len - calculate how much real data is stored in the buffer
 * @page_size: min I/O of the device
 * @buf: a buffer with the contents of the physical eraseblock
 * @len: the buffer length
 *
 * This function calculates how much "real data" is stored in @buf and
 * returns the length (in number of pages). Continuous 0xFF bytes at the end
 * of the buffer are not considered as "real data".
 */
static int calc_data_len(int page_size, const void *buf, int len)
{
	int i;

	for (i = len - 1; i >= 0; i--)
		if (((const uint8_t *)buf)[i] != 0xFF)
			break;

	/* The resulting length must be aligned to the minimum flash I/O size */
	len = i + 1;
	len = (len + page_size - 1) / page_size;
	return len;
}

/**
 * read_ec_hdr - read and check an erase counter header.
 * @peb: number of the physical erase block to read the header for
 * @ec_hdr: a &struct ubi_ec_hdr object where to store the read erase counter
 * 			header
 *
 * This function reads erase counter header from physical eraseblock @peb and
 * stores it in @ec_hdr. This function also checks the validity of the read
 * header.
 *
 * Return codes:
 * -1 - in case of error
 *  0 - if PEB was found valid
 *  1 - if PEB is empty
 */
static int read_ec_hdr(uint32_t peb, struct ubi_ec_hdr *ec_hdr)
{
	unsigned char *spare, *tmp_buf;
	int ret = -1;
	uint32_t crc;
	int page_size = flash_page_size();
	int num_pages_per_blk = flash_block_size()/page_size;

	spare = (unsigned char *)malloc(flash_spare_size());
	if (!spare)
	{
		dprintf(CRITICAL, "read_ec_hdr: Mem allocation failed\n");
		return ret;
	}

	tmp_buf = (unsigned char *)malloc(page_size);
	if (!tmp_buf)
	{
		dprintf(CRITICAL, "read_ec_hdr: Mem allocation failed\n");
		goto out_tmp_buf;
	}

	if (qpic_nand_block_isbad(peb * num_pages_per_blk)) {
		dprintf(CRITICAL, "read_ec_hdr: Bad block @ %d\n", peb);
		goto out;
	}

	if (qpic_nand_read(peb * num_pages_per_blk, 1, tmp_buf, spare)) {
		dprintf(CRITICAL, "read_ec_hdr: Read %d failed \n", peb);
		goto out;
	}
	memcpy(ec_hdr, tmp_buf, UBI_EC_HDR_SIZE);

	if (check_pattern((void *)ec_hdr, 0xFF, UBI_EC_HDR_SIZE)) {
		ret = 1;
		goto out;
	}

	/* Make sure we read a valid UBI EC_HEADER */
	if (BE32(ec_hdr->magic) != (uint32_t)UBI_EC_HDR_MAGIC) {
		dprintf(CRITICAL,
			"read_ec_hdr: Wrong magic at peb-%d Expected: %d, received %d\n",
			peb, UBI_EC_HDR_MAGIC, BE32(ec_hdr->magic));
		goto out;
	}

	if (ec_hdr->version != UBI_VERSION) {
		dprintf(CRITICAL,
			"read_ec_hdr: Wrong version at peb-%d Expected: %d, received %d\n",
			peb, UBI_VERSION, ec_hdr->version);
		goto out;
	}

	if (BE64(ec_hdr->ec) > UBI_MAX_ERASECOUNTER) {
		dprintf(CRITICAL,
			"read_ec_hdr: Wrong ec at peb-%d: %lld \n",
			peb, BE64(ec_hdr->ec));
		goto out;
	}

	crc = mtd_crc32(UBI_CRC32_INIT, ec_hdr, UBI_EC_HDR_SIZE_CRC);
	if (BE32(ec_hdr->hdr_crc) != crc) {
		dprintf(CRITICAL,
			"read_ec_hdr: Wrong crc at peb-%d: calculated %d, recived %d\n",
			peb,crc,  BE32(ec_hdr->hdr_crc));
		goto out;
	}

	ret = 0;
out:
	free(tmp_buf);
out_tmp_buf:
	free(spare);
	return ret;
}

/**
 * read_vid_hdr - read and check an Volume identifier header.
 * @peb: number of the physical erase block to read the header for
 * @vid_hdr: a &struct ubi_vid_hdr object where to store the read header
 * @vid_hdr_offset: offset of the VID header from the beginning of the PEB
 * 			 (in bytes)
 *
 * This function reads the volume identifier header from physical
 * eraseblock @peb and stores it in @vid_hdr. This function also checks the
 * validity of the read header.
 *
 * Return codes:
 * -1 - in case of error
 *  0 - on success
 *  1 - if the PEB is free (no VID hdr)
 */
static int read_vid_hdr(uint32_t peb, struct ubi_vid_hdr *vid_hdr,
		int vid_hdr_offset)
{
	unsigned char *spare, *tmp_buf;
	int ret = -1;
	uint32_t crc, magic;
	int page_size = flash_page_size();
	int num_pages_per_blk = flash_block_size()/page_size;

	spare = (unsigned char *)malloc(flash_spare_size());
	if (!spare)
	{
		dprintf(CRITICAL, "read_vid_hdr: Mem allocation failed\n");
		return ret;
	}

	tmp_buf = (unsigned char *)malloc(page_size);
	if (!tmp_buf)
	{
		dprintf(CRITICAL, "read_vid_hdr: Mem allocation failed\n");
		goto out_tmp_buf;
	}

	if (qpic_nand_block_isbad(peb * num_pages_per_blk)) {
		dprintf(CRITICAL, "read_vid_hdr: Bad block @ %d\n", peb);
		goto out;
	}

	if (qpic_nand_read(peb * num_pages_per_blk + vid_hdr_offset/page_size,
			1, tmp_buf, spare)) {
		dprintf(CRITICAL, "read_vid_hdr: Read %d failed \n", peb);
		goto out;
	}
	memcpy(vid_hdr, tmp_buf, UBI_VID_HDR_SIZE);

	if (check_pattern((void *)vid_hdr, 0xFF, UBI_VID_HDR_SIZE)) {
		ret = 1;
		goto out;
	}

	magic = BE32(vid_hdr->magic);
	if (magic != UBI_VID_HDR_MAGIC) {
		dprintf(CRITICAL,
				"read_vid_hdr: Wrong magic at peb-%d Expected: %d, received %d\n",
				peb, UBI_VID_HDR_MAGIC, BE32(vid_hdr->magic));
		goto out;
	}

	crc = mtd_crc32(UBI_CRC32_INIT, vid_hdr, UBI_EC_HDR_SIZE_CRC);
	if (BE32(vid_hdr->hdr_crc) != crc) {
		dprintf(CRITICAL,
			"read_vid_hdr: Wrong crc at peb-%d: calculated %d, received %d\n",
			peb,crc,  BE32(vid_hdr->hdr_crc));
		goto out;
	}

	ret = 0;
out:
	free(tmp_buf);
out_tmp_buf:
	free(spare);
	return ret;
}

/**
 * read_leb_data - read data section of the PEB (LEB).
 * @peb: number of the physical erase block to read the data for
 * @leb_data: a buffer where to store the read data at
 * @leb_size: LEB size
 * @data_offset: offset of the data from the beginning of the PEB
 * 			 (in bytes)
 *
 * Return codes:
 * -1 - in case of error
 *  0 - on success
 */
static int read_leb_data(uint32_t peb, void *leb_data,
		int leb_size, int data_offset)
{
	unsigned char *spare, *tmp_buf;
	int ret = -1;
	int page_size = flash_page_size();
	int block_size = flash_block_size();
	int num_pages_per_blk = block_size/page_size;

	spare = (unsigned char *)malloc(flash_spare_size());
	if (!spare)
	{
		dprintf(CRITICAL, "read_leb_data: Mem allocation failed\n");
		return ret;
	}

	tmp_buf = (unsigned char *)malloc(leb_size);
	if (!tmp_buf)
	{
		dprintf(CRITICAL, "read_leb_data: Mem allocation failed\n");
		goto out_tmp_buf;
	}

	if (qpic_nand_block_isbad(peb * num_pages_per_blk)) {
		dprintf(CRITICAL, "read_leb_data: Bad block @ %d\n", peb);
		goto out;
	}

	if (qpic_nand_read(peb * num_pages_per_blk + data_offset/page_size,
			leb_size/page_size, tmp_buf, spare)) {
		dprintf(CRITICAL, "read_leb_data: Read %d failed \n", peb);
		goto out;
	}
	memcpy(leb_data, tmp_buf, leb_size);

	ret = 0;
out:
	free(tmp_buf);
out_tmp_buf:
	free(spare);
	return ret;
}

/**
 * write_ec_header() - Write provided ec_header for given PEB
 * @peb: number of the physical erase block to write the header to
 * @new_ech: the ec_header to write
 *
 * Return codes:
 * -1 - in case of error
 *  0 - on success
 */
static int write_ec_header(uint32_t peb, struct ubi_ec_hdr *new_ech)
{
	unsigned page_size = flash_page_size();
	int num_pages_per_blk = flash_block_size()/page_size;
	unsigned char *buf;
	int ret = 0;

	buf = malloc(sizeof(uint8_t) * page_size);
	if (!buf) {
		dprintf(CRITICAL, "write_ec_header: Mem allocation failed\n");
		return -1;
	}

	memset(buf, 0, page_size);
	ASSERT(page_size > sizeof(*new_ech));
	memcpy(buf, new_ech, UBI_EC_HDR_SIZE);
	ret = qpic_nand_write(peb * num_pages_per_blk, 1, buf, 0);
	if (ret) {
		dprintf(CRITICAL,
			"write_ec_header: qpic_nand_write failed with %d\n", ret);
		ret = -1;
		goto out;
	}

out:
	free(buf);
	return ret;
}

/**
 * write_vid_header() - Write provided vid_header for given PEB
 * @peb: number of the physical erase block to write the header to
 * @new_vidh: the vid_header to write
 * @offset: vid_hdr offset in bytes from the beginning of the PEB
 *
 * Return codes:
 * -1 - in case of error
 *  0 - on success
 */
static int write_vid_header(uint32_t peb,
		struct ubi_vid_hdr *new_vidh, int offset)
{
	unsigned page_size = flash_page_size();
	int num_pages_per_blk = flash_block_size()/page_size;
	unsigned char *buf;
	int ret = 0;

	buf = malloc(sizeof(uint8_t) * page_size);
	if (!buf) {
		dprintf(CRITICAL, "write_vid_header: Mem allocation failed\n");
		return -1;
	}

	memset(buf, 0, page_size);
	ASSERT(page_size > sizeof(*new_vidh));
	memcpy(buf, new_vidh, UBI_VID_HDR_SIZE);
	ret = qpic_nand_write(peb * num_pages_per_blk + offset/page_size,
			1, buf, 0);
	if (ret) {
		dprintf(CRITICAL,
			"write_vid_header: qpic_nand_write failed with %d\n", ret);
		ret = -1;
		goto out;
	}

out:
	free(buf);
	return ret;
}

/**
 * write_leb_data - write data section of the PEB (LEB).
 * @peb: number of the physical erase block to write the data for
 * @leb_data: a data buffer to write
 * @size: data size
 * @data_offset: offset of the data from the beginning of the PEB
 * 			 (in bytes)
 *
 * Return codes:
 * -1 - in case of error
 *  0 - on success
 */
static int write_leb_data(uint32_t peb, void *data,
		int size, int data_offset)
{
	unsigned char *tmp_buf;
	int ret = -1;
	int num_pages;
	int page_size = flash_page_size();
	int block_size = flash_block_size();
	int num_pages_per_blk = block_size/page_size;

	tmp_buf = (unsigned char *)malloc(block_size - data_offset);
	if (!tmp_buf)
	{
		dprintf(CRITICAL, "write_leb_data: Mem allocation failed\n");
		return -1;
	}

	if (size < block_size - data_offset)
		num_pages = size / page_size;
	else
		num_pages = calc_data_len(page_size, data,
				block_size - data_offset);
	memcpy(tmp_buf, data, num_pages * page_size);
	ret = qpic_nand_write(peb * num_pages_per_blk + data_offset/page_size,
			num_pages, tmp_buf, 0);
	if (ret) {
		dprintf(CRITICAL,
			"write_vid_header: qpic_nand_write failed with %d\n", ret);
		ret = -1;
		goto out;
	}

	ret = 0;
out:
	free(tmp_buf);
	return ret;
}

/**
 * scan_partition() - Collect the ec_headers info of a given partition
 * @ptn: partition to read the headers of
 *
 * Returns allocated and filled struct ubi_scan_info (si).
 * Note: si should be released by caller.
 */
static struct ubi_scan_info *scan_partition(struct ptentry *ptn)
{
	struct ubi_scan_info *si;
	struct ubi_ec_hdr *ec_hdr;
	struct ubi_vid_hdr vid_hdr;
	unsigned i;
	unsigned long long sum = 0;
	int page_size = flash_page_size();
	int ret;

	si = malloc(sizeof(*si));
	if (!si) {
		dprintf(CRITICAL,"scan_partition: (%s) Memory allocation failed\n",
				ptn->name);
		return NULL;
	}

	memset((void *)si, 0, sizeof(*si));
	si->pebs_data = malloc(ptn->length * sizeof(struct peb_info));
	if (!si->pebs_data) {
		dprintf(CRITICAL,"scan_partition: (%s) Memory allocation failed\n",
				ptn->name);
		goto out_failed_pebs;
	}
	memset((void *)si->pebs_data, 0, ptn->length * sizeof(struct peb_info));

	ec_hdr = malloc(UBI_EC_HDR_SIZE);
	if (!ec_hdr) {
		dprintf(CRITICAL,"scan_partition: (%s) Memory allocation failed\n",
				ptn->name);
		goto out_failed;
	}

	si->vid_hdr_offs = 0;
	si->image_seq = rand() & UBI_IMAGE_SEQ_BASE;
	si->vtbl_peb1 = -1;
	si->vtbl_peb2 = -1;
	si->fastmap_sb = -1;
	for (i = 0; i < ptn->length; i++){
		ret = read_ec_hdr(ptn->start + i, ec_hdr);
		switch (ret) {
		case 1:
			si->empty_cnt++;
			si->pebs_data[i].ec = UBI_MAX_ERASECOUNTER;
			si->pebs_data[i].status = UBI_EMPTY_PEB;
			break;
		case 0:
			if (!si->vid_hdr_offs) {
				si->vid_hdr_offs = BE32(ec_hdr->vid_hdr_offset);
				si->data_offs = BE32(ec_hdr->data_offset);
				if (!si->vid_hdr_offs || !si->data_offs ||
					si->vid_hdr_offs % page_size ||
					si->data_offs % page_size) {
					si->bad_cnt++;
					si->pebs_data[i].ec = UBI_MAX_ERASECOUNTER;
					si->vid_hdr_offs = 0;
					continue;
				}
				if (BE32(ec_hdr->vid_hdr_offset) != si->vid_hdr_offs) {
					si->bad_cnt++;
					si->pebs_data[i].ec = UBI_MAX_ERASECOUNTER;
					continue;
				}
				if (BE32(ec_hdr->data_offset) != si->data_offs) {
					si->bad_cnt++;
					si->pebs_data[i].ec = UBI_MAX_ERASECOUNTER;
					continue;
				}
			}
			si->read_image_seq = BE32(ec_hdr->image_seq);
			si->pebs_data[i].ec = BE64(ec_hdr->ec);
			/* Now read the VID header to find if the peb is free */
			ret = read_vid_hdr(ptn->start + i, &vid_hdr,
					BE32(ec_hdr->vid_hdr_offset));
			switch (ret) {
			case 1:
				si->pebs_data[i].status = UBI_FREE_PEB;
				si->free_cnt++;
				break;
			case 0:
				si->pebs_data[i].status = UBI_USED_PEB;
				si->pebs_data[i].volume = BE32(vid_hdr.vol_id);
				if (BE32(vid_hdr.vol_id) == UBI_LAYOUT_VOLUME_ID) {
					if (si->vtbl_peb1 == -1)
						si->vtbl_peb1 = i;
					else if (si->vtbl_peb2 == -1)
						si->vtbl_peb2 = i;
					else
						dprintf(CRITICAL,
							"scan_partition: Found > 2 copies of vtbl");
				}
				if (BE32(vid_hdr.vol_id) == UBI_FM_SB_VOLUME_ID)
					si->fastmap_sb = i;
				si->used_cnt++;
				break;
			case -1:
			default:
				si->bad_cnt++;
				si->pebs_data[i].ec = UBI_MAX_ERASECOUNTER;
				si->pebs_data[i].status = UBI_BAD_PEB;
				break;
			}
			break;
		case -1:
		default:
			si->bad_cnt++;
			si->pebs_data[i].ec = UBI_MAX_ERASECOUNTER;
			si->pebs_data[i].status = UBI_BAD_PEB;
			break;
		}
	}

	/* Sanity check */
	if (si->bad_cnt + si->empty_cnt + si->free_cnt + si->used_cnt != (int)ptn->length) {
		dprintf(CRITICAL,"scan_partition: peb count doesn't sum up \n");
		goto out_failed;
	}

	/*
	 * If less then 95% of the PEBs were "bad" (didn't have valid
	 * ec header), then set mean_ec = UBI_DEF_ERACE_COUNTER.
	 */
	sum = 0;
	if ((si->free_cnt + si->used_cnt) &&
		(double)((si->free_cnt + si->used_cnt) / ptn->length) * 100 > 95) {
		for (i = 0; i < ptn->length; i++) {
			if (si->pebs_data[i].ec == UBI_MAX_ERASECOUNTER)
				continue;
			sum += si->pebs_data[i].ec;
		}
		si->mean_ec = sum / (si->free_cnt + si->used_cnt);
	} else {
		si->mean_ec = UBI_DEF_ERACE_COUNTER;
	}
	free(ec_hdr);
	return si;

out_failed:
	free(si->pebs_data);
out_failed_pebs:
	free(si);
	return NULL;
}

/**
 * update_ec_header() - Update provided ec_header
 * @si: pointer to struct ubi_scan_info, holding the collected
 * 		ec_headers information of the partition
 * @index: index in si->ec[] of this peb. Relative to ptn->start
 * @new_header: False if this is an update of an existing header.
 * 		True if new header needs to be filled in
 */
static void update_ec_header(struct ubi_ec_hdr *old_ech,
		const struct ubi_scan_info *si,
		int index, bool new_header)
{
	uint32_t crc;

	if (si->pebs_data[index].ec < UBI_MAX_ERASECOUNTER)
		old_ech->ec = BE64(si->pebs_data[index].ec + 1);
	else
		old_ech->ec = BE64(si->mean_ec);

	if (new_header) {
		old_ech->vid_hdr_offset = BE32(si->vid_hdr_offs);
		old_ech->data_offset = BE32(si->data_offs);
		old_ech->magic = BE32(UBI_EC_HDR_MAGIC);
		old_ech->version = UBI_VERSION;
	}
	old_ech->image_seq = BE32(si->image_seq);
	crc = mtd_crc32(UBI_CRC32_INIT,
			(const void *)old_ech, UBI_EC_HDR_SIZE_CRC);
	old_ech->hdr_crc = BE32(crc);
}


static void update_vid_header(struct ubi_vid_hdr *vid_hdr,
		const struct ubi_scan_info *si, uint32_t vol_id,
		uint32_t lnum, uint32_t data_pad)
{
	uint32_t crc;

	vid_hdr->vol_type = UBI_VID_DYNAMIC;
	vid_hdr->sqnum = BE64(si->image_seq);
	vid_hdr->vol_id = BE32(vol_id);
	vid_hdr->lnum = BE32(lnum);
	vid_hdr->compat = 0;
	vid_hdr->data_pad = BE32(data_pad);

	vid_hdr->magic = BE32(UBI_VID_HDR_MAGIC);
	vid_hdr->version = UBI_VERSION;
	crc = mtd_crc32(UBI_CRC32_INIT,
			(const void *)vid_hdr, UBI_VID_HDR_SIZE_CRC);
	vid_hdr->hdr_crc = BE32(crc);
}

/**
 * fastmap_present - returns true if Fastmap superblock is found
 * @data: raw data to test
 *
 * This function returns 1 if the provided PEB data contains
 * Fastmap superblock, 0 otherwise
 */
static int fastmap_present(const void *data){
	struct ubi_ec_hdr *ec_hdr = (struct ubi_ec_hdr *)(data);
	struct ubi_vid_hdr *vid_hdr;

	vid_hdr = (struct ubi_vid_hdr *)(data + BE32(ec_hdr->vid_hdr_offset));
	if (BE32(vid_hdr->vol_id) == UBI_FM_SB_VOLUME_ID)
		return 1;
	else
		return 0;
}

/**
 * ubi_erase_peb - Erase PEB and update EC header
 * @peb_num: number of the PEB to erase
 * @si: UBI scan information
 * @ptn_start: first PEB of the flashed partition
 *
 * This function erases the given PEB (if required) and writes a new EC
 * header for it.
 *
 * Returns: -1 on error
 *           0 on success
 */
static int ubi_erase_peb(int peb_num, struct ubi_scan_info *si,
		int ptn_start)
{
	struct ubi_ec_hdr new_ech;
	int page_size = flash_page_size();
	int num_pages_per_blk = flash_block_size() / page_size;
	int ret;

	if (qpic_nand_blk_erase(peb_num * num_pages_per_blk)) {
		dprintf(INFO, "ubi_erase_peb: erase of %d failed\n", peb_num);
		return -1;
	}
	memset(&new_ech, 0xff, sizeof(new_ech));
	update_ec_header(&new_ech, si, peb_num - ptn_start, true);

	/* Write new ec_header */
	ret = write_ec_header(peb_num, &new_ech);
	if (ret) {
		dprintf(CRITICAL, "ubi_erase_peb: write ec_header to %d failed\n",
				peb_num);
		return -1;
	}
	si->pebs_data[peb_num - ptn_start].status = UBI_FREE_PEB;
	return 0;
}

/**
 * remove_F_flag() - Turn off space-fixup flag in the ubifs superblock
 * @data: pointer to the peb to check in the flashed image
 *
 * The UBIFS Superblock will be located at LEB 0 of the image. LEB 0 will be
 * mapped as follows:
 * If the image contains Fastmap superblock:
 * - LEB 0 will be at PEB3
 * else:
 * - LEB 0 will be at PEB2
 */
static void remove_F_flag(const void *leb_data)
{
	struct ubifs_ch *ch;
	struct ubifs_sb_node *ubifs_sb;
	struct ubi_ec_hdr *ech;
	struct ubi_vid_hdr *vidh;
	int vol_id;

	ech = (struct ubi_ec_hdr *)leb_data;
	vidh = (struct ubi_vid_hdr *)(leb_data + BE32(ech->vid_hdr_offset));
	vol_id = BE32(vidh->vol_id);

	if (vol_id > UBI_MAX_VOLUMES &&
			vol_id != UBI_LAYOUT_VOLUME_ID &&
			vol_id != UBI_FM_SB_VOLUME_ID)
		return;

	ubifs_sb = (struct ubifs_sb_node *)(leb_data + BE32(ech->data_offset));
	ch = (struct ubifs_ch *)ubifs_sb;
	if (ch->node_type != UBIFS_SB_NODE)
		return;
	if (ubifs_sb->flags & UBIFS_FLG_SPACE_FIXUP) {
		ubifs_sb->flags &= (~UBIFS_FLG_SPACE_FIXUP);
		ch->crc = mtd_crc32(UBIFS_CRC32_INIT, (void *)ubifs_sb + 8,
				sizeof(struct ubifs_sb_node) - 8);
	}
}

/**
 * flash_ubi_img() - Write the provided (UBI) image to given partition
 * @ptn: partition to write the image to
 * @data: the image to write
 * @size: size of the image to write
 *
 *  Return codes:
 * -1 - in case of error
 *  0 - on success
 */
int flash_ubi_img(struct ptentry *ptn, void *data, unsigned size)
{
	struct ubi_scan_info *si;
	struct ubi_ec_hdr *old_ech;
	uint32_t curr_peb = ptn->start;
	void *img_peb;
	unsigned page_size = flash_page_size();
	unsigned block_size = flash_block_size();
	int num_pages_per_blk = block_size / page_size;
	int num_pages;
	int ret;
	int bad_blocks_cnt = 0;
	uint32_t fmsb_peb = UINT_MAX;
	int is_fmsb_peb_valid = 0;
	unsigned peb_valid_sz= 0;

	si = scan_partition(ptn);
	if (!si) {
		dprintf(CRITICAL, "flash_ubi_img: scan_partition failed\n");
		return -1;
	}

	/*
	 * In case si->vid_hdr_offs is still -1 (non UBI image was
	 * flashed on device, get the value from the image to flush
	 */
	if (!si->vid_hdr_offs){
		struct ubi_ec_hdr *echd = (struct ubi_ec_hdr *)data;
		si->vid_hdr_offs = BE32(echd->vid_hdr_offset);
		si->data_offs = BE32(echd->data_offset);
	}

	/* Update the "to be" flashed image and flash it */
	img_peb = data;
	while (size && curr_peb < ptn->start + ptn->length) {
		if (qpic_nand_blk_erase(curr_peb * num_pages_per_blk)) {
			dprintf(CRITICAL, "flash_ubi_img: erase of %d failed\n",
				curr_peb);
			bad_blocks_cnt++;
			curr_peb++;
			continue;
		}

		if (size < block_size)
			num_pages = size / page_size;
		else
			num_pages = calc_data_len(page_size, img_peb, block_size);

		/* Total size of valid data in peb */
		peb_valid_sz = num_pages * page_size;

		if (size < UBI_MAGIC_SIZE)
		{
			dprintf(CRITICAL, "flash_ubi_img: invalid size provided.\n");
			return -1;
		}

		/*
		* Check for oob access if any in img_peb.
		*/
		if (memcmp(img_peb, UBI_MAGIC, UBI_MAGIC_SIZE) ||
			BE32(((struct ubi_ec_hdr *)img_peb)->vid_hdr_offset) > peb_valid_sz ||
			BE32(((struct ubi_ec_hdr *)img_peb)->data_offset) > peb_valid_sz)
		{
			dprintf(CRITICAL, "flash_ubi_img: invalid image peb found\n");
			return -1;
		}

		remove_F_flag(img_peb);
		/* Update the ec_header in the image */
		old_ech = (struct ubi_ec_hdr *)img_peb;
		update_ec_header(old_ech, si, curr_peb - ptn->start, false);
		/* Write one block from image */
		ret = qpic_nand_write(curr_peb * num_pages_per_blk,
				num_pages, img_peb, 0);
		if (ret) {
			dprintf(CRITICAL, "flash_ubi_img: writing to peb-%d failed\n",
					curr_peb);
			bad_blocks_cnt++;
			curr_peb++;
			continue;
		}
		if (size < block_size)
			size = 0;
		else
			size -= block_size;

		if (fastmap_present(img_peb)) {
			fmsb_peb = curr_peb;
			is_fmsb_peb_valid = 1;
		}
		img_peb += flash_block_size();
		curr_peb++;
	}

	if (size) {
		dprintf(CRITICAL,
				"flash_ubi_img: Not enough good blocks to flash image!");
		ret = -1;
		goto out;
	}

	/* Erase and write ec_header for the rest of the blocks */
	for (; curr_peb < ptn->start + ptn->length; curr_peb++)
		if (ubi_erase_peb(curr_peb, si, ptn->start))
			bad_blocks_cnt++;

	ret = 0;
	/*
	 * If flashed image contains fastmap data and bad blocks were found
	 * we need to invalidate the flashed fastmap since it isn't accurate
	 * anymore.
	 */
	if (bad_blocks_cnt && (is_fmsb_peb_valid == 1)) {
		dprintf(CRITICAL, "flash_ubi_img: invalidate fmsb (fmsb_peb = %u)\n",
			fmsb_peb);
		ret = ubi_erase_peb(fmsb_peb, si, ptn->start);
	}

out:
	free(si->pebs_data);
	free(si);
	return ret;
}

/**
 * find_volume() - Find given volume in a partition by it's name
 * @si: pointer to struct ubi_scan_info
 * @ptn_start: PEB number the partition begins at
 * @vol_name: name of the volume to search for
 * @vol_info: info obout the found volume
 *
 * This functions reads the volume table, then iterates over all its records
 * and searches for a volume with a given name. If found, the volume table
 * record describing this volume is returned at @vol_info. The volume
 * id returned as a return code of the function.
 *
 * Returns:
 * -1 - if the volume was not found
 * volume in dex when found
 */
static int find_volume(struct ubi_scan_info *si, int ptn_start,
		const char *vol_name, struct ubi_vtbl_record *vol_info)
{
	int i, vtbl_records, vtbl_peb, ret = -1;
	int block_size = flash_block_size();
	void *leb_data;
	struct ubi_vtbl_record *curr_vol;

	if (si->vtbl_peb1 < 0) {
		dprintf(CRITICAL,"find_volume: vtbl not found \n");
		return -1;
	}
	vtbl_peb = si->vtbl_peb1;

	vtbl_records = (block_size - si->data_offs) / UBI_VTBL_RECORD_SIZE;
	if (vtbl_records > UBI_MAX_VOLUMES)
		vtbl_records = UBI_MAX_VOLUMES;

	leb_data = malloc(block_size - si->data_offs);
	if (!leb_data) {
		dprintf(CRITICAL,"find_volume: Memory allocation failed\n");
		goto out_free_leb;
	}
retry:
	/* First read the volume table */
	if (read_leb_data(vtbl_peb + ptn_start, leb_data,
			block_size - si->data_offs, si->data_offs)) {
		dprintf(CRITICAL,"find_volume: read_leb_data failed\n");
		if (vtbl_peb == si->vtbl_peb1 && si->vtbl_peb2 != -1) {
			vtbl_peb = si->vtbl_peb2;
			goto retry;
		}
		goto out_free_leb;
	}

	/* Now search for the required volume ID */
	for (i = 0; i < vtbl_records; i++) {
		curr_vol = (struct ubi_vtbl_record *)
				(leb_data + UBI_VTBL_RECORD_SIZE*i);
		if (!curr_vol->vol_type)
			break;
		if (!strcmp((char *)curr_vol->name, vol_name)) {
			ret = i;
			memcpy((void*)vol_info, curr_vol, sizeof(struct ubi_vtbl_record));
			break;
		}
	}

out_free_leb:
	free(leb_data);
	return ret;
}

/**
 * write_one_peb() - writes data to a PEB, including VID header
 * @curr_peb - PEB to write to
 * @ptn_start: number of first PEB of the partition
 * @si: pointer to struct ubi_scan_info
 * @idx: index of required PEB in si->pebs_data array
 * @lnum: lun number this LEB belongs to
 * @vol_id: volume ID this PEB belongs to
 * @data: data to write
 * @size: size of the data
 *
 * Assumption: EC header correctly written and PEB erased
 *
 * Return codes:
 * -1 - in case of error
 *  0 - on success
 */
static int write_one_peb(int curr_peb, int ptn_start,
		struct ubi_scan_info *si,
		int lnum, int vol_id, void* data, int size)
{
	int ret;
	struct ubi_vid_hdr vidh;

	memset((void *)&vidh, 0, UBI_VID_HDR_SIZE);
	update_vid_header(&vidh, si, vol_id, lnum, 0);
	if (write_vid_header(curr_peb + ptn_start, &vidh, si->vid_hdr_offs)) {
		dprintf(CRITICAL,
				"update_ubi_vol: write_vid_header for peb %d failed \n",
				curr_peb);
		ret = -1;
		goto out;
	}

	/* now write the data */
	ret = write_leb_data(curr_peb + ptn_start, data, size, si->data_offs);
	if (ret)
		dprintf(CRITICAL, "update_ubi_vol: writing data to peb-%d failed\n",
				curr_peb);
	else
		si->pebs_data[curr_peb].status = UBI_USED_PEB;
out:
	return ret;
}

/**
 * update_ubi_vol() - Write the provided (UBI) image to given volume
 * @ptn: partition holding the required volume
 * @data: the image to write
 * @size: size of the image to write
 *
 *  Return codes:
 * -1 - in case of error
 *  0 - on success
 */
int update_ubi_vol(struct ptentry *ptn, const char* vol_name,
				void *data, unsigned size)
{
	struct ubi_scan_info *si;
	int vol_id, vol_pebs, curr_peb = 0, ret = -1;
	unsigned block_size = flash_block_size();
	void *img_peb;
	struct ubi_vtbl_record curr_vol;
	int img_pebs, lnum = 0;

	si = scan_partition(ptn);
	if (!si) {
		dprintf(CRITICAL, "update_ubi_vol: scan_partition failed\n");
		return -1;
	}
	if (si->read_image_seq)
		si->image_seq = si->read_image_seq;

	vol_id = find_volume(si, ptn->start, vol_name, &curr_vol);
	if (vol_id == -1) {
		dprintf(CRITICAL, "update_ubi_vol: dint find volume\n");
		goto out;
	}
	if (si->fastmap_sb > -1 &&
			ubi_erase_peb(ptn->start + si->fastmap_sb, si, ptn->start)) {
		dprintf(CRITICAL, "update_ubi_vol: fastmap invalidation failed\n");
		goto out;
	}

	img_pebs = size / (block_size - si->data_offs);
	if (size % (block_size - si->data_offs))
		img_pebs++;

	vol_pebs = BE32(curr_vol.reserved_pebs);
	if (img_pebs > vol_pebs) {
		dprintf(CRITICAL,
			"update_ubi_vol: Provided image is too big. Requires %d PEBs, avail. only %d\n",
				img_pebs, vol_pebs);
		goto out;
	}

	/* First erase all volume used PEBs */
	curr_peb = 0;
	while (curr_peb < (int)ptn->length) {
		if (si->pebs_data[curr_peb].status != UBI_USED_PEB ||
				si->pebs_data[curr_peb].volume != vol_id) {
			curr_peb++;
			continue;
		}
		if (ubi_erase_peb(ptn->start + curr_peb, si, ptn->start))
			goto out;
		curr_peb++;
	}

	/* Flash the image */
	img_peb = data;
	lnum = 0;
	for (curr_peb = 0;
			curr_peb < (int)ptn->length && size && vol_pebs;
			curr_peb++) {
		if (si->pebs_data[curr_peb].status != UBI_FREE_PEB &&
			si->pebs_data[curr_peb].status != UBI_EMPTY_PEB)
			continue;

		if (write_one_peb(curr_peb, ptn->start, si,
				lnum++, vol_id, img_peb,
				(size < block_size - si->data_offs ? size :
						block_size - si->data_offs))) {
			dprintf(CRITICAL, "update_ubi_vol: write_one_peb failed\n");
			goto out;
		}
		if (size < block_size - si->data_offs)
			size = 0;
		else
			size -= (block_size - si->data_offs);
		vol_pebs--;
		img_peb += block_size - si->data_offs;
	}

	if (size) {
		dprintf(CRITICAL,
			"update_ubi_vol: Not enough available PEBs for writing the volume\n");
		goto out;
	}
	ret = 0;
out:
	free(si->pebs_data);
	free(si);
	return ret;
}


