/*******************************************************************************
Copyright (C) Marvell International Ltd. and its affiliates

This software file (the "File") is owned and distributed by Marvell
International Ltd. and/or its affiliates ("Marvell") under the following
alternative licensing terms.  Once you have made an election to distribute the
File under one of the following license alternatives, please (i) delete this
introductory statement regarding license alternatives, (ii) delete the two
license alternatives that you have not elected to use and (iii) preserve the
Marvell copyright notice above.

********************************************************************************
Marvell Commercial License Option

If you received this File from Marvell and you have entered into a commercial
license agreement (a "Commercial License") with Marvell, the File is licensed
to you under the terms of the applicable Commercial License.

********************************************************************************
Marvell GPL License Option

If you received this File from Marvell, you may opt to use, redistribute and/or
modify this File in accordance with the terms and conditions of the General
Public License Version 2, June 1991 (the "GPL License"), a copy of which is
available along with the File in the license.txt file or by writing to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 or
on the worldwide web at http://www.gnu.org/licenses/gpl.txt.

THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE IMPLIED
WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY
DISCLAIMED.  The GPL License provides additional details about this warranty
disclaimer.
********************************************************************************
Marvell BSD License Option

If you received this File from Marvell, you may opt to use, redistribute and/or
modify this File under the following licensing terms.
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 Marvell 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 BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 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.

******************************************************************************/
/*******************************************************************************
* tpm_init.c
*
* DESCRIPTION:
*               Traffic Processor Manager = TPM
*
* DEPENDENCIES:
*               None
*
* CREATED BY:   OctaviaP
*
* DATE CREATED:
*
* FILE REVISION NUMBER:
*               Revision: 1.13
*
*
*******************************************************************************/

#include "tpm_common.h"
#include "tpm_header.h"

/* Global  Variables */
extern spinlock_t tpmPncLock;
extern spinlock_t tpmModLock;
extern spinlock_t tpmTcamAgingLock;

/* Local definitions */
#define TPM_L2_BASE_LUID   0
#define TPM_L3_BASE_LUID   (TPM_L2_BASE_LUID + 1)
#define TPM_IPV4_BASE_LUID (TPM_L3_BASE_LUID + 1)
#define TPM_IPV6_BASE_LUID (TPM_IPV4_BASE_LUID + 3)

#define IF_ERROR(ret)       \
	if (ret != TPM_OK) {\
		TPM_OS_ERROR(TPM_INIT_MOD, " recvd ret_code(%d)\n", ret);\
		return(ret);\
	}
#define IF_ERROR_I(ret, i)  \
	if (ret != TPM_OK) {\
		TPM_OS_ERROR(TPM_INIT_MOD, " For index(%d), recvd ret_code(%d)\n", i, ret);\
		return(ret);\
	}

/* Local Variables */
static tpm_init_t tpm_init;

static tpm_tx_mod_hal_map_t tpm_tx_mod_hal_attrs[TPM_MAX_NUM_TX_PORTS] = {
	/* <TCONT number> */
	/*TPM_TX_MOD_GMAC0 */ {0, 0},
	/*TPM_TX_MOD_GMAC1 */ {1, 0},
	/*TPM_TX_MOD_PMAC_0 */ {2, 0},
	/*TPM_TX_MOD_PMAC_1 */ {2, 1},
	/*TPM_TX_MOD_PMAC_2 */ {2, 2},
	/*TPM_TX_MOD_PMAC_3 */ {2, 3},
	/*TPM_TX_MOD_PMAC_4 */ {2, 4},
	/*TPM_TX_MOD_PMAC_5 */ {2, 5},
	/*TPM_TX_MOD_PMAC_6 */ {2, 6},
	/*TPM_TX_MOD_PMAC_7 */ {2, 7}
};


#define INIT_GMAC_VALID(gmac)							\
	(((TPM_ENUM_PMAC == gmac) && (TPM_NONE != tpm_init.pon_type)) ||	\
	 ((1 == tpm_init.gmac_port_conf[gmac].valid) && (TPM_GMAC_CON_DISC != tpm_init.gmac_port_conf[gmac].conn)))

uint32_t opt_tbl[] = { 	ESC_OPT_RGMIIA_MAC0, ESC_OPT_RGMIIA_MAC1, ESC_OPT_RGMIIA_SW_P5, ESC_OPT_RGMIIA_SW_P6,
			 	ESC_OPT_RGMIIB_MAC0, ESC_OPT_MAC0_2_SW_P4, ESC_OPT_MAC1_2_SW_P5, ESC_OPT_GEPHY_MAC1,
			    	ESC_OPT_GEPHY_SW_P0, ESC_OPT_GEPHY_SW_P5, ESC_OPT_FE3PHY, ESC_OPT_SGMII_2_SW_P1, ESC_OPT_SGMII,
				ESC_OPT_QSGMII,	ESC_OPT_SATA, ESC_OPT_SGMII_2_5 };
char *opt_str_tlb[] = { "RGMIIA_MAC0", "RGMIIA_MAC1", "RGMIIA_SW_P5", "RGMIIA_SW_P6",
		 	"RGMIIB_MAC0", "MAC0_2_SW_P4", "MAC1_2_SW_P5", "GEPHY_MAC1",
		    	"GEPHY_SW_P0", "GEPHY_SW_P5", "FE3PHY", "PCS", "SGMII", "QSGMII", "SATA" , "SGMII_2_5"};
char *prof_str_tlb[] = { "", "PON_WAN_DUAL_MAC_INT_SWITCH", 	"PON_WAN_G0_INT_SWITCH",
			"PON_WAN_G1_LAN_G0_INT_SWITCH", 	"G0_WAN_G1_INT_SWITCH",
		 	"G1_WAN_G0_INT_SWITCH", 		"PON_G1_WAN_G0_INT_SWITCH",
			"PON_G0_WAN_G1_INT_SWITCH",		"PON_WAN_DUAL_MAC_EXT_SWITCH",
		    	"PON_WAN_G1_MNG_EXT_SWITCH",		"PON_WAN_G0_SINGLE_PORT",
			"PON_WAN_G1_SINGLE_PORT",		"PON_G1_WAN_G0_SINGLE_PORT",
			"PON_G0_WAN_G1_SINGLE_PORT",		"PON_WAN_G0_G1_LPBK"};

static tpm_pnc_range_lookup_map_t pnc_range_lookup_tbl[TPM_MAX_NUM_RANGES] = {
/*  Range_num             lu_id  last_range  valid */
	{TPM_PNC_MNGMT_DS, 0, 0, 1},
	{TPM_PNC_MAC_LEARN, 0, 1, 1},
	{TPM_PNC_CPU_WAN_LPBK_US, 0, 0, 1},
	{TPM_PNC_NUM_VLAN_TAGS, 0, 0, 1},
	{TPM_PNC_MULTI_LPBK, 0, 0, 1},
	{TPM_PNC_VIRT_UNI, 0, 0, 1},
	{TPM_PNC_LOOP_DET_US, 0, 0, 1},
	{TPM_PNC_L2_MAIN, 0, 1, 1},
	{TPM_PNC_ETH_TYPE, 1, 1, 1},
	{TPM_PNC_IGMP, 2, 0, 1},
	{TPM_PNC_IPV4_MC_DS, 2, 0, 1},
	{TPM_PNC_IPV4_MAIN, 2, 1, 1},
	{TPM_PNC_TCP_FLAG, 3, 1, 1},
	{TPM_PNC_TTL, 4, 1, 1},
	{TPM_PNC_IPV4_PROTO, 5, 0, 1},
	{TPM_PNC_IPV4_FRAG, 5, 0, 1},
	{TPM_PNC_IPV4_LEN, 5, 1, 1},
	{TPM_PNC_IPV6_NH, 6, 1, 1},
	{TPM_PNC_IPV6_L4_MC_DS, 7, 1, 1},
	{TPM_PNC_IPV6_L4, 7, 1, 1},
	{TPM_PNC_IPV6_HOPL, 8, 1, 1},
	{TPM_PNC_IPV6_MC_SIP, 8, 1, 1},
	{TPM_PNC_IPV6_GEN, 8, 1, 1},
	{TPM_PNC_IPV6_MC_DS, 9, 1, 1},
	{TPM_PNC_IPV6_DIP, 9, 1, 1},
	{TPM_PNC_CNM_IPV4_PRE, 10, 1, 1},
	/* The range 'TPM_PNC_CNM_MAIN' spans over two lookup ids.
		LU_ID_CNM_BASE := 11
		LU_ID_L2_CNM   := LU_ID_CNM_BASE+0[/11]
		LU_ID_IPV4_CNM := LU_ID_CNM_BASE+1[/12] */
	{TPM_PNC_CNM_MAIN, 11, 1, 1},
	{TPM_PNC_CATCH_ALL, 0, 0, 1},

};

bool tpm_init_gmac_in_gateway_mode(tpm_gmacs_enum_t gmac_i)
{
	struct eth_port *pp = NULL;

	pp = mv_eth_port_by_id(gmac_i);
	if (!pp) {
		TPM_OS_WARN(TPM_INIT_MOD, "Port (%d) has not been initialized\n", gmac_i);
		return true;
	}

	if (pp->flags & MV_ETH_F_SWITCH) {
		TPM_OS_INFO(TPM_INIT_MOD, "Port (%d) is in GateWay mode, driver has already set MH\n", gmac_i);
		return true;
	}

	return false;
}

uint32_t tpm_init_check_gmac_mh_gtwy_mode(tpm_gmacs_enum_t gmac_i, uint32_t mh)
{
	struct eth_port *pp = NULL;

	pp = mv_eth_port_by_id(gmac_i);
	if (!pp) {
		TPM_OS_WARN(TPM_INIT_MOD, "Port (%d) has not been initialized\n", gmac_i);
		return TPM_OK;
	}

	if (tpm_init_gmac_in_gateway_mode(gmac_i) && (0 == mh)) {
		/* Port is in GateWay mode, MH must be enabled */
		return TPM_FAIL;
	}

	return TPM_OK;
}

void tpm_init_config_params_init(tpm_init_t *tpm_init_params)
{
	tpm_init.omci_etype = tpm_init_params->omci_etype;
	tpm_init.pon_type = tpm_init_params->pon_type;
	tpm_init.ds_mh_set_conf = tpm_init_params->ds_mh_set_conf;
	tpm_init.validation_en = tpm_init_params->validation_en;
	tpm_init.igmp_snoop = tpm_init_params->igmp_snoop;
	tpm_init.igmp_cpu_queue = tpm_init_params->igmp_cpu_queue;
	memcpy(&(tpm_init.igmp_pkt_frwd_mod), &(tpm_init_params->igmp_pkt_frwd_mod),
	       sizeof(tpm_init.igmp_pkt_frwd_mod));
	tpm_init.num_tcont_llid = tpm_init_params->num_tcont_llid;
	tpm_init.gmac0_mh_en = tpm_init_params->gmac0_mh_en;
	tpm_init.gmac1_mh_en = tpm_init_params->gmac1_mh_en;
#if 0				/*Keep to be added in future version */
	tpm_init.deb_port_valid = tpm_init_params->deb_port_valid;
	tpm_init.deb_port = tpm_init_params->deb_port;
#endif
	tpm_init.cfg_pnc_parse = tpm_init_params->cfg_pnc_parse;
	tpm_init.cpu_loopback = tpm_init_params->cpu_loopback;
	tpm_init.trace_debug_info = tpm_init_params->trace_debug_info;
	tpm_init.virt_uni_info.enabled = tpm_init_params->virt_uni_info.enabled;
	tpm_init.virt_uni_info.uni_port = tpm_init_params->virt_uni_info.uni_port;
	tpm_init.virt_uni_info.switch_port = tpm_init_params->virt_uni_info.switch_port;
	tpm_init.ipv6_5t_enable = tpm_init_params->ipv6_5t_enable;
	tpm_init.ctc_cm_enable = tpm_init_params->ctc_cm_enable;
	tpm_init.ctc_cm_ipv6_parse_window = tpm_init_params->ctc_cm_ipv6_parse_window;
	tpm_init.pnc_mac_learn_enable = tpm_init_params->pnc_mac_learn_enable;
#if 0
	tpm_init.vlan1_tpid = tpm_init_params->vlan1_tpid;
	tpm_init.vlan2_tpid = tpm_init_params->vlan2_tpid;
#endif

	memcpy(&(tpm_init.eth_port_conf), &(tpm_init_params->eth_port_conf),
	       ((sizeof(tpm_init_eth_port_conf_t)) * TPM_MAX_NUM_ETH_PORTS));
	memcpy(&(tpm_init.gmac_tx), &(tpm_init_params->gmac_tx), ((sizeof(tpm_init_gmac_tx_t)) * TPM_MAX_NUM_TX_PORTS));
	memcpy(&(tpm_init.gmac_rx), &(tpm_init_params->gmac_rx), ((sizeof(tpm_init_gmac_rx_t)) * TPM_MAX_NUM_GMACS));
	memcpy(&(tpm_init.gmac_bp_bufs), &(tpm_init_params->gmac_bp_bufs),
	       ((sizeof(tpm_init_gmac_bufs_t)) * TPM_MAX_NUM_GMACS));
	memcpy(&(tpm_init.pnc_range), &(tpm_init_params->pnc_range),
	       ((sizeof(tpm_init_pnc_range_t)) * TPM_MAX_NUM_RANGES));
	memcpy(&(tpm_init.vlan_etypes), &(tpm_init_params->vlan_etypes),
	       ((sizeof(uint32_t)) * TPM_NUM_VLAN_ETYPE_REGS));
	memcpy(&(tpm_init.tpid_opt), &(tpm_init_params->tpid_opt), sizeof(tpm_init_tpid_opt_t));
	memcpy(&(tpm_init.mod_config), &(tpm_init_params->mod_config), sizeof(tpm_init_mod_params_t));
	memcpy(&(tpm_init.mod_chain), &(tpm_init_params->mod_chain), sizeof(tpm_init_mod_chain_t));
	memcpy(&(tpm_init.mc_setting), &(tpm_init_params->mc_setting), sizeof(tpm_init_mc_setting_t));

	memcpy(&(tpm_init.mtu_config), &(tpm_init_params->mtu_config), sizeof(tpm_init_mtu_params_t));
	memcpy(&(tpm_init.port_fc_conf), &(tpm_init_params->port_fc_conf), sizeof(tpm_init_fc_params_t));
	tpm_init.pppoe_add_enable = tpm_init_params->pppoe_add_enable;
	tpm_init.num_vlan_tags = tpm_init_params->num_vlan_tags;
	tpm_init.cpu_rx_queue = tpm_init_params->cpu_rx_queue;
	tpm_init.ttl_illegal_action = tpm_init_params->ttl_illegal_action;
	tpm_init.tcp_flag_check = tpm_init_params->tcp_flag_check;
	tpm_init.catch_all_pkt_action = tpm_init_params->catch_all_pkt_action;
	tpm_init.ety_dsa_enable = tpm_init_params->ety_dsa_enable;

	tpm_init.eth_cmplx_profile = tpm_init_params->eth_cmplx_profile;
	memcpy(&(tpm_init.gmac_port_conf), &(tpm_init_params->gmac_port_conf),
		sizeof(tpm_init.gmac_port_conf));
	tpm_init.backup_wan = tpm_init_params->backup_wan;
	memcpy(&(tpm_init.split_mod_config), &(tpm_init_params->split_mod_config), sizeof(tpm_init_split_mod_params_t));
	tpm_init.switch_init = tpm_init_params->switch_init;
}

void tpm_init_pon_type_get(void)
{
	if (tpm_init.pon_type == MV_TPM_UN_INITIALIZED_INIT_PARAM) {
		tpm_init.pon_type = TPM_NONE;

		if (tpm_init.validation_en == TPM_VALID_ENABLED)
			TPM_OS_ERROR(TPM_INIT_MOD, "\n PON_TYPE - missing initialization. ");
	}
}

void tpm_init_ds_mh_set_conf_get(void)
{
	if (tpm_init.ds_mh_set_conf == MV_TPM_UN_INITIALIZED_INIT_PARAM) {
		tpm_init.ds_mh_set_conf = TPM_MH_SRC_RX_CTRL;
		if (tpm_init.validation_en == TPM_VALID_ENABLED)
			TPM_OS_WARN(TPM_INIT_MOD,
				    " MH_SRC_RX_CTRL - missing initialization - set to default = TPM_MH_SRC_RX_CTRL = 0. \n");
	}
}

void tpm_init_validation_get(void)
{
	if (tpm_init.validation_en == MV_TPM_UN_INITIALIZED_INIT_PARAM)
		tpm_init.validation_en = TPM_VALID_DISABLED;
}

void tpm_init_cfg_pnc_parse_get(void)
{
	if (tpm_init.cfg_pnc_parse == MV_TPM_UN_INITIALIZED_INIT_PARAM)
		tpm_init.cfg_pnc_parse = TPM_CFG_PNC_PARSE_ENABLED;
}

void tpm_init_cpu_loopback_get(void)
{
	if (tpm_init.cpu_loopback == MV_TPM_UN_INITIALIZED_INIT_PARAM)
		tpm_init.cpu_loopback = TPM_CPU_LOOPBACK_DISABLED;
}

void tpm_init_trace_debug_info_get(void)
{
	if (tpm_init.trace_debug_info == MV_TPM_UN_INITIALIZED_INIT_PARAM)
		tpm_init.trace_debug_info = 0xE000FFFF;

	/* update the global param with debug info from xml */
	tpm_glob_trace = tpm_init.trace_debug_info;
}

void tpm_init_vitual_uni_info_get(void)
{
	if (tpm_init.virt_uni_info.enabled == MV_TPM_UN_INITIALIZED_INIT_PARAM) {
		tpm_init.virt_uni_info.enabled = 0;
		tpm_init.virt_uni_info.uni_port = TPM_SRC_PORT_UNI_VIRT;
		tpm_init.virt_uni_info.switch_port = 5;
	}
}

void tpm_init_omci_get(void)
{
	if (tpm_init.omci_etype == MV_TPM_UN_INITIALIZED_INIT_PARAM) {
		tpm_init.omci_etype = 0xBABA;
		if (tpm_init.validation_en == TPM_VALID_ENABLED)
			TPM_OS_ERROR(TPM_INIT_MOD, "\n OMCI type - missing initialization. ");
	}
}

void tpm_init_igmp_get(void)
{
	tpm_src_port_type_t src_port;

	if (tpm_init.igmp_snoop == MV_TPM_UN_INITIALIZED_INIT_PARAM) {
		tpm_init.igmp_snoop = 1;
		if (tpm_init.validation_en == TPM_VALID_ENABLED)
			TPM_OS_ERROR(TPM_INIT_MOD, "IGMP snooping - missing initialization. \n ");
	}

	if (tpm_init.igmp_cpu_queue == MV_TPM_UN_INITIALIZED_INIT_PARAM) {
		tpm_init.igmp_cpu_queue = 0;
		if (tpm_init.validation_en == TPM_VALID_ENABLED)
			TPM_OS_ERROR(TPM_INIT_MOD, "IGMP cpu_queue - missing initialization. \n ");
	}

	for (src_port = TPM_SRC_PORT_UNI_0; src_port <= TPM_SRC_PORT_UNI_VIRT; src_port++) {
		if (tpm_init.igmp_pkt_frwd_mod[src_port] == MV_TPM_UN_INITIALIZED_INIT_PARAM) {
			tpm_init.igmp_pkt_frwd_mod[src_port] = TPM_IGMP_FRWD_MODE_SNOOPING;
			if (tpm_init.validation_en == TPM_VALID_ENABLED)
				TPM_OS_ERROR(TPM_INIT_MOD, "IGMP pkt_frwd_mod port: %d - missing initialization. \n ",
					     src_port);
		}
	}

}

void tpm_init_mc_get(void)
{

	if (tpm_init.mc_setting.filter_mode == MV_TPM_UN_INITIALIZED_INIT_PARAM)
		tpm_init.mc_setting.filter_mode = TPM_MC_COMBINED_IP_MAC_FILTER;
#if 0
	if (tpm_init.mc_setting.igmp_mode == MV_TPM_UN_INITIALIZED_INIT_PARAM)
	   tpm_init.mc_setting.igmp_mode = TPM_MC_IGMP_SNOOPING;
#endif
	if (tpm_init.mc_setting.per_uni_vlan_xlat == MV_TPM_UN_INITIALIZED_INIT_PARAM)
		tpm_init.mc_setting.per_uni_vlan_xlat = false;

	if (tpm_init.mc_setting.mc_pppoe_enable == MV_TPM_UN_INITIALIZED_INIT_PARAM)
		tpm_init.mc_setting.mc_pppoe_enable = false;

	if (tpm_init.mc_setting.ipv4_mc_support == MV_TPM_UN_INITIALIZED_INIT_PARAM)
		tpm_init.mc_setting.ipv4_mc_support = TPM_TRUE;

	if (tpm_init.mc_setting.ipv6_mc_support == MV_TPM_UN_INITIALIZED_INIT_PARAM)
		tpm_init.mc_setting.ipv6_mc_support = TPM_FALSE;

}

uint32_t tpm_init_pkt_len_max_us_get(void)
{
	if (TPM_GPON == tpm_init.pon_type)
		return 2000;
	else
		return 1593;
}

uint32_t tpm_init_ipv4_mtu_us_default_get(void)
{
	uint32_t ipv4_mtu_default;

	ipv4_mtu_default = tpm_init_pkt_len_max_us_get();

	/* vlan */
	ipv4_mtu_default -= (4 * tpm_init.num_vlan_tags);
	/* da + sa + ety */
	ipv4_mtu_default -= 14;

	return ipv4_mtu_default;
}

uint32_t tpm_init_ipv4_pppoe_mtu_us_default_get(void)
{
	uint32_t ipv4_pppoe_mtu_default;

	ipv4_pppoe_mtu_default = tpm_init_pkt_len_max_us_get();

	if (TPM_PPPOE_ADD_ENABLED == tpm_init.pppoe_add_enable)
		ipv4_pppoe_mtu_default -= 8;

	ipv4_pppoe_mtu_default -= (4 * tpm_init.num_vlan_tags);
	/* da + sa + ety */
	ipv4_pppoe_mtu_default -= 14;

	return ipv4_pppoe_mtu_default;
}

uint32_t tpm_init_ipv6_mtu_us_default_get(void)
{
	uint32_t ipv6_mtu_default;

	ipv6_mtu_default = tpm_init_pkt_len_max_us_get();

	ipv6_mtu_default -= (4 * tpm_init.num_vlan_tags);

	/* in ipv6 header, payload length does not contain the ipv6 header itself */
	ipv6_mtu_default -= 40;
	/* da + sa + ety */
	ipv6_mtu_default -= 14;

	return ipv6_mtu_default;
}

uint32_t tpm_init_ipv6_pppoe_mtu_us_default_get(void)
{
	uint32_t ipv6_pppoe_mtu_default;

	ipv6_pppoe_mtu_default = tpm_init_pkt_len_max_us_get();

	if (TPM_PPPOE_ADD_ENABLED == tpm_init.pppoe_add_enable)
		ipv6_pppoe_mtu_default -= 8;

	ipv6_pppoe_mtu_default -= (4 * tpm_init.num_vlan_tags);

	/* in ipv6 header, payload length does not contain the ipv6 header itself */
	ipv6_pppoe_mtu_default -= 40;
	/* da + sa + ety */
	ipv6_pppoe_mtu_default -= 14;

	return ipv6_pppoe_mtu_default;
}

void tpm_init_mtu_get(void)
{

	if (tpm_init.pppoe_add_enable == MV_TPM_UN_INITIALIZED_INIT_PARAM)
		tpm_init.pppoe_add_enable = TPM_PPPOE_ADD_ENABLED;

	if (tpm_init.num_vlan_tags == MV_TPM_UN_INITIALIZED_INIT_PARAM)
		tpm_init.num_vlan_tags = 1;

	if (tpm_init.mtu_config.mtu_enable == MV_TPM_UN_INITIALIZED_INIT_PARAM)
		tpm_init.mtu_config.mtu_enable = TPM_MTU_CHECK_ENABLED;

	if (tpm_init.mtu_config.ipv4_mtu_us == MV_TPM_UN_INITIALIZED_INIT_PARAM)
		tpm_init.mtu_config.ipv4_mtu_us = tpm_init_ipv4_mtu_us_default_get();

	if (tpm_init.mtu_config.ipv6_mtu_us == MV_TPM_UN_INITIALIZED_INIT_PARAM)
		tpm_init.mtu_config.ipv6_mtu_us = tpm_init_ipv6_mtu_us_default_get();

	if (tpm_init.cpu_rx_queue == MV_TPM_UN_INITIALIZED_INIT_PARAM)
		tpm_init.cpu_rx_queue = 0;

	if (tpm_init.ttl_illegal_action == MV_TPM_UN_INITIALIZED_INIT_PARAM)
		tpm_init.ttl_illegal_action = TPM_TTL_ZERO_ACTION_NOTHING;

	if (tpm_init.tcp_flag_check == MV_TPM_UN_INITIALIZED_INIT_PARAM)
		tpm_init.tcp_flag_check = TPM_TCP_FLAG_NOT_CHECK;

	/* if the pppoe is not enabled, do not need to set
	   ipv4_pppoe_mtu_us and ipv6_pppoe_mtu_us */
	if (TPM_PPPOE_ADD_DISABLED == tpm_init.pppoe_add_enable)
		return;

	if (tpm_init.mtu_config.ipv4_pppoe_mtu_us == MV_TPM_UN_INITIALIZED_INIT_PARAM)
		tpm_init.mtu_config.ipv4_pppoe_mtu_us = tpm_init_ipv4_pppoe_mtu_us_default_get();

	if (tpm_init.mtu_config.ipv6_pppoe_mtu_us == MV_TPM_UN_INITIALIZED_INIT_PARAM)
		tpm_init.mtu_config.ipv6_pppoe_mtu_us = tpm_init_ipv6_pppoe_mtu_us_default_get();

	/* in DS, mtu is optional, so do not set default value */

}

void tpm_init_pnc_config_get(void)
{
	if (tpm_init.catch_all_pkt_action == MV_TPM_UN_INITIALIZED_INIT_PARAM)
		tpm_init.catch_all_pkt_action = TPM_PNC_LAST_ENTRY_INIT_DROP;
}

void tpm_init_ety_dsa_enable_get(void)
{
	if (tpm_init.ety_dsa_enable == MV_TPM_UN_INITIALIZED_INIT_PARAM)
		tpm_init.ety_dsa_enable = TPM_ETY_DSA_DISABLE;
}

void tpm_init_ctc_cm_enable_get(void)
{
	if (tpm_init.ctc_cm_enable == MV_TPM_UN_INITIALIZED_INIT_PARAM)
		tpm_init.ctc_cm_enable = TPM_CTC_CM_DISABLED;
}

void tpm_init_ctc_cm_ipv6_parse_window_get(void)
{
	if (tpm_init.ctc_cm_ipv6_parse_window == MV_TPM_UN_INITIALIZED_INIT_PARAM)
		tpm_init.ctc_cm_ipv6_parse_window = TPM_CTC_CM_IPv6_FIRST_24B;
}

void tpm_init_split_mod_get(void)
{
	uint32_t i = 0;
	if (tpm_init.split_mod_config.split_mod_enable == MV_TPM_UN_INITIALIZED_INIT_PARAM)
		tpm_init.split_mod_config.split_mod_enable = TPM_SPLIT_MOD_DISABLED;
	if (tpm_init.split_mod_config.p_bit_num == MV_TPM_UN_INITIALIZED_INIT_PARAM) {
		tpm_init.split_mod_config.p_bit_num = 8;
		for(i = 0; i < tpm_init.split_mod_config.p_bit_num; i++) {
			tpm_init.split_mod_config.p_bit[i] = i;
		}
	}
	if (tpm_init.split_mod_config.vlan_num == MV_TPM_UN_INITIALIZED_INIT_PARAM)
		tpm_init.split_mod_config.vlan_num = 10;
	if (tpm_init.split_mod_config.split_mod_mode == MV_TPM_UN_INITIALIZED_INIT_PARAM)
		tpm_init.split_mod_config.split_mod_mode = TPM_SPLIT_MOD_MODE_CTC;
}
void tpm_init_switch_init_get(void)
{
	if (tpm_init.switch_init == MV_TPM_UN_INITIALIZED_INIT_PARAM) {
		if (   tpm_init.eth_cmplx_profile == TPM_PON_WAN_G0_SINGLE_PORT
		    || tpm_init.eth_cmplx_profile == TPM_PON_WAN_G1_SINGLE_PORT
		    || tpm_init.eth_cmplx_profile == TPM_PON_G1_WAN_G0_SINGLE_PORT
		    || tpm_init.eth_cmplx_profile == TPM_PON_G0_WAN_G1_SINGLE_PORT
		    || tpm_init.eth_cmplx_profile == TPM_PON_WAN_G0_G1_LPBK)
			tpm_init.switch_init = 0;
		else
			tpm_init.switch_init = 1;
	}
}

void tpm_init_ipv6_5t_enable_get(void)
{
	if (tpm_init.ipv6_5t_enable == MV_TPM_UN_INITIALIZED_INIT_PARAM)
		tpm_init.ipv6_5t_enable = TPM_IPV6_5T_DISABLED;
}

#define	HW_OPT_ON(on, hw) ((hw & on)  == on)
#define	VALID_ONLY(on, hw) (((hw & on)  == on) & ((hw & ~on)  == 0))

void tpm_init_eth_cmplx_setup_error_print(uint32_t hwEthCmplx, bool sysfs_call)
{
	uint32_t i,j, off = 0;
	char buff[1024];
	uint32_t profile[8]= {0};

	off += sprintf(buff+off, "\nSelected Eth Complex Profile: %s", prof_str_tlb[tpm_init.eth_cmplx_profile]);
	off += sprintf(buff+off, "\nHW enabled options:\n\t");
	for (i = 0;  i<sizeof(opt_tbl)/sizeof(uint32_t); i++) {
		if (opt_tbl[i] & hwEthCmplx)
			off += sprintf(buff+off, "%s ", opt_str_tlb[i]);
	}

	switch (tpm_init.eth_cmplx_profile)
	{
	case TPM_PON_WAN_DUAL_MAC_INT_SWITCH:
		profile[0] = ESC_OPT_MAC0_2_SW_P4 | ESC_OPT_MAC1_2_SW_P5 | ESC_OPT_GEPHY_SW_P0 | ESC_OPT_FE3PHY;
		profile[1] = ESC_OPT_MAC0_2_SW_P4 | ESC_OPT_MAC1_2_SW_P5 | ESC_OPT_QSGMII;
		profile[2] = ESC_OPT_MAC0_2_SW_P4 | ESC_OPT_MAC1_2_SW_P5 | ESC_OPT_QSGMII | ESC_OPT_RGMIIA_SW_P6;
		profile[3] = ESC_OPT_MAC0_2_SW_P4 | ESC_OPT_MAC1_2_SW_P5 | ESC_OPT_RGMIIA_SW_P6 | ESC_OPT_FE3PHY;
		break;

	case TPM_PON_WAN_G0_INT_SWITCH:
		profile[0] = ESC_OPT_MAC0_2_SW_P4 | ESC_OPT_FE3PHY | ESC_OPT_GEPHY_SW_P0;
		profile[1] = ESC_OPT_MAC0_2_SW_P4 | ESC_OPT_QSGMII;
		profile[2] = ESC_OPT_MAC0_2_SW_P4 | ESC_OPT_QSGMII | ESC_OPT_RGMIIA_SW_P6;
		profile[3] = ESC_OPT_MAC0_2_SW_P4 | ESC_OPT_FE3PHY | ESC_OPT_RGMIIA_SW_P6;
		break;

	case TPM_PON_WAN_G1_LAN_G0_INT_SWITCH:
		profile[0] = ESC_OPT_RGMIIA_MAC1 | ESC_OPT_MAC0_2_SW_P4 | ESC_OPT_GEPHY_SW_P0 | ESC_OPT_FE3PHY;
		profile[1] = ESC_OPT_RGMIIA_MAC1 | ESC_OPT_MAC0_2_SW_P4 | ESC_OPT_QSGMII;
		profile[2] = ESC_OPT_MAC0_2_SW_P4 | ESC_OPT_GEPHY_MAC1 | ESC_OPT_FE3PHY;
		profile[3] = ESC_OPT_MAC0_2_SW_P4 | ESC_OPT_GEPHY_MAC1 | ESC_OPT_RGMIIA_SW_P6 | ESC_OPT_FE3PHY;
		profile[4] = ESC_OPT_MAC0_2_SW_P4 | ESC_OPT_GEPHY_MAC1 | ESC_OPT_QSGMII;
		break;

	case TPM_G0_WAN_G1_INT_SWITCH:
		profile[0] = ESC_OPT_RGMIIB_MAC0 | ESC_OPT_MAC1_2_SW_P5 | ESC_OPT_GEPHY_SW_P0 | ESC_OPT_FE3PHY;
		profile[1] = ESC_OPT_RGMIIB_MAC0 | ESC_OPT_MAC1_2_SW_P5 | ESC_OPT_QSGMII;
		break;

	case TPM_G1_WAN_G0_INT_SWITCH:
		profile[0] = ESC_OPT_MAC0_2_SW_P4 | ESC_OPT_RGMIIA_MAC1 | ESC_OPT_GEPHY_SW_P0 | ESC_OPT_FE3PHY;
        profile[1] = ESC_OPT_MAC0_2_SW_P4 | ESC_OPT_RGMIIA_MAC1 | ESC_OPT_FE3PHY;
		profile[2] = ESC_OPT_MAC0_2_SW_P4 | ESC_OPT_RGMIIA_MAC1 | ESC_OPT_QSGMII;
		profile[3] = ESC_OPT_MAC0_2_SW_P4 | ESC_OPT_GEPHY_MAC1 | ESC_OPT_FE3PHY;
		profile[4] = ESC_OPT_MAC0_2_SW_P4 | ESC_OPT_GEPHY_MAC1 | ESC_OPT_RGMIIA_SW_P6 | ESC_OPT_FE3PHY;
		profile[5] = ESC_OPT_MAC0_2_SW_P4 | ESC_OPT_GEPHY_MAC1 | ESC_OPT_QSGMII;
		profile[6] = ESC_OPT_MAC0_2_SW_P4 | ESC_OPT_GEPHY_MAC1 | ESC_OPT_QSGMII | ESC_OPT_RGMIIA_SW_P6;
		break;

	case TPM_PON_G1_WAN_G0_INT_SWITCH:
		profile[0] = ESC_OPT_MAC0_2_SW_P4 | ESC_OPT_RGMIIA_MAC1 | ESC_OPT_GEPHY_SW_P0 | ESC_OPT_FE3PHY;
		profile[1] = ESC_OPT_MAC0_2_SW_P4 | ESC_OPT_RGMIIA_MAC1 | ESC_OPT_QSGMII;
		profile[2] = ESC_OPT_MAC0_2_SW_P4 | ESC_OPT_GEPHY_MAC1 | ESC_OPT_FE3PHY;
		profile[3] = ESC_OPT_MAC0_2_SW_P4 | ESC_OPT_GEPHY_MAC1 | ESC_OPT_RGMIIA_SW_P6 | ESC_OPT_FE3PHY;
		profile[4] = ESC_OPT_MAC0_2_SW_P4 | ESC_OPT_GEPHY_MAC1 | ESC_OPT_QSGMII;
		profile[5] = ESC_OPT_MAC0_2_SW_P4 | ESC_OPT_GEPHY_MAC1 | ESC_OPT_QSGMII | ESC_OPT_RGMIIA_SW_P6;
		break;

	case TPM_PON_G0_WAN_G1_INT_SWITCH:
		profile[0] = ESC_OPT_RGMIIB_MAC0 | ESC_OPT_MAC1_2_SW_P5 | ESC_OPT_GEPHY_SW_P0 | ESC_OPT_FE3PHY;
		profile[1] = ESC_OPT_RGMIIB_MAC0 | ESC_OPT_MAC1_2_SW_P5 | ESC_OPT_MAC1_2_SW_P5 | ESC_OPT_QSGMII;
		break;

	case TPM_PON_WAN_DUAL_MAC_EXT_SWITCH:
		profile[0] = ESC_OPT_RGMIIB_MAC0 | ESC_OPT_RGMIIA_MAC1;
		break;

	case TPM_PON_WAN_G1_MNG_EXT_SWITCH:
		profile[0] = ESC_OPT_GEPHY_MAC1;
		break;

	case TPM_PON_WAN_G0_SINGLE_PORT:
		profile[0] = ESC_OPT_RGMIIB_MAC0;
		break;

	case TPM_PON_WAN_G1_SINGLE_PORT:
		profile[0] = ESC_OPT_RGMIIB_MAC0 | ESC_OPT_RGMIIA_MAC1;
		profile[1] = ESC_OPT_RGMIIB_MAC0 | ESC_OPT_GEPHY_MAC1;
		break;

	case TPM_PON_G1_WAN_G0_SINGLE_PORT:
		profile[0] = ESC_OPT_RGMIIB_MAC0 | ESC_OPT_RGMIIA_MAC1;
		break;

	case TPM_PON_G0_WAN_G1_SINGLE_PORT:
		profile[0] = ESC_OPT_RGMIIB_MAC0 | ESC_OPT_RGMIIA_MAC1;
		break;

	case TPM_PON_WAN_G0_G1_LPBK:
		if (DB_88F6535_BP_ID == mvBoardIdGet())
			profile[0] = ESC_OPT_RGMIIA_MAC0 | ESC_OPT_GEPHY_MAC1;
		if (DB_88F6601_BP_ID == mvBoardIdGet())
			profile[0] = ESC_OPT_SGMII | ESC_OPT_GEPHY_MAC0 | ESC_OPT_LP_SERDES_FE_GE_PHY;
		if ((RD_88F6601_MC_ID == mvBoardIdGet())
			|| (GFLT200_ID == mvBoardIdGet()) || (GFLT110_ID == mvBoardIdGet()))
			profile[0] = ESC_OPT_GEPHY_MAC0;
		break;
	}

	off += sprintf(buff+off, "\nProfile supported options:\n");
	for (i = 0; profile[i]; i++) {
		off += sprintf(buff+off, "\t");
		for (j = 0; j<32; j++) {
			if (profile[i] & (1<<j)) {
				off += sprintf(buff+off, "%s ", opt_str_tlb[j]);
			}
		}
		off += sprintf(buff+off, "\n");
	}

	off += sprintf(buff+off, "\n");
	if (true == sysfs_call)
		printk("%s", buff);
	else
		TPM_OS_ERROR(TPM_INIT_MOD, "%s", buff);
}


static uint32_t tpm_init_eth_cmplx_update_conf(void)
{
	uint32_t i;
	uint32_t hwEthCmplx = mvBoardEthComplexConfigGet();

	if (hwEthCmplx & (ESC_OPT_AUTO | ESC_OPT_ILLEGAL))
	{
		TPM_OS_ERROR(TPM_INIT_MOD, "\n Illegal values in mvBoardEthComplexConfigGet 0x%x\n", hwEthCmplx);
       	return TPM_FAIL;
	}

	if (tpm_init.eth_cmplx_profile == MV_TPM_UN_INITIALIZED_INIT_PARAM) {
		if (TPM_VALID_ENABLED == tpm_init.validation_en){
			TPM_OS_ERROR(TPM_INIT_MOD, "\n ETH COMPLEX PROFILE - missing initialization\n");
       		return TPM_FAIL;
		}
	}

	/* set default values for all ports and GMACs */
	switch (tpm_init.eth_cmplx_profile)
	{
	case TPM_PON_WAN_DUAL_MAC_INT_SWITCH:
		if (!VALID_ONLY((ESC_OPT_MAC0_2_SW_P4 | ESC_OPT_MAC1_2_SW_P5 | ESC_OPT_GEPHY_SW_P0 | ESC_OPT_FE3PHY), hwEthCmplx) &&
		    !VALID_ONLY((ESC_OPT_MAC0_2_SW_P4 | ESC_OPT_MAC1_2_SW_P5 | ESC_OPT_QSGMII), hwEthCmplx) &&
		    !VALID_ONLY((ESC_OPT_MAC0_2_SW_P4 | ESC_OPT_MAC1_2_SW_P5 | ESC_OPT_QSGMII | ESC_OPT_RGMIIA_SW_P6), hwEthCmplx) &&
		    !VALID_ONLY((ESC_OPT_MAC0_2_SW_P4 | ESC_OPT_MAC1_2_SW_P5| ESC_OPT_RGMIIA_SW_P6 | ESC_OPT_FE3PHY), hwEthCmplx))
			goto setup_err;

		tpm_init.gmac_port_conf[0].valid = TPM_TRUE;
		tpm_init.gmac_port_conf[0].port_src = TPM_SRC_PORT_ILLEGAL;
		tpm_init.gmac_port_conf[0].conn = TPM_GMAC_CON_SWITCH_4;

		tpm_init.gmac_port_conf[1].valid = TPM_TRUE;
		tpm_init.gmac_port_conf[1].port_src = TPM_SRC_PORT_ILLEGAL;
		tpm_init.gmac_port_conf[1].conn = TPM_GMAC_CON_SWITCH_5;

		tpm_init.gmac_port_conf[2].valid = TPM_TRUE;
		tpm_init.gmac_port_conf[2].port_src = TPM_SRC_PORT_WAN;

		for (i = 0; i < TPM_MAX_NUM_ETH_PORTS; i++){
			if (TPM_TRUE == tpm_init.eth_port_conf[i].valid){
				tpm_init.eth_port_conf[i].int_connect = TPM_INTCON_SWITCH;

				if (HW_OPT_ON(ESC_OPT_QSGMII, hwEthCmplx) &&
				    (tpm_init.eth_port_conf[i].switch_port >= 0) &&
				    (tpm_init.eth_port_conf[i].switch_port <= 3))
					tpm_init.eth_port_conf[i].chip_connect = TPM_CONN_QSGMII;
				else if (HW_OPT_ON(ESC_OPT_GEPHY_SW_P0, hwEthCmplx) &&
					 (tpm_init.eth_port_conf[i].switch_port == 0))
					tpm_init.eth_port_conf[i].chip_connect = TPM_CONN_GE_PHY;
				else if (HW_OPT_ON(ESC_OPT_RGMIIA_SW_P6, hwEthCmplx) &&
					 (tpm_init.eth_port_conf[i].switch_port == 6))
				 	tpm_init.eth_port_conf[i].chip_connect =TPM_CONN_RGMII1;
				else if (HW_OPT_ON(ESC_OPT_FE3PHY, hwEthCmplx) &&
				    	 (tpm_init.eth_port_conf[i].switch_port >= 1) &&
				    	 (tpm_init.eth_port_conf[i].switch_port <= 3))
					tpm_init.eth_port_conf[i].chip_connect = TPM_CONN_FE_PHY;
				else
				{
					TPM_OS_WARN(TPM_INIT_MOD, "switch port %d could not be configured\n",
						tpm_init.eth_port_conf[i].switch_port);
					tpm_init.eth_port_conf[i].chip_connect = TPM_CONN_DISC;
				}
			}
		}

		if (tpm_init.virt_uni_info.enabled) {
			tpm_init.virt_uni_info.uni_port = TPM_SRC_PORT_UNI_VIRT;
			tpm_init.virt_uni_info.switch_port = TPM_GMAC1_AMBER_PORT_NUM;
		}
		break;

	case TPM_PON_WAN_G0_INT_SWITCH:
		if (1 == tpm_init.virt_uni_info.enabled)
			goto virt_uni_err;

		if (!VALID_ONLY((ESC_OPT_MAC0_2_SW_P4 | ESC_OPT_GEPHY_SW_P0 | ESC_OPT_FE3PHY), hwEthCmplx) &&
		    !VALID_ONLY((ESC_OPT_MAC0_2_SW_P4 | ESC_OPT_QSGMII), hwEthCmplx) &&
		    !VALID_ONLY((ESC_OPT_MAC0_2_SW_P4 | ESC_OPT_QSGMII | ESC_OPT_RGMIIA_SW_P6), hwEthCmplx) &&
		    !VALID_ONLY((ESC_OPT_MAC0_2_SW_P4 | ESC_OPT_RGMIIA_SW_P6 | ESC_OPT_FE3PHY), hwEthCmplx))
			goto setup_err;

		tpm_init.gmac_port_conf[0].valid = TPM_TRUE;
		tpm_init.gmac_port_conf[0].port_src = TPM_SRC_PORT_ILLEGAL;
		tpm_init.gmac_port_conf[0].conn = TPM_GMAC_CON_SWITCH_4;

		tpm_init.gmac_port_conf[1].valid = TPM_FALSE;
		tpm_init.gmac_port_conf[1].conn = TPM_GMAC_CON_DISC;

		tpm_init.gmac_port_conf[2].valid = TPM_TRUE;
		tpm_init.gmac_port_conf[2].port_src = TPM_SRC_PORT_WAN;

		for (i = 0; i < TPM_MAX_NUM_ETH_PORTS; i++){
			if (TPM_TRUE == tpm_init.eth_port_conf[i].valid){
				tpm_init.eth_port_conf[i].int_connect = TPM_INTCON_SWITCH;

				if (HW_OPT_ON(ESC_OPT_QSGMII, hwEthCmplx) &&
				    (tpm_init.eth_port_conf[i].switch_port >= 0) &&
				    (tpm_init.eth_port_conf[i].switch_port <= 3))
					tpm_init.eth_port_conf[i].chip_connect = TPM_CONN_QSGMII;
				else if (HW_OPT_ON(ESC_OPT_GEPHY_SW_P0, hwEthCmplx) &&
			 	    (tpm_init.eth_port_conf[i].switch_port == 0))
					tpm_init.eth_port_conf[i].chip_connect = TPM_CONN_GE_PHY;
				else if (HW_OPT_ON(ESC_OPT_RGMIIA_SW_P6, hwEthCmplx) &&
					 (tpm_init.eth_port_conf[i].switch_port == 6))
					tpm_init.eth_port_conf[i].chip_connect =TPM_CONN_RGMII1;
				else if (HW_OPT_ON(ESC_OPT_FE3PHY, hwEthCmplx) &&
				    	 (tpm_init.eth_port_conf[i].switch_port >= 1) &&
				    	 (tpm_init.eth_port_conf[i].switch_port <= 3))
					tpm_init.eth_port_conf[i].chip_connect = TPM_CONN_FE_PHY;
				else
				{
					TPM_OS_WARN(TPM_INIT_MOD, "switch port %d could not be configured\n",
						tpm_init.eth_port_conf[i].switch_port);
					tpm_init.eth_port_conf[i].chip_connect = TPM_CONN_DISC;
				}
			}
		}
		break;

	case TPM_PON_WAN_G1_LAN_G0_INT_SWITCH:
		if (1 == tpm_init.virt_uni_info.enabled)
			goto virt_uni_err;

		tpm_init.gmac_port_conf[0].valid = TPM_TRUE;
		tpm_init.gmac_port_conf[0].port_src = TPM_SRC_PORT_ILLEGAL;
		tpm_init.gmac_port_conf[0].conn = TPM_GMAC_CON_SWITCH_4;

		tpm_init.gmac_port_conf[1].valid = TPM_TRUE;
		// tpm_init.gmac_port_conf[1].port_src = according to XML
		// tpm_init.gmac_port_conf[1].conn = configured above

		tpm_init.gmac_port_conf[2].valid = TPM_TRUE;
		tpm_init.gmac_port_conf[2].port_src = TPM_SRC_PORT_WAN;

		for (i = 0; i < TPM_MAX_NUM_ETH_PORTS; i++)
       		if (TPM_TRUE == tpm_init.eth_port_conf[i].valid){
				tpm_init.eth_port_conf[i].int_connect = TPM_INTCON_SWITCH;

				if (HW_OPT_ON(ESC_OPT_QSGMII, hwEthCmplx) &&
				    (tpm_init.eth_port_conf[i].switch_port >= 0) &&
				    (tpm_init.eth_port_conf[i].switch_port <= 3))
       				tpm_init.eth_port_conf[i].chip_connect = TPM_CONN_QSGMII;
				else if (HW_OPT_ON(ESC_OPT_GEPHY_SW_P0, hwEthCmplx) &&
					 (tpm_init.eth_port_conf[i].switch_port == 0))
					tpm_init.eth_port_conf[i].chip_connect = TPM_CONN_GE_PHY;
				else if (HW_OPT_ON(ESC_OPT_RGMIIA_SW_P6, hwEthCmplx) &&
					 (tpm_init.eth_port_conf[i].switch_port == 6))
					tpm_init.eth_port_conf[i].chip_connect = TPM_CONN_RGMII1;
				else if (HW_OPT_ON(ESC_OPT_FE3PHY, hwEthCmplx) &&
				    	 (tpm_init.eth_port_conf[i].switch_port >= 1) &&
				    	 (tpm_init.eth_port_conf[i].switch_port <= 3))
					tpm_init.eth_port_conf[i].chip_connect = TPM_CONN_FE_PHY;
				else
				{
					TPM_OS_WARN(TPM_INIT_MOD, "switch port %d could not be configured\n",
						tpm_init.eth_port_conf[i].switch_port);
					tpm_init.eth_port_conf[i].chip_connect = TPM_CONN_DISC;
				}
			}

		if (VALID_ONLY((ESC_OPT_RGMIIA_MAC1 | ESC_OPT_MAC0_2_SW_P4 | ESC_OPT_FE3PHY), hwEthCmplx) ||
		    VALID_ONLY((ESC_OPT_RGMIIA_MAC1 | ESC_OPT_MAC0_2_SW_P4 | ESC_OPT_QSGMII), hwEthCmplx))
		{
			for (i = 0; i < TPM_MAX_NUM_ETH_PORTS; i++)
				if (TPM_FALSE == tpm_init.eth_port_conf[i].valid){
					tpm_init.eth_port_conf[i].valid = TPM_TRUE;
					tpm_init.eth_port_conf[i].port_src = tpm_init.gmac_port_conf[1].port_src;
					tpm_init.eth_port_conf[i].chip_connect = TPM_CONN_RGMII1;
					tpm_init.eth_port_conf[i].int_connect = TPM_INTCON_GMAC1;
					tpm_init.gmac_port_conf[1].conn = TPM_GMAC_CON_RGMII1;
					break;
				}
		} else if (VALID_ONLY((ESC_OPT_MAC0_2_SW_P4 | ESC_OPT_GEPHY_MAC1 | ESC_OPT_FE3PHY), hwEthCmplx) ||
			   VALID_ONLY((ESC_OPT_MAC0_2_SW_P4 | ESC_OPT_GEPHY_MAC1 | ESC_OPT_RGMIIA_SW_P6 | ESC_OPT_FE3PHY), hwEthCmplx) ||
			   VALID_ONLY((ESC_OPT_MAC0_2_SW_P4 | ESC_OPT_GEPHY_MAC1 | ESC_OPT_QSGMII), hwEthCmplx) ||
			   VALID_ONLY((ESC_OPT_MAC0_2_SW_P4 | ESC_OPT_GEPHY_MAC1 | ESC_OPT_QSGMII | ESC_OPT_RGMIIA_SW_P6), hwEthCmplx))
		{
				for (i = 0; i < TPM_MAX_NUM_ETH_PORTS; i++)
					if (TPM_FALSE == tpm_init.eth_port_conf[i].valid){
						tpm_init.eth_port_conf[i].valid = TPM_TRUE;
						tpm_init.eth_port_conf[i].port_src = tpm_init.gmac_port_conf[1].port_src;
						tpm_init.eth_port_conf[i].chip_connect = TPM_CONN_GE_PHY;
						tpm_init.eth_port_conf[i].int_connect = TPM_INTCON_GMAC1;
						tpm_init.gmac_port_conf[1].conn = TPM_GMAC_CON_GE_PHY;
						break;
       				 }
		} else
			goto setup_err;

		break;

	case TPM_G0_WAN_G1_INT_SWITCH:
		if (1 == tpm_init.virt_uni_info.enabled)
			goto virt_uni_err;

		if (!VALID_ONLY((ESC_OPT_RGMIIB_MAC0 | ESC_OPT_MAC1_2_SW_P5 | ESC_OPT_GEPHY_SW_P0 | ESC_OPT_FE3PHY), hwEthCmplx) &&
		    !VALID_ONLY((ESC_OPT_RGMIIB_MAC0 | ESC_OPT_MAC1_2_SW_P5 | ESC_OPT_QSGMII), hwEthCmplx))
			goto setup_err;

		tpm_init.pon_type = TPM_NONE;

		tpm_init.gmac_port_conf[0].valid = TPM_TRUE;
		tpm_init.gmac_port_conf[0].port_src = TPM_SRC_PORT_WAN;
		tpm_init.gmac_port_conf[0].conn = TPM_GMAC_CON_RGMII2;

		tpm_init.gmac_port_conf[1].valid = TPM_TRUE;
		tpm_init.gmac_port_conf[1].port_src = TPM_SRC_PORT_ILLEGAL;
		tpm_init.gmac_port_conf[1].conn = TPM_GMAC_CON_SWITCH_5;

		tpm_init.gmac_port_conf[2].valid = TPM_FALSE;
		tpm_init.gmac_port_conf[2].port_src = TPM_SRC_PORT_WAN;

		for (i = 0; i < TPM_MAX_NUM_ETH_PORTS; i++)
       		if (TPM_TRUE == tpm_init.eth_port_conf[i].valid){
				tpm_init.eth_port_conf[i].int_connect = TPM_INTCON_SWITCH;

				if (HW_OPT_ON(ESC_OPT_QSGMII, hwEthCmplx) &&
				    (tpm_init.eth_port_conf[i].switch_port >= 0) &&
				    (tpm_init.eth_port_conf[i].switch_port <= 3))
       				tpm_init.eth_port_conf[i].chip_connect = TPM_CONN_QSGMII;
				else if (HW_OPT_ON(ESC_OPT_GEPHY_SW_P0, hwEthCmplx) &&
					 (tpm_init.eth_port_conf[i].switch_port == 0))
					tpm_init.eth_port_conf[i].chip_connect = TPM_CONN_GE_PHY;
				else if (HW_OPT_ON(ESC_OPT_RGMIIB_MAC0, hwEthCmplx) &&
					 (tpm_init.eth_port_conf[i].switch_port == 5))
					tpm_init.eth_port_conf[i].chip_connect = TPM_CONN_RGMII2;
				else if (HW_OPT_ON(ESC_OPT_FE3PHY, hwEthCmplx) &&
				    	 (tpm_init.eth_port_conf[i].switch_port >= 1) &&
				    	 (tpm_init.eth_port_conf[i].switch_port <= 3))
					tpm_init.eth_port_conf[i].chip_connect = TPM_CONN_FE_PHY;
				else
				{
					TPM_OS_WARN(TPM_INIT_MOD, "switch port %d could not be configured\n",
						tpm_init.eth_port_conf[i].switch_port);
					tpm_init.eth_port_conf[i].chip_connect = TPM_CONN_DISC;
				}
			}


		for (i = 0; i < TPM_MAX_NUM_ETH_PORTS; i++){
			if (TPM_FALSE == tpm_init.eth_port_conf[i].valid){
				 tpm_init.eth_port_conf[i].valid = TPM_TRUE;
				 tpm_init.eth_port_conf[i].port_src = TPM_SRC_PORT_WAN;
				 tpm_init.eth_port_conf[i].chip_connect = TPM_CONN_RGMII2;
				 tpm_init.eth_port_conf[i].int_connect = TPM_INTCON_GMAC0;
				 break;
			}
		}
		break;

	case TPM_G1_WAN_G0_INT_SWITCH:
		if (1 == tpm_init.virt_uni_info.enabled)
			goto virt_uni_err;

		tpm_init.pon_type = TPM_NONE;

		tpm_init.gmac_port_conf[0].valid = TPM_TRUE;
		tpm_init.gmac_port_conf[0].port_src = TPM_SRC_PORT_ILLEGAL;
		tpm_init.gmac_port_conf[0].conn = TPM_GMAC_CON_SWITCH_4;

		tpm_init.gmac_port_conf[1].valid = TPM_TRUE;
		tpm_init.gmac_port_conf[1].port_src = TPM_SRC_PORT_WAN;
		// tpm_init.gmac_port_conf[1].conn = set below

		tpm_init.gmac_port_conf[2].valid = TPM_FALSE;

		for (i = 0; i < TPM_MAX_NUM_ETH_PORTS; i++)
       		if (TPM_TRUE == tpm_init.eth_port_conf[i].valid){
				tpm_init.eth_port_conf[i].int_connect = TPM_INTCON_SWITCH;

				if (HW_OPT_ON(ESC_OPT_QSGMII, hwEthCmplx) &&
				    (tpm_init.eth_port_conf[i].switch_port >= 0) &&
				    (tpm_init.eth_port_conf[i].switch_port <= 3))
					tpm_init.eth_port_conf[i].chip_connect = TPM_CONN_QSGMII;
				else if (HW_OPT_ON(ESC_OPT_GEPHY_SW_P0, hwEthCmplx) &&
					(tpm_init.eth_port_conf[i].switch_port == 0))
       				tpm_init.eth_port_conf[i].chip_connect = TPM_CONN_GE_PHY;
				else if (HW_OPT_ON(ESC_OPT_RGMIIA_SW_P6, hwEthCmplx) &&
					 (tpm_init.eth_port_conf[i].switch_port == 6))
       				tpm_init.eth_port_conf[i].chip_connect = TPM_CONN_RGMII1;
				else if (HW_OPT_ON(ESC_OPT_FE3PHY, hwEthCmplx) &&
				    	 (tpm_init.eth_port_conf[i].switch_port >= 1) &&
				    	 (tpm_init.eth_port_conf[i].switch_port <= 3))
					tpm_init.eth_port_conf[i].chip_connect = TPM_CONN_FE_PHY;
				else
				{
					TPM_OS_WARN(TPM_INIT_MOD, "switch port %d could not be configured\n",
						tpm_init.eth_port_conf[i].switch_port);
					tpm_init.eth_port_conf[i].chip_connect = TPM_CONN_DISC;
				}
			}

		if (VALID_ONLY((ESC_OPT_RGMIIA_MAC1 | ESC_OPT_MAC0_2_SW_P4 | ESC_OPT_GEPHY_SW_P0 | ESC_OPT_FE3PHY), hwEthCmplx) ||
               VALID_ONLY((ESC_OPT_RGMIIA_MAC1 | ESC_OPT_MAC0_2_SW_P4 | ESC_OPT_FE3PHY), hwEthCmplx) ||
		    VALID_ONLY((ESC_OPT_RGMIIA_MAC1 | ESC_OPT_MAC0_2_SW_P4 | ESC_OPT_QSGMII), hwEthCmplx)){
			for (i = 0; i < TPM_MAX_NUM_ETH_PORTS; i++){
				if (TPM_FALSE == tpm_init.eth_port_conf[i].valid){
					tpm_init.eth_port_conf[i].valid = TPM_TRUE;
					tpm_init.eth_port_conf[i].port_src = tpm_init.gmac_port_conf[1].port_src;
					tpm_init.eth_port_conf[i].chip_connect = TPM_CONN_RGMII1;
					tpm_init.eth_port_conf[i].int_connect = TPM_INTCON_GMAC1;
					tpm_init.gmac_port_conf[1].conn = TPM_GMAC_CON_RGMII1;
					break;
				}
			}
		} else if (VALID_ONLY((ESC_OPT_MAC0_2_SW_P4 | ESC_OPT_GEPHY_MAC1 | ESC_OPT_FE3PHY), hwEthCmplx) ||
			   VALID_ONLY((ESC_OPT_MAC0_2_SW_P4 | ESC_OPT_GEPHY_MAC1 | ESC_OPT_RGMIIA_SW_P6 | ESC_OPT_FE3PHY), hwEthCmplx) ||
			   VALID_ONLY((ESC_OPT_MAC0_2_SW_P4 | ESC_OPT_GEPHY_MAC1 | ESC_OPT_QSGMII), hwEthCmplx) ||
			   VALID_ONLY((ESC_OPT_MAC0_2_SW_P4 | ESC_OPT_GEPHY_MAC1 | ESC_OPT_QSGMII | ESC_OPT_RGMIIA_SW_P6), hwEthCmplx)){
			for (i = 0; i < TPM_MAX_NUM_ETH_PORTS; i++){
				if (TPM_FALSE == tpm_init.eth_port_conf[i].valid){
					tpm_init.eth_port_conf[i].valid = TPM_TRUE;
					tpm_init.eth_port_conf[i].port_src = tpm_init.gmac_port_conf[1].port_src;
					tpm_init.eth_port_conf[i].chip_connect = TPM_CONN_GE_PHY;
					tpm_init.eth_port_conf[i].int_connect = TPM_INTCON_GMAC1;
					tpm_init.gmac_port_conf[1].conn = TPM_GMAC_CON_GE_PHY;
					break;
       			 }
			}
		} else
			goto setup_err;

		break;

	case TPM_PON_G1_WAN_G0_INT_SWITCH:
		if (MV_TPM_UN_INITIALIZED_INIT_PARAM == tpm_init.backup_wan)
			tpm_init.backup_wan = TPM_ENUM_GMAC_1;

		if (1 == tpm_init.virt_uni_info.enabled)
			goto virt_uni_err;

		tpm_init.gmac_port_conf[0].valid = TPM_TRUE;
		tpm_init.gmac_port_conf[0].port_src = TPM_SRC_PORT_ILLEGAL;
		tpm_init.gmac_port_conf[0].conn = TPM_GMAC_CON_SWITCH_4;

		tpm_init.gmac_port_conf[1].valid = TPM_TRUE;
		tpm_init.gmac_port_conf[1].port_src = TPM_SRC_PORT_WAN;
		// tpm_init.gmac_port_conf[1].conn = set in XML

		tpm_init.gmac_port_conf[2].valid = TPM_TRUE;
		tpm_init.gmac_port_conf[2].port_src = TPM_SRC_PORT_WAN;

		for (i = 0; i < TPM_MAX_NUM_ETH_PORTS; i++)
       		if (TPM_TRUE == tpm_init.eth_port_conf[i].valid) {
				tpm_init.eth_port_conf[i].int_connect = TPM_INTCON_SWITCH;

				if (HW_OPT_ON(ESC_OPT_QSGMII, hwEthCmplx) &&
				    (tpm_init.eth_port_conf[i].switch_port >= 0) &&
				    (tpm_init.eth_port_conf[i].switch_port <= 3))
					tpm_init.eth_port_conf[i].chip_connect = TPM_CONN_QSGMII;
				else if (HW_OPT_ON(ESC_OPT_GEPHY_SW_P0, hwEthCmplx) &&
					 (tpm_init.eth_port_conf[i].switch_port == 0))
					tpm_init.eth_port_conf[i].chip_connect = TPM_CONN_GE_PHY;
				else if (HW_OPT_ON(ESC_OPT_RGMIIA_SW_P6, hwEthCmplx) &&
					 (tpm_init.eth_port_conf[i].switch_port == 6))
					tpm_init.eth_port_conf[i].chip_connect = TPM_CONN_RGMII1;
				else if (HW_OPT_ON(ESC_OPT_FE3PHY, hwEthCmplx) &&
				    	 (tpm_init.eth_port_conf[i].switch_port >= 1) &&
				    	 (tpm_init.eth_port_conf[i].switch_port <= 3))
					tpm_init.eth_port_conf[i].chip_connect = TPM_CONN_FE_PHY;
				else
				{
					TPM_OS_WARN(TPM_INIT_MOD, "switch port %d could not be configured\n",
						tpm_init.eth_port_conf[i].switch_port);
					tpm_init.eth_port_conf[i].chip_connect = TPM_CONN_DISC;
				}
			}

		if (VALID_ONLY((ESC_OPT_MAC0_2_SW_P4 | ESC_OPT_RGMIIA_MAC1 | ESC_OPT_GEPHY_SW_P0 | ESC_OPT_FE3PHY), hwEthCmplx) ||
		    VALID_ONLY((ESC_OPT_MAC0_2_SW_P4 | ESC_OPT_RGMIIA_MAC1 | ESC_OPT_QSGMII), hwEthCmplx))	{
			for (i = 0; i < TPM_MAX_NUM_ETH_PORTS; i++)
				if (TPM_FALSE == tpm_init.eth_port_conf[i].valid){
					tpm_init.eth_port_conf[i].valid = TPM_TRUE;
					tpm_init.eth_port_conf[i].port_src = tpm_init.gmac_port_conf[1].port_src;
					tpm_init.eth_port_conf[i].chip_connect = TPM_CONN_RGMII1;
					tpm_init.eth_port_conf[i].int_connect = TPM_INTCON_GMAC1;
					tpm_init.gmac_port_conf[1].conn = TPM_GMAC_CON_RGMII1;
					break;
				}
		} else if (VALID_ONLY((ESC_OPT_MAC0_2_SW_P4 | ESC_OPT_GEPHY_MAC1 | ESC_OPT_FE3PHY), hwEthCmplx) ||
			   VALID_ONLY((ESC_OPT_MAC0_2_SW_P4 | ESC_OPT_GEPHY_MAC1 | ESC_OPT_RGMIIA_SW_P6 | ESC_OPT_FE3PHY), hwEthCmplx) ||
			   VALID_ONLY((ESC_OPT_MAC0_2_SW_P4 | ESC_OPT_GEPHY_MAC1 | ESC_OPT_QSGMII), hwEthCmplx)){
				for (i = 0; i < TPM_MAX_NUM_ETH_PORTS; i++)
					if (TPM_FALSE == tpm_init.eth_port_conf[i].valid){
						tpm_init.eth_port_conf[i].valid = TPM_TRUE;
						tpm_init.eth_port_conf[i].port_src = tpm_init.gmac_port_conf[1].port_src;
						tpm_init.eth_port_conf[i].chip_connect = TPM_CONN_GE_PHY;
						tpm_init.eth_port_conf[i].int_connect = TPM_INTCON_GMAC1;
						tpm_init.gmac_port_conf[1].conn = TPM_GMAC_CON_GE_PHY;
						break;
       				 }
		} else
			goto setup_err;

		break;

	case TPM_PON_G0_WAN_G1_INT_SWITCH:
		if (MV_TPM_UN_INITIALIZED_INIT_PARAM == tpm_init.backup_wan)
			tpm_init.backup_wan = TPM_ENUM_GMAC_1;

		if (1 == tpm_init.virt_uni_info.enabled)
			goto virt_uni_err;

		if (!VALID_ONLY((ESC_OPT_RGMIIB_MAC0 | ESC_OPT_MAC1_2_SW_P5 | ESC_OPT_GEPHY_SW_P0 | ESC_OPT_FE3PHY), hwEthCmplx) &&
		    !VALID_ONLY((ESC_OPT_RGMIIB_MAC0 | ESC_OPT_MAC1_2_SW_P5 | ESC_OPT_MAC1_2_SW_P5 | ESC_OPT_QSGMII), hwEthCmplx))
			goto setup_err;

		tpm_init.gmac_port_conf[0].valid = TPM_TRUE;
		tpm_init.gmac_port_conf[0].port_src = TPM_SRC_PORT_WAN;
		tpm_init.gmac_port_conf[0].conn = TPM_GMAC_CON_RGMII2;

		tpm_init.gmac_port_conf[1].valid = TPM_TRUE;
		tpm_init.gmac_port_conf[1].port_src = TPM_SRC_PORT_ILLEGAL;
		tpm_init.gmac_port_conf[1].conn = TPM_GMAC_CON_SWITCH_5;

		tpm_init.gmac_port_conf[2].valid = TPM_TRUE;
		tpm_init.gmac_port_conf[2].port_src = TPM_SRC_PORT_WAN;


		for (i = 0; i < TPM_MAX_NUM_ETH_PORTS; i++)
       		if (TPM_TRUE == tpm_init.eth_port_conf[i].valid){
				tpm_init.eth_port_conf[i].int_connect = TPM_INTCON_SWITCH;

				if (HW_OPT_ON(ESC_OPT_QSGMII, hwEthCmplx) &&
				    (tpm_init.eth_port_conf[i].switch_port >= 0) &&
				    (tpm_init.eth_port_conf[i].switch_port <= 3))
       				tpm_init.eth_port_conf[i].chip_connect = TPM_CONN_QSGMII;
				else if (HW_OPT_ON(ESC_OPT_GEPHY_SW_P0, hwEthCmplx) &&
					 (tpm_init.eth_port_conf[i].switch_port == 0))
					tpm_init.eth_port_conf[i].chip_connect = TPM_CONN_GE_PHY;
				else if (HW_OPT_ON(ESC_OPT_FE3PHY, hwEthCmplx) &&
				    	 (tpm_init.eth_port_conf[i].switch_port >= 1) &&
				    	 (tpm_init.eth_port_conf[i].switch_port <= 3))
					tpm_init.eth_port_conf[i].chip_connect = TPM_CONN_FE_PHY;
				else
				{
					TPM_OS_WARN(TPM_INIT_MOD, "switch port %d could not be configured\n",
						tpm_init.eth_port_conf[i].switch_port);
					tpm_init.eth_port_conf[i].chip_connect = TPM_CONN_DISC;
				}
			}

		for (i = 0; i < TPM_MAX_NUM_ETH_PORTS; i++){
			if (TPM_FALSE == tpm_init.eth_port_conf[i].valid){
				tpm_init.eth_port_conf[i].valid = TPM_TRUE;
				tpm_init.eth_port_conf[i].port_src = TPM_SRC_PORT_WAN;
				tpm_init.eth_port_conf[i].chip_connect = TPM_CONN_RGMII1;
				tpm_init.eth_port_conf[i].int_connect = TPM_INTCON_GMAC0;
				break;
			}
		}
		break;

	case TPM_PON_WAN_DUAL_MAC_EXT_SWITCH:
		if (1 == tpm_init.virt_uni_info.enabled)
			goto virt_uni_err;

		if (!VALID_ONLY((ESC_OPT_RGMIIB_MAC0 | ESC_OPT_RGMIIA_MAC1), hwEthCmplx))
			goto setup_err;

		tpm_init.gmac_port_conf[0].valid = TPM_TRUE;
		tpm_init.gmac_port_conf[0].port_src = TPM_SRC_PORT_ILLEGAL;
		tpm_init.gmac_port_conf[0].conn = TPM_GMAC_CON_RGMII2;

		tpm_init.gmac_port_conf[1].valid = TPM_TRUE;
		tpm_init.gmac_port_conf[1].port_src = TPM_SRC_PORT_ILLEGAL;
		tpm_init.gmac_port_conf[1].conn = TPM_GMAC_CON_RGMII1;

		tpm_init.gmac_port_conf[2].valid = TPM_TRUE;
		tpm_init.gmac_port_conf[2].port_src = TPM_SRC_PORT_WAN;

		for (i = 0; i < TPM_MAX_NUM_ETH_PORTS; i++){
			tpm_init.eth_port_conf[i].valid = TPM_FALSE;
		}
		break;

	case TPM_PON_WAN_G1_MNG_EXT_SWITCH:
		if (1 == tpm_init.virt_uni_info.enabled)
			goto virt_uni_err;

		if (!VALID_ONLY((ESC_OPT_GEPHY_MAC1), hwEthCmplx))
			goto setup_err;

		tpm_init.gmac_port_conf[0].valid = TPM_FALSE;

		tpm_init.gmac_port_conf[1].valid = TPM_TRUE;
		tpm_init.gmac_port_conf[1].port_src = TPM_SRC_PORT_ILLEGAL;
		tpm_init.gmac_port_conf[1].conn = TPM_GMAC_CON_RGMII1;

		tpm_init.gmac_port_conf[2].valid = TPM_TRUE;
		tpm_init.gmac_port_conf[2].port_src = TPM_SRC_PORT_WAN;

		for (i = 0; i < TPM_MAX_NUM_ETH_PORTS; i++)
			tpm_init.eth_port_conf[i].valid = TPM_FALSE;

		for (i = 0; i < TPM_MAX_NUM_ETH_PORTS; i++){
			if (TPM_FALSE == tpm_init.eth_port_conf[i].valid){
				tpm_init.eth_port_conf[i].valid = TPM_TRUE;
				tpm_init.eth_port_conf[i].port_src = TPM_SRC_PORT_UNI_0;
				tpm_init.eth_port_conf[i].chip_connect = TPM_CONN_GE_PHY;
				tpm_init.eth_port_conf[i].int_connect = TPM_INTCON_GMAC1;
				break;
			}
		}
		break;

	case TPM_PON_WAN_G0_SINGLE_PORT:
		if (1 == tpm_init.virt_uni_info.enabled)
			goto virt_uni_err;

		/* FIXME - Add correct condition, after answers from lsp team.
		if (!VALID_ONLY((ESC_OPT_RGMIIB_MAC0), hwEthCmplx))
			goto setup_err;*/

		tpm_init.gmac_port_conf[0].valid = TPM_TRUE;
		tpm_init.gmac_port_conf[0].port_src = TPM_SRC_PORT_UNI_0;
		tpm_init.gmac_port_conf[0].conn = TPM_GMAC_CON_RGMII2;

		tpm_init.gmac_port_conf[1].valid = TPM_FALSE;
		tpm_init.gmac_port_conf[1].conn = TPM_GMAC_CON_DISC;

		tpm_init.gmac_port_conf[2].valid = TPM_TRUE;
		tpm_init.gmac_port_conf[2].port_src = TPM_SRC_PORT_WAN;

		i = 0;
		tpm_init.eth_port_conf[i].valid = TPM_TRUE;
		tpm_init.eth_port_conf[i].port_src = TPM_SRC_PORT_UNI_0;
		tpm_init.eth_port_conf[i].chip_connect = TPM_CONN_RGMII2;
		tpm_init.eth_port_conf[i].int_connect = TPM_INTCON_GMAC0;
		i++;
		for (; i < TPM_MAX_NUM_ETH_PORTS; i++)
			tpm_init.eth_port_conf[i].valid = TPM_FALSE;
		break;

	case TPM_PON_WAN_G1_SINGLE_PORT:
		if (1 == tpm_init.virt_uni_info.enabled)
			goto virt_uni_err;

		if (!VALID_ONLY((ESC_OPT_RGMIIA_MAC1), hwEthCmplx) &&
		    !VALID_ONLY((ESC_OPT_GEPHY_MAC1), hwEthCmplx))
			goto setup_err;

		if (HW_OPT_ON((ESC_OPT_RGMIIA_MAC1), hwEthCmplx)){
			 tpm_init.gmac_port_conf[1].conn = TPM_GMAC_CON_RGMII1;
			 tpm_init.eth_port_conf[0].chip_connect = TPM_CONN_RGMII1;
		}else if (HW_OPT_ON((ESC_OPT_GEPHY_MAC1), hwEthCmplx)){
			 tpm_init.gmac_port_conf[1].conn = TPM_GMAC_CON_GE_PHY;
			 tpm_init.eth_port_conf[0].chip_connect = TPM_CONN_GE_PHY;
		}

		tpm_init.gmac_port_conf[0].valid = TPM_FALSE;
		tpm_init.gmac_port_conf[0].conn = TPM_GMAC_CON_DISC;

		tpm_init.gmac_port_conf[1].valid = TPM_TRUE;
		tpm_init.gmac_port_conf[1].port_src = TPM_SRC_PORT_UNI_0;
		// tpm_init.gmac_port_conf[1].conn = set above

		tpm_init.gmac_port_conf[2].valid = TPM_TRUE;
		tpm_init.gmac_port_conf[2].port_src = TPM_SRC_PORT_WAN;

		i = 0;
		tpm_init.eth_port_conf[i].valid = TPM_TRUE;
		tpm_init.eth_port_conf[i].port_src = TPM_SRC_PORT_UNI_0;
		//tpm_init.eth_port_conf[i].chip_connect = set by XML
		tpm_init.eth_port_conf[i].int_connect = TPM_INTCON_GMAC1;
		i++;

		for (; i < TPM_MAX_NUM_ETH_PORTS; i++)
			tpm_init.eth_port_conf[i].valid = TPM_FALSE;
		break;

	case TPM_PON_G1_WAN_G0_SINGLE_PORT:
		if (1 == tpm_init.virt_uni_info.enabled)
			goto virt_uni_err;

		if ((TPM_ENUM_GMAC_0 != tpm_init.backup_wan) && (TPM_ENUM_GMAC_1 != tpm_init.backup_wan) &&
		    (TPM_ENUM_PMAC   != tpm_init.backup_wan)) {
			TPM_OS_ERROR(TPM_INIT_MOD, "\n tpm_init.backup_wan (%x) is not set\n",
					tpm_init.backup_wan);
			goto setup_err;
		}

		if (!VALID_ONLY((ESC_OPT_RGMIIB_MAC0 | ESC_OPT_RGMIIA_MAC1), hwEthCmplx) &&
		    !VALID_ONLY((ESC_OPT_GEPHY_MAC1 | ESC_OPT_RGMIIA_MAC0), hwEthCmplx))
			goto setup_err;

		if (MV_TPM_UN_INITIALIZED_INIT_PARAM == tpm_init.backup_wan)
			tpm_init.backup_wan = TPM_ENUM_GMAC_1;

		tpm_init.gmac_port_conf[0].valid = TPM_TRUE;
		tpm_init.gmac_port_conf[0].port_src = TPM_SRC_PORT_UNI_0;

		if (HW_OPT_ON(ESC_OPT_RGMIIB_MAC0, hwEthCmplx))
			tpm_init.gmac_port_conf[0].conn = TPM_GMAC_CON_RGMII2;
		else if (HW_OPT_ON(ESC_OPT_RGMIIA_MAC0, hwEthCmplx))
			tpm_init.gmac_port_conf[0].conn = TPM_GMAC_CON_RGMII1;

		tpm_init.gmac_port_conf[1].valid = TPM_TRUE;
		tpm_init.gmac_port_conf[1].port_src = TPM_SRC_PORT_WAN;

		if (HW_OPT_ON(ESC_OPT_RGMIIA_MAC1, hwEthCmplx))
			tpm_init.gmac_port_conf[1].conn = TPM_GMAC_CON_RGMII1;
		else if (HW_OPT_ON(ESC_OPT_GEPHY_MAC1, hwEthCmplx))
			tpm_init.gmac_port_conf[1].conn = TPM_GMAC_CON_GE_PHY;

		tpm_init.gmac_port_conf[2].valid = TPM_TRUE;
		tpm_init.gmac_port_conf[2].port_src = TPM_SRC_PORT_WAN;

		i = 0;
		tpm_init.eth_port_conf[i].valid = TPM_TRUE;
		tpm_init.eth_port_conf[i].port_src = TPM_SRC_PORT_UNI_0;
		tpm_init.eth_port_conf[i].chip_connect = TPM_CONN_RGMII1;
		tpm_init.eth_port_conf[i].int_connect = TPM_INTCON_GMAC0;
		i++;
		tpm_init.eth_port_conf[i].valid = TPM_TRUE;
		tpm_init.eth_port_conf[i].port_src = TPM_SRC_PORT_WAN;
		tpm_init.eth_port_conf[i].chip_connect = TPM_CONN_RGMII1;
		tpm_init.eth_port_conf[i].int_connect = TPM_INTCON_GMAC1;
		i++;
		for (; i < TPM_MAX_NUM_ETH_PORTS; i++)
			tpm_init.eth_port_conf[i].valid = TPM_FALSE;
		break;

	case TPM_PON_G0_WAN_G1_SINGLE_PORT:
		if (1 == tpm_init.virt_uni_info.enabled)
			goto virt_uni_err;

		if ((TPM_ENUM_GMAC_0 != tpm_init.backup_wan) && (TPM_ENUM_GMAC_1 != tpm_init.backup_wan) &&
		    (TPM_ENUM_PMAC   != tpm_init.backup_wan)) {
			TPM_OS_ERROR(TPM_INIT_MOD, "\n tpm_init.backup_wan (%x) is not set\n",
					tpm_init.backup_wan);
			goto setup_err;
		}
		if (!VALID_ONLY((ESC_OPT_RGMIIB_MAC0 | ESC_OPT_RGMIIA_MAC1), hwEthCmplx) &&
		    !VALID_ONLY((ESC_OPT_GEPHY_MAC1 | ESC_OPT_RGMIIA_MAC0), hwEthCmplx))
			goto setup_err;

		if (MV_TPM_UN_INITIALIZED_INIT_PARAM == tpm_init.backup_wan)
			tpm_init.backup_wan = TPM_ENUM_GMAC_0;

		tpm_init.gmac_port_conf[0].valid = TPM_TRUE;
		tpm_init.gmac_port_conf[0].port_src = TPM_SRC_PORT_WAN;

		if (HW_OPT_ON(ESC_OPT_RGMIIB_MAC0, hwEthCmplx))
			tpm_init.gmac_port_conf[0].conn = TPM_GMAC_CON_RGMII2;
		else if (HW_OPT_ON(ESC_OPT_RGMIIA_MAC0, hwEthCmplx))
			tpm_init.gmac_port_conf[0].conn = TPM_GMAC_CON_RGMII1;

		tpm_init.gmac_port_conf[1].valid = TPM_TRUE;
		tpm_init.gmac_port_conf[1].port_src = TPM_SRC_PORT_UNI_0;

		if (HW_OPT_ON(ESC_OPT_RGMIIA_MAC1, hwEthCmplx))
			tpm_init.gmac_port_conf[1].conn = TPM_GMAC_CON_RGMII1;
		else if (HW_OPT_ON(ESC_OPT_GEPHY_MAC1, hwEthCmplx))
			tpm_init.gmac_port_conf[1].conn = TPM_GMAC_CON_GE_PHY;

		tpm_init.gmac_port_conf[2].valid = TPM_TRUE;
		tpm_init.gmac_port_conf[2].port_src = TPM_SRC_PORT_WAN;

		i = 0;
		tpm_init.eth_port_conf[i].valid = TPM_TRUE;
		tpm_init.eth_port_conf[i].port_src = TPM_SRC_PORT_WAN;
		tpm_init.eth_port_conf[i].chip_connect = TPM_CONN_RGMII1;
		tpm_init.eth_port_conf[i].int_connect = TPM_INTCON_GMAC1;
		i++;
		tpm_init.eth_port_conf[i].valid = TPM_TRUE;
		tpm_init.eth_port_conf[i].port_src = TPM_SRC_PORT_UNI_0;
		tpm_init.eth_port_conf[i].chip_connect = TPM_CONN_RGMII1;
		tpm_init.eth_port_conf[i].int_connect = TPM_INTCON_GMAC0;
		i++;
		for (; i < TPM_MAX_NUM_ETH_PORTS; i++)
			tpm_init.eth_port_conf[i].valid = TPM_FALSE;
		break;

	case TPM_PON_WAN_G0_G1_LPBK:
		if (1 == tpm_init.virt_uni_info.enabled)
			goto virt_uni_err;

		/* FIXME - Add correct condition, after answers from lsp team. */
		/*if (!VALID_ONLY((ESC_OPT_SGMII | ESC_OPT_GEPHY_MAC0 | ESC_OPT_LP_SERDES_FE_GE_PHY), hwEthCmplx))
			goto setup_err;*/

		tpm_init.gmac_port_conf[0].valid = TPM_TRUE;
		tpm_init.gmac_port_conf[0].port_src = TPM_SRC_PORT_UNI_0;
		tpm_init.gmac_port_conf[0].conn = TPM_GMAC_CON_GE_PHY;

		tpm_init.gmac_port_conf[1].valid = TPM_TRUE;
		tpm_init.gmac_port_conf[1].port_src = TPM_SRC_PORT_ILLEGAL;
		tpm_init.gmac_port_conf[1].conn = TPM_GMAC_CON_GE_PHY;

		tpm_init.gmac_port_conf[2].valid = TPM_TRUE;
		tpm_init.gmac_port_conf[2].port_src = TPM_SRC_PORT_WAN;

		i = 0;
		tpm_init.eth_port_conf[i].valid = TPM_TRUE;
		tpm_init.eth_port_conf[i].port_src = TPM_SRC_PORT_UNI_0;
		tpm_init.eth_port_conf[i].chip_connect = TPM_CONN_RGMII1;
		tpm_init.eth_port_conf[i].int_connect = TPM_INTCON_GMAC0;
		i++;
		for (; i < TPM_MAX_NUM_ETH_PORTS; i++)
			tpm_init.eth_port_conf[i].valid = TPM_FALSE;
		break;
	}

	return TPM_OK;

setup_err:
	TPM_OS_ERROR(TPM_INIT_MOD, "\n\nHW enabled options and Eth Complex setting do not comply!");
	tpm_init_eth_cmplx_setup_error_print(hwEthCmplx, false);
	return (TPM_FAIL);

virt_uni_err:
	TPM_OS_ERROR(TPM_INIT_MOD, "\n Virt-UNI not supported in profile %s\n",	prof_str_tlb[tpm_init.eth_cmplx_profile]);
	return (TPM_FAIL);
}

uint32_t tpm_init_tcont_llid_get(void)
{
	if (tpm_init.num_tcont_llid == MV_TPM_UN_INITIALIZED_INIT_PARAM) {
		tpm_init.num_tcont_llid = 1;	/* for ZTE fix - changed from 8; */
		if (tpm_init.validation_en == TPM_VALID_ENABLED)
			TPM_OS_WARN(TPM_INIT_MOD, "\n TCONT / LLID - missing initialization - set to default <8>.\n ");
	}
	return (TPM_OK);
}

void tpm_init_gmac_mh_en_get(void)
{
	if (tpm_init.gmac0_mh_en == MV_TPM_UN_INITIALIZED_INIT_PARAM) {
		if (tpm_init_gmac_in_gateway_mode(TPM_ENUM_GMAC_0))
			tpm_init.gmac0_mh_en = TPM_TRUE;
		else
			tpm_init.gmac0_mh_en = TPM_FALSE;
		if (tpm_init.validation_en == TPM_VALID_ENABLED)
			TPM_OS_ERROR(TPM_INIT_MOD, "\n GMAC_0 MH - missing initialization. ");
	} else if (tpm_init.gmac0_mh_en == 2) {
		if (tpm_init.gmac_port_conf[0].conn == TPM_GMAC_CON_SWITCH_4)
			tpm_init.gmac0_mh_en = 1;
		else
			tpm_init.gmac0_mh_en = 0;
	}

	if (tpm_init.gmac1_mh_en == MV_TPM_UN_INITIALIZED_INIT_PARAM) {
		if (tpm_init_gmac_in_gateway_mode(TPM_ENUM_GMAC_1))
			tpm_init.gmac1_mh_en = TPM_TRUE;
		else
			tpm_init.gmac1_mh_en = TPM_FALSE;
		if (tpm_init.validation_en == TPM_VALID_ENABLED)
			TPM_OS_ERROR(TPM_INIT_MOD, "\n GMAC_1 MH - missing initialization. ");
	} else if (tpm_init.gmac1_mh_en == 2) {
		if (tpm_init.gmac_port_conf[1].conn == TPM_GMAC_CON_SWITCH_5)
			tpm_init.gmac1_mh_en = 1;
		else
			tpm_init.gmac1_mh_en = 0;
	}
}

void tpm_init_lookup_get(tpm_pnc_ranges_t range_num, uint32_t *lu_id, uint32_t *last_lu_range, uint32_t *valid)
{
	uint32_t i;

	*valid = 0;

	for (i = 0; i < (sizeof(pnc_range_lookup_tbl) / sizeof(pnc_range_lookup_tbl[0])); i++) {
		if (range_num == pnc_range_lookup_tbl[i].pnc_range) {
			*lu_id = pnc_range_lookup_tbl[i].lookup_id;
			*last_lu_range = pnc_range_lookup_tbl[i].last_lookup_range;
			*valid = pnc_range_lookup_tbl[i].valid;
		}
	}
	return;
}

int32_t tpm_init_config_params_update(void)
{

	int32_t rc;

	tpm_init_trace_debug_info_get();
	tpm_init_pon_type_get();
	tpm_init_ds_mh_set_conf_get();
	tpm_init_ipv6_5t_enable_get();
	tpm_init_ctc_cm_ipv6_parse_window_get();
	tpm_init_ctc_cm_enable_get();
	tpm_init_vitual_uni_info_get();
	tpm_init_omci_get();
	tpm_init_igmp_get();
	tpm_init_cpu_loopback_get();
	tpm_init_mtu_get();
	tpm_init_cfg_pnc_parse_get();
	tpm_init_mc_get();
	rc = tpm_init_eth_cmplx_update_conf();
	if (rc != TPM_OK) {
		TPM_OS_FATAL(TPM_INIT_MOD, "\n Ethernet Complex configuration failed!\n");
		return (TPM_FAIL);
	}

	rc = tpm_init_tcont_llid_get();	/* LLID / TCONT taken from XML */
	if (rc != TPM_OK) {
		TPM_OS_FATAL(TPM_INIT_MOD, "\n GMAC internal configuration READ failed!.\n");
		return (TPM_FAIL);
	}

	tpm_init_gmac_mh_en_get();
	tpm_init_pnc_config_get();
	tpm_init_ety_dsa_enable_get();
	tpm_init_split_mod_get();
	tpm_init_switch_init_get();

	return (TPM_OK);
}

int32_t tpm_init_info_validate(void)
{
	int i = 0, j = 0, rc = 0;
	tpm_init_tx_mod_t tx_mod;
	unsigned int config_pnc_parser_val;
	int txp, txq, min_tcont_llid;
	tpm_gmacs_enum_t gmac_i;
	uint8_t found_ipv4_pre, found_cnm_main;
	uint32_t ipv4_pre_size, cnm_main_size, exp_range_size, num_uni_ports = 0;
	uint32_t gmac0_owner = 0;
	uint32_t cpu_owner = 0;

	/********************************************************************/
	if (tpm_init.validation_en == TPM_VALID_ENABLED) {
	/******************** EPON/GPON system - check num of LLID / TCONT : legal values: 1..8 *********************/
		if ((tpm_init.pon_type == TPM_EPON) || (tpm_init.pon_type == TPM_GPON)) {
			if ((tpm_init.num_tcont_llid <= 0) || (tpm_init.num_tcont_llid > 8)) {
				TPM_OS_FATAL(TPM_INIT_MOD, "\n TCONT/LLID: illegal value(%d) => legal values <1-8>.\n",
					tpm_init.num_tcont_llid);
				return (TPM_FAIL);
			}
		}
	/***** EPON case: validate vs .config value for EPON *****/
		if (tpm_init.pon_type == TPM_EPON) {
			min_tcont_llid = min(TPM_GPON_MAX_NUM_OF_T_CONTS, TPM_EPON_MAX_MAC_NUM);
			if (tpm_init.num_tcont_llid > min_tcont_llid) {
				TPM_OS_FATAL(TPM_INIT_MOD,
					"\n LLID: illegal value(%d) => max legal value defined in kernel is %d.\n",
					tpm_init.num_tcont_llid, TPM_EPON_MAX_MAC_NUM);
				return (TPM_FAIL);
			}
		}
	/***** GPON case: validate vs .config value for GPON *****/
		if (tpm_init.pon_type == TPM_GPON) {
			if (tpm_init.num_tcont_llid > TPM_GPON_MAX_NUM_OF_T_CONTS) {
				TPM_OS_FATAL(TPM_INIT_MOD,
					"\n TCONT: illegal value(%d) => max legal value defined in kernel is %d.\n",
					tpm_init.num_tcont_llid, TPM_GPON_MAX_NUM_OF_T_CONTS);
				return (TPM_FAIL);
			}
		}
#if 0				/*Keep to be added in future version */
	/******************** Debug port setting - validation **********************************/
		if ((tpm_init.deb_port_valid != 0) && (tpm_init.deb_port_valid != 1)) {
			TPM_OS_FATAL(TPM_INIT_MOD,
				"\n Debug port valid is wrong => legal values <0=invalid/1=valid>. \n");
			return (TPM_FAIL);
		}
		if ((tpm_init.deb_port_valid == 1) &&
		    ((tpm_init.deb_port < TPM_SRC_PORT_UNI_0) || (tpm_init.deb_port > TPM_SRC_PORT_UNI_3))) {
			TPM_OS_FATAL(TPM_INIT_MOD,
				"\n Bad debug port => legal values <TPM_SRC_PORT_UNI_0-TPM_SRC_PORT_UNI_3>. \n");
			return (TPM_FAIL);
		}
#endif
		/********************* pon type validation *********************************************/
		/* for FPGA systems - the WAN tech is defined as TPM_NONE */
		if (tpm_init.pon_type > TPM_NONE) {
			TPM_OS_FATAL(TPM_INIT_MOD,
				"\n pon type: wrong init value(%d) => legal values "
				"<%d=TPM_EPON/%d=TPM_GPON/%d=TPM_P2P/%d=TPM_NONE>. \n",
				tpm_init.pon_type, TPM_EPON, TPM_GPON, TPM_P2P, TPM_NONE);
			return (TPM_FAIL);
		}

		/********************* CFG PNC PARSE validation *******************************************/
		if ((tpm_init.cfg_pnc_parse < TPM_CFG_PNC_PARSE_DISABLED)
		    || (tpm_init.cfg_pnc_parse > TPM_CFG_PNC_PARSE_ENABLED)) {
			TPM_OS_FATAL(TPM_INIT_MOD,
				"\n CFG PNC parse: wrong init value(%d) => legal values <0=DISABLED/1=ENABLED. \n",
				tpm_init.cfg_pnc_parse);
			return (TPM_FAIL);
		}
		/* get the config_pnc_parser value */
		config_pnc_parser_val = mv_eth_ctrl_pnc_get();

        /* logical validation */

#ifdef CONFIG_MV_ETH_PNC
		if (tpm_init.cfg_pnc_parse == 0) {
			if (config_pnc_parser_val == 0) {
				/* the intention is to give the control to mv neta PNC configuration
				   do not permit moving from 0 to 1 */
				TPM_OS_FATAL(TPM_INIT_MOD,
					"\n CFG PNC bad value: PNC in LSP cannot move from 0 to 1 \n");
				return (TPM_FAIL);
			} else {
				/* config_pnc_parser == 1 */
				/* nothing to do - the control is in LSP config */
			}
		}
		if (tpm_init.cfg_pnc_parse == 1) {
			if (config_pnc_parser_val == 0) {
				/* nothing to do - the control is in TPM */
			} else {	/* config_pnc_parser == 1 */
				/* set the config_pnc_parser to 0 - control is set to TPM */
				rc = mv_eth_ctrl_pnc(0);
				if (rc != 0) {
					TPM_OS_FATAL(TPM_INIT_MOD,
						"\n Failed to SET the config PNC parse parameter. \n");
					return (TPM_FAIL);
				}
			}
		}
#else
		/* if compilation flag is turned off - there are no relevant functions for PNC_PARSER
		   therefore do not permit the flag to be 0 - meaning the LSP is taking the responsibility */
		if (tpm_init.cfg_pnc_parse == 0) {
			TPM_OS_FATAL(TPM_INIT_MOD, "\n CFG PNC bad value: PNC in LSP does not support PNC PARSER \n");
			return (TPM_FAIL);
		} else {
			if (config_pnc_parser_val == 0) {
				/*do nothing */
			} else {
				/* set the config_pnc_parser to 0 - control is set to TPM */
				rc = mv_eth_ctrl_pnc(0);
				if (rc != 0) {
					TPM_OS_FATAL(TPM_INIT_MOD,
						"\n Failed to SET the config PNC parse parameter. \n");
					return (TPM_FAIL);
				}
			}
		}
#endif

	/********************* CPU loopback type validation  ********************************************/
		if ((tpm_init.cpu_loopback < TPM_CPU_LOOPBACK_DISABLED)
		    || (tpm_init.cpu_loopback > TPM_CPU_LOOPBACK_ENABLED)) {
			TPM_OS_FATAL(TPM_INIT_MOD,
				"\n CPU loopback type: wrong init value(%d) => legal values <0=disabled/1=enabled. \n",
				tpm_init.cpu_loopback);
			return (TPM_FAIL);
		}

	/********************* TRACE DEBUG INFO validation *******************************************/
		if (tpm_init.trace_debug_info == 0) {
			TPM_OS_WARN(TPM_INIT_MOD,
				"\n TRACE DEBUG info: init value is %d - no ERRORs will be displayed. \n ",
				tpm_init.trace_debug_info);
		}

	/********************* IGMP snooping validation *********************************************/
		if ((tpm_init.igmp_snoop != 0) && (tpm_init.igmp_snoop != 1)) {
			TPM_OS_FATAL(TPM_INIT_MOD,
				     "\n IGMP snooping: wrong init value(%d) => legal values <0=disabled/1=enabled>. \n",
				     tpm_init.igmp_snoop);
			return (TPM_FAIL);
		}
		if (tpm_init.igmp_snoop == 1) {
			if (tpm_init.igmp_cpu_queue > 7) {
				TPM_OS_FATAL(TPM_INIT_MOD,
					     "\n IGMP snooping: wrong CPU queue(%d) => legal values <0-7>. \n",
					     tpm_init.igmp_cpu_queue);
				return (TPM_FAIL);
			}
		}

	/********************* Multicast validation *********************************************/
		if (tpm_init.mc_setting.per_uni_vlan_xlat) {
			if (tpm_init.mc_setting.filter_mode != TPM_MC_COMBINED_IP_MAC_FILTER) {
				TPM_OS_FATAL(TPM_INIT_MOD,
					     "\n multicast per uni vlan translation is not supported in filter_mode (%d). \n",
					     tpm_init.mc_setting.filter_mode);
				return (TPM_FAIL);
			}
#if 0
			if (tpm_init.mc_setting.igmp_mode == TPM_MC_IGMP_SNOOPING && tpm_init.mc_setting.mc_pppoe_enable) {
			   TPM_OS_FATAL(TPM_INIT_MOD, "\n multicast per uni vlan translation is not supported "
						"in igmp snooping over pppoe. \n");
			   return(TPM_FAIL);
			}
#endif
		}

		/* check that igmp_cpu_queue is CPU's reserved queue */
		/* oct*>>> to do - if per system Q6 is the IGMP CPU - check in all GMACs that Q6 is of CPU ownership */

		if (tpm_init.mc_setting.mc_hwf_queue > 7) {
			TPM_OS_FATAL(TPM_INIT_MOD, "\n MC setting: wrong MC HWF queue(%d) => legal values <0-7>. \n",
				     tpm_init.mc_setting.mc_hwf_queue);
			return (TPM_FAIL);
		}

		if (tpm_init.mc_setting.mc_cpu_queue > 7) {
			TPM_OS_FATAL(TPM_INIT_MOD, "\n MC setting: wrong MC CPU queue(%d) => legal values <0-7>. \n",
				     tpm_init.mc_setting.mc_cpu_queue);
			return (TPM_FAIL);
		}

	/********************** GMAC_0 connectivity validation *************************************/
		if ((tpm_init.gmac_port_conf[0].conn < TPM_GMAC_CON_DISC) || (tpm_init.gmac_port_conf[0].conn > TPM_GMAC_CON_GE_PHY)) {
			TPM_OS_FATAL(TPM_INIT_MOD,
				     "\n GMAC_0 connectivity: wrong init value(%d) => legal values <0-7> \n",
				     tpm_init.gmac_port_conf[0].conn);
			return (TPM_FAIL);
		}
	/********************** GMAC_1 connectivity validation *************************************/
		if ((tpm_init.gmac_port_conf[1].conn < TPM_GMAC_CON_DISC) || (tpm_init.gmac_port_conf[1].conn > TPM_GMAC_CON_GE_PHY)) {
			TPM_OS_FATAL(TPM_INIT_MOD,
				     "\n GMAC_1 connectivity: wrong init value(%d) => legal values <0-7> \n",
				     tpm_init.gmac_port_conf[1].conn);
			return (TPM_FAIL);
		}
	/********************** GMAC_0 MH enable validation   *************************************/
		if ((tpm_init.gmac0_mh_en != 0) && (tpm_init.gmac0_mh_en != 1)) {
			TPM_OS_FATAL(TPM_INIT_MOD,
				     "\n GMAC_0 MH enable: wrong init value(%d) => legal values <0=disabled,1=enabled> \n",
				     tpm_init.gmac0_mh_en);
			return (TPM_FAIL);
		}
		rc = tpm_init_check_gmac_mh_gtwy_mode(TPM_ENUM_GMAC_0, tpm_init.gmac0_mh_en);
		if (rc != TPM_OK) {
			TPM_OS_FATAL(TPM_INIT_MOD,
				     "\n GMAC_0 is in GateWay mode, MH can not be disabled\n");
			return (TPM_FAIL);
		}
	/********************** GMAC_1 MH enable validation   *************************************/
		if ((tpm_init.gmac1_mh_en != 0) && (tpm_init.gmac1_mh_en != 1)) {
			TPM_OS_FATAL(TPM_INIT_MOD,
				     "\n GMAC_1 MH enable: wrong init value(%d) => legal values <0=disabled,1=enabled> \n",
				     tpm_init.gmac1_mh_en);
			return (TPM_FAIL);
		}
		rc = tpm_init_check_gmac_mh_gtwy_mode(TPM_ENUM_GMAC_1, tpm_init.gmac1_mh_en);
		if (rc != TPM_OK) {
			TPM_OS_FATAL(TPM_INIT_MOD,
				     "\n GMAC_1 is in GateWay mode, MH can not be disabled\n");
			return (TPM_FAIL);
		}
	/********************** GMAC_ Buffer Mngmt Pool_sizes validation ***********************************/
		for (i = 0; i < sizeof(tpm_init.gmac_bp_bufs) / sizeof(tpm_init_gmac_bufs_t); i++) {
			if (tpm_init.gmac_bp_bufs[i].valid) {
				if (((tpm_init.gmac_bp_bufs[i].large_pkt_buffers != 0) &&
				     (tpm_init.gmac_bp_bufs[i].large_pkt_buffers < MV_BM_POOL_CAP_MIN)) ||
				    ((tpm_init.gmac_bp_bufs[i].small_pkt_buffers != 0) &&
				     (tpm_init.gmac_bp_bufs[i].small_pkt_buffers < MV_BM_POOL_CAP_MIN))) {
					TPM_OS_FATAL(TPM_INIT_MOD,
						"\n GMAC%d BM Pool has too small buffer assigment "
						"large_buf %d, small_buf %d\n",
						i, tpm_init.gmac_bp_bufs[i].large_pkt_buffers,
						tpm_init.gmac_bp_bufs[i].small_pkt_buffers);
					return (TPM_FAIL);
				}
			}
		}
	/********************** PNC MH enabled allow for DS   *************************************/
		if ((tpm_init.ds_mh_set_conf != 0) && (tpm_init.ds_mh_set_conf != 1)) {
			TPM_OS_FATAL(TPM_INIT_MOD,
				"\n PNC - DS MH allow: wrong init value(%d) => "
				"legal values <0=MH not allowed/DS,1=MH allowed/DS> \n",
				tpm_init.ds_mh_set_conf);
			return (TPM_FAIL);
		}

		if (tpm_init.port_fc_conf.enabled) {
			MV_U32 device_id = mvCtrlModelGet();

			if (device_id != MV_6601_DEV_ID) {
				TPM_OS_FATAL(TPM_INIT_MOD, "\n port SW Flow-Control is not supported by this device");
				return (TPM_FAIL);
			}

			if ((tpm_init.port_fc_conf.port > TPM_MAX_GMAC) 	||
			    (tpm_init.port_fc_conf.tgt_port > TPM_MAX_GMAC)	||
			    (tpm_init.port_fc_conf.tx_port > TPM_MAX_GMAC)){
				TPM_OS_FATAL(TPM_INIT_MOD,
					"\n port SW Flow-Control invalid port number:"
					"port=%d tgt_port=%d tx_port=%d\n",
					tpm_init.port_fc_conf.port,
					tpm_init.port_fc_conf.tgt_port,
					tpm_init.port_fc_conf.tx_port);
				return (TPM_FAIL);
			}

			if (tpm_init.port_fc_conf.tx_queue >= TPM_MAX_NUM_TX_QUEUE){
				TPM_OS_FATAL(TPM_INIT_MOD,
					"\n port SW Flow-Control invalid port number: tx_queue=%d",
					tpm_init.port_fc_conf.tx_queue);
				return (TPM_FAIL);
			}
		}
	/********************** ethernet ports validation ******************************************/
		for (i = 0; i < TPM_MAX_NUM_ETH_PORTS; i++) {
			if (tpm_init.eth_port_conf[i].valid == TPM_TRUE) {
				if ((tpm_init.eth_port_conf[i].chip_connect < TPM_CONN_DISC) ||
						(tpm_init.eth_port_conf[i].chip_connect > TPM_CONN_RGMII2)) {
					TPM_OS_FATAL(TPM_INIT_MOD,
						"\n ETH_port[(%d)]: chip_connect - wrong init value(%d)"
						" => legal values <0-5> \n",
						i, tpm_init.eth_port_conf[i].chip_connect);
					return (TPM_FAIL);
				}
				if ((tpm_init.eth_port_conf[i].int_connect < TPM_INTCON_GMAC0) ||
						(tpm_init.eth_port_conf[i].int_connect > TPM_INTCON_SWITCH)) {
					TPM_OS_FATAL(TPM_INIT_MOD,
						"\n ETH_port[(%d)]: chip_connect - wrong init "
						"value(%d) => legal values <0-2> \n",
						i, tpm_init.eth_port_conf[i].int_connect);
					return (TPM_FAIL);
				}
				if ((tpm_init.eth_port_conf[i].int_connect == TPM_INTCON_SWITCH) &&
						(tpm_init.eth_port_conf[i].switch_port > 6)) {
					TPM_OS_FATAL(TPM_INIT_MOD,
						"\n ETH_port[(%d)]: switch_port - wrong init "
						"value(%d) => legal values <0-6> \n",
						i, tpm_init.eth_port_conf[i].switch_port);
					return (TPM_FAIL);
				}

				if ((tpm_init.eth_port_conf[i].int_connect == TPM_INTCON_SWITCH) &&
					 (tpm_init.eth_port_conf[i].switch_port <= 6)) {
					num_uni_ports++;
				}
			}
		}
	/********************* Virtual UNI validation *************************************/

		if ((tpm_init.virt_uni_info.enabled < TPM_VIRT_UNI_DISABLED) ||
				(tpm_init.virt_uni_info.enabled > TPM_VIRT_UNI_ENABLED)) {
			TPM_OS_FATAL(TPM_INIT_MOD,
				"\n Virtual UNI: wrong init value(%d) => legal "
				"values <0=TPM_WIFI_VIRT_UNI_DISABLED/1=TPM_VIRT_UNI_ENABLED. \n",
				tpm_init.virt_uni_info.enabled);
			return (TPM_FAIL);
		}
		if (tpm_init.virt_uni_info.enabled == TPM_VIRT_UNI_ENABLED) {
		/*oct* - open this validation in next LSP - meantime it works only on RD */
#if 0
			/* check that GMAC1 is connected to internal switch port #5 */
			rc = mvBoardIsInternalSwitchConnected(1);
			if (rc == 0) {
				TPM_OS_FATAL(TPM_INIT_MOD,
					"\n WiFi virtual UNI: feature ENABLED - GMAC1 "
					"is NOT HW-connected to Switch  port #5. \n");
				return (TPM_FAIL);
			}
#endif
			/* fail eth complex other than dual MAC */
			if (TPM_PON_WAN_DUAL_MAC_INT_SWITCH != tpm_init.eth_cmplx_profile)
			{
				TPM_OS_FATAL(TPM_INIT_MOD,
					"\n Virtual UNI suppoerted only by ethernet Complex %x (used %x) \n",
					TPM_PON_WAN_DUAL_MAC_INT_SWITCH, tpm_init.eth_cmplx_profile);
				return (TPM_FAIL);
			}

			/* currently support only UNI_VIRT port for WIFI virtual UNI port */
			if (tpm_init.virt_uni_info.uni_port != TPM_SRC_PORT_UNI_VIRT) {
				TPM_OS_FATAL(TPM_INIT_MOD,
					"\n Virtual UNI: wrong port value(%d) => "
					"legal values <0-%d> - default value<%d. \n",
					tpm_init.virt_uni_info.uni_port, TPM_SRC_PORT_UNI_VIRT ,TPM_SRC_PORT_UNI_VIRT);
				return (TPM_FAIL);
			}

			num_uni_ports++;

			/* if feature enabled and missing PNC range in the xml - return ERROR */
			for (i = 0; i < TPM_MAX_NUM_RANGES; i++) {
				if (tpm_init.pnc_range[i].range_num == TPM_PNC_VIRT_UNI) {
					if (tpm_init.pnc_range[i].valid != TPM_TRUE) {
						TPM_OS_FATAL(TPM_INIT_MOD,
							"\n Virtual UNI: feature ENABLED - missing "
							"PNC range <TPM_PNC_VIRT_UNI> in XML config file. \n");
						return (TPM_FAIL);
					}
				}
			}	/* for */
			/* TODO: check all GMAC1 TX queues are owned by CPU */

		}

		/*if wifi feature enabled - end validation */
	/********************* PNC validations *****************************************************/
		found_ipv4_pre = found_cnm_main = TPM_FALSE;
		ipv4_pre_size = cnm_main_size = 0;

		/* Validate total number of Pnc Entries */
		for (i = 0; i < TPM_MAX_NUM_RANGES; i++) {
			if (tpm_init.pnc_range[i].valid == TPM_TRUE) {
				j += tpm_init.pnc_range[i].range_size;
				if (tpm_init.pnc_range[i].range_num >= TPM_MAX_NUM_RANGES) {
					TPM_OS_FATAL(TPM_INIT_MOD,
						"PNC range[%d]: range_num - wrong init value(%d) => "
						"legal values <0-%d>\n",
						i, tpm_init.pnc_range[i].range_num, TPM_MAX_RANGE);
					return (TPM_FAIL);
				}
				if (tpm_init.pnc_range[i].range_type > TPM_RANGE_TYPE_TABLE) {
					TPM_OS_FATAL(TPM_INIT_MOD,
						"PNC range[%d]: range_type - wrong init value(%d) => "
						"legal values <0=TYPE_ACL,1=TYPE_TABLE>\n",
						i, tpm_init.pnc_range[i].range_type);
					return (TPM_FAIL);
				}
				if ((tpm_init.pnc_range[i].cntr_grp < 0) || (tpm_init.pnc_range[i].cntr_grp > 3)) {
					TPM_OS_FATAL(TPM_INIT_MOD,
						     "PNC range[%d] cntr_grp - wrong init value(%d) => legal values <0-3>\n",
						     i, tpm_init.pnc_range[i].cntr_grp);
					return (TPM_FAIL);
				}
				if ((tpm_init.pnc_range[i].lu_mask < 0) || (tpm_init.pnc_range[i].lu_mask > 1)) {
					TPM_OS_FATAL(TPM_INIT_MOD,
						     "PNC range[%d] lu_mask - wrong init value(%d) => legal values <0-1>\n",
						     i, tpm_init.pnc_range[i].lu_mask);
					return (TPM_FAIL);
				}
				if (tpm_init.pnc_range[i].range_num == TPM_PNC_CNM_IPV4_PRE) {
					found_ipv4_pre = TPM_TRUE;
					ipv4_pre_size = tpm_init.pnc_range[i].range_size;
				} else if (tpm_init.pnc_range[i].range_num == TPM_PNC_CNM_MAIN) {
					found_cnm_main = TPM_TRUE;
					cnm_main_size = tpm_init.pnc_range[i].range_size;
				}
			}
		}
		if (j > TPM_PNC_SIZE) {
			TPM_OS_FATAL(TPM_INIT_MOD, "Sum of Pnc ranges(%d) is bigger than PnC size(%d)\n", j,
				     TPM_PNC_SIZE);
			return (TPM_FAIL);
		}

	/********************* MOD validations *****************************************************/
		/* Validate TPM reserved modification entries */
	/********************* TX module validations *****************************************************/

		for (tx_mod = TPM_TX_MOD_GMAC0; tx_mod < TPM_MAX_NUM_TX_PORTS; (tx_mod)++) {
			/* validate gmac_tx - according to tpm_init.num_tcont_llid */
			if (tx_mod >= TPM_TX_MOD_PMAC_0) {
				if (((tx_mod - TPM_TX_MOD_GMAC1) > tpm_init.num_tcont_llid) &&
				    (tpm_init.gmac_tx[tx_mod].valid == 1)) {
					tpm_init.gmac_tx[tx_mod].valid = 0;
					TPM_OS_WARN(TPM_INIT_MOD,
						    " Illegal TCONT/LLID %d configuration - max legal value is %d.\n ",
						    tx_mod, tpm_init.num_tcont_llid);
				}
			}
			for (i = 0; i < TPM_MAX_NUM_TX_QUEUE; i++) {
				if (tpm_init.gmac_tx[tx_mod].tx_queue[i].valid != 1)
					continue;

				if ((tpm_init.gmac_tx[tx_mod].tx_queue[i].queue_owner < TPM_Q_OWNER_CPU) ||
				    (tpm_init.gmac_tx[tx_mod].tx_queue[i].queue_owner >= TPM_Q_OWNER_MAX)) {
					TPM_OS_FATAL(TPM_INIT_MOD,
						"TX module queue [%d]: queue_owner - wrong init value(%d)"
						" => legal values <%d-%d>\n",
						tx_mod, tpm_init.gmac_tx[tx_mod].tx_queue[i].queue_owner,
						TPM_Q_OWNER_CPU, TPM_Q_OWNER_PMAC);
					return (TPM_FAIL);
				}
				if (tpm_init.gmac_tx[tx_mod].tx_queue[i].owner_queue_num >= TPM_MAX_NUM_TX_QUEUE) {
					TPM_OS_FATAL(TPM_INIT_MOD,
						"TX module queue [%d]: owner_queue_num - wrong init value(%d) "
						"is bigger than maximum queue number (%d)\n",
						tx_mod, tpm_init.gmac_tx[tx_mod].tx_queue[i].owner_queue_num,
						TPM_MAX_NUM_TX_QUEUE - 1);
					return (TPM_FAIL);
				}
				if ((tpm_init.gmac_tx[tx_mod].tx_queue[i].sched_method < TPM_SCHED_SP) ||
				    (tpm_init.gmac_tx[tx_mod].tx_queue[i].sched_method > TPM_SCHED_WRR)) {
					TPM_OS_FATAL(TPM_INIT_MOD,
						"TX module queue [%d]: sched_method  - wrong init value(%d) => "
						"legal values <%d-%d>\n\n",
						tx_mod, tpm_init.gmac_tx[tx_mod].tx_queue[i].owner_queue_num,
						TPM_SCHED_SP, TPM_SCHED_WRR);
					return (TPM_FAIL);
				}
				if (tpm_init.gmac_tx[tx_mod].tx_queue[i].queue_weight > TPM_MAX_WRR_WEIGHT) {
					TPM_OS_FATAL(TPM_INIT_MOD,
						"TX module queue [%d]: queue_weight  - wrong init value(%d) "
						"=> legal values <0-%d>\n\n",
						tx_mod, tpm_init.gmac_tx[tx_mod].tx_queue[i].queue_weight,
						TPM_MAX_WRR_WEIGHT);
					return (TPM_FAIL);
				}
			}
		}

		/********* per GMAC - validate that default TCONT & Queue - are not set as HWF in xml *****/
		for (gmac_i = 0; gmac_i < TPM_MAX_NUM_GMACS; gmac_i++) {
			rc = mv_eth_get_txq_cpu_def(gmac_i, &txp, &txq, 0);
			if (rc != 0) {
				TPM_OS_WARN(TPM_INIT_MOD, "\n Failed to GET the default queue per GMAC%d - rc= %d. \n",
					    gmac_i, rc);
       			continue;
			}
			if (gmac_i >= TPM_TX_MOD_PMAC_0) {
				if (tpm_init.gmac_tx[gmac_i + txp].tx_queue[txq].queue_owner != TPM_Q_OWNER_CPU) {
					TPM_OS_WARN(TPM_INIT_MOD,
						" Default TX queue(%d) per GMAC (%d) must not be set in "
						"hardware forwarding mode in config params.\n\n", txq, gmac_i);
				}
			} else {
				if (tpm_init.gmac_tx[gmac_i].tx_queue[txq].queue_owner != TPM_Q_OWNER_CPU) {
					TPM_OS_WARN(TPM_INIT_MOD,
						" Default TX queue(%d) per GMAC (%d) must not be set in "
						"hardware forwarding mode in config params.\n\n", txq, gmac_i);
				}
			}
		}

		/*****split mod setting validation******/
		if (tpm_init.split_mod_config.split_mod_enable == TPM_SPLIT_MOD_ENABLED) {
			if(tpm_init.split_mod_config.vlan_num > (TPM_DB_SPLIT_MOD_NUM_VLANS_MAX - TPM_DB_SPLIT_MOD_INIT_VLANS_NUM)) {
				TPM_OS_FATAL(TPM_INIT_MOD,
				     "\n Split Mod VLAN num %d, it should not larger than %d \n",
				     tpm_init.split_mod_config.vlan_num, (TPM_DB_SPLIT_MOD_NUM_VLANS_MAX - TPM_DB_SPLIT_MOD_INIT_VLANS_NUM));
				return (TPM_FAIL);
			}
			if (tpm_init.split_mod_config.p_bit_num > TPM_DB_SPLIT_MOD_P_BIT_NUM_MAX || tpm_init.split_mod_config.p_bit_num == TPM_DB_SPLIT_MOD_P_BIT_NO_SET) {
				TPM_OS_FATAL(TPM_INIT_MOD, "\n Split Mod P_bit number out of range.\n");
				return (TPM_FAIL);
			}
			for (i = 0; i < tpm_init.split_mod_config.p_bit_num; i++) {
				if(tpm_init.split_mod_config.p_bit[i] > TPM_DB_SPLIT_MOD_P_BIT_MAX) {
					TPM_OS_FATAL(TPM_INIT_MOD,
				     		"\n Split Mod P_bit %d No Valid\n",
						tpm_init.split_mod_config.p_bit[i]);
					return (TPM_FAIL);
				}
				for (j = i + 1; j < tpm_init.split_mod_config.p_bit_num; j++) {
					if(tpm_init.split_mod_config.p_bit[i] == tpm_init.split_mod_config.p_bit[j]) {
						TPM_OS_FATAL(TPM_INIT_MOD,
				     			"\n Split Mod P_bit %d Repeat\n",
							tpm_init.split_mod_config.p_bit[i]);
						return (TPM_FAIL);
					}
				}
			}
		}

		/********************* CTC CNM validation *************************************/
		if (tpm_init.ctc_cm_enable != TPM_CTC_CM_DISABLED) {
			if (tpm_init.split_mod_config.split_mod_enable == TPM_SPLIT_MOD_DISABLED) {
				TPM_OS_FATAL(TPM_INIT_MOD,
					"\n CTC CM: CTC CnM is enabled while split modification is disabled! \n");
				return (TPM_FAIL);
			}

			if (!found_ipv4_pre) {
				TPM_OS_FATAL(TPM_INIT_MOD,
					"\n CTC CM: CTC CnM is enabled while CNM_IPV4_PRE range size is Zero! \n");
				return (TPM_FAIL);
			} else {
				exp_range_size = num_uni_ports * TPM_CNM_MAX_IPV4_PRE_FILTER_RULE_PER_PORT + 1;
				if (exp_range_size > ipv4_pre_size) {
					TPM_OS_WARN(TPM_INIT_MOD,
						"\n CTC CM: CNM IPV4 PRE FILTER is not enough for "
						"L2 & IPV4 combo rules (%d/%d) of %d UNI ports! \n",
						exp_range_size, ipv4_pre_size, num_uni_ports);
				}
			}

			if (!found_cnm_main) {
				TPM_OS_FATAL(TPM_INIT_MOD,
					"\n CTC CM: CTC CnM is enabled while CNM_MAIN range size is Zero! \n");
				return (TPM_FAIL);
			} else {
				exp_range_size = num_uni_ports * TPM_MAX_NUM_CTC_PRECEDENCE + 2;
				if (exp_range_size > cnm_main_size) {
					TPM_OS_WARN(TPM_INIT_MOD,
						"\n CTC CM: CNM MAIN is not enough for "
						"8 precedence rules (%d/%d) of %d UNI ports! \n",
						exp_range_size, cnm_main_size, num_uni_ports);
				}
			}
		} else {
			if (found_ipv4_pre) {
				TPM_OS_WARN(TPM_INIT_MOD,
					"\n CTC CM: Since CTC CnM is disabled, CNM_IPV4_PRE range size should be Zero! \n");
			}
			if (found_cnm_main) {
				TPM_OS_WARN(TPM_INIT_MOD,
					"\n CTC CM: Since CTC CnM is disabled, CNM_MAIN range size should be Zero! \n");
			}
		}
	}

	/********************* No switch init(MC) validation *************************************/
	if (tpm_init.switch_init == 0) {
		if (tpm_init.virt_uni_info.enabled == TPM_VIRT_UNI_ENABLED) {
			TPM_OS_FATAL(TPM_INIT_MOD,
					"\n No Switch Init: Virt UNI is not supported! \n");
			return (TPM_FAIL);
		}

		if (tpm_init.mc_setting.per_uni_vlan_xlat) {
			TPM_OS_FATAL(TPM_INIT_MOD,
					"\n No Switch Init: MC Per UNI Xlate is not supported! \n");
			return (TPM_FAIL);
		}

		if (tpm_init.mc_setting.filter_mode != TPM_MC_ALL_CPU_FRWD && tpm_init.mc_setting.filter_mode != TPM_MC_IP_ONLY_FILTER) {
			TPM_OS_FATAL(TPM_INIT_MOD,
					"\n No Switch Init: MC filter mode(%d) not supported! \n", tpm_init.mc_setting.filter_mode);
			return (TPM_FAIL);
		}

		if (tpm_init.ety_dsa_enable == TPM_ETY_DSA_ENABLE) {
			TPM_OS_FATAL(TPM_INIT_MOD,
					"\n No Switch Init: DSA is not supported! \n");
			return (TPM_FAIL);
		}

		if (tpm_init.gmac0_mh_en == 1) {
			TPM_OS_FATAL(TPM_INIT_MOD,
					"\n No Switch Init: GMAC0 Marvell header should disabled! \n");
			return (TPM_FAIL);
		}

		if (tpm_init.pnc_range[TPM_PNC_MAC_LEARN].range_size == 0) {
			TPM_OS_FATAL(TPM_INIT_MOD,
					"\n No Switch Init: PNC range[%d] size is 0! \n", TPM_PNC_MAC_LEARN);
			return (TPM_FAIL);
		}

		if (tpm_init.pnc_mac_learn_enable == TPM_PNC_MAC_LEARN_DISABLED &&
		    tpm_init.pnc_range[TPM_PNC_MAC_LEARN].range_size > 1) {
			TPM_OS_WARN(TPM_INIT_MOD,
					"\n No Switch Init: MAC learn disabled, PNC range[%d] size is too bigger! \n", TPM_PNC_MAC_LEARN);
		}

		if (tpm_init.pnc_mac_learn_enable == TPM_PNC_MAC_LEARN_ENABLED &&
		    tpm_init.pnc_range[TPM_PNC_MAC_LEARN].range_size <= 1) {
			TPM_OS_WARN(TPM_INIT_MOD,
					"\n No Switch Init: MAC learn enabled, PNC range[%d] size is too small! \n", TPM_PNC_MAC_LEARN);
		}
	} else if ((tpm_init.eth_cmplx_profile == TPM_PON_WAN_G0_SINGLE_PORT ||
		    tpm_init.eth_cmplx_profile == TPM_PON_WAN_G1_SINGLE_PORT ||
		    tpm_init.eth_cmplx_profile == TPM_PON_G1_WAN_G0_SINGLE_PORT ||
		    tpm_init.eth_cmplx_profile == TPM_PON_G0_WAN_G1_SINGLE_PORT ||
		    tpm_init.eth_cmplx_profile == TPM_PON_WAN_G0_G1_LPBK)
		 && tpm_init.switch_init == 1) {
			TPM_OS_FATAL(TPM_INIT_MOD,
					"\n Switch can not be Init at this profile: [%d]! \n", tpm_init.eth_cmplx_profile);
			tpm_init.switch_init = 0;
	}

	/* check XML Tx queue for MC chip with profile TPM_PON_WAN_G0_G1_LPBK */
	if((MV_6601_DEV_ID == mvCtrlModelGet()) && (TPM_PON_WAN_G0_G1_LPBK == tpm_init.eth_cmplx_profile)) {
		/* check GMAC1 Tx queue configuration in XML */
		if (tpm_init.gmac_tx[TPM_TX_MOD_GMAC1].valid == TPM_TRUE) {
			for (i = 0; i < TPM_MAX_NUM_TX_QUEUE; i++) {
				if (tpm_init.gmac_tx[TPM_TX_MOD_GMAC1].tx_queue[i].valid == TPM_TRUE) {
					if (tpm_init.gmac_tx[TPM_TX_MOD_GMAC1].tx_queue[i].queue_owner == TPM_Q_OWNER_GMAC0)
						gmac0_owner++;
					if (tpm_init.gmac_tx[TPM_TX_MOD_GMAC1].tx_queue[i].queue_owner == TPM_Q_OWNER_CPU)
						cpu_owner++;
				}
			}
			if (gmac0_owner == 0) {
				TPM_OS_FATAL(TPM_INIT_MOD,
						"\n TPM_PON_WAN_G0_G1_LPBK: MC chip GMAC1 Tx queue no assigned to GMAC0 \n");
				return (TPM_FAIL);
			} else if (gmac0_owner > 1) {
				TPM_OS_WARN(TPM_INIT_MOD,
						"\n TPM_PON_WAN_G0_G1_LPBK: One GMAC1 Tx queue assigned to GMAC0 enough! \n");
			}
			if (cpu_owner == 0) {
				TPM_OS_FATAL(TPM_INIT_MOD,
						"\n TPM_PON_WAN_G0_G1_LPBK: MC chip GMAC1 Tx queue no assigned to CPU \n");
				return (TPM_FAIL);
			}
		} else {
			TPM_OS_FATAL(TPM_INIT_MOD,
					"\n TPM_PON_WAN_G0_G1_LPBK: MC chip GMAC1 Invalid! \n");
			return (TPM_FAIL);
		}

		/* check PON Tx queue configuration in XML */
		for (i = TPM_TX_MOD_PMAC_0; i < TPM_MAX_NUM_TX_PORTS; i++) {
			if (tpm_init.gmac_tx[i].valid == TPM_TRUE) {
				for(j = 0; j < TPM_MAX_NUM_TX_QUEUE; j++) {
					if (tpm_init.gmac_tx[i].tx_queue[j].valid != TPM_TRUE ||
					    tpm_init.gmac_tx[i].tx_queue[j].queue_owner != TPM_Q_OWNER_GMAC1) {
						TPM_OS_WARN(TPM_INIT_MOD,
							"\n TPM_PON_WAN_G0_G1_LPBK: All PON-%d Tx queue should be assign to GMAC1! \n", (i - TPM_TX_MOD_PMAC_0));
						break;
					}
				}
			}
		}
	}

	return (TPM_OK);
}

/*******************************************************************************
* tpm_init_tx_mod_set()
*
* DESCRIPTION:      Set the configuration of a Tx module
*
* INPUTS:
* tx_mod           -

* OUTPUTS:
*
* RETURNS:
*
*******************************************************************************/
void tpm_init_tx_mod_set(tpm_db_tx_mod_t tx_mod)
{
	uint32_t i;

	for (i = 0; i < TPM_MAX_NUM_TX_QUEUE; i++) {
		if (tpm_init.gmac_tx[tx_mod].tx_queue[i].valid == TPM_TRUE) {
			tpm_db_gmac_tx_q_conf_set(tx_mod, i,
						  tpm_init.gmac_tx[tx_mod].tx_queue[i].sched_method,
						  tpm_init.gmac_tx[tx_mod].tx_queue[i].queue_owner,
						  tpm_init.gmac_tx[tx_mod].tx_queue[i].owner_queue_num,
						  tpm_init.gmac_tx[tx_mod].tx_queue[i].queue_size,
						  tpm_init.gmac_tx[tx_mod].tx_queue[i].queue_weight);
		}
	}

}

/*******************************************************************************
* tpm_init_gmac_rxq_set()
*
* DESCRIPTION:      Set the queue configuration of a GMAC
*
* INPUTS:
* tx_mod           -

* OUTPUTS:
*
* RETURNS:
*
*******************************************************************************/
void tpm_init_gmac_rxq_set(tpm_gmacs_enum_t gmac)
{
	uint32_t i;

	for (i = 0; i < TPM_MAX_NUM_TX_QUEUE; i++) {
		if (tpm_init.gmac_rx[gmac].rx_queue[i].valid == TPM_TRUE)
			tpm_db_gmac_rx_q_conf_set(gmac, i, tpm_init.gmac_rx[gmac].rx_queue[i].queue_size);
	}
}

/*******************************************************************************
* tpm_init_pncranges_set()
*
* DESCRIPTION:      Initialize the PnC ranges
*
* INPUTS:
* tx_mod           -

* OUTPUTS:
*
* RETURNS:
*
*******************************************************************************/
int32_t tpm_init_pncranges_set(tpm_reset_level_enum_t reset_type)
{
	tpm_db_pnc_range_conf_t pnc_range_conf;
	uint32_t cur_pnc_entry = 0;
	uint32_t luid = 0, last_lu_range, val;
	uint32_t i;
	tpm_pnc_ranges_t cur_range;
	int32_t ret_code;

	/* Init basics which are same for all Ranges */
	pnc_range_conf.num_luids = 1;

	/* Insert valid PnC Ranges by enum order */
	for (cur_range = 0; cur_range <= TPM_MAX_RANGE; cur_range++) {
		/* Search Input Table */
		for (i = 0; i < TPM_MAX_NUM_RANGES; i++) {
			if ((tpm_init.pnc_range[i].range_num == cur_range) && (tpm_init.pnc_range[i].valid == TPM_TRUE)
			    && (tpm_init.pnc_range[i].range_size > 0)) {
				pnc_range_conf.range_id = tpm_init.pnc_range[i].range_num;
				pnc_range_conf.min_reset_level = tpm_init.pnc_range[i].min_reset_level;
				pnc_range_conf.range_type = tpm_init.pnc_range[i].range_type;
				pnc_range_conf.range_size = tpm_init.pnc_range[i].range_size;
				pnc_range_conf.range_start = cur_pnc_entry;
				pnc_range_conf.range_end = cur_pnc_entry + tpm_init.pnc_range[i].range_size - 1;
				pnc_range_conf.cntr_grp = tpm_init.pnc_range[i].cntr_grp;
				pnc_range_conf.lu_mask = tpm_init.pnc_range[i].lu_mask;
				pnc_range_conf.api_start = 0;
				/* For the dscp_ds or dscp_us range, reserve hardcoded  entry at the beginning
				 * of the pnc_range (see tpm_proc_ipv4_dscp_init) */
				if (tpm_init.pnc_range[i].range_size < (pnc_range_conf.api_start + 1)) {
					TPM_OS_ERROR(TPM_INIT_MOD,
						"pnc_range(%d) cannot set first api_entry to (%d), pnc_range  "
						"is too small\n",
						cur_range, pnc_range_conf.api_start);
					return (TPM_FAIL);
				}
				tpm_init_lookup_get(tpm_init.pnc_range[i].range_num, &luid, &last_lu_range, &val);
				if (val == 0) {
					TPM_OS_ERROR(TPM_INIT_MOD, "pnc_range(%d) has no defined lookup_id\n",
						     cur_range);
					return (TPM_FAIL);
				}

				pnc_range_conf.base_lu_id = luid;

				/* Set PortId for last entry drop/trap usage, currently last entry will be valid for all active gmacs */
				pnc_range_conf.last_ent_portid = tpm_proc_all_gmac_bm();

				/* Depending if this is last Range of a LookupId, reserve last entry for debug */
				if (0 && last_lu_range == 1) {	/* YUVAL_NOW, add xml_param here */
					if (tpm_init.pnc_range[i].range_size < ((pnc_range_conf.api_start + 1) + 1)) {
						TPM_OS_ERROR(TPM_INIT_MOD,
							"pnc_range(%d) cannot set last entry to trap, pnc_range "
							" is is too small\n",
							cur_range);
						return (TPM_FAIL);
					}
					/* TODO - this is harcdoded to trap, should be configurable trap/drop/default */
					pnc_range_conf.init_last_entry = TPM_PNC_RNG_LAST_INIT_TRAP;
					pnc_range_conf.api_end = pnc_range_conf.range_size - 2;
				} else {
					pnc_range_conf.init_last_entry = TPM_PNC_RNG_LAST_INIT_DEF;
					pnc_range_conf.api_end = pnc_range_conf.range_size - 1;
				}

				/* Create or Reset the Range (Delete+Create), or skip resetting it */
				if (reset_type < pnc_range_conf.min_reset_level) {
					TPM_OS_DEBUG(TPM_INIT_MOD, " skip resetting range (%d)\n",
						     pnc_range_conf.range_id);
				} else {
					TPM_OS_DEBUG(TPM_INIT_MOD, " set range (%d)\n", pnc_range_conf.range_id);
					/* Never mind if it did or did not exist */
					ret_code = tpm_db_pnc_rng_delete(pnc_range_conf.range_id);
					ret_code = tpm_db_pnc_rng_create(&pnc_range_conf);
					IF_ERROR(ret_code);
				}
				cur_pnc_entry += tpm_init.pnc_range[i].range_size;

				TPM_OS_DEBUG(TPM_INIT_MOD,
					     "\t rng_type(%d)  rng_id(%d)    rng_start(%d)     rng_end(%d)\n"
					     "\t rng_size(%d)  cntr_grp(%d)  lu_mask(%d)   api_start(%d) \n"
					     "\t api_end(%d)   lu_id(%d)\n"
					     "\t init_last_e(%d) last_ent_port_id(%x)\n",
					     pnc_range_conf.range_type,
					     pnc_range_conf.range_id,
					     pnc_range_conf.range_start,
					     pnc_range_conf.range_end,
					     pnc_range_conf.range_size,
					     pnc_range_conf.cntr_grp,
					     pnc_range_conf.lu_mask,
					     pnc_range_conf.api_start,
					     pnc_range_conf.api_end,
					     pnc_range_conf.base_lu_id,
					     pnc_range_conf.init_last_entry, pnc_range_conf.last_ent_portid);

				TPM_OS_DEBUG(TPM_INIT_MOD, "cur_pnc_entry(%d)\n", cur_pnc_entry);
				break;
			}
		}
	}
	return (TPM_OK);
}

int32_t tpm_init_api_rng_init(tpm_pnc_ranges_t range, tpm_api_sections_t api_sec, tpm_dir_t dir)
{
	int32_t ret_code;
	uint32_t api_size;
	tpm_db_pnc_range_conf_t range_conf;

	ret_code = tpm_db_pnc_rng_conf_get(range, &range_conf);
	if (ret_code != TPM_OK) {
		TPM_OS_WARN(TPM_INIT_MOD, " PNC Range(%d) was not created - rc(%d) \n", range, ret_code);
	} else {
		api_size = (range_conf.api_end - range_conf.api_start + 1);
		ret_code = tpm_db_api_section_init(api_sec, range, api_size);
		IF_ERROR(ret_code);
		return (ret_code);
	}
	return (TPM_OK);
}

int32_t tpm_init_api_rng_init_all(void)
{
	int32_t ret_code;
	/* Init the API Entries Memeory Area */
	tpm_db_api_entries_area_reset();

	/* Init API Ranges - MAC LEARN */
	ret_code = tpm_init_api_rng_init(TPM_PNC_MAC_LEARN, TPM_PNC_MAC_LEARN_ACL, TPM_DIR_DS);
	IF_ERROR(ret_code);

	/* Init API Ranges - CPU WAN LPBK */
	ret_code = tpm_init_api_rng_init(TPM_PNC_CPU_WAN_LPBK_US, TPM_CPU_LOOPBACK_ACL, TPM_DIR_DS);
	IF_ERROR(ret_code);

	/* Init API Ranges - L2DS, L2US */
	ret_code = tpm_init_api_rng_init(TPM_PNC_L2_MAIN, TPM_L2_PRIM_ACL, TPM_DIR_DS);
	IF_ERROR(ret_code);

	/* Init API Ranges - L3DS, L3US */
	ret_code = tpm_init_api_rng_init(TPM_PNC_ETH_TYPE, TPM_L3_TYPE_ACL, TPM_DIR_DS);
	IF_ERROR(ret_code);

	/* Init API Ranges - IPV4 US, IPV4 DS */
	ret_code = tpm_init_api_rng_init(TPM_PNC_IPV4_MAIN, TPM_IPV4_ACL, TPM_DIR_DS);
	IF_ERROR(ret_code);

	/* Init API Ranges - IPV4 MC */
	ret_code = tpm_init_api_rng_init(TPM_PNC_IPV4_MC_DS, TPM_IPV4_MC, TPM_DIR_DS);
	IF_ERROR(ret_code);

	ret_code = tpm_init_api_rng_init(TPM_PNC_IPV6_GEN, TPM_IPV6_GEN_ACL, TPM_DIR_DS);
	IF_ERROR(ret_code);
	ret_code = tpm_init_api_rng_init(TPM_PNC_IPV6_NH, TPM_IPV6_NH_ACL, TPM_DIR_DS);
	IF_ERROR(ret_code);
	ret_code = tpm_init_api_rng_init(TPM_PNC_IPV6_DIP, TPM_IPV6_DIP_ACL, TPM_DIR_DS);
	IF_ERROR(ret_code);
	ret_code = tpm_init_api_rng_init(TPM_PNC_IPV6_L4, TPM_L4_ACL, TPM_DIR_DS);
	IF_ERROR(ret_code);
	ret_code = tpm_init_api_rng_init(TPM_PNC_IPV6_MC_DS, TPM_IPV6_MC_ACL, TPM_DIR_DS);
	IF_ERROR(ret_code);

	ret_code = tpm_init_api_rng_init(TPM_PNC_CNM_MAIN, TPM_CNM_MAIN_ACL, TPM_DIR_DS);
	IF_ERROR(ret_code);

	return (TPM_OK);
}

uint16_t tpm_init_uni_amber_vec_map(uint16_t uni_vec)
{
	uint16_t amber_vec = 0;
	uint16_t amber_port = 0;
	uint32_t uni_i;
	tpm_src_port_type_t uni_src_port;

	for (uni_i = 0; uni_i < TPM_MAX_NUM_ETH_PORTS; uni_i++) {
		if (uni_vec & (1 << uni_i)) {
			uni_src_port = TPM_SRC_PORT_UNI_0 + uni_i;
			amber_port = (uint16_t) tpm_db_eth_port_switch_port_get(uni_src_port);
			amber_vec |= (1 << amber_port);
		}
	}
	return (amber_vec);
}

int32_t tpm_init_port_vector_tbl(void)
{
	uint32_t i, pnc_vector, tbl_entry, uni_port_nr;
	int32_t ret_code, virt_uni_amber_port_bmp = 0;
	tpm_init_virt_uni_t virt_uni_info;
	uint16_t amber_port_vector;
	uint32_t trg_port_uni_vec = 0, uni_vector, uni_vector_bmp;

	/* use all 16 registers with straight mapping uni_vector to amber_port_vector
	   only UNI_0 - UNI_3 are used */
	ret_code = tpm_db_virt_info_get(&virt_uni_info);
	if (ret_code != TPM_DB_OK) {
		TPM_OS_ERROR(TPM_TPM_LOG_MOD, " tpm_db_virt_info_get ret_code(%d)\n", ret_code);
		return (ret_code);
	}

	/* virt uni not enabled */
	if (virt_uni_info.enabled == 0) {
		/* Convert UNI_Vector to Amber Vector, applies to uni_0..7, uni_vector from 0x00 to 0xFF */
		for (i = 0; i < TPM_TX_MAX_MH_REGS; i++) {
			amber_port_vector = tpm_init_uni_amber_vec_map(i + 1);
			tpm_db_port_vector_tbl_info_set(i, i + 1, amber_port_vector, 0);
		}
		return TPM_DB_OK;
       }

	/* virt uni enabled */

	/* first map all 8 UNI ports */
	amber_port_vector = 0;
	pnc_vector = 1;
	tbl_entry = 0;
	uni_vector_bmp = 0;
	uni_port_nr = TPM_SRC_PORT_UNI_0;
	for (uni_vector = TPM_TRG_UNI_0; uni_vector <= TPM_TRG_UNI_VIRT; uni_vector = uni_vector << 1) {
       	uint16_t switch_port = tpm_db_eth_port_switch_port_get(uni_port_nr);

		if (TPM_DB_ERR_PORT_NUM != switch_port){
       		tpm_db_port_vector_tbl_info_set(tbl_entry, uni_vector, (1 << switch_port),
							pnc_vector << TPM_MH_RI_OFFSET);

			/* save the internal switch vector for later use */
			amber_port_vector |= (1 << switch_port);

			/* save the virt uni and target port vec w/o virt port for later use */
			if ((1 == virt_uni_info.enabled) && (uni_port_nr == virt_uni_info.uni_port))
				virt_uni_amber_port_bmp = (1 << switch_port);
			else
				uni_vector_bmp |= uni_vector;

			trg_port_uni_vec |= (pnc_vector << TPM_MH_RI_OFFSET);
		}
		pnc_vector++;
		tbl_entry++;
		uni_port_nr++;
      	}

	/* now add UNI_ANY mapping */
	tpm_db_port_vector_tbl_info_set(tbl_entry, TPM_TRG_PORT_UNI_ANY, amber_port_vector,
					pnc_vector << TPM_MH_RI_OFFSET);
	tbl_entry++;

	/* now add UNI_ANY_SPECIAL mapping (exluding virt-uni port) */
	if (1 == virt_uni_info.enabled)
		amber_port_vector &= ~virt_uni_amber_port_bmp;

	tpm_db_port_vector_tbl_info_set(tbl_entry, uni_vector_bmp, amber_port_vector, trg_port_uni_vec);

	return TPM_DB_OK;
}

int32_t tpm_init_info_set(void)
{
	int32_t ret_code;
	uint32_t i;
	tpm_src_port_type_t src_port;

	tpm_db_eth_cmplx_profile_set(tpm_init.eth_cmplx_profile);
	ret_code = tpm_db_eth_max_uni_port_set();
	IF_ERROR(ret_code);
	ret_code = tpm_db_pon_type_set(tpm_init.pon_type);
	IF_ERROR(ret_code);
	ret_code = tpm_db_backup_wan_set(tpm_init.backup_wan);
	IF_ERROR(ret_code);
	ret_code = tpm_db_ds_mh_set_conf_set(tpm_init.ds_mh_set_conf);
	IF_ERROR(ret_code);
	ret_code = tpm_db_cfg_pnc_parse_set(tpm_init.cfg_pnc_parse);
	IF_ERROR(ret_code);
	ret_code = tpm_db_cpu_loopback_set(tpm_init.cpu_loopback);
	IF_ERROR(ret_code);
	ret_code = tpm_db_ipv6_5t_enable_set(tpm_init.ipv6_5t_enable);
	IF_ERROR(ret_code);
	ret_code = tpm_db_ctc_cm_enable_set(tpm_init.ctc_cm_enable);
	IF_ERROR(ret_code);
	ret_code = tpm_db_ctc_cm_ipv6_parse_win_set(tpm_init.ctc_cm_ipv6_parse_window);
	IF_ERROR(ret_code);
	ret_code = tpm_db_ctc_cm_ipv6_parse_win_orig_set(tpm_init.ctc_cm_ipv6_parse_window);
	IF_ERROR(ret_code);
	ret_code = tpm_db_virt_info_set(tpm_init.virt_uni_info);
	IF_ERROR(ret_code);
	ret_code = tpm_db_double_tag_support_set((tpm_init.num_vlan_tags > 1) ? 1 : 0);
	IF_ERROR(ret_code);
#if 0
	ret_code = tpm_db_default_tag_tpid_set(tpm_init.vlan1_tpid, tpm_init.vlan2_tpid);
	IF_ERROR(ret_code);
#endif
	ret_code = tpm_db_default_tag_tpid_set(&tpm_init.tpid_opt);
	IF_ERROR(ret_code);
	ret_code = tpm_db_switch_init_set(tpm_init.switch_init);
	IF_ERROR(ret_code);
	ret_code = tpm_db_pnc_mac_learn_enable_set(tpm_init.pnc_mac_learn_enable);
	IF_ERROR(ret_code);
	ret_code = tpm_db_fc_conf_set(&tpm_init.port_fc_conf);
	IF_ERROR(ret_code);

	/* Set GMAC Logical Functions */

	/* PON_MAC */
	if (tpm_db_active_wan_get() == TPM_ENUM_PMAC)
		if ((tpm_init.pon_type == TPM_GPON || tpm_init.pon_type == TPM_EPON) &&
		    (tpm_init.pon_type != TPM_P2P)) {
			ret_code = tpm_db_omci_type_set(tpm_init.omci_etype);
			IF_ERROR(ret_code);
		}

	/* set GMAC/PMAC functionality */
	tpm_db_mac_func_set();

#if 0				/*Keep to be added in future version */
	/* Set Debug Port */
	if (tpm_init.deb_port_valid == 1) {
		ret_code = tpm_db_pnc_init_deb_port_set(tpm_init.deb_port);
		IF_ERROR(ret_code);
	}
#endif

	/* Set IGMP Conf */
	for (src_port = TPM_SRC_PORT_UNI_0; src_port <= TPM_SRC_PORT_WAN; src_port++) {
		tpm_db_igmp_set_port_frwd_mode(src_port, tpm_init.igmp_pkt_frwd_mod[src_port]);
		printk(KERN_INFO "TPM_SRC_PORT: %d, value: %d\n", src_port, tpm_init.igmp_pkt_frwd_mod[src_port]);
	}
	tpm_db_igmp_set_cpu_queue(tpm_init.igmp_cpu_queue);
	/*printk("TPM_SRC_PORT_WAN: %d, TPM_SRC_PORT_UNI_0: %d, TPM_SRC_PORT_UNI_1: %d, TPM_SRC_PORT_UNI_2: %d, "
	   "TPM_SRC_PORT_UNI_3: %d, igmp_cpu_queue: %d\n",
	   tpm_init.igmp_pkt_frwd_mod[4],tpm_init.igmp_pkt_frwd_mod[0],tpm_init.igmp_pkt_frwd_mod[1],
	   tpm_init.igmp_pkt_frwd_mod[2],tpm_init.igmp_pkt_frwd_mod[3],tpm_init.igmp_cpu_queue); */

	/* Set ethernet Port Config */
	for (i = 0; i < TPM_MAX_NUM_ETH_PORTS; i++) {
		if (TPM_TRUE == tpm_init.eth_port_conf[i].valid) {
			ret_code = tpm_db_eth_port_conf_set(&tpm_init.eth_port_conf[i]);
			IF_ERROR(ret_code);
		}
	}

	/* Set GMAC Port Config */
	ret_code = tpm_db_gmac_conn_conf_set(tpm_init.gmac_port_conf, TPM_NUM_GMACS);
	IF_ERROR(ret_code);

	/* Init MH Tx Amber Port Vectors Table */
	tpm_init_port_vector_tbl();

	/* Set tcont_llid */
	ret_code = tpm_db_gmac_tcont_llid_set(tpm_init.num_tcont_llid);
	IF_ERROR(ret_code);

	/* Set GMAC mh_enable */
	ret_code = tpm_db_gmac_mh_en_conf_set(TPM_ENUM_GMAC_0, tpm_init.gmac0_mh_en);
	IF_ERROR(ret_code);
	ret_code = tpm_db_gmac_mh_en_conf_set(TPM_ENUM_GMAC_1, tpm_init.gmac1_mh_en);
	IF_ERROR(ret_code);
	ret_code = tpm_db_gmac_mh_en_conf_set(TPM_ENUM_PMAC, TPM_TRUE);
	IF_ERROR(ret_code);

	/* Set GMAC BM pools */
	for (i = 0; i < sizeof(tpm_init.gmac_bp_bufs) / sizeof(tpm_init_gmac_bufs_t); i++) {
		if (tpm_init.gmac_bp_bufs[i].valid == TPM_TRUE) {
			tpm_db_gmac_bm_bufs_conf_set(i,
						     tpm_init.gmac_bp_bufs[i].large_pkt_buffers,
						     tpm_init.gmac_bp_bufs[i].small_pkt_buffers);
		}
	}

	/* Set GMAC/TCONT Tx Queues */

	/* GMAC0 tx */
	if (tpm_init.gmac_port_conf[0].conn != TPM_GMAC_CON_DISC) {
		tpm_db_gmac_tx_val_set(TPM_TX_MOD_GMAC0);
		tpm_init_tx_mod_set(TPM_TX_MOD_GMAC0);

	}
	/* GMAC1 tx */
	if (tpm_init.gmac_port_conf[1].conn != TPM_GMAC_CON_DISC) {
		tpm_db_gmac_tx_val_set(TPM_TX_MOD_GMAC1);
		tpm_init_tx_mod_set(TPM_TX_MOD_GMAC1);
	}
	/* TCONTs */
	for (i = TPM_TX_MOD_PMAC_0; i < (TPM_TX_MOD_PMAC_0 + tpm_init.num_tcont_llid); i++) {
		tpm_db_gmac_tx_val_set(i);
		tpm_init_tx_mod_set(i);
	}

	/* Set GMAC Rx Queues */

	/* GMAC0 rx */
	if (tpm_init.gmac_port_conf[0].conn != TPM_GMAC_CON_DISC) {
		tpm_db_gmac_rx_val_set(TPM_ENUM_GMAC_0);
		tpm_init_gmac_rxq_set(TPM_ENUM_GMAC_0);
	}

	/* GMAC1 rx */
	if (tpm_init.gmac_port_conf[1].conn != TPM_GMAC_CON_DISC) {
		tpm_db_gmac_rx_val_set(TPM_ENUM_GMAC_1);
		tpm_init_gmac_rxq_set(TPM_ENUM_GMAC_1);
	}
	/* PMAC Rx */
	if (tpm_init.pon_type == TPM_GPON || tpm_init.pon_type == TPM_EPON) {
		tpm_db_gmac_rx_val_set(TPM_ENUM_PMAC);
		tpm_init_gmac_rxq_set(TPM_ENUM_PMAC);
	}

	/* Init PNC Ranges */
	/* Init ALL PnC Ranges in the DB, even PnC Ranges with highest reset_level */
	ret_code = tpm_init_pncranges_set(TPM_ENUM_MAX_RESET_LEVEL + 1);
	IF_ERROR(ret_code);

	/* Init API Ranges */
	ret_code = tpm_init_api_rng_init_all();
	IF_ERROR(ret_code);

	tpm_db_mod2_set_udp_checksum_use_init_bm_state(tpm_init.mod_config.udp_checksum_use_init_bm);
	tpm_db_mod2_set_udp_checksum_state(tpm_init.mod_config.udp_checksum_update);

	for (i = 0; i < tpm_init.mod_chain.chain_num; i++)
		tpm_db_mod2_set_chain_num(tpm_init.mod_chain.chain_data[i].type, tpm_init.mod_chain.chain_data[i].num);

	/*** Set state of MH modification in PMT for Multicast ***/

	/* For ip_only_filter_mode, multicast will ALWAYS update the MH, and NEVER use the MH_tx_registers
	   This way it works the same way for both with_virtual_uni and without_virtual_uni */
	if (tpm_init.mc_setting.filter_mode == TPM_MC_IP_ONLY_FILTER)
		tpm_db_mod2_set_multicast_mh_state(1);
	else {
		/* For mac_ip_combo_filter_mode, MH is not modified.
		 * The MH_tx_register are set to :
		 *   - no_uni_translation  - The "broadcast register", to all_uni_ports.
		 *   - yes_uni_translation - to switch_port of GMAC1.
		 * For other modes (not supported yet), it will be same as mac_ip_combo_filter_mode
		 */
		if (tpm_init.mc_setting.per_uni_vlan_xlat)
			tpm_db_mod2_set_multicast_mh_state(1);
		else
			tpm_db_mod2_set_multicast_mh_state(0);
	}
	/* Set system support for adding PPPoE header as part of PMT modification */
	tpm_db_mod2_set_pppoe_add_mod_state(tpm_init.pppoe_add_enable);

	/* Set modification double_tag according to num_vlan_tags parameter */
	tpm_db_mod2_set_double_tag_state((tpm_init.num_vlan_tags >= 2));

	/* set mtu config */
	tpm_db_mtu_set_ipv4_mtu_us(tpm_init.mtu_config.ipv4_mtu_us);

	tpm_db_mtu_set_ipv4_pppoe_mtu_us(tpm_init.mtu_config.ipv4_pppoe_mtu_us);

	tpm_db_mtu_set_ipv6_mtu_us(tpm_init.mtu_config.ipv6_mtu_us);

	tpm_db_mtu_set_ipv6_pppoe_mtu_us(tpm_init.mtu_config.ipv6_pppoe_mtu_us);

	tpm_db_mtu_set_ipv4_mtu_ds(tpm_init.mtu_config.ipv4_mtu_ds);

	tpm_db_mtu_set_ipv6_mtu_ds(tpm_init.mtu_config.ipv6_mtu_ds);

	tpm_db_set_pppoe_add_enable(tpm_init.pppoe_add_enable);

	tpm_db_set_num_vlan_tags(tpm_init.num_vlan_tags);

	tpm_db_set_mtu_enable(tpm_init.mtu_config.mtu_enable);

	tpm_db_set_cpu_rx_queue(tpm_init.cpu_rx_queue);

	tpm_db_set_ttl_illegal_action(tpm_init.ttl_illegal_action);

	tpm_db_set_tcp_flag_check(tpm_init.tcp_flag_check);

	tpm_db_set_mc_filter_mode(tpm_init.mc_setting.filter_mode);
	/*tpm_db_set_mc_igmp_mode(tpm_init.mc_setting.igmp_mode); */
	tpm_db_set_mc_per_uni_vlan_xlate(tpm_init.mc_setting.per_uni_vlan_xlat);
	tpm_db_set_mc_lpbk_enable(TPM_IP_VER_4, (uint8_t)tpm_init.mc_setting.ipv4_mc_support);
	tpm_db_set_mc_lpbk_enable(TPM_IP_VER_6, (uint8_t)tpm_init.mc_setting.ipv6_mc_support);
	tpm_db_set_mc_pppoe_enable(tpm_init.mc_setting.mc_pppoe_enable);
	tpm_db_set_mc_hwf_queue(tpm_init.mc_setting.mc_hwf_queue);
	tpm_db_set_mc_cpu_queue(tpm_init.mc_setting.mc_cpu_queue);

	tpm_db_set_catch_all_pkt_action(tpm_init.catch_all_pkt_action);
	tpm_db_set_ety_dsa_enable(tpm_init.ety_dsa_enable);

	/* set split mod config */
	tpm_db_split_mod_set_enable(tpm_init.split_mod_config.split_mod_enable);
	tpm_db_split_mod_set_num_vlans(tpm_init.split_mod_config.vlan_num);
	tpm_db_split_mod_set_num_p_bits(tpm_init.split_mod_config.p_bit_num, tpm_init.split_mod_config.p_bit);
	tpm_db_split_mod_set_mode(tpm_init.split_mod_config.split_mod_mode);

	/* set function profile */
	if (tpm_init.eth_cmplx_profile == TPM_PON_WAN_G0_G1_LPBK)
		tpm_db_gmac1_lpbk_en_set(true);
	else
		tpm_db_gmac1_lpbk_en_set(false);

	/* set CPU WAN loopback en */
	if (    (tpm_init.eth_cmplx_profile == TPM_PON_WAN_G0_G1_LPBK)
	     || (tpm_init.gmac_port_conf[TPM_ENUM_GMAC_0].conn == TPM_GMAC_CON_SWITCH_5))
		tpm_db_cpu_wan_lpbk_en_set(true);
	else
		tpm_db_cpu_wan_lpbk_en_set(false);

	tpm_db_switch_init_set(tpm_init.switch_init);

	return (TPM_OK);
}

void tpm_init_locks_init(void)
{
	spin_lock_init(&tpmPncLock);
	spin_lock_init(&tpmModLock);
	spin_lock_init(&tpmTcamAgingLock);
}

/* Note : The function assumes that the port numbers in the LSP are identical
 * to the GMAC numbers (port 0 = GMAC0, etc. )*/
void tpm_init_hwf_set(void)
{
	int tx_num, q_num, dest_port, dest_port_txp, owner_rx_port;

	for (tx_num = TPM_TX_MOD_GMAC0; tx_num < TPM_MAX_NUM_TX_PORTS; tx_num++) {
		dest_port = tpm_tx_mod_hal_attrs[tx_num].hal_port;
		dest_port_txp = tpm_tx_mod_hal_attrs[tx_num].hal_txp;
		if (!tpm_init.gmac_tx[tx_num].valid)
       		continue;

		for (q_num = 0; q_num < TPM_MAX_NUM_TX_QUEUE; q_num++) {
			if (tpm_init.gmac_tx[tx_num].tx_queue[q_num].valid) {
				/* No HW forwarding for CPU */
				if (tpm_init.gmac_tx[tx_num].tx_queue[q_num].queue_owner != TPM_Q_OWNER_CPU) {
					owner_rx_port =
					    tpm_init.gmac_tx[tx_num].tx_queue[q_num].queue_owner - 1;
					if (mv_eth_ctrl_txq_hwf_own(dest_port, dest_port_txp, q_num, owner_rx_port)){
						TPM_OS_ERROR(TPM_INIT_MOD,
				    		"mv_eth_ctrl_txq_hwf_own err GMAC = %d TCONT = %d Q = %d HWF: owner_rx %d\n",
						     dest_port, dest_port_txp, q_num, owner_rx_port);
					}

					mvNetaHwfTxqEnable(owner_rx_port, dest_port, dest_port_txp, q_num, 1);

					TPM_OS_DEBUG(TPM_INIT_MOD,
						     "GMAC = %d TCONT = %d Q = %d HWF: owner_rx %d\n",
						     dest_port, dest_port_txp, q_num, owner_rx_port);
				}
			} else {
				if (mv_eth_ctrl_txq_hwf_own(dest_port, dest_port_txp, q_num, -1)){
						TPM_OS_DEBUG(TPM_INIT_MOD,
				    		"mv_eth_ctrl_txq_hwf_own err GMAC = %d TCONT = %d Q = %d HWF: owner_rx -1\n",
						     dest_port, dest_port_txp, q_num);
				}
				mvNetaHwfTxqEnable(0, dest_port, dest_port_txp, q_num, 0);
				TPM_OS_DEBUG(TPM_INIT_MOD, "GMAC = %d TCONT = %d Q = %d CPU owner\n",
					     dest_port, dest_port_txp, q_num);
			}
		}	/* All queues */
	}			/* All TX ports */
}

/* Note : The function assumes that the port numbers in the LSP are
 * identical to the GMAC numbers (port 0 = GMAC0, etc. )*/
void tpm_init_txq_size_set(void)
{
	int tx_num, q_num, dest_port, prev_dest_port = 0xFF, dest_port_txp, status;
	uint32_t q_valid, q_size;

	for (tx_num = TPM_TX_MOD_GMAC0; tx_num < TPM_MAX_NUM_TX_PORTS; tx_num++) {
		dest_port = tpm_tx_mod_hal_attrs[tx_num].hal_port;
		dest_port_txp = tpm_tx_mod_hal_attrs[tx_num].hal_txp;

		if ((dest_port == 0 && tpm_init.gmac_port_conf[0].conn == TPM_GMAC_CON_DISC) ||
		    (dest_port == 1 && tpm_init.gmac_port_conf[1].conn == TPM_GMAC_CON_DISC)) {
			continue;
		}

		if (mv_eth_ctrl_port_started_get(dest_port)) {
			if (prev_dest_port != dest_port)
				TPM_OS_WARN(TPM_INIT_MOD,
					    "port%d already started, tx_queue sizes will not be updated\n", dest_port);
			prev_dest_port = dest_port;
			continue;
		}

		for (q_num = 0; q_num < TPM_MAX_NUM_TX_QUEUE; q_num++) {

			if (TPM_DB_OK != tpm_db_gmac_tx_q_conf_get(tx_num, q_num, &q_valid,
								   NULL, NULL, NULL, &q_size, NULL)){
				TPM_OS_WARN(TPM_INIT_MOD,
					    "Could not get port(%d) tx_queue sizes\n", dest_port);
				continue;
			}

			if (!q_valid)
				q_size = 0;

			status = mv_eth_ctrl_txq_size_set(dest_port, dest_port_txp, q_num, q_size);
			if (status) {
				TPM_OS_DEBUG(TPM_INIT_MOD, "mv_eth_ctrl_txq_size_set err, port = %d TCONT = %d Q = %d size = %d\n",
					     dest_port, dest_port_txp, q_num, q_size);
			}
		}		/* All TX queues */
	}			/* All TX ports */
}

/* Note : The function assumes that the port numbers in the LSP are
 * identical to the GMAC numbers (port 0 = GMAC0, etc. )*/
void tpm_init_rxq_size_set(void)
{
	tpm_gmacs_enum_t gmac_num;
	int q_num, status;
	uint32_t q_valid, q_size, rc;

	for (gmac_num = TPM_ENUM_GMAC_0; gmac_num < TPM_MAX_NUM_GMACS; gmac_num++) {
		if (!tpm_db_gmac_rx_val_get(gmac_num))
			continue;
		/* treat only valid ports */
		if (!INIT_GMAC_VALID(gmac_num))
			continue;

		if (mv_eth_ctrl_port_started_get(gmac_num)) {
			TPM_OS_WARN(TPM_INIT_MOD, "port%d already started, rx_queue sizes will not be updated\n", gmac_num);
			continue;
		}
		for (q_num = 0; q_num < TPM_MAX_NUM_RX_QUEUE; q_num++) {
			rc = tpm_db_gmac_rx_q_conf_get(gmac_num, q_num, &q_valid, &q_size);

			if (TPM_DB_OK != rc) {
				TPM_OS_WARN(TPM_INIT_MOD, "tpm_db_gmac_rx_q_conf_get port%d error\n", gmac_num);
				continue;
			}
			if (q_valid)
				status = mv_eth_ctrl_rxq_size_set(gmac_num, q_num, q_size);
			else
				status = mv_eth_ctrl_rxq_size_set(gmac_num, q_num, 0);

			if (status)
				TPM_OS_DEBUG(TPM_INIT_MOD, "gmac_num = %d  Q = %d size = %d\n", gmac_num, q_num, q_size);
		}		/* All RX queues */
	}			/* All GMACs */
}

int32_t tpm_init_mh_select(void)
{
	tpm_gmacs_enum_t gmac_i;
	tpm_db_gmac_func_t gmac_func;

	/* MH select config */
	for (gmac_i = TPM_ENUM_GMAC_0; gmac_i < TPM_MAX_NUM_GMACS; gmac_i++) {
		if (!INIT_GMAC_VALID(gmac_i))
			continue;

		tpm_db_gmac_func_get(gmac_i, &gmac_func);

		if ((gmac_func == TPM_GMAC_FUNC_LAN_AND_WAN) || (gmac_func == TPM_GMAC_FUNC_WAN)) {
			switch (tpm_init.ds_mh_set_conf) {
			case TPM_MH_SRC_RX_CTRL:
				mvNetaHwfMhSrcSet(gmac_i, MV_NETA_HWF_MH_REG);
				mvNetaHwfMhSelSet(gmac_i, (uint8_t) NETA_MH_REPLACE_MH_REG(0));
				/* Keep all TX_MH_registers(1-15) 'Zero' !! */
				break;
			case TPM_MH_SRC_PNC_RI:
				mvNetaHwfMhSrcSet(gmac_i, MV_NETA_HWF_MH_PNC);
				mvNetaHwfMhSelSet(gmac_i, (uint8_t) NETA_MH_DONT_CHANGE);
				break;
			default:
				TPM_OS_ERROR(TPM_INIT_MOD, " Unknown d/s MH source (%d)\n", tpm_init.ds_mh_set_conf);
				return (TPM_FAIL);
			}
		} else if ((gmac_func == TPM_GMAC_FUNC_LAN_AND_WAN) || (gmac_func == TPM_GMAC_FUNC_LAN)) {
			mvNetaHwfMhSrcSet(gmac_i, MV_NETA_HWF_MH_REG);
			mvNetaHwfMhSelSet(gmac_i, (uint8_t) NETA_MH_REPLACE_GPON_HDR);
		}
	}

	return (TPM_OK);
}

int32_t tpm_init_tx_queue_sched(void)
{

	tpm_init_tx_mod_t tx_mod;
	tpm_db_sched_t sched_method;
	uint32_t queue_weight = 0;
	int32_t ret_code = TPM_OK;
	int i = 0, port = 0, sched_ent = 0;
	uint32_t q_valid;

	for (tx_mod = TPM_TX_MOD_GMAC0; tx_mod < TPM_MAX_NUM_TX_PORTS; (tx_mod)++) {

		for (i = 0; i < TPM_MAX_NUM_TX_QUEUE; i++) {

			ret_code = tpm_db_gmac_tx_q_conf_get(tx_mod, i, &q_valid, &sched_method,
							     NULL, NULL, NULL, &queue_weight);
			if (q_valid == TPM_FALSE)
				continue;

			if (tx_mod == TPM_TX_MOD_GMAC0) {
				port = SW_GMAC_0;
				sched_ent = 0;
			} else if (tx_mod >= TPM_TX_MOD_PMAC_0) {
				port = PON_PORT;
				sched_ent = tx_mod - TPM_TX_MOD_PMAC_0;
			} else {
				ret_code = TPM_FAIL;
				break;
			}

			switch (sched_method) {
			case TPM_SCHED_SP:
				mvNetaTxqFixPrioSet(port, sched_ent, i);
				break;

			case TPM_SCHED_WRR:
				mvNetaTxqWrrPrioSet(port, sched_ent, i, queue_weight);
				break;

			default:
				printk(KERN_ERR " Unknown scheduling method command \n");
				return (TPM_NOT_FOUND);

			}
		}
	}

	return ret_code;
}

int32_t tpm_init_switch(void)
{
	uint32_t i;
	uint32_t sw_port_bmp = 0;
	unsigned char gq_da[6] = { 0x01, 0x00, 0x5e, 0x00, 0x00, 0x01 };
	tpm_gmacs_enum_t gmac_i;
	int32_t switch_port;

	/* no need to initialize switch for these profiles */
	switch (tpm_init.eth_cmplx_profile) {
	case TPM_PON_WAN_DUAL_MAC_EXT_SWITCH:
	case TPM_PON_WAN_G1_MNG_EXT_SWITCH:
	case TPM_PON_WAN_G0_SINGLE_PORT:
	case TPM_PON_WAN_G1_SINGLE_PORT:
	case TPM_PON_G1_WAN_G0_SINGLE_PORT:
	case TPM_PON_G0_WAN_G1_SINGLE_PORT:
	case TPM_PON_WAN_G0_G1_LPBK:
		return (TPM_OK);
       default:
       	break;
	}

	mv_switch_drv_init();

	/* Set 802.1q mode => fallback for all ports */
	for (i = 0; i < TPM_MAX_NUM_ETH_PORTS; i++) {
		if (TPM_FALSE == tpm_init.eth_port_conf[i].valid)
           		continue;

		/* need only switch ports */
		if (TPM_INTCON_SWITCH != tpm_init.eth_port_conf[i].int_connect)
			continue;

	    	if (mv_switch_set_vid_filter_per_port(tpm_init.eth_port_conf[i].switch_port, GT_FALSE))
			TPM_OS_WARN(TPM_INIT_MOD, "mv_switch_set_vid_filter_per_port err. sw port %d\n",
					    tpm_init.eth_port_conf[i].switch_port);
	}

	for (gmac_i = TPM_ENUM_GMAC_0; gmac_i < TPM_MAX_NUM_GMACS; gmac_i++) {
		if (!INIT_GMAC_VALID(gmac_i))
			continue;

		switch_port = -1;

		if (TPM_GMAC_CON_SWITCH_4 == tpm_init.gmac_port_conf[gmac_i].conn)
			switch_port = TPM_GMAC0_AMBER_PORT_NUM;
		else if (TPM_GMAC_CON_SWITCH_5 == tpm_init.gmac_port_conf[gmac_i].conn){
			if (1 == tpm_init.virt_uni_info.enabled || tpm_init.mc_setting.per_uni_vlan_xlat == 1)
				switch_port = tpm_init.virt_uni_info.switch_port;
			else
				switch_port = TPM_GMAC1_AMBER_PORT_NUM;
		 }
		 if (switch_port != -1) {
       		 if (mv_switch_set_vid_filter_per_port(switch_port, GT_FALSE))
				 TPM_OS_WARN(TPM_INIT_MOD, "mv_switch_set_vid_filter_per_port err. sw port %d\n",
					    switch_port);
		}
	}

	/* Enable BC floods */
	mv_switch_set_broadcast_flood(GT_TRUE);

	/* Disable unknown MC floods for all UNI ports */
	for (i = 0; i < TPM_MAX_NUM_ETH_PORTS; i++) {
		if (TPM_FALSE == tpm_init.eth_port_conf[i].valid)
           		continue;

		/* need only switch ports */
		if (TPM_INTCON_SWITCH != tpm_init.eth_port_conf[i].int_connect)
			continue;

		if (mv_switch_set_unknown_multicast_flood(tpm_init.eth_port_conf[i].switch_port, GT_FALSE))
			TPM_OS_WARN(TPM_INIT_MOD, "mv_switch_set_unknown_multicast_flood err. sw port %d\n",
					    tpm_init.eth_port_conf[i].switch_port);
	}

	/*set default VLAN ID to 0 */
	for (i = 0; i < TPM_MAX_NUM_ETH_PORTS; i++) {
		if (TPM_FALSE == tpm_init.eth_port_conf[i].valid)
           		continue;

		/* need only switch ports */
		if (TPM_INTCON_SWITCH != tpm_init.eth_port_conf[i].int_connect)
			continue;

		if (mv_switch_set_port_def_vlan(tpm_init.eth_port_conf[i].switch_port, 0))
			TPM_OS_WARN(TPM_INIT_MOD, "mv_switch_set_port_def_vlan err. sw port %d\n",
					    tpm_init.eth_port_conf[i].switch_port);
	}

	for (gmac_i = TPM_ENUM_GMAC_0; gmac_i < TPM_MAX_NUM_GMACS; gmac_i++) {
		if (TPM_FALSE == tpm_init.gmac_port_conf[gmac_i].valid)
			continue;

		switch_port = -1;

		if (TPM_GMAC_CON_SWITCH_4 == tpm_init.gmac_port_conf[gmac_i].conn)
			switch_port = TPM_GMAC0_AMBER_PORT_NUM;
		else if (TPM_GMAC_CON_SWITCH_5 == tpm_init.gmac_port_conf[gmac_i].conn){
			if (1 == tpm_init.virt_uni_info.enabled)
				switch_port = tpm_init.virt_uni_info.switch_port;
			else
				switch_port = TPM_GMAC1_AMBER_PORT_NUM;
		}

		if (switch_port != -1) {
			if (mv_switch_set_port_def_vlan(switch_port, 0))
				TPM_OS_WARN(TPM_INIT_MOD, "mv_switch_set_vid_filter_per_port err. sw port %d\n",
					    switch_port);
		}
	}

	switch_port = -1;

	/* Add all ports to the member list of default VID(0) */
	for (gmac_i = TPM_ENUM_GMAC_0; gmac_i < TPM_MAX_NUM_GMACS; gmac_i++) {
		if (TPM_FALSE == tpm_init.gmac_port_conf[gmac_i].valid)
			continue;

		if (TPM_GMAC_CON_SWITCH_5 == tpm_init.gmac_port_conf[gmac_i].conn){
			if (1 == tpm_init.virt_uni_info.enabled)
				switch_port = tpm_init.virt_uni_info.switch_port;
			else
				switch_port = TPM_GMAC1_AMBER_PORT_NUM;

       		 if (mv_switch_port_add_vid(switch_port, 0, TPM_GMAC0_AMBER_PORT_NUM))
				 TPM_OS_WARN(TPM_INIT_MOD, "mv_switch_set_port_def_vlan err. sw port %d\n",
					    switch_port);
		}
	}

	if (switch_port != -1) {
		for (i = 0; i < TPM_MAX_NUM_ETH_PORTS; i++) {
			if (TPM_FALSE == tpm_init.eth_port_conf[i].valid)
				continue;

			/* need only switch ports */
			if (TPM_INTCON_SWITCH != tpm_init.eth_port_conf[i].int_connect)
				continue;

			if (switch_port != -1) {
				if (mv_switch_port_add_vid(tpm_init.eth_port_conf[i].switch_port, 0, switch_port))
					TPM_OS_WARN(TPM_INIT_MOD, "mv_switch_port_add_vid err. sw port %d\n",
						tpm_init.eth_port_conf[i].switch_port);
			}
		}
	}


	/* config amber port#5 - same as UNI ports */

	for (gmac_i = TPM_ENUM_GMAC_0; gmac_i < TPM_MAX_NUM_GMACS; gmac_i++) {
		if (TPM_FALSE == tpm_init.gmac_port_conf[gmac_i].valid)
			continue;

		if (TPM_GMAC_CON_SWITCH_4 == tpm_init.gmac_port_conf[gmac_i].conn)
			sw_port_bmp |= 1 << TPM_GMAC0_AMBER_PORT_NUM;
		else if (TPM_GMAC_CON_SWITCH_5 == tpm_init.gmac_port_conf[gmac_i].conn)
			sw_port_bmp |= 1 << TPM_GMAC1_AMBER_PORT_NUM;
	}


	for (i = 0; i < TPM_MAX_NUM_ETH_PORTS; i++) {
		if (TPM_FALSE == tpm_init.eth_port_conf[i].valid)
           		continue;

		/* need only switch ports */
		if (TPM_INTCON_SWITCH != tpm_init.eth_port_conf[i].int_connect)
			continue;

		sw_port_bmp |= 1 << tpm_init.eth_port_conf[i].switch_port;
	}
	if (mv_switch_mac_addr_set(gq_da, 0, sw_port_bmp, 1))
		TPM_OS_WARN(TPM_INIT_MOD, "mv_switch_mac_addr_set err. sw_port_bmp 0X%x\n", sw_port_bmp);

	return (TPM_OK);
}

int32_t tpm_init_mh_conf_set(void)
{
	tpm_gmacs_enum_t gmac_i;
	uint32_t amber_port_num, mh_en;
	/*uint16_t amber_port_cfg_reg; */

	for (gmac_i = TPM_ENUM_GMAC_0; gmac_i < TPM_MAX_NUM_GMACS; gmac_i++) {
		if (!INIT_GMAC_VALID(gmac_i))
			continue;

		/* if port in GateWay mode, do not set MH */
		if (tpm_init_gmac_in_gateway_mode(gmac_i))
			continue;

		amber_port_num = -1;

		switch (gmac_i) {
		case TPM_ENUM_GMAC_0:
			mh_en = tpm_init.gmac0_mh_en;
			if (TPM_GMAC_CON_SWITCH_4 == tpm_init.gmac_port_conf[gmac_i].conn)
				amber_port_num = TPM_GMAC0_AMBER_PORT_NUM;
			break;
		case TPM_ENUM_GMAC_1:
			mh_en = tpm_init.gmac1_mh_en;
			if (TPM_GMAC_CON_SWITCH_5 == tpm_init.gmac_port_conf[gmac_i].conn)
				amber_port_num = TPM_GMAC1_AMBER_PORT_NUM;
			break;
		case TPM_ENUM_PMAC:
			mh_en = 1;
			/*no amber port */
			break;
		default:
			TPM_OS_ERROR(TPM_INIT_MOD, " Unknown GMAC (%d)\n", gmac_i);
			return (TPM_FAIL);
		}

		/* Configure PP */
		TPM_OS_DEBUG(TPM_INIT_MOD, "GMAC(%d) mh_en(%d)\n", gmac_i, mh_en);
		printk("GMAC(%d) mh_en(%d) amber_port_num(%d)\n", gmac_i, mh_en,amber_port_num);
		if (mh_en == TPM_TRUE)
		{
			if (mv_eth_ctrl_flag(gmac_i, MV_ETH_F_MH, 1)){
				TPM_OS_ERROR(TPM_INIT_MOD, " mv_eth_ctrl_flag err port %d flag %X VAL %X\n",
					gmac_i, MV_ETH_F_MH, 1);
				return (TPM_FAIL);
			}
		}
		else
			if (mv_eth_ctrl_flag(gmac_i, MV_ETH_F_MH, 0)){
				TPM_OS_ERROR(TPM_INIT_MOD, " mv_eth_ctrl_flag err port %d flag %X VAL %X\n",
					gmac_i, MV_ETH_F_MH, 0);
				return (TPM_FAIL);
       		}
		/* Configure Amber */
		if (amber_port_num != -1)
			mv_switch_set_marvell_header_mode(amber_port_num, mh_en);
	}
	return (TPM_OK);
}

int32_t tpm_init_mh_reg_set(void)
{
	tpm_gmacs_enum_t gmac_i;
	uint32_t pp_port_num;
	uint32_t num_txp = 0, txp_i = 0, tx_reg_i = 0;
	tpm_db_gmac_func_t gmac_func;
	uint32_t gmac_mh_en;
	uint16_t regVal;
	uint16_t amber_port_vector;
	uint32_t pnc_vector, uni_vector;

	/* MH Select Tx registers config */
	for (gmac_i = TPM_ENUM_GMAC_0; gmac_i < TPM_MAX_NUM_GMACS; gmac_i++) {
		if (!INIT_GMAC_VALID(gmac_i))
			continue;

		if (tpm_db_gmac_func_get(gmac_i, &gmac_func) != TPM_OK) {
			TPM_OS_ERROR(TPM_INIT_MOD, " tpm_db_gmac_func_get err port %d\n", gmac_i);
			return (TPM_FAIL);
		}
		if (tpm_db_gmac_mh_en_conf_get(gmac_i, &gmac_mh_en) != TPM_OK) {
			TPM_OS_ERROR(TPM_INIT_MOD, " tpm_db_gmac_mh_en_conf_get err port %d\n", gmac_i);
			return (TPM_FAIL);
		}
		pp_port_num = TPM_GMAC_TO_PP_PORT(gmac_i);

		if (((gmac_func == TPM_GMAC_FUNC_LAN_AND_WAN) || (gmac_func == TPM_GMAC_FUNC_LAN)) &&
		    gmac_mh_en && (tpm_init.ds_mh_set_conf == TPM_MH_SRC_PNC_RI)) {
			/* Set MH Tx registers to full table */
			for (tx_reg_i = 0; tx_reg_i < TPM_TX_MAX_MH_REGS; tx_reg_i++) {
				regVal = 0;	/* Marvell Header (FID, LearnDisable) fields are both zero */
				if (tpm_db_port_vector_tbl_info_get(tx_reg_i, &uni_vector,
								     &amber_port_vector, &pnc_vector) != TPM_OK) {
						TPM_OS_ERROR(TPM_INIT_MOD, "tpm_db_port_vector_tbl_info_get err tx_reg %d\n",
								tx_reg_i);
						return (TPM_FAIL);
				}
				regVal = amber_port_vector;
				if (mvNetaTxMhRegSet(pp_port_num, 0 /*txp */ , tx_reg_i, regVal)) {
					TPM_OS_ERROR(TPM_INIT_MOD,
						     "mvNetaTxMhRegSet err pp_port_num %d tx_reg %d regVal 0x%x\n",
						     pp_port_num, tx_reg_i, regVal);
					return (TPM_FAIL);
				}
			}
		} else {
			/* Get GMAC number of tx_modules & default register value */
			if (gmac_i != TPM_ENUM_PMAC) {
				num_txp = 1;
				/* Marvell Header -  FID/LearnDisable fields are zero */
				/*                   VLANTable field is  (re)set to 'all_other_switch_ports' */

				if (gmac_i == TPM_ENUM_GMAC_0)
					regVal = 0x3f & (~(1 << TPM_GMAC0_AMBER_PORT_NUM));
				else
					regVal = 0x3f & (~(1 << TPM_GMAC1_AMBER_PORT_NUM));
			} else {
				if (tpm_db_num_tcont_llid_get(&num_txp) != TPM_OK) {
					TPM_OS_ERROR(TPM_INIT_MOD,
						     "tpm_db_num_tcont_llid_get err\n");
					return (TPM_FAIL);
				}
				regVal = 0;
			}

			/* Set MH_tx registers for all tx_modules */
			for (txp_i = 0; txp_i < num_txp; txp_i++) {
				for (tx_reg_i = 0; tx_reg_i < TPM_TX_MAX_MH_REGS; tx_reg_i++)
					if (mvNetaTxMhRegSet(pp_port_num, txp_i, tx_reg_i, regVal)) {
						TPM_OS_ERROR(TPM_INIT_MOD,
						     "mvNetaTxMhRegSet err pp_port_num %d txp %d tx_reg 0x%x, regVal 0x%X\n",
						     pp_port_num, txp_i, tx_reg_i, regVal);
						return (TPM_FAIL);
					 }
			}

		}
	}

	return (TPM_OK);
}
int32_t tpm_init_get_gmac_queue_rate_limit(void)
{
	tpm_db_tx_mod_t tx_mod_i;
	tpm_gmacs_enum_t gmac_i;
	uint32_t txp_i = 0;
	uint32_t size = 0, queue = 0, rate = 0;

	for (tx_mod_i = 0; tx_mod_i < TPM_MAX_NUM_TX_PORTS; tx_mod_i++) {
		if (TPM_FALSE == tpm_db_gmac_tx_val_get(tx_mod_i)) {
			TPM_OS_INFO(TPM_INIT_MOD, "tx_mod_i (%d) is invalid\n", tx_mod_i);
			continue;
		}

		if (tx_mod_i < TPM_TX_MOD_PMAC_0) {
			gmac_i = tx_mod_i;
		} else {
			gmac_i = TPM_ENUM_PMAC;
			txp_i = tx_mod_i - TPM_TX_MOD_PMAC_0;
		}
		/* get Tx queue bucket size */
		for (queue = 0; queue < TPM_MAX_NUM_TX_QUEUE; queue++) {
#ifdef MV_ETH_WRR_NEW
			size = MV_REG_READ(NETA_TXQ_TOKEN_SIZE_REG(gmac_i, txp_i, queue));
			rate = MV_REG_READ(NETA_TXQ_REFILL_REG(gmac_i, txp_i, queue));
#else /* Old WRR/EJP module */
			/* token size and rate are in the same reg */
			rate = MV_REG_READ(ETH_TXQ_TOKEN_CFG_REG(gmac_i, txp_i, queue));
#endif /* MV_ETH_WRR_NEW */
			TPM_OS_INFO(TPM_INIT_MOD, "gmac_i (%d), txp_i (%d), queue (%d), size (%d), rate (%d)\n",
				gmac_i, txp_i, queue, size, rate);
			tpm_db_set_gmac_rate_limit(tx_mod_i, queue, size, rate);
		}
	}
	return (TPM_OK);
}
int32_t tpm_init_set_gmac_queue_rate_limit(void)
{
	tpm_db_tx_mod_t tx_mod_i;
	tpm_gmacs_enum_t gmac_i;
	uint32_t txp_i = 0;
	uint32_t size = 0, queue = 0, rate = 0;

	for (tx_mod_i = 0; tx_mod_i < TPM_MAX_NUM_TX_PORTS; tx_mod_i++) {
		if (TPM_FALSE == tpm_db_gmac_tx_val_get(tx_mod_i))
			continue;

		if (tx_mod_i < TPM_TX_MOD_PMAC_0) {
			gmac_i = tx_mod_i;
		} else {
			gmac_i = TPM_ENUM_PMAC;
			txp_i = tx_mod_i - TPM_TX_MOD_PMAC_0;
		}
		/* get Tx queue bucket size */
		for (queue = 0; queue < TPM_MAX_NUM_TX_QUEUE; queue++) {
			tpm_db_get_gmac_rate_limit(tx_mod_i, queue, &size, &rate);
			TPM_OS_INFO(TPM_INIT_MOD, "gmac_i (%d), txp_i (%d), queue (%d), size (%d), rate (%d)\n",
				gmac_i, txp_i, queue, size, rate);
#ifdef MV_ETH_WRR_NEW
			MV_REG_WRITE(NETA_TXQ_REFILL_REG(gmac_i, txp_i, queue), rate);
			MV_REG_WRITE(NETA_TXQ_TOKEN_SIZE_REG(gmac_i, txp_i, queue), size);
#else /* Old WRR/EJP module */
			MV_REG_WRITE(ETH_TXQ_TOKEN_CFG_REG(gmac_i, txp_i, queue), rate);
#endif /* MV_ETH_WRR_NEW */
		}
	}
	return (TPM_OK);
}
int32_t tpm_init_reset_gmac_queue_rate_limit(void)
{
	static uint32_t first_time = 0;
	int32_t tpm_ret = 0;

	if (first_time == 0) {
		/* tpm module start up, do not reset gmac q */
		TPM_OS_INFO(TPM_INIT_MOD, "tpm module start up, get gmac queue rate limit\n");
		first_time = 1;

		/* get queue rate limit */
		tpm_ret = tpm_init_get_gmac_queue_rate_limit();
		IF_ERROR(tpm_ret);

		return (TPM_OK);
	}

	TPM_OS_INFO(TPM_INIT_MOD, "tpm mib-reset, reset gmac queue rage limit\n");

	/* set queue rate limit */
	tpm_ret = tpm_init_set_gmac_queue_rate_limit();
	IF_ERROR(tpm_ret);

	return (TPM_OK);
}

int32_t tpm_init_mh(void)
{
	if (tpm_init_mh_select() != TPM_OK) {
		TPM_OS_ERROR(TPM_INIT_MOD, "tpm_init_mh_select err\n");
		return (TPM_FAIL);
	}
	if (tpm_init_mh_conf_set() != TPM_OK) {
		TPM_OS_ERROR(TPM_INIT_MOD, "tpm_init_mh_conf_set err\n");
		return (TPM_FAIL);
	}
	if (tpm_init_mh_reg_set() != TPM_OK) {
		TPM_OS_ERROR(TPM_INIT_MOD, "tpm_init_mh_reg_set err\n");
		return (TPM_FAIL);
	}

	return (TPM_OK);
}

int32_t tpm_init_bm_pool(void)
{
	int status;
	tpm_gmacs_enum_t gmac_i;
	uint32_t val, large_buf, small_buf;

	for (gmac_i = 0; gmac_i < TPM_MAX_NUM_GMACS; gmac_i++) {
		if (!INIT_GMAC_VALID(gmac_i))
			continue;

		tpm_db_gmac_bm_bufs_conf_get(gmac_i, &val, &large_buf, &small_buf);
		if (val) {
			if ((gmac_i == 0 && tpm_init.gmac_port_conf[0].conn == TPM_GMAC_CON_DISC) ||
			    (gmac_i == 1 && tpm_init.gmac_port_conf[1].conn == TPM_GMAC_CON_DISC))
				continue;

			if (mv_eth_ctrl_port_started_get(gmac_i)) {
				TPM_OS_WARN(TPM_INIT_MOD, "port%d already started, port bm_pools will not be updated\n",
					    gmac_i);
				continue;
			}

#ifdef CONFIG_MV_ETH_BM_CPU
			status = mv_eth_ctrl_port_buf_num_set(TPM_GMAC_TO_PP_PORT(gmac_i), large_buf, small_buf);
#else
			status = mv_eth_bm_config_buf_num_set(TPM_GMAC_TO_PP_PORT(gmac_i), large_buf, small_buf);
#endif
			if (status) {
				TPM_OS_ERROR(TPM_INIT_MOD, "BM Pool error gmac(%d) large_buf(%d), small_buf(%d)\n",
					     gmac_i, large_buf, small_buf);
				return (TPM_FAIL);
			}
		}
	}
	return (TPM_OK);
}

int32_t tpm_init_ipg(void)
{
	int status;
	tpm_gmacs_enum_t gmac_i;
	uint16_t ipg_val, preamble;
	uint8_t port;
	tpm_db_gmac_func_t gmac_func;
	tpm_db_gmac_conn_t gmac_con;
	MV_BOOL link_is_up;


	for (gmac_i = 0; gmac_i < TPM_MAX_NUM_GMACS; gmac_i++) {
		if (!INIT_GMAC_VALID(gmac_i))
			continue;

		tpm_db_gmac_conn_get(gmac_i, &gmac_con);
		tpm_db_gmac_func_get(gmac_i, &gmac_func);

		if (gmac_func != TPM_GMAC_FUNC_NONE) {

			if ((gmac_i == 0 && tpm_init.gmac0_mh_en != TPM_FALSE && gmac_con == TPM_GMAC_CON_SWITCH_4) ||
			    (gmac_i == 1 && tpm_init.gmac1_mh_en != TPM_FALSE && gmac_con == TPM_GMAC_CON_SWITCH_5)) {
				mvNetaPortDisable(gmac_i);
				mvNetaHwfEnable(gmac_i, 0);
				ipg_val = mvNetaPortIpgGet(gmac_i);
				ipg_val -= TPM_MH_LEN;
				mvNetaPortIpgSet(gmac_i, ipg_val);
				mvNetaHwfEnable(gmac_i, 1);
				status = mvNetaPortEnable(gmac_i);
				if (status != MV_OK) {
					link_is_up = mvNetaLinkIsUp(gmac_i);

					if (link_is_up)
						mvNetaPortUp(gmac_i);
				}

				if (gmac_i == 0)
					port = TPM_GMAC0_AMBER_PORT_NUM;
				else
					port = TPM_GMAC1_AMBER_PORT_NUM;

				/* TODO: Need to check if switch is attached to GMAC */
				status = mv_switch_get_port_preamble(port, &preamble);
				if (status) {
					TPM_OS_ERROR(TPM_INIT_MOD, "Fail to get port(%d) preamble_len\n", port);
					return (TPM_FAIL);
				}
				preamble -= TPM_MH_LEN;
				status = mv_switch_set_port_preamble(port, preamble);
				if (status) {
					TPM_OS_ERROR(TPM_INIT_MOD, "Fail to set port(%d) preamble_len(%d)\n"
						     , port, preamble);
					return (TPM_FAIL);
				}
			}
		}
	}

	return (TPM_OK);
}

int32_t tpm_init_ethertype_dsa_tag(void)
{
	uint16_t  reg_tmp = 0;
	uint8_t   ret;
	int       cpu_port = 4;
	int       frame_mode_reg = 4;
	int       portetype_reg = 0xf;
	int       switch_dev_num_reg = 0x1c;
	int       rsvd2cpu2x_reg = 2;
	int       rsvd2cpu0x_reg = 3;
	tpm_db_ety_dsa_enable_t ety_dsa_enable;

	tpm_db_get_ety_dsa_enable(&ety_dsa_enable);

	if (TPM_ETY_DSA_DISABLE == ety_dsa_enable)
		return TPM_OK;

	/*
	For switch port 4: change the Frame Mode (Port reg offset 0x04) to Ethertype_DSA.
	For switch port 4: set Port EType register (Port reg offset 0x0F) to 0xDABC.
	Set zero to MGMT Enables 0x register (Global 2 offset 0x03) and MGMT Enables 2x register (Global 2 offset 0x02).
	*/

	/* get Frame Mode reg from HW */
	ret = mv_switch_reg_read(cpu_port, frame_mode_reg, MV_SWITCH_PORT_ACCESS, &reg_tmp);
	if (0 != ret) {
		TPM_OS_ERROR(TPM_INIT_MOD, "Fail to get cpu port frame mode reg, ret(%d)\n", ret);
		return (TPM_FAIL);
	}

	/* set bits 8, 9 to 11, as Ethertype_DSA */
	reg_tmp |= (3 << 8);
	ret = mv_switch_reg_write(cpu_port, frame_mode_reg, MV_SWITCH_PORT_ACCESS, reg_tmp);
	if (0 != ret) {
		TPM_OS_ERROR(TPM_INIT_MOD, "Fail to set cpu port frame mode reg, ret(%d)\n", ret);
		return (TPM_FAIL);
	}

	/* set PortEType reg to HW */
	reg_tmp = TPM_ETHERTYPE_DSA_TAG;
	ret = mv_switch_reg_write(cpu_port, portetype_reg, MV_SWITCH_PORT_ACCESS, reg_tmp);
	if (0 != ret) {
		TPM_OS_ERROR(TPM_INIT_MOD, "Fail to set cpu port PortEType reg, ret(%d)\n", ret);
		return (TPM_FAIL);
	}

	/* get switch_dev_num value reg from HW */
	ret = mv_switch_reg_read(0, switch_dev_num_reg, MV_SWITCH_GLOBAL_ACCESS, &reg_tmp);
	if (0 != ret) {
		TPM_OS_ERROR(TPM_INIT_MOD, "Fail to get switch_dev_num reg, ret(%d)\n", ret);
		return (TPM_FAIL);
	}
	tpm_db_set_switch_dev_num((reg_tmp & 0x1f));

	/* set PortEType reg to HW */
	reg_tmp = 0;
	ret = mv_switch_reg_write(0, rsvd2cpu2x_reg, MV_SWITCH_GLOBAL2_ACCESS, reg_tmp);
	if (0 != ret) {
		TPM_OS_ERROR(TPM_INIT_MOD, "Fail to set zero to rsvd2cpu2x reg, ret(%d)\n", ret);
		return (TPM_FAIL);
	}
	ret = mv_switch_reg_write(0, rsvd2cpu0x_reg, MV_SWITCH_GLOBAL2_ACCESS, reg_tmp);
	if (0 != ret) {
		TPM_OS_ERROR(TPM_INIT_MOD, "Fail to set zero to rsvd2cpu0x reg, ret(%d)\n", ret);
		return (TPM_FAIL);
	}

	return (TPM_OK);
}

/*******************************************************************************
* tpm_init_gmac_loopback()
*
* DESCRIPTION:      Initialize the GMAC to loopback mode if necessary, and force
*		gmac linkup to 1G
*
* INPUTS:

* OUTPUTS:
*
* RETURNS:
*
*******************************************************************************/
int32_t tpm_init_gmac_loopback(int port)
{
	uint32_t regVal;

	mvNetaPortDisable(port);
	mvNetaHwfEnable(port, 0);

	mvNetaForceLinkModeSet(port, 1, 0);/*for link up*/
	mvNetaSpeedDuplexSet(port, MV_ETH_SPEED_1000, MV_ETH_DUPLEX_FULL);/*set 1G*/

	mvNetaHwfEnable(port, 1);
	mvNetaPortEnable(port);

	MV_REG_WRITE(NETA_GMAC_CTRL_1_REG(port), 0x31); /* set gmac to loopback mode */

	regVal = MV_REG_READ(NETA_GMAC_AN_CTRL_REG(port));
	regVal |=  NETA_FORCE_LINK_FAIL_MASK;  			/* enable Force Link Pass 	*/
	regVal |=  NETA_SET_GMII_SPEED_1000_MASK;  		/* set GMII Speed 1000		*/
	regVal &= ~NETA_ENABLE_SPEED_AUTO_NEG_MASK;  		/* disable AutoNeg speed 	*/
	regVal |=  NETA_SET_FLOW_CONTROL_MASK;  		/* enable AutoNeg FC		*/
	regVal |=  NETA_FLOW_CONTROL_ADVERTISE_MASK;  		/* enable advertise FC		*/
	regVal &= ~NETA_ENABLE_FLOW_CONTROL_AUTO_NEG_MASK;  	/* disable AutoNeg FC		*/
	regVal |=  NETA_SET_FULL_DUPLEX_MASK;			/* enable full duplex mode	*/
	regVal &= ~NETA_ENABLE_DUPLEX_AUTO_NEG_MASK;		/* disable duplex AutoNeg 	*/
	MV_REG_WRITE(NETA_GMAC_AN_CTRL_REG(port), regVal);

	return TPM_OK;
}

/*******************************************************************************
* tpm_init_system_mib_reset()
*
* DESCRIPTION:      Initialize the dynamic parts of the system hardware
*
* INPUTS:

* OUTPUTS:
*
* RETURNS:
*
*******************************************************************************/
int32_t tpm_init_system_mib_reset(tpm_reset_level_enum_t reset_type)
{
	tpm_pnc_ranges_t cur_range = TPM_INVALID_RANGE, next_range = 0;
	tpm_db_pnc_range_t next_range_data;
	tpm_db_pnc_range_conf_t range_conf;
	uint32_t switch_init;
	int32_t ret_code;
	tpm_db_ttl_illegal_action_t ttl_illegal_action;
	tpm_db_tcp_flag_check_t tcp_flag_check;
	tpm_gmacs_enum_t gmac_i;
	tpm_db_gmac_func_t gfunc;

	TPM_OS_DEBUG(TPM_INIT_MOD, "\n");

	ret_code = tpm_db_mod2_setup();
	IF_ERROR(ret_code);

	for (gmac_i = TPM_ENUM_GMAC_0; gmac_i < TPM_MAX_NUM_GMACS; gmac_i++) {
		if (!INIT_GMAC_VALID(gmac_i))
			continue;

		tpm_db_gmac_func_get(gmac_i, &gfunc);
		if (gfunc != TPM_GMAC_FUNC_NONE) {
			ret_code = tpm_mod2_mac_inv(gmac_i);
			IF_ERROR(ret_code);
		}

		ret_code = tpm_mod2_split_mod_init(gmac_i);
		IF_ERROR(ret_code);
	}
	/* Init Tx queue rate limit */
	ret_code = tpm_init_reset_gmac_queue_rate_limit();
	IF_ERROR(ret_code);

	/* Init Amber Switch */
	tpm_db_switch_init_get(&switch_init);
	if (switch_init)
		tpm_init_switch();
#if 0 /* No GMAC1 on MC RD board */
		else
		/* Init GMAC1 in loopback mod if no switch*/
		tpm_init_gmac_loopback(TPM_ENUM_GMAC_1);
#endif
	/*Init TX scheduling */
	ret_code = tpm_init_tx_queue_sched();
	IF_ERROR(ret_code);

	/* Initialize (wipe out) the PNC ranges in PnC HW */
	tpm_db_pnc_rng_val_get_next(cur_range, &next_range, &next_range_data);
	TPM_OS_DEBUG(TPM_INIT_MOD, "next_range(%d)\n", next_range);
	while (next_range != TPM_INVALID_RANGE) {
		if (reset_type >= next_range_data.pnc_range_conf.min_reset_level) {
			ret_code = tpm_pncl_range_reset(next_range);
			IF_ERROR(ret_code);
		}
		cur_range = next_range;
		tpm_db_pnc_rng_val_get_next(cur_range, &next_range, &next_range_data);
		TPM_OS_DEBUG(TPM_INIT_MOD, "next_range(%d)\n", next_range);
	}
	/* Initialize the PNC Hardcoded Ranges */
	/* @Wilson
	   New bi-direction range: NUM_VLAN_TAGS three hardcoded rules
	*/
	ret_code = tpm_db_pnc_rng_conf_get(TPM_PNC_NUM_VLAN_TAGS, &range_conf);
	if (ret_code == TPM_DB_OK) {
		ret_code = tpm_proc_l2_num_vlan_tags_init();
		IF_ERROR(ret_code);
	} else
		TPM_OS_WARN(TPM_INIT_MOD, "PNC range(%d) not initialized\n", TPM_PNC_NUM_VLAN_TAGS);

	tpm_db_get_ttl_illegal_action(&ttl_illegal_action);
	ret_code = tpm_db_pnc_rng_conf_get(TPM_PNC_TTL, &range_conf);
	if (TPM_TTL_ZERO_ACTION_NOTHING == ttl_illegal_action) {
		if (ret_code == TPM_DB_OK) {
			/* do not check ttl, no need to create ttl range */
			TPM_OS_WARN(TPM_INIT_MOD, "do not check ttl, no need to create ttl range\n");
		}
	} else {
		if ((ret_code != TPM_DB_OK) || (range_conf.range_size < 4)) {
			/* check ttl, need to create ttl range */
			TPM_OS_WARN(TPM_INIT_MOD, "check ttl, need to create ttl range with size of 4\n");
		} else {
			ret_code = tpm_proc_ipv4_ttl_init(ttl_illegal_action);
			IF_ERROR(ret_code);
		}
	}

	ret_code = tpm_db_pnc_rng_conf_get(TPM_PNC_IPV6_L4_MC_DS, &range_conf);
	if (ret_code == TPM_DB_OK) {
		if (range_conf.range_size > 1)
			/* SIZE too big, it is a waste */
			TPM_OS_WARN(TPM_INIT_MOD, "TPM_PNC_IPV6_L4_MC_DS SIZE should be 1, too big now, it is a waste\n");
		ret_code = tpm_proc_ipv6_l4_mc_ds_init();
		IF_ERROR(ret_code);
	} else
		TPM_OS_WARN(TPM_INIT_MOD, "PNC range(%d) not initialized\n", TPM_PNC_IPV6_L4_MC_DS);

	ret_code = tpm_db_pnc_rng_conf_get(TPM_PNC_IPV6_MC_SIP, &range_conf);
	if (ret_code == TPM_DB_OK) {
		if (range_conf.range_size > 8)
			/* SIZE too big, it is a waste */
			TPM_OS_WARN(TPM_INIT_MOD, "TPM_PNC_IPV6_MC_SIP SIZE should be 8, too big now, it is a waste\n");
		if (range_conf.range_size < 8)
			/* SIZE too small, it might not be enough */
			TPM_OS_WARN(TPM_INIT_MOD, "TPM_PNC_IPV6_MC_SIP SIZE should be 8, a little bit smaller now\n");
		ret_code = tpm_proc_ipv6_mc_sip_init();
		IF_ERROR(ret_code);
	} else
		TPM_OS_WARN(TPM_INIT_MOD, "PNC range(%d) not initialized\n", TPM_PNC_IPV6_L4_MC_DS);

	ret_code = tpm_db_pnc_rng_conf_get(TPM_PNC_IPV6_HOPL, &range_conf);
	if (TPM_TTL_ZERO_ACTION_NOTHING == ttl_illegal_action) {
		if (ret_code == TPM_DB_OK) {
			/* do not check ttl, no need to create hoplimit range */
			TPM_OS_WARN(TPM_INIT_MOD, "do not check hoplimit, no need to create hoplimit range\n");
		}
	} else {
		if ((ret_code != TPM_DB_OK) || (range_conf.range_size < 3)) {
			/* check hoplimit, need to create hoplimit range */
			TPM_OS_WARN(TPM_INIT_MOD, "check hoplimit, need to create hoplimit range with size of 3\n");
		} else {
			ret_code = tpm_proc_ipv6_hoplimit_init(ttl_illegal_action);
			IF_ERROR(ret_code);
		}
	}
	ret_code = tpm_db_pnc_rng_conf_get(TPM_PNC_IGMP, &range_conf);
	if (ret_code == TPM_DB_OK) {
		ret_code = tpm_proc_ipv4_igmp_init();
		IF_ERROR(ret_code);
	} else
		TPM_OS_WARN(TPM_INIT_MOD, "PNC range(%d) not initialized\n", TPM_PNC_IGMP);

	ret_code = tpm_db_pnc_rng_conf_get(TPM_PNC_IPV4_PROTO, &range_conf);
	if (ret_code == TPM_DB_OK) {
		ret_code = tpm_proc_ipv4_proto_init();
		IF_ERROR(ret_code);
	} else
		TPM_OS_WARN(TPM_INIT_MOD, "PNC range(%d) not initialized\n", TPM_PNC_IPV4_PROTO);

	ret_code = tpm_db_pnc_rng_conf_get(TPM_PNC_IPV4_FRAG, &range_conf);
	if (ret_code == TPM_DB_OK) {
		ret_code = tpm_proc_ipv4_frag_init();
		IF_ERROR(ret_code);
	} else
		TPM_OS_WARN(TPM_INIT_MOD, "PNC range(%d) not initialized\n", TPM_PNC_IPV4_FRAG);

	ret_code = tpm_db_pnc_rng_conf_get(TPM_PNC_CATCH_ALL, &range_conf);
	if (ret_code == TPM_DB_OK) {
		ret_code = tpm_proc_catch_all_init();
		IF_ERROR(ret_code);
	} else
		TPM_OS_WARN(TPM_INIT_MOD, "PNC range(%d) not initialized\n", TPM_PNC_CATCH_ALL);

	tpm_db_get_tcp_flag_check(&tcp_flag_check);
	ret_code = tpm_db_pnc_rng_conf_get(TPM_PNC_TCP_FLAG, &range_conf);
	if (TPM_TCP_FLAG_NOT_CHECK == tcp_flag_check) {
		if (ret_code == TPM_DB_OK) {
			/* do not check tcp flag, no need to create tcp flag range */
			TPM_OS_WARN(TPM_INIT_MOD, "do not check tcp flag, no need to create tcp flag range\n");
		}
	} else {
		if ((ret_code != TPM_DB_OK) || (range_conf.range_size < 4)) {
			/* check tcp flag, need to create tcp flag range */
			TPM_OS_WARN(TPM_INIT_MOD, "check tcp flag, need to create tcp flag range with size of 4\n");
		} else {
			ret_code = tpm_proc_tcp_flag_init();
			IF_ERROR(ret_code);
		}
	}

	ret_code = tpm_db_pnc_rng_conf_get(TPM_PNC_VIRT_UNI, &range_conf);
	if (ret_code == TPM_DB_OK) {
		ret_code = tpm_proc_virt_uni_init();
		IF_ERROR(ret_code);
	} else
		TPM_OS_WARN(TPM_INIT_MOD, "PNC range(%d) not initialized\n", TPM_PNC_VIRT_UNI);

	ret_code = tpm_proc_mtu_init();
	IF_ERROR(ret_code);

	ret_code = tpm_init_ethertype_dsa_tag();
	IF_ERROR(ret_code);

	ret_code = tpm_fc_engine_init();
	IF_ERROR(ret_code);

	return (TPM_OK);
}

/*******************************************************************************
* tpm_init_vlan_etype_set()
*
* DESCRIPTION:      Set configured VLAN ETYs in the TPM DB and hardware
*
* INPUTS:

* OUTPUTS:
*
* RETURNS:
*
*******************************************************************************/
int32_t tpm_init_vlan_etype_set(void)
{
	int32_t ret_code = TPM_OK;
	uint32_t etype_sel;
	int i;

	for (i = 0; i < TPM_NUM_VLAN_ETYPE_REGS; i++) {
		if (tpm_init.vlan_etypes[i] != MV_TPM_UN_INITIALIZED_INIT_PARAM) {
			ret_code = tpm_mod2_tpid_get(tpm_init.vlan_etypes[i], &etype_sel);
			IF_ERROR(ret_code);
		}

	}

	return (ret_code);
}

/*******************************************************************************
* tpm_pnc_init_temp()
*
* DESCRIPTION:      when TPM is responsible to configure the PNC:
*                   * PNC clean ALL
*                   * Add entry #0 for HW forwarding enabled
*
* INPUTS:

* OUTPUTS:
*
* RETURNS:
*
*******************************************************************************/
void tpm_pnc_init_temp(void)
{
	int rc;
	unsigned int config_pnc_parser_val;

	/* get the config_pnc_parser value */
	config_pnc_parser_val = mv_eth_ctrl_pnc_get();
	if (config_pnc_parser_val == 0) {
		rc = tcam_hw_init();
		if (rc != TPM_OK)
			TPM_OS_WARN(TPM_INIT_MOD, " recvd ret_code(%d)\n", rc);
		pnc_def_entry_init(0, 0);	/* rxq =0 */
	}
	return;
}

/*******************************************************************************
* tpm_init_system_init()
*
* DESCRIPTION:      Initialize the system hardware.
*                   First all the one-time Inits are performed,
*                   and then a call to the dynamic sections is performed by calling mib_reset
*
* INPUTS:

* OUTPUTS:
*
* RETURNS:
*
*******************************************************************************/
int32_t tpm_init_system_init(tpm_reset_level_enum_t reset_type)
{
	int32_t ret_code;
	tpm_db_gmac_func_t gfunc;
	tpm_db_gmac_conn_t gconn = TPM_GMAC_CON_DISC;
	tpm_gmacs_enum_t gmac_i;
	uint16_t txp;

	TPM_OS_DEBUG(TPM_INIT_MOD, "\n");

	/* Init Vlan Ethertype Registers */
	ret_code = tpm_init_vlan_etype_set();
	IF_ERROR(ret_code);

	/* Init HW Modification table and registers */
	for (gmac_i = 0; gmac_i < TPM_MAX_NUM_GMACS; gmac_i++) {
		if (!INIT_GMAC_VALID(gmac_i))
			continue;

		tpm_db_gmac_func_get(gmac_i, &gfunc);
		if (gmac_i != TPM_ENUM_PMAC)
			tpm_db_gmac_conn_get(gmac_i, &gconn);

		if (gfunc != TPM_GMAC_FUNC_NONE &&
				(gconn != TPM_GMAC_CON_DISC || gmac_i == TPM_ENUM_PMAC)) {
			/*ret_code = tpm_mod2_inv_all(); */
			ret_code = tpm_mod2_mac_inv(gmac_i);
			IF_ERROR(ret_code);
			if (gmac_i == TPM_ENUM_PMAC) {
				for (txp = 0; txp < 8; txp++)
					ret_code = tpm_mod2_registers_init(gmac_i, txp);
			} else
				ret_code = tpm_mod2_registers_init(gmac_i, 0);

			IF_ERROR(ret_code);
		}
	}
	/* temporarily = clean the PNC if needed */
	tpm_pnc_init_temp();

	/* Init hardware forwarding configuration */
	tpm_init_hwf_set();

	/* Init tx_queue sizes */
	tpm_init_txq_size_set();

	/* Init rx_queue sizes */
	tpm_init_rxq_size_set();

	/* Init marvell header configuration */
	ret_code = tpm_init_mh();
	IF_ERROR(ret_code);

	/* Init Buffer Mngmt Pool configuration */
	tpm_init_bm_pool();

	/* Init IPG */
	tpm_init_ipg();

	ret_code = tpm_init_system_mib_reset(reset_type);
	IF_ERROR(ret_code);

	return (TPM_OK);
}

/*******************************************************************************
* tpm_module_init()
*
* DESCRIPTION:      Initialize the TPM module
*
* INPUTS:

* OUTPUTS:
*
* RETURNS:
*
*******************************************************************************/
int32_t tpm_module_init(void)
{
	int32_t ret_code;

	/* Reset DB */
	ret_code = tpm_db_init();
	if (ret_code != TPM_DB_OK) {
		printk(KERN_ERR "Error in Init DB\n");
		return (TPM_FAIL);
	}

	ret_code = tpm_mod2_init();
	if (ret_code != TPM_OK) {
		printk(KERN_ERR "Error in Init MOD2\n");
		return (TPM_FAIL);
	}

	return (TPM_OK);
}

/*******************************************************************************
* tpm_module_start()
*
* DESCRIPTION:      Initialize the TPM module
*
* INPUTS:

* OUTPUTS:
*
* RETURNS:
*
*******************************************************************************/
int32_t tpm_module_start(tpm_init_t *tpm_init)
{
	int32_t ret_code;
	static uint32_t first_time = 0;

	if (first_time == 0) {

		/* Initialize XML configuration to the init database */
		tpm_init_config_params_init(tpm_init);

		/* Update database hardcoded configuration */
		ret_code = tpm_init_config_params_update();
		if (ret_code != TPM_OK) {
			printk(KERN_ERR "Error in Init Configuration \n");
			return (TPM_FAIL);
		}

		/* Check all Configuration params are consistent */
		ret_code = tpm_init_info_validate();
		if (ret_code != TPM_OK) {
			printk(KERN_ERR "Error in Init Info Validate \n");
			return (TPM_FAIL);
		}

		/* Transform raw form Init Info into TPM format and update DB
		 * Involves internal mapping logic */
		ret_code = tpm_init_info_set();
		if (ret_code != TPM_OK) {
			printk(KERN_ERR "Error in  Init Info Set \n");
			return (TPM_FAIL);
		}

		/* Initialize TPM Locks */
		tpm_init_locks_init();

		/* Initialize System (HW) */
		/* In HW reset all PnC Ranges, except for those that should never be reset (e.g. PNC_INIT_US for NFS) */
		ret_code = tpm_init_system_init(TPM_ENUM_RESET_LEVEL1);
		if (ret_code != TPM_OK) {
			printk(KERN_ERR "\n= TPM Module - Error in System Init =\n");
			return (TPM_FAIL);
		} else {
			printk(KERN_INFO "\n= TPM Module Init ended successfully =\n");
			tpm_db_init_done_set();
		}

	} else
		TPM_OS_INFO(TPM_INIT_MOD, " skipped\n");

	first_time++;

	return (TPM_OK);
}
