/*
 * Quantenna Board Provision configuraion file upload/update/show support
 */
#include <common.h>
#include <command.h>
#include <environment.h>
#include <malloc.h>
#include <net.h>
#include <stdbool.h>

#include "ruby.h"
#include "spi_flash.h"
#include "board_cfg.h"
#include "ruby_config.h"
#include "ruby_board_cfg.h"
#include "ruby_board_db.h"
#include "shared_defs_common.h"

#define FAIL			(-1)
#define SUCCESS			(0)
#define CMD_BUFSIZE		256
#define TMP_BUFSIZE		256
#define QTN_HW_BOARD_CFG_BIN		"qtn_hw_board_config.bin"
#define QTN_HW_BOARD_DB_BIN		"qtn_hw_board_db.bin"
#ifdef TOPAZ_EP_MINI_UBOOT
#undef RUN
#define RUN(fmt,args...)
#endif

#define QTN_FILES_DEBUG 0

#if QTN_FILES_DEBUG
#define DBG_PRINTF(fmt, args...) printf(fmt ,##args)
#else
#define DBG_PRINTF(fmt, args...)
#endif

char board_config_name[32];
board_cfg_t board_hw_config;
uint32_t flash_size = 0;

static const char * const type2name[] = BOARD_CFG_FIELD_NAMES;

#ifdef GFRG240
static board_cfg_t	g_default_board_cfg = {
	.bc_board_id	= QTN_RUBY_UNIVERSAL_BOARD_ID,
	.bc_name	= "gfrg240",
	.bc_ddr_type	= DDR3_16_WINBOND,
	.bc_ddr_speed	= DDR3_500MHz,
	.bc_ddr_size	= DDR_256MB,
	.bc_emac0	= EMAC_IN_USE,
	.bc_emac1	=
		(EMAC_IN_USE | EMAC_PHY_FORCE_1000MB | EMAC_PHY_NOT_IN_USE | EMAC_PHY_AR8327),
	.bc_phy0_addr   = 0x4,
	.bc_phy1_addr   = EMAC_PHY_ADDR_SCAN,
	.bc_spi1	= SPI1_NOT_IN_USE,
	.bc_wifi_hw	= QTN_TPZ_SKY85703,
	.bc_uart1	= UART1_NOT_IN_USE,
	.bc_pcie        = PCIE_ROOTCOMPLEX,
	.bc_rgmii_timing = 0x84848484,
	};
#else
static board_cfg_t	g_default_board_cfg = {
	.bc_board_id	= QTN_RUBY_UNIVERSAL_BOARD_ID,
	.bc_name	= "default board",
	.bc_ddr_type	= DEFAULT_DDR_CFG,
	.bc_ddr_speed	= DEFAULT_DDR_SPEED,
	.bc_ddr_size	= DDR_AUTO,
	.bc_emac0	= EMAC_NOT_IN_USE,
	.bc_emac1	= EMAC_NOT_IN_USE,
	.bc_phy0_addr = EMAC_PHY_ADDR_SCAN,
	.bc_phy1_addr = EMAC_PHY_ADDR_SCAN,
	.bc_spi1	= SPI1_IN_USE,
	.bc_wifi_hw	= QTN_RUBY_WIFI_NONE,
	.bc_uart1	= UART1_NOT_IN_USE,
	.bc_rgmii_timing = CONFIG_ARCH_RGMII_DEFAULT,
	};
#endif /* #ifdef GFRG240 */

#ifndef TOPAZ_EP_MINI_UBOOT
static uint32_t qtn_board_get_end(void)
{
	char tmpBuf[TMP_BUFSIZE];
	uint32_t addr;
	int i;
	if ((i = getenv_r("config_data_end", tmpBuf, sizeof(tmpBuf))) <= 0) {
		/* the new bootcfg data will be first entry in system */
		addr = BOOT_CFG_DEF_START;
	} else {
		tmpBuf[i]='\0';
		addr = simple_strtoul(tmpBuf, NULL, 16);
	}
	return addr;
}
#endif /* TOPAZ_EP_MINI_UBOOT */

static long qtn_board_get_env_val(char *env)
{
	char tmpBuf[TMP_BUFSIZE];
	long val = 0;
	int i;
	if ((i = getenv_r(env, tmpBuf, sizeof(tmpBuf))) <= 0) {
		val = -1;
	} else {
		tmpBuf[i]='\0';
		val = simple_strtol(tmpBuf, NULL, 0);
	}

	return val;
}

#ifndef TOPAZ_EP_MINI_UBOOT
static uint32_t qtn_board_get_load_addr(void)
{
	char tmpBuf[TMP_BUFSIZE];
	uint32_t addr;
	int i;
	if ((i = getenv_r("loadaddr", tmpBuf, sizeof(tmpBuf))) <= 0) {
		/* the new bootcfg data will be first entry in system */
		addr = CONFIG_SYS_LOAD_ADDR;
	} else {
		tmpBuf[i]='\0';
		addr = simple_strtoul(tmpBuf, NULL, 16);
	}
	return addr;
}
#endif /* TOPAZ_EP_MINI_UBOOT */

static uint8_t *qtn_get_file_env_ptr(char *filename, uint16_t *size)
{
	int retval;
	uint32_t offset;
	char tmp[64], *ch;

	retval = getenv_r(filename, tmp, sizeof(tmp));
	if (retval < 0) {
		printf("File %s doesn't exist\n", filename);
		return NULL;
	}

	if(strstr(tmp, "cfg") == NULL) {
		printf("wrong file description. correct format is 'cfg 0xXXX 0xYYY'.\n");
		printf("use printenv for debugging\n");
		return NULL;
	}

	/* skip the string "cfg " */
	ch = tmp;
	while (*ch != '0') ch++;

	offset = simple_strtoul(ch, NULL, 16);

	/* skip offset to find size */
	if (size) {
		while (*ch != ' ') ch++;
		while (*ch != '0') ch++;
		*size = simple_strtoul(ch, NULL, 16);
	}
	return env_get_file_body(offset);
}

static int qtn_get_emac_set(void)
{
	char *emac_set_str = NULL;
	char *emac_index = NULL;
	uint32_t emac_set = 0;
	int retval = 0;

	emac_index = getenv("emac_index");
	emac_set_str = getenv("emac_set");

	if (emac_index != NULL && emac_set_str != NULL) {
		if (simple_strtoul(emac_index, NULL, 0) == 0) {

			emac_set = simple_strtoul(emac_set_str, NULL, 0);
			g_default_board_cfg.bc_emac0 = (int)emac_set;
		}else if (simple_strtoul(emac_index, NULL, 0) == 1) {

			emac_set = simple_strtoul(emac_set_str, NULL, 0);
			g_default_board_cfg.bc_emac1 = (int)emac_set;
		}
	} else {
		printf("Please setup emac setting correctly for tftp load file\n");
		retval = FAIL;
	}

	return retval;
}

static int qtn_get_ddr_set(void)
{
	char ddr_set_str[TMP_BUFSIZE];
	char *ddr_set_type = NULL;
	char *ddr_set_speed = NULL;
	char *ddr_set_size = NULL;
	int retval = 0;
	int i;

	i = getenv_r("ddr_set", ddr_set_str, sizeof(ddr_set_str));

	if (i > 0) {
		ddr_set_str[i] = '\0';
		ddr_set_type = strtok(ddr_set_str, ",");
		ddr_set_speed = strtok(NULL, ",");
		ddr_set_size = strtok(NULL, ",");

		if (ddr_set_type == NULL || ddr_set_speed == NULL || ddr_set_size == NULL) {
			goto INVALID_DDR_SET;
		}
		g_default_board_cfg.bc_ddr_type = (int)simple_strtoul(ddr_set_type, NULL, 0);
		g_default_board_cfg.bc_ddr_speed = (int)simple_strtoul(ddr_set_speed, NULL, 0);
		g_default_board_cfg.bc_ddr_size = (int)simple_strtoul(ddr_set_size, NULL, 0);

		return retval;
	}

INVALID_DDR_SET:
	printf("Please setup ddr setting correctly for tftp load file\n");
	retval = FAIL;

	return retval;
}

static int board_hw_config_apply(uint16_t type,
		int data, uint8_t datalen,
		const char *str, uint8_t strlen)
{
	int need_save = 0;
	int lna_gain = 0;
	int antenna_number = 0;
	int antenna_gain = 0;
	int lna_gain_5db = 0;
	int tx_power_cal = 0;

	if (type == BOARD_CFG_NAME) {
		memcpy(board_config_name, str, min(strlen, sizeof(board_config_name) - 1));
		board_hw_config.bc_name = board_config_name;
	} else if (type < BOARD_CFG_STRUCT_NUM_FIELDS) {
		int *p = (int *) &board_hw_config;
		p[type] = data;
	} else {
		switch (type) {
		case BOARD_CFG_FLASH_SIZE:
			flash_size = data;
			if (flash_size <= 1024)
				flash_size <<= 20;
			break;
		case BOARD_CFG_EXT_LNA_GAIN:
			lna_gain = data;
			if (qtn_board_get_env_val("ext_lna_gain") != lna_gain) {
				RUN("setenv ext_lna_gain %d", lna_gain);
				need_save = 1;
			}
			break;
		case BOARD_CFG_TX_ANTENNA_NUM:
			antenna_number = data;
			if (qtn_board_get_env_val("antenna_num") != antenna_number) {
				RUN("setenv antenna_num %d", antenna_number);
				need_save = 1;
			}
			break;
		case BOARD_CFG_TX_ANTENNA_GAIN:
			antenna_gain = data;
			if (qtn_board_get_env_val("antenna_gain") != antenna_gain) {
				RUN("setenv antenna_gain %d", antenna_gain);
				need_save = 1;
			}
			break;
		case BOARD_CFG_EXT_LNA_BYPASS_GAIN:
			lna_gain_5db = data;
			if ((int8_t)(qtn_board_get_env_val("ext_lna_bypass_gain") - 256 ) != (int8_t)(lna_gain_5db - 256)) {
				RUN("setenv ext_lna_bypass_gain %d", (int8_t)(lna_gain_5db - 256));
				need_save = 1;
			}
			break;
		case BOARD_CFG_CALSTATE_VPD:
			tx_power_cal = data;
			if (qtn_board_get_env_val("tx_power_cal") != tx_power_cal) {
				RUN("setenv tx_power_cal %d", tx_power_cal);
				need_save = 1;
			}
			break;
		default:
			break;
		}
	}

	return need_save;
}

#ifndef TOPAZ_EP_MINI_UBOOT
static int board_hw_config_display(uint16_t type,
		int data, uint8_t datalen,
		const char *str, uint8_t strlen)
{
	if (type >= ARRAY_SIZE(type2name)) {
		return 0;
	}

	printf("%d: %s:\n", type+1, type2name[type]);
	if (type == BOARD_CFG_NAME) {
		printf(" %s\n", str);
	} else if (datalen == 0) {
		int db_data = 0;
		if (board_parse_tag(type2name[type], str, &db_data) == 0) {
			printf(" %s, 0x%08x\n", str, db_data);
		} else {
			printf(" %s\n", str);
		}
	} else {
		printf(" %s, 0x%08x\n", str, data);
	}

	return 0;
}
#endif /* TOPAZ_EP_MINI_UBOOT */

static int board_hw_config_no_resolve(int bc_index)
{
	return bc_index == BOARD_CFG_ID ||
		bc_index == BOARD_CFG_NAME ||
		bc_index == BOARD_CFG_EMAC0 ||
		bc_index == BOARD_CFG_EMAC1 ||
		bc_index == BOARD_CFG_RGMII_TIMING ||
		bc_index >= ARRAY_SIZE(type2name);
}

static int board_hw_config_iterate(int (*apply)(uint16_t, int, uint8_t, const char *, uint8_t),
		const uint8_t * const board_config,
		uint16_t board_config_size)
{
	int ret = 0;
	const uint8_t *cfg_p = board_config;

	while (1) {
		uint16_t config_index;
		uint16_t bc_index;
		uint8_t data_len = 0;
		uint8_t str_len = 0;
		char str[64] = {0};
		int data = 0;
		int uboot_data = 0;
		uint16_t bytes_read;

		/*
		 * Config index from the file is
		 * board config index + 1
		 */
		memcpy(&config_index, cfg_p, sizeof(config_index));
		cfg_p += sizeof(config_index);
		if (config_index > ARRAY_SIZE(type2name)) {
			printf("%s: invalid config_index: %u\n", __FUNCTION__, config_index);
			break;
		}

		str_len = *cfg_p;
		cfg_p += sizeof(str_len);
		if (str_len > sizeof(str) - 1) {
			printf("%s: invalid strlen: %u\n", __FUNCTION__, str_len);
			break;
		}
		memcpy(str, cfg_p, str_len);
		cfg_p += str_len;

		data_len = *cfg_p;
		cfg_p += sizeof(data_len);
		if (data_len > 4) {
			printf("%s: invalid data len: %u\n", __FUNCTION__, data_len);
			break;
		}
		/* file is always little endian */
		memcpy(&data, cfg_p, data_len);
		cfg_p += data_len;

		bc_index = config_index - 1;
		/* lookup string in the compiled in database */
		if (board_hw_config_no_resolve(bc_index)) {
			/* Don't attempt to resolve */
		} else if (data_len > 0 &&
				!board_parse_tag(type2name[bc_index], str, &uboot_data) &&
				data != uboot_data) {
			printf("%s: %s value from config %d doesn't match expected value %d\n",
					__FUNCTION__, type2name[bc_index], data, uboot_data);
		}

		if (0 && bc_index < ARRAY_SIZE(type2name)) {
			printf("%s: cfg %u %s <- 0x%08lx %s\n",
					__FUNCTION__,
					bc_index, type2name[bc_index],
					(unsigned long) data, str);
		}

		if (bc_index < ARRAY_SIZE(type2name))
			ret |= apply(bc_index, data, data_len, str, str_len);

		bytes_read = cfg_p - ((const uint8_t *) board_config);
		if (bytes_read >= board_config_size) {
			break;
		}
	}

	return ret;
}

int board_hw_config_read(void)
{
	int need_save = 0;
	uint16_t board_config_size = 0;
	const uint8_t * const board_config = qtn_get_file_env_ptr(QTN_HW_BOARD_CFG_BIN, &board_config_size);

#ifdef GFRG240
	if (board_config == NULL) {
		memcpy(&board_hw_config, &g_default_board_cfg, sizeof(board_cfg_t));
		return SUCCESS;
	}
#endif
	if (board_config == NULL) {
		if (qtn_get_emac_set() < 0) {
			return FAIL;
		}

		if (qtn_get_ddr_set() < 0) {
			return FAIL;
		}

		memcpy(&board_hw_config, &g_default_board_cfg, sizeof(board_cfg_t));
		return SUCCESS;
	}

	board_hw_config.bc_board_id = QTN_RUBY_UNIVERSAL_BOARD_ID;
	need_save = board_hw_config_iterate(&board_hw_config_apply,
			board_config, board_config_size);
	if (need_save == 1) {
		saveenv();
	}

	return 0;
}

#ifndef TOPAZ_EP_MINI_UBOOT
int do_qtn_show_board_hw_config(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
	uint16_t board_config_size;
	const uint8_t * const board_config = qtn_get_file_env_ptr(QTN_HW_BOARD_CFG_BIN, &board_config_size);

	if (board_config == NULL) {
		return 0;
	}

	printf("##############current board Hardware configuration########################\n");

	board_hw_config_iterate(&board_hw_config_display,
			board_config, board_config_size);

	return 0;
}

int do_qtn_show_board_hw_db(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
	uint16_t board_database_size;
	const uint8_t * const board_database = qtn_get_file_env_ptr(QTN_HW_BOARD_DB_BIN, &board_database_size);
	const uint8_t *cfg_p = board_database;

	uint16_t tlv_cnt;
	int i;

	if (board_database == NULL) {
		return 0;
	}

	memcpy(&tlv_cnt, cfg_p, sizeof(tlv_cnt));
	cfg_p += sizeof(tlv_cnt);

	printf("##############current board Hardware database########################\n");
	printf("Total %d configuration types\n", tlv_cnt-1);
	for (i = 0; i < tlv_cnt; i++) {
		int j;
		uint16_t type;
		uint16_t v_cnt;
		memcpy(&type, cfg_p, sizeof(type));
		cfg_p += sizeof(type);
		memcpy(&v_cnt, cfg_p, sizeof(v_cnt));
		cfg_p += sizeof(v_cnt);

		if (type > ARRAY_SIZE(type2name)) {
			printf("%u: %s, %u options\n", type, "unknown", v_cnt);
		}else if (type > 0)
			printf("%u: %s, %u options\n", type, type2name[type-1], v_cnt);

		for (j = 0; j < v_cnt; j++) {
			const char *str_sep = j == (v_cnt - 1) ? "" : ";";
			uint8_t datalen;
			uint8_t strlen;
			char str[64] = {0};
			int data = 0;

			strlen = *cfg_p;
			cfg_p += sizeof(strlen);
			if (strlen > sizeof(str) - 1) {
				printf("%s: invalid strlen: %u\n", __FUNCTION__, strlen);
				break;
			}
			memcpy(str, cfg_p, strlen);
			cfg_p += strlen;

			datalen = *cfg_p;
			cfg_p += sizeof(datalen);
			if (datalen > 4) {
				printf("%s: invalid datalen: %u\n", __FUNCTION__, datalen);
				break;
			}
			memcpy(&data, cfg_p, datalen);	// little endian
			cfg_p += datalen;

			if (type > 0) {
				if (datalen == 0) {
					printf(" %s%s\n", str, str_sep);
				} else {
					printf(" %s, 0x%08x%s\n", str, data, str_sep);
				}
			}
		}
	}

	return 0;
}

int qtn_upload_update_file_to_flash(char *file_name, int transfer_len)
{
	int retval = 0;
	uint32_t mem_addr = qtn_board_get_load_addr();
	uchar *data = NULL;

	if ( qtn_get_file_env_ptr(file_name, NULL) ) {
		printf("file %s already exist. use qtn_erase_file to delete it first\n", file_name);
		return FAIL;
	}

	if ((qtn_board_get_end() + transfer_len) > BOOT_CFG_DATA_SIZE) {
                printf("error - len out of range, transfer len = %d, end_of_present = 0x%08x, border = 0x%08x\n", transfer_len, qtn_board_get_end(), (int)BOOT_CFG_DATA_SIZE);
                return 0;
        }

	if (transfer_len > 0) {
                retval = RUN("setenv %s cfg 0x%08x 0x%08x", file_name, (qtn_board_get_end()), transfer_len);
                if (retval >= 0) {
                        retval = RUN("setenv config_data_end 0x%08x", (qtn_board_get_end() + transfer_len));
                        if (retval < 0) {
                                printf("setenv config_data_end error\n");
                                return 0;
                        }
                } else {
                        printf("setenv %s error\n", file_name);
                        return 0;
                }
        } else {
                printf("File size of %s error, please try again\n", file_name);
                return 0;
        }

	data = qtn_get_file_env_ptr(file_name, NULL);
	if (data != NULL) {
		memcpy(data, (void *) mem_addr, transfer_len);
                printf("0x%x bytes data copied from 0x%.8x to 0x%.8x\n", transfer_len, (size_t)mem_addr, (size_t)data);
	} else {
		printf("unable to write file\n");
		return 0;
	}

	env_crc_update();
	saveenv();
	return 0;
}

int do_qtn_upload_file(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
	char *file_name = NULL;
	int retval = 0;

	if (argc < 2) {
		printf("Help:\n");
		printf("qtn_upload_file <file_name>\n");
		return 0;
	}
	file_name = argv[1];

	retval = RUN("tftpboot %s", file_name);
	if (retval < 0)
		return retval;

	return qtn_upload_update_file_to_flash(file_name, NetBootFileXferSize);
}

int do_qtn_upload_file_serial(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
	char tmpBuf[TMP_BUFSIZE];
	char *file_name;
	int retval = 0;
	uint32_t file_size;

	if (argc < 2) {
		printf("Help:\n");
		printf("qtn_upload_file_serial <file_name>\n");
		return 0;
	}
	file_name = argv[1];

	retval = RUN("loadb");
	if (retval < 0)
		return retval;

	getenv_r("filesize", tmpBuf, sizeof(tmpBuf));
	file_size = simple_strtoul(tmpBuf, NULL, 16);

	return qtn_upload_update_file_to_flash(file_name, file_size);
}

bool qtn_envvar_get_next
(
		int* offset,            /* for first var just put 0 */
		char* name,             /* name typically ends by '=' in environment database. better just to copy it to outer buffer*/
		int name_buffer_length, /* to be safe about buffer overflows */
		char** value            /* as the value is zero-terminated it is safe not to copy it*/
)
{
	bool result = false;

	char* name_and_value = (char*)env_get_addr(*offset);

	char* value_part = strchr(name_and_value, '=');

	if (value_part) {
		int name_len = value_part - name_and_value;
		result = true; /* OK, we've found something like name=value\0 */
		*value = value_part + 1; /* skip the '=' itself */
		if (name_len > (name_buffer_length -1))	{
			name_len = name_buffer_length -1;
			printf("environment variable name length exceeds %d, truncated\n", name_buffer_length);
		}
		strncpy(name, name_and_value, name_len);
		name[name_len] = 0;
	}

	*offset += strlen(name_and_value) + 1; /* +1 to skip trailing zero */

	return result;
}

/*returns TRUE if the variable looks like file description*/
bool qtn_get_file_location(char* value, uint8_t** p_data, uint16_t* size)
{
#define FILE_ID_TRAIT "cfg "
#define	FILE_ID_TRAIT_LEN (sizeof(FILE_ID_TRAIT)-1)
	int result = false;
	if (0 == strncmp(value, FILE_ID_TRAIT, FILE_ID_TRAIT_LEN)) {
		char* current = value + FILE_ID_TRAIT_LEN;
		while (*current != '0') current++; /* skip blanks */
		if (p_data) {
			*p_data = env_get_file_body(simple_strtoul(current, &current, 16));
		}
		while (*current != '0') current++; /* skip blanks */
		if (size) {
			*size = (uint16_t)simple_strtoul(current, NULL, 16);
		}
		result = true;
	}
	return result;
}

void qtn_set_file_location(char* value, uint8_t* p_data, uint16_t size)
{
#define FILE_DESCRIPTOR_FORMAT_STR "cfg 0x%08x 0x%08x"
	/*it is safe to do modification in place because of fixed data format*/
	sprintf
	(
		value,
		FILE_DESCRIPTOR_FORMAT_STR,
		(uint32_t)(p_data - (uint8_t*)env_get_file_body(0)), // an offset
		(uint32_t)size
	);
}

int do_qtn_erase_file(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
	char *file_name           = NULL;
	int offset                = 0;
	char  name[TMP_BUFSIZE];
	char* value               = NULL;
	uint8_t* erase_ptr        = NULL;
	uint16_t erase_size       = 0;
	int bytes_to_move         = 0;
	uint32_t current_data_end = qtn_board_get_end();

	if (argc < 2) {
		printf("Help:\n");
		printf("qtn_erase_file <file_name>\n");
		return FAIL;
	}
	file_name = argv[1];

	erase_ptr = qtn_get_file_env_ptr(file_name, &erase_size);
	DBG_PRINTF("erase_ptr = %p, size to be erased = %d\n", erase_ptr, erase_size);

	if ( NULL == erase_ptr ) {
		DBG_PRINTF("file does not exist\n");
		return FAIL;
	}

	while ( qtn_envvar_get_next( &offset, name, sizeof(name), &value) ) {
		uint8_t* dataptr = NULL;
		uint16_t size;
		DBG_PRINTF("checking variable %s\n", name);
		if (qtn_get_file_location(value, &dataptr, &size)) {
			DBG_PRINTF("file with size %d is at %p\n", size, dataptr);
			if ((erase_ptr + erase_size) <= dataptr) {
				qtn_set_file_location(value, dataptr - erase_size, size);
				DBG_PRINTF("shifted left from %p to %p\n", dataptr, dataptr - erase_size);
			} else {
				DBG_PRINTF("no need to move\n");
			}
		} else {
			DBG_PRINTF("not a file, skipped\n");
		}
	}
	RUN("setenv config_data_end 0x%08x", current_data_end - erase_size );
	RUN("setenv %s", file_name);

	/*file descriptors updated, now is the time to shift the actual content*/
	/*we are dealing with overlapped regions so memmove is our choice*/
	bytes_to_move = (uint8_t*)env_get_file_body(current_data_end) - ( erase_ptr + erase_size );
	DBG_PRINTF("%d byte(s) needs to be moved from %p to %p\n", bytes_to_move, erase_ptr + erase_size, erase_ptr);
	memmove(erase_ptr, erase_ptr + erase_size, bytes_to_move);
	DBG_PRINTF("done\n");

	env_crc_update();
	DBG_PRINTF("environment CRC updated\n");

	saveenv();
	DBG_PRINTF("environment saved\n");

	return SUCCESS;
}

int do_qtn_rename_file(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
	char* old_file_name      = NULL;
	char* new_file_name      = NULL;
	char tmpBuf[TMP_BUFSIZE] = {0};

	if (argc < 3) {
		printf("Help:\n");
		printf("qtn_rename_file <oldname> <newname>\n");
		return FAIL;
	}
	old_file_name = argv[1];
	new_file_name = argv[2];

	if ( getenv_r(old_file_name, tmpBuf, sizeof(tmpBuf)) <= 0) {
		printf("unable to get value from environment. use printenv for debugging\n");
		return FAIL;
	}
	if ( !qtn_get_file_location(tmpBuf, NULL, NULL) ) {
		printf("wrong file descriptor. unable to rename\n");
		return FAIL;
	}

	setenv(old_file_name, NULL);
	setenv(new_file_name, tmpBuf);

	env_crc_update();
	saveenv();

	return SUCCESS;
}

int do_qtn_dump_file(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
	char *file_name      = NULL;
	uint8_t* ptr         = NULL;
	uint16_t size        = 0;

	if (argc < 2) {
		printf("Help:\n");
		printf("qtn_dump_file <file_name>\n");
		return FAIL;
	}
	file_name = argv[1];

	ptr = qtn_get_file_env_ptr(file_name, &size);

	if ( !ptr ) {
		printf("Unable to read file %s\n", file_name);
		return FAIL;
	}

	RUN("md.b 0x%x 0x%x", (uint32_t)ptr, (uint32_t)size);

	return SUCCESS;
}

int do_qtn_list_files(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
	int offset                = 0;
	char  name[TMP_BUFSIZE];
	char* value               = NULL;

	while (qtn_envvar_get_next( &offset, name, sizeof(name), &value)) {
		uint8_t* dataptr = NULL;
		uint16_t size;
		if (qtn_get_file_location(value, &dataptr, &size)) {
			printf("file %s with size %d is at %p\n", name, size, dataptr);
		}
	}

	return SUCCESS;
}

U_BOOT_CMD(qtn_upload_file, CONFIG_SYS_MAXARGS, 0, do_qtn_upload_file,
		"Upload file from memory to flash via ethernet port",
		"Quantenna universal board config. Attempts to upload file into flash\n"
	  );

U_BOOT_CMD(qtn_upload_file_serial, CONFIG_SYS_MAXARGS, 0, do_qtn_upload_file_serial,
		"Upload file from memory to flash via serial port",
		"Quantenna universal board config. Attempts to upload file into flash\n"
	  );

U_BOOT_CMD(qtn_show_board_config, CONFIG_SYS_MAXARGS, 0, do_qtn_show_board_hw_config,
		"Show board hw configuration",
		"Quantenna universal board config.\n"
	  );

U_BOOT_CMD(qtn_show_board_database, CONFIG_SYS_MAXARGS, 0, do_qtn_show_board_hw_db,
		"Show board hw configuration database content",
		"Quantenna universal board config.\n"
	  );

U_BOOT_CMD(qtn_erase_file, 2, 0, do_qtn_erase_file,
		"Erases file from flash <filename>",
		"Quantenna universal board config. Erases file from flash\n"
	  );

U_BOOT_CMD(qtn_rename_file, 3, 0, do_qtn_rename_file,
		"Renames file from <oldname> to <newname>",
		"Quantenna universal board config. Renames file\n"
	  );

U_BOOT_CMD(qtn_dump_file, 2, 0, do_qtn_dump_file,
		"Dumps file from config data space <filename>",
		"Quantenna universal board config. Dumps file\n"
	  );

U_BOOT_CMD(qtn_list_files, 1, 0, do_qtn_list_files,
		"list files from config data space",
		"Quantenna universal board config.\n"
	  );

#endif /* TOPAZ_EP_MINI_UBOOT */

