/*******************************************************************************
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   1
#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",
			"TPM_PON_WAN_G0_G1_DUAL_LAN"};

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_DS_LOAD_BALANCE, 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_DROP_PRECEDENCE, 0, 0, 1},
	{TPM_PNC_L2_MAIN, 1, 1, 1},
	{TPM_PNC_ETH_TYPE, 2, 1, 1},
	{TPM_PNC_IGMP, 3, 0, 1},
	{TPM_PNC_IPV4_MC_DS, 3, 0, 1},
	{TPM_PNC_IPV4_MAIN, 3, 1, 1},
	{TPM_PNC_IPV4_TCP_FLAG, 4, 1, 1},
	{TPM_PNC_TTL, 5, 1, 1},
	{TPM_PNC_IPV4_PROTO, 6, 0, 1},
	{TPM_PNC_IPV4_FRAG, 6, 0, 1},
	{TPM_PNC_IPV4_LEN, 6, 1, 1},
	{TPM_PNC_IPV6_NH, 7, 1, 1},
	{TPM_PNC_IPV6_L4_MC_DS, 8, 1, 1},
	{TPM_PNC_IPV6_TCP_FLAG, 8, 1, 1},
	{TPM_PNC_IPV6_L4, 8, 1, 1},
	{TPM_PNC_IPV6_HOPL, 9, 1, 1},
	{TPM_PNC_IPV6_MC_SIP, 9, 1, 1},
	{TPM_PNC_IPV6_GEN, 9, 1, 1},
	{TPM_PNC_IPV6_MC_DS, 10, 1, 1},
	{TPM_PNC_IPV6_DIP, 10, 1, 1},
	{TPM_PNC_CNM_IPV4_PRE, 11, 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, 12, 1, 1},
	{TPM_PNC_CATCH_ALL, 0, 0, 1},

};

bool tpm_init_check_gmac_init(tpm_gmacs_enum_t gmac_i)
{
	/* Check Port Available or not */
	if (mvNetaPortCheck(gmac_i) || (NULL == mvNetaPortHndlGet(gmac_i))) {
		return false;
	}
	return true;
}

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.active_wan = tpm_init_params->active_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;
	tpm_init.ds_mac_based_trunk_enable = tpm_init_params->ds_mac_based_trunk_enable;
}

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.eth_cmplx_profile == TPM_PON_WAN_G0_G1_DUAL_LAN)
			tpm_init.switch_init = 0;
		else
			tpm_init.switch_init = 1;
	}
}
void tpm_init_ds_mac_based_trunk_enable_get(void)
{
	if (tpm_init.ds_mac_based_trunk_enable == MV_TPM_UN_INITIALIZED_INIT_PARAM)
		tpm_init.ds_mac_based_trunk_enable = TPM_DS_MAC_BASED_TRUNK_DISABLED;
}

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[7]= {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_GEPHY_SW_P0 | ESC_OPT_FE3PHY;
		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_RGMIIA_SW_P6 | ESC_OPT_FE3PHY;
		break;

	case TPM_PON_WAN_G1_LAN_G0_INT_SWITCH:
		profile[0] = ESC_OPT_MAC0_2_SW_P4 | ESC_OPT_RGMIIA_MAC1 | 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_FE3PHY | ESC_OPT_RGMIIA_SW_P6;
		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_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_RGMIIA_SW_P6 | 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_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_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:
	case TPM_PON_G0_WAN_G1_SINGLE_PORT:
		profile[0] = ESC_OPT_RGMIIB_MAC0 | ESC_OPT_RGMIIA_MAC1;
		profile[1] = ESC_OPT_GEPHY_MAC1 | ESC_OPT_RGMIIA_MAC0;
		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())
			profile[0] = ESC_OPT_GEPHY_MAC0;
		break;
	case TPM_PON_WAN_G0_G1_DUAL_LAN:
		profile[0] = ESC_OPT_GEPHY_MAC0 | ESC_OPT_RGMIIA_MAC1;
		break;
	}

	off += sprintf(buff+off, "\nProfile supported options:\n");
	for (i = 0; profile[i]; i++) {
		off += sprintf(buff+off, "\t");
		for (j = 0; j < (sizeof(opt_str_tlb)/sizeof(opt_str_tlb[0])); 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;
	}

	/* do not check SATA */
	hwEthCmplx &= (~ESC_OPT_SATA);

	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;
		}
	}

	if (MV_TPM_UN_INITIALIZED_INIT_PARAM == tpm_init.active_wan)
		tpm_init.active_wan = TPM_ENUM_PMAC;

	/* 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_RGMIIA_SW_P6 |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_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 (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 (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 (!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;

		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 (!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;

		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_GE_PHY;
		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_DUAL_LAN:
		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_GEPHY_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_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_UNI_1;
		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;

		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_GE_PHY;
		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_UNI_1;
		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;
	}

	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();
	tpm_init_ds_mac_based_trunk_enable_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)
		return TPM_OK;

	/******************** 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);
		}
		if (tpm_init.cpu_loopback == TPM_CPU_LOOPBACK_ENABLED) {
			if (tpm_init.gmac_port_conf[1].valid == TPM_TRUE &&
			    tpm_init.gmac_port_conf[1].port_src != TPM_SRC_PORT_ILLEGAL) {
				TPM_OS_FATAL(TPM_INIT_MOD, "\n CPU loopback not supported for GMAC function \n");
				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");
		}
	}

	/********************* ds_mac_based_trunking validation *************************************/
	if (tpm_init.ds_mac_based_trunk_enable == TPM_DS_MAC_BASED_TRUNK_ENABLED) {
		if (    (tpm_init.cpu_loopback == TPM_CPU_LOOPBACK_ENABLED)
		     || (tpm_init.mc_setting.per_uni_vlan_xlat)
		     || (tpm_init.virt_uni_info.enabled == TPM_VIRT_UNI_ENABLED)) {
			TPM_OS_FATAL(TPM_INIT_MOD,
				"\n when ds_mac_based_trunk is enabled, cpu_loopback, per_uni_vlan_xlat"
				" and virt_uni can not be enabled! \n");
			return (TPM_FAIL);
		}

		if (    (tpm_init.gmac0_mh_en == 0)
		     || (tpm_init.gmac1_mh_en == 0)) {
			TPM_OS_FATAL(TPM_INIT_MOD,
				"\n when ds_mac_based_trunk is enabled, MH on GMAC0/1 must be enabled\n");
			return (TPM_FAIL);
		}

		if (    (tpm_init.eth_cmplx_profile != TPM_PON_WAN_DUAL_MAC_INT_SWITCH)
		     && (tpm_init.eth_cmplx_profile != TPM_PON_WAN_DUAL_MAC_EXT_SWITCH)) {
			TPM_OS_FATAL(TPM_INIT_MOD,
				"\n when ds_mac_based_trunk is enabled, eth_cmplx_profile must be "
				"TPM_PON_WAN_DUAL_MAC_INT_SWITCH"
				" or TPM_PON_WAN_DUAL_MAC_EXT_SWITCH! \n");
			return (TPM_FAIL);
		}

	}
	/********************* 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_init.pnc_mac_learn_enable == TPM_PNC_MAC_LEARN_ENABLED) {
			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);
		}

		if (tpm_init.pnc_mac_learn_enable == TPM_PNC_MAC_LEARN_ENABLED &&
		    tpm_init.eth_cmplx_profile != TPM_PON_WAN_G0_G1_LPBK) {
			TPM_OS_FATAL(TPM_INIT_MOD,
					"\n PNC MAC learning not supported with profile (%d) \n",
					tpm_init.eth_cmplx_profile);
			return (TPM_FAIL);
		}

		if (tpm_init.ipv6_5t_enable == TPM_IPV6_5T_ENABLED &&
		    tpm_init.eth_cmplx_profile == TPM_PON_WAN_G0_G1_DUAL_LAN) {
			TPM_OS_FATAL(TPM_INIT_MOD,
					"\n IPV6 5-tuple supported with profile (%d) \n",
					tpm_init.eth_cmplx_profile);
			return (TPM_FAIL);
		}
	} 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.eth_cmplx_profile == TPM_PON_WAN_G0_G1_DUAL_LAN)
		 && 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;
					}
				}
			}
		}
	}

	/* check all the loopback features */
	if (tpm_init.mc_setting.per_uni_vlan_xlat) {
		if (tpm_init.virt_uni_info.enabled != TPM_VIRT_UNI_ENABLED) {
			TPM_OS_FATAL(TPM_INIT_MOD, "\n per_uni_vlan_xlat can not be supported when virt_uni is disabled\n");
			return (TPM_FAIL);
		}
	}
	if (tpm_init.cpu_loopback == TPM_CPU_LOOPBACK_ENABLED) {
		if (tpm_init.eth_cmplx_profile == TPM_PON_WAN_G0_G1_LPBK)
			;/* OK */
		else if (    (tpm_init.gmac_port_conf[TPM_ENUM_GMAC_1].conn == TPM_GMAC_CON_SWITCH_5)
		          && (tpm_init.eth_cmplx_profile != TPM_G0_WAN_G1_INT_SWITCH)
		          && (tpm_init.eth_cmplx_profile != TPM_PON_G0_WAN_G1_INT_SWITCH))
			;/* OK */
		else {
			TPM_OS_FATAL(TPM_INIT_MOD, "\n cpu_wan_loopback can not be supported on this profile\n");
			return (TPM_FAIL);
		}
	}

	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_RX_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);

	ret_code = tpm_init_api_rng_init(TPM_PNC_DS_LOAD_BALANCE, TPM_DS_LOAD_BALANCE_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_active_wan_set(tpm_init.active_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);
	ret_code = tpm_db_ds_mac_based_trunk_enable_set(tpm_init.ds_mac_based_trunk_enable);
	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);
	tpm_db_igmp_set_snoop_enable(tpm_init.igmp_snoop);
	/*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_init.pon_type == TPM_P2P) {
		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 */
	tpm_db_cpu_wan_lpbk_en_set(tpm_init.cpu_loopback);

	tpm_db_switch_init_set(tpm_init.switch_init);
	if (	(tpm_init.eth_cmplx_profile == TPM_PON_WAN_DUAL_MAC_INT_SWITCH)
	     || (tpm_init.eth_cmplx_profile == TPM_PON_WAN_DUAL_MAC_EXT_SWITCH))
		tpm_db_ds_load_bal_en_set(true);
	else
		tpm_db_ds_load_bal_en_set(false);


	/* set switch active WAN en */
	if (    (tpm_init.eth_cmplx_profile == TPM_PON_G1_WAN_G0_INT_SWITCH)
	     || (tpm_init.eth_cmplx_profile == TPM_PON_G0_WAN_G1_INT_SWITCH)
	     || (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_db_switch_active_wan_en_set(true);
	else
		tpm_db_switch_active_wan_en_set(false);

	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_cpu_own(dest_port, dest_port_txp, q_num, 1)){
						TPM_OS_ERROR(TPM_INIT_MOD,
						"mv_eth_ctrl_txq_cpu_own err GMAC = %d TCONT = %d Q = %d SWF: 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(tpm_init_mh_src_t ds_mh_set_conf)
{
	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 (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", ds_mh_set_conf);
				return (TPM_FAIL);
			}
		} else if ((gmac_func == TPM_GMAC_FUNC_LAN_AND_WAN) || (gmac_func == TPM_GMAC_FUNC_LAN) || (gmac_func == TPM_GMAC_FUNC_LAN_UNI)) {
			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;
}

/*******************************************************************************
* tpm_init_gmac_PHY_poll()
*
* DESCRIPTION:      Initialize the GMAC PHY polling state accordint to it connect to PHY or not
*
* INPUTS:
*	port -- GMAC port
*	state -- true: enable PHY polling; false: disable PHY polling
* OUTPUTS:None
*
* RETURNS:
*
*******************************************************************************/
int32_t tpm_init_gmac_PHY_poll(int port, bool state)
{
	unsigned int regData;

	regData = MV_REG_READ(ETH_UNIT_CONTROL_REG(port));
	if (state)
		regData |= ETH_PHY_POLLING_ENABLE_MASK;
	else
		regData &= (~ETH_PHY_POLLING_ENABLE_MASK);

	MV_REG_WRITE(ETH_UNIT_CONTROL_REG(port), regData);

	return TPM_OK;
}

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 };
	unsigned char gq_mld_da[6] = { 0x33, 0x33, 0x00, 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:
	case TPM_PON_WAN_G0_G1_DUAL_LAN:
		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);
	if (mv_switch_mac_addr_set(gq_mld_da, 0, sw_port_bmp, 1))
		TPM_OS_WARN(TPM_INIT_MOD, "mv_switch_mac_addr_set err.for mld general query sw_port_bmp 0X%x\n", sw_port_bmp);
    
	/* If Switch port MAC no connected to PHY, disable GMAC PHY polling */
	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 ||
		    TPM_GMAC_CON_SWITCH_5 == tpm_init.gmac_port_conf[gmac_i].conn)
			tpm_init_gmac_PHY_poll(gmac_i, false);
	}

	return (TPM_OK);
}

int32_t tpm_init_mh_conf_set(uint32_t gmac0_mh_en, uint32_t gmac1_mh_en, tpm_init_gmac_conn_conf_t *gmac_port_conf)
{
	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 = gmac0_mh_en;
			if (TPM_GMAC_CON_SWITCH_4 == gmac_port_conf[gmac_i].conn)
				amber_port_num = TPM_GMAC0_AMBER_PORT_NUM;
			break;
		case TPM_ENUM_GMAC_1:
			mh_en = gmac1_mh_en;
			if (TPM_GMAC_CON_SWITCH_5 == 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(tpm_init_mh_src_t ds_mh_set_conf)
{
	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_func == TPM_GMAC_FUNC_LAN_UNI)) &&
		    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 = 0x7f & (~(1 << TPM_GMAC0_AMBER_PORT_NUM));
				else
					regVal = 0x7f & (~(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, prio = 0;
	uint32_t size = 0, queue = 0, rate = 0, wrr = 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));
			wrr = MV_REG_READ(NETA_TXQ_WRR_ARBITER_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_q_rate_limit(tx_mod_i, queue, size, rate, wrr);
		}

		/* get TX bucket and rate */
#ifdef MV_ETH_WRR_NEW
		size = MV_REG_READ(NETA_TXP_TOKEN_SIZE_REG(gmac_i, txp_i));
		rate = MV_REG_READ(NETA_TXP_REFILL_REG(gmac_i, txp_i));
		prio = MV_REG_READ(NETA_TX_FIXED_PRIO_CFG_REG(gmac_i, txp_i));
#else /* Old WRR/EJP module */
		rate = MV_REG_READ(ETH_TXP_TOKEN_RATE_CFG_REG(gmac_i, txp_i));
		size = MV_REG_READ(ETH_TXP_TOKEN_SIZE_REG(gmac_i, txp_i));
#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, size, rate, prio);
	}
	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;
	uint32_t wrr = 0, prio = 0, regVal = 0;

	/* keep the compiler quiet */
	regVal = 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;
		}

		/* set Tx queue bucket size */
		for (queue = 0; queue < TPM_MAX_NUM_TX_QUEUE; queue++) {
			tpm_db_get_gmac_q_rate_limit(tx_mod_i, queue, &size, &rate, &wrr);
			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);
			MV_REG_WRITE(NETA_TXQ_WRR_ARBITER_REG(gmac_i, txp_i, queue), wrr);
#else /* Old WRR/EJP module */
			MV_REG_WRITE(ETH_TXQ_TOKEN_CFG_REG(gmac_i, txp_i, queue), rate);
#endif /* MV_ETH_WRR_NEW */
		}

		tpm_db_get_gmac_rate_limit(tx_mod_i, &size, &rate, &prio);
		TPM_OS_INFO(TPM_INIT_MOD, "gmac_i (%d), txp_i (%d), size (%d), rate (%d)\n",
			gmac_i, txp_i, size, rate);
		/* set TX bucket and rate */
#ifdef MV_ETH_WRR_NEW
		MV_REG_WRITE(NETA_TXP_TOKEN_SIZE_REG(gmac_i, txp_i), size);
		MV_REG_WRITE(NETA_TXP_REFILL_REG(gmac_i, txp_i), rate);
		MV_REG_WRITE(NETA_TX_FIXED_PRIO_CFG_REG(gmac_i, txp_i), prio);
#else /* Old WRR/EJP module */
		regVal = MV_REG_READ(ETH_TXP_TOKEN_RATE_CFG_REG(gmac_i, txp_i));
		regVal &= ~ETH_TXP_TOKEN_RATE_ALL_MASK;
		regVal |= ETH_TXP_TOKEN_RATE_MASK(rate);
		MV_REG_WRITE(ETH_TXP_TOKEN_RATE_CFG_REG(gmac_i, txp_i), regVal);
		regVal = MV_REG_READ(ETH_TXP_TOKEN_SIZE_REG(gmac_i, txp_i));
		regVal &= ~ETH_TXP_TOKEN_SIZE_ALL_MASK;
		regVal |= ETH_TXP_TOKEN_SIZE_MASK(size);
		MV_REG_WRITE(ETH_TXP_TOKEN_SIZE_REG(gmac_i, txp_i), regVal);
#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(tpm_init_mh_src_t ds_mh_set_conf,
			uint32_t gmac0_mh_en,
			uint32_t gmac1_mh_en,
			tpm_init_gmac_conn_conf_t *gmac_port_conf)
{
	if (tpm_init_mh_select(ds_mh_set_conf) != TPM_OK) {
		TPM_OS_ERROR(TPM_INIT_MOD, "tpm_init_mh_select err\n");
		return (TPM_FAIL);
	}
	if (tpm_init_mh_conf_set(gmac0_mh_en, gmac1_mh_en, gmac_port_conf) != TPM_OK) {
		TPM_OS_ERROR(TPM_INIT_MOD, "tpm_init_mh_conf_set err\n");
		return (TPM_FAIL);
	}
	if (tpm_init_mh_reg_set(ds_mh_set_conf) != 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(int32_t mod_value)
{
	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;
	tpm_db_error_t db_ret_code;
	uint32_t gmac0_mh_en = 0;
	uint32_t gmac1_mh_en = 0;

	db_ret_code = tpm_db_gmac_mh_en_conf_get(TPM_ENUM_GMAC_0, &gmac0_mh_en);
	IF_ERROR(db_ret_code);
	db_ret_code = tpm_db_gmac_mh_en_conf_get(TPM_ENUM_GMAC_1, &gmac1_mh_en);
	IF_ERROR(db_ret_code);

	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 && gmac0_mh_en != TPM_FALSE && gmac_con == TPM_GMAC_CON_SWITCH_4) ||
			    (gmac_i == 1 && gmac1_mh_en != TPM_FALSE && (gmac_con == TPM_GMAC_CON_SWITCH_5 ||
			     tpm_init.eth_cmplx_profile == TPM_PON_WAN_G0_G1_LPBK))) {
				mvNetaPortDisable(gmac_i);
				mvNetaHwfEnable(gmac_i, 0);
				ipg_val = mvNetaPortIpgGet(gmac_i);
				ipg_val += mod_value;
				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_con == TPM_GMAC_CON_SWITCH_4) || (gmac_con == TPM_GMAC_CON_SWITCH_5)) {
					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 += mod_value;
					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(tpm_gmacs_enum_t port, uint8_t enable)
{
	uint32_t regVal;

	if (port > TPM_MAX_GMAC) {
		TPM_OS_ERROR(TPM_INIT_MOD, "GMAC port(%d) is invalid\n", port);
		return TPM_FAIL;
	}

	/* Check Port Available or not */
	if (!tpm_init_check_gmac_init(port)) {
		TPM_OS_ERROR(TPM_INIT_MOD, "GMAC port(%d) is not available\n", port);
		return TPM_FAIL;
	}

	if (mvNetaPortDisable(port)) {
		TPM_OS_ERROR(TPM_INIT_MOD, "Fail to disable GMAC port(%d)\n", port);
		return (TPM_FAIL);
	}
	if (mvNetaHwfEnable(port, 0)) {
		TPM_OS_ERROR(TPM_INIT_MOD, "Fail to disable GMAC port(%d) HWF\n", port);
		return (TPM_FAIL);
	}

	if (mvNetaForceLinkModeSet(port, 1, 0)) {/*for link up*/
		TPM_OS_ERROR(TPM_INIT_MOD, "Fail to set GMAC port(%d) force link\n", port);
		return (TPM_FAIL);
	}
	if (mvNetaSpeedDuplexSet(port, MV_ETH_SPEED_1000, MV_ETH_DUPLEX_FULL)) {/*set 1G*/
		TPM_OS_ERROR(TPM_INIT_MOD, "Fail to set GMAC port(%d) speed and duplex\n", port);
		return (TPM_FAIL);
	}

	if (mvNetaHwfEnable(port, 1)) {
		TPM_OS_ERROR(TPM_INIT_MOD, "Fail to enable GMAC port(%d) HWF\n", port);
		return (TPM_FAIL);
	}
	if (mvNetaPortEnable(port)) {
		TPM_OS_ERROR(TPM_INIT_MOD, "Fail to enable GMAC port(%d)\n", port);
		return (TPM_FAIL);
	}

	/* set GMAC_CTRL_2_REG */
	regVal = MV_REG_READ(NETA_GMAC_CTRL_2_REG(port));
	regVal &= ~NETA_GMAC_PSC_ENABLE_MASK;
	MV_REG_WRITE(NETA_GMAC_CTRL_2_REG(port), regVal);

	if (enable)
		MV_REG_WRITE(NETA_GMAC_CTRL_1_REG(port), 0x31); /* set gmac to loopback mode */
	else
		MV_REG_WRITE(NETA_GMAC_CTRL_1_REG(port), 0x11); /* set gmac to no-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;
	tpm_db_pnc_range_conf_t range_conf_tcp_flag;
	uint32_t switch_init;
	int32_t ret_code, ret_code_tcp_flag;
	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_db_ds_mac_based_trunk_enable_t ds_mac_based_trunk_enable;
	uint32_t snoop_enable;

	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 Amber Switch */
	tpm_db_switch_init_get(&switch_init);
	if (switch_init)
		tpm_init_switch();
	else {
		if (tpm_db_gmac1_lpbk_en_get()) {
			/* Init GMAC1 in loopback mod if GMAC loopback is enabled */
			ret_code = tpm_init_gmac_loopback(TPM_ENUM_GMAC_1, 1);
			IF_ERROR(ret_code);
		}
	}
	/*Init TX scheduling */
	ret_code = tpm_init_tx_queue_sched();
	IF_ERROR(ret_code);

	/* Init Tx queue rate limit */
	ret_code = tpm_init_reset_gmac_queue_rate_limit();
	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_ds_mac_based_trunk_enable_get(&ds_mac_based_trunk_enable);
	ret_code = tpm_db_pnc_rng_conf_get(TPM_PNC_DS_LOAD_BALANCE, &range_conf);
	if (TPM_DS_MAC_BASED_TRUNK_ENABLED == ds_mac_based_trunk_enable) {
		if (ret_code != TPM_DB_OK) {
			TPM_OS_ERROR(TPM_INIT_MOD, "PNC range TPM_PNC_DS_LOAD_BALANCE is not created "
				"when ds_mac_based_trunk is enabled\n");
			return ERR_GENERAL;
		} else if (range_conf.range_size < 3) {
			TPM_OS_ERROR(TPM_INIT_MOD, "PNC range TPM_PNC_DS_LOAD_BALANCE size should be at least "
				"3 when ds_mac_based_trunk is enabled\n");
			return ERR_GENERAL;
		}
	} else {
		if ((ret_code == TPM_DB_OK) && (range_conf.range_size != 0)) {
			TPM_OS_WARN(TPM_INIT_MOD, "do not perform ds_mac_based_trunk, "
				"no need to create TPM_PNC_DS_LOAD_BALANCE range\n");
		}
	}

	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);
	tpm_db_igmp_get_snoop_enable(&snoop_enable);
	if (TPM_TRUE == snoop_enable) {
		if (ret_code == TPM_DB_OK) {
			ret_code = tpm_proc_ipv4_igmp_init();
			IF_ERROR(ret_code);
		} else {
			TPM_OS_ERROR(TPM_INIT_MOD, "PNC range(TPM_PNC_IGMP) not initialized with IGMP snoop enabled\n");
			return ERR_GENERAL;
		}
	} else if (ret_code == TPM_DB_OK) {
		if (range_conf.range_size != 0) {
			/* igmp snoop is disabled, no need to create TPM_PNC_IGMP range */
			TPM_OS_WARN(TPM_INIT_MOD, "igmp snoop is disabled, no need to create TPM_PNC_IGMP range\n");
		}
	}

	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_IPV4_TCP_FLAG, &range_conf);
	ret_code_tcp_flag = tpm_db_pnc_rng_conf_get(TPM_PNC_IPV6_TCP_FLAG, &range_conf_tcp_flag);
	if (TPM_TCP_FLAG_NOT_CHECK == tcp_flag_check) {
		if (ret_code == TPM_DB_OK || ret_code_tcp_flag == 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 IPv4/6 tcp flag range\n");
		}
	} else {
		if ((ret_code != TPM_DB_OK) || (range_conf.range_size < 3)) {
			/* check tcp flag, need to create tcp flag range */
			TPM_OS_WARN(TPM_INIT_MOD, "check tcp flag, need to create IPv4 tcp flag range with size of 3\n");
		} else if ((ret_code_tcp_flag != TPM_DB_OK) || (range_conf_tcp_flag.range_size < 2)) {
			/* check tcp flag, need to create tcp flag range */
			TPM_OS_WARN(TPM_INIT_MOD, "check tcp flag, need to create IPv6 tcp flag range with size of 2\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);

	ret_code = tpm_init_qos();
	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_init_qos()
*
* DESCRIPTION:	    Set drop precedence for QoS
*
* INPUTS:

* OUTPUTS:
*
* RETURNS:
*
*******************************************************************************/
int32_t tpm_init_qos(void)
{
	int32_t ret_code = TPM_OK;

	ret_code = tpm_proc_set_drop_precedence_mode(0, TPM_DROP_PRECEDENCE_8P0D);
	IF_ERROR(ret_code);
	ret_code = tpm_proc_set_drop_precedence_mode(0, TPM_DROP_PRECEDENCE_NONE);
	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");

	/* check PON and GMAC state */
	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 (gfunc == TPM_GMAC_FUNC_NONE)
			continue;
		if (!tpm_init_check_gmac_init(gmac_i)) {
			TPM_OS_ERROR(TPM_INIT_MOD, "GMAC port(%d) is not init, system is not fully functional!\n", gmac_i);
			return TPM_FAIL;
		}
	}
	/* 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(tpm_init.ds_mh_set_conf,
				tpm_init.gmac0_mh_en,
				tpm_init.gmac1_mh_en,
				tpm_init.gmac_port_conf);
	IF_ERROR(ret_code);

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

	/* Init IPG */
	tpm_init_ipg((-TPM_MH_LEN));

	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);
}
