/*******************************************************************************
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_print.c
*
* DESCRIPTION:
*               Traffic Processor Manager = TPM
*
* DEPENDENCIES:
*               None
*
* CREATED BY:   OctaviaP
*
* DATE CREATED:
*
* FILE REVISION NUMBER:
*               Revision: 1.3
*
*
*******************************************************************************/

#include "tpm_common.h"
#include "tpm_header.h"
#include "tpm_sysfs_utils.h"
#include "dbg-trace.h"

/*TODO - currently some printing funtions are directly accessing DB */
extern tpm_db_t tpm_db;

#define DWORD_LEN       32

/* start offset of api_dump_ipv4_parse_bm, should be bigger than l2_parse_bm
   right now the biggest l2_parse_bm is TPM_L2_PARSE_GEMPORT with offset 8
 */
#define API_DUMP_IPV4_PARSE_BM_START       12

/* offset of api_dump_ipv6_parse_bm, should be bigger than ipv4_parse_bm + API_DUMP_IPV4_PARSE_BM_START
   right now the biggest ipv4_parse_bm is TPM_IPv4_PARSE_PROTO with offset 4
 */
#define API_DUMP_IPV6_PARSE_BM_START       24

#define TPM_DBVAL_CON(dbval)	((dbval == TPM_DB_VALID) ? TPM_TRUE : TPM_FALSE)
#define DIR2STR(dir)		((dir == TPM_DIR_DS) ? "DS" : "US")
#define IF_ERROR(ret)		\
		if (ret != TPM_DB_OK) {\
			TPM_OS_ERROR(TPM_CLI_MOD, "%s(%d):  recev'd error code (%d)\n", __func__, __LINE__, ret);\
			return;\
		}

db_enum_string_t tpm_db_chip_conn_str[] = {
	BuildEnumString(TPM_CONN_DISC),
	BuildEnumString(TPM_CONN_QSGMII),
	BuildEnumString(TPM_CONN_FE_PHY),
	BuildEnumString(TPM_CONN_GE_PHY),
	BuildEnumString(TPM_CONN_RGMII1),
	BuildEnumString(TPM_CONN_RGMII2),
};

db_enum_string_t tpm_db_int_conn_str[] = {
	BuildEnumString(TPM_INTCON_GMAC0),
	BuildEnumString(TPM_INTCON_GMAC1),
	BuildEnumString(TPM_INTCON_SWITCH),
};

db_enum_string_t tpm_db_sched_str[] = {
	BuildEnumString(TPM_SCHED_SP),
	BuildEnumString(TPM_SCHED_WRR),
};

db_enum_string_t tpm_db_txq_owner_str[] = {
	BuildEnumString(TPM_Q_OWNER_CPU),
	BuildEnumString(TPM_Q_OWNER_GMAC0),
	BuildEnumString(TPM_Q_OWNER_GMAC1),
	BuildEnumString(TPM_Q_OWNER_PMAC),
};

db_enum_string_t tpm_db_gmac_conn_str[] = {
	BuildEnumString(TPM_GMAC_CON_DISC),
	BuildEnumString(TPM_GMAC_CON_QSGMII),
	BuildEnumString(TPM_GMAC_CON_SWITCH_4),
	BuildEnumString(TPM_GMAC_CON_SWITCH_5),
	BuildEnumString(TPM_GMAC_CON_SWITCH_6),
	BuildEnumString(TPM_GMAC_CON_RGMII1),
	BuildEnumString(TPM_GMAC_CON_RGMII2),
	BuildEnumString(TPM_GMAC_CON_GE_PHY),
};

db_enum_string_t tpm_db_gmac_func_str[] = {
	BuildEnumString(TPM_GMAC_FUNC_NONE),
	BuildEnumString(TPM_GMAC_FUNC_LAN),
	BuildEnumString(TPM_GMAC_FUNC_WAN),
	BuildEnumString(TPM_GMAC_FUNC_LAN_AND_WAN),
	BuildEnumString(TPM_GMAC_FUNC_VIRT_UNI),
	BuildEnumString(TPM_GMAC_FUNC_LAN_UNI),
	BuildEnumString(TPM_GMAC_FUNC_US_MAC_LEARN_DS_LAN_UNI),
};

db_enum_string_t tpm_pnc_ranges_str[] = {
	BuildEnumString(TPM_PNC_MNGMT_DS),
	BuildEnumString(TPM_PNC_MAC_LEARN),
	BuildEnumString(TPM_PNC_CPU_WAN_LPBK_US),
	BuildEnumString(TPM_PNC_NUM_VLAN_TAGS),
	BuildEnumString(TPM_PNC_DS_LOAD_BALANCE),
	BuildEnumString(TPM_PNC_VIRT_UNI),
	BuildEnumString(TPM_PNC_MULTI_LPBK),
	BuildEnumString(TPM_PNC_LOOP_DET_US),
	BuildEnumString(TPM_PNC_L2_MAIN),
	BuildEnumString(TPM_PNC_ETH_TYPE),
	BuildEnumString(TPM_PNC_IGMP),
	BuildEnumString(TPM_PNC_IPV4_MC_DS),
	BuildEnumString(TPM_PNC_IPV4_MAIN),
	BuildEnumString(TPM_PNC_IPV4_TCP_FLAG),
	BuildEnumString(TPM_PNC_TTL),
	BuildEnumString(TPM_PNC_IPV4_PROTO),
	BuildEnumString(TPM_PNC_IPV4_FRAG),
	BuildEnumString(TPM_PNC_IPV4_LEN),
	BuildEnumString(TPM_PNC_IPV6_HOPL),
	BuildEnumString(TPM_PNC_IPV6_GEN),
	BuildEnumString(TPM_PNC_IPV6_MC_SIP),
	BuildEnumString(TPM_PNC_IPV6_DIP),
	BuildEnumString(TPM_PNC_IPV6_MC_DS),
	BuildEnumString(TPM_PNC_IPV6_NH),
	BuildEnumString(TPM_PNC_IPV6_L4_MC_DS),
	BuildEnumString(TPM_PNC_IPV6_TCP_FLAG),
	BuildEnumString(TPM_PNC_IPV6_L4),
	BuildEnumString(TPM_PNC_CNM_IPV4_PRE),
	BuildEnumString(TPM_PNC_CNM_MAIN),
	BuildEnumString(TPM_PNC_CATCH_ALL),
};

db_enum_string_t tpm_api_range_type_str[] = {
	BuildEnumString(TPM_RANGE_TYPE_ACL),
	BuildEnumString(TPM_RANGE_TYPE_TABLE),
};

db_enum_string_t tpm_db_pnc_last_init_str[] = {
	BuildEnumString(TPM_PNC_RNG_LAST_INIT_DEF),
	BuildEnumString(TPM_PNC_RNG_LAST_INIT_DROP),
	BuildEnumString(TPM_PNC_RNG_LAST_INIT_TRAP),
};

static tpm_str_map_t api_section_str[] = {
	{TPM_L2_PRIM_ACL, "TPM_L2_PRIM_ACL"},
	{TPM_L3_TYPE_ACL, "TPM_L3_TYPE_ACL"},
	{TPM_IPV4_ACL, "TPM_IPV4_ACL"},
	{TPM_IPV4_MC, "TPM_IPV4_MC"},
	{TPM_IPV6_GEN_ACL, "TPM_IPV6_GEN_ACL"},
	{TPM_IPV6_DIP_ACL, "TPM_IPV6_DIP_ACL"},
	{TPM_IPV6_NH_ACL, "TPM_IPV6_NH_ACL"},
	{TPM_L4_ACL, "TPM_L4_ACL"},
};

static tpm_str_map_t api_type_str[] = {
	{TPM_API_MGMT, "MNGMT"},
	{TPM_API_MAC_LEARN,       "MAC_LEARN   "},
	{TPM_API_DS_LOAD_BALANCE, "DS_LOAD_BAL "},
	{TPM_API_CPU_LOOPBACK,    "CPU_LOOPBACK"},
	{TPM_API_L2_PRIM, "L2      "},
	{TPM_API_L3_TYPE, "L3      "},
	{TPM_API_IPV4,    "IPV4    "},
	{TPM_API_IPV4_MC, "IPV4_MC "},
	{TPM_API_IPV6_GEN, "IPV6_GEN"},
	{TPM_API_IPV6_DIP, "IPV6_DIP"},
	{TPM_API_IPV6_MC, "IPV6_MC"},
	{TPM_API_IPV6_NH, "IPV6_NH "},
	{TPM_API_IPV6_L4, "L4      "},
	{TPM_API_CNM,     "CNM     "},
};
char *tpm_db_params_illegal_str = "??";



/********************************************************************************/
/*                                Print Utils                                   */
/********************************************************************************/
char *db_mac_to_str(uint8_t * addr, char *str)
{
	if ((str != NULL) && (addr != NULL)) {
		str[0] = '\0';
		sprintf(str, "%02x:%02x:%02x:%02x:%02x:%02x", addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]);
		return str;
	}

	return NULL;
}

char *db_ipv4_to_str(uint8_t * ipaddr, char *str)
{
	if ((str != NULL) && (ipaddr != NULL)) {
		str[0] = '\0';
		sprintf(str, "%u.%u.%u.%u", ipaddr[0], ipaddr[1], ipaddr[2], ipaddr[3]);
		return str;
	}

	return NULL;
}

char *db_ipv6_to_str(uint8_t * ipaddr, char *str)
{
	int i, j;
	uint16_t addr[DB_IPV6_ADDR_LEN / 2];

	if ((str != NULL) && (ipaddr != NULL)) {
		for (i = 0, j = 0; i < DB_IPV6_ADDR_LEN; j++) {
			addr[j] = (ipaddr[i] << 8) | ipaddr[i + 1];
			i += 2;
		}

		str[0] = '\0';
		sprintf(str,
			"%x:%x:%x:%x:%x:%x:%x:%x",
			addr[0], addr[1], addr[2], addr[3], addr[4], addr[5], addr[6], addr[7]);
		return str;
	}

	return NULL;
}

/*******************************************************************************
* api_sec_to_str()
*
* DESCRIPTION:      Convert api section to string
*
* INPUTS:
* api_section      - API Section to retrieve configuration for
*
* RETURNS:
* On success, return pointer to entry in api_section_str[], on error return NULL.
*
* COMMENTS:
*
*******************************************************************************/
static uint8_t *api_sec_to_str(tpm_api_sections_t api_section)
{
	uint32_t i;

	for (i = 0; i < (sizeof(api_section_str) / sizeof(tpm_str_map_t)); i++) {
		if (api_section_str[i].enum_in == api_section)
			return (&(api_section_str[i].str_out[0]));
	}
	return (NULL);
}

/*******************************************************************************
* api_type_to_str()
*
* DESCRIPTION:      Convert api section to string
*
* INPUTS:
* tpm_api_type_t    - API Type to retrieve configuration for
*
* RETURNS:
* On success, return pointer to entry in api_type_str[], on error return NULL.
*
* COMMENTS:
*
*******************************************************************************/
uint8_t *api_type_to_str(tpm_api_type_t api_type)
{
	uint32_t i;

	for (i = 0; i < (sizeof(api_type_str) / sizeof(tpm_str_map_t)); i++) {
		if (api_type_str[i].enum_in == api_type)
			return (&(api_type_str[i].str_out[0]));
	}
	return (tpm_db_params_illegal_str);
}

/*******************************************************************************
* pnc_rng_to_str()
*
* DESCRIPTION:      Convert Pnc Range  to string
*
* INPUTS:
* api_section      - API Section to retrieve configuration for
*
* RETURNS:
* On success, return pointer to entry in api_section_str[], on error return NULL.
*
* COMMENTS:
*
*******************************************************************************/
static uint8_t *pnc_rng_to_str(tpm_pnc_ranges_t range)
{
	uint32_t i;

	for (i = 0; i < (sizeof(tpm_pnc_ranges_str) / sizeof(db_enum_string_t)); i++) {
		if (tpm_pnc_ranges_str[i].enumPar == range)
			return (&(tpm_pnc_ranges_str[i].enumString[0]));
	}
	return (NULL);
}

/*******************************************************************************
* tpm_print_mac_key()
*
* DESCRIPTION:
*
* INPUTS:
* mac_key       - Print mac key
*
* RETURNS:
*
* COMMENTS:
*
*******************************************************************************/
void tpm_print_mac_key(tpm_mac_key_t *mac_key)
{
	char smac_str[DB_MAC_STR_LEN] = { '\0' };
	char dmac_str[DB_MAC_STR_LEN] = { '\0' };

	printk("=========================================\n");
	printk("          DA                SA           \n");
	printk("        DA mask           SA mask        \n");
	printk("=========================================\n");
	printk("  %s   %s\n", db_mac_to_str(mac_key->mac_da, dmac_str),
	       db_mac_to_str(mac_key->mac_sa, smac_str));
	printk("  %s   %s\n", db_mac_to_str(mac_key->mac_da_mask, dmac_str),
	       db_mac_to_str(mac_key->mac_sa_mask, smac_str));
	printk("=========================================\n");
	return;
}

/*******************************************************************************
* tpm_print_cpu_lpbk_entry()
*
* DESCRIPTION:
*
* INPUTS:
*   None
*
* RETURNS:
*
* COMMENTS:
*
*******************************************************************************/
void tpm_print_cpu_lpbk_entry(void)
{
	uint16_t flow_id;
	tpm_cpu_loopback_t *lpbk_entry = NULL;

	print_horizontal_line(60);
	printk("  Index  trg_port  trg_queue  gem_port  rule_idx  mod_idx \n");
	print_horizontal_line(60);

	for (flow_id = 0; flow_id < TPM_MAX_CPU_LOOPBACK_NUM; flow_id++) {
		lpbk_entry = tpm_proc_get_loopback_entry(flow_id);

		if ((lpbk_entry != NULL) && (lpbk_entry->in_use == TPM_TRUE)) {
			printk("  %4.4d   0x%4.4x    %1.1d          %4.4d      %4.4d      %4.4d \n",
			       flow_id, lpbk_entry->trg_port, lpbk_entry->trg_queue,
			       lpbk_entry->gem_port, lpbk_entry->rule_idx, lpbk_entry->mod_idx);
		}

	}

	print_horizontal_line(60);
}

/*******************************************************************************
* tpm_print_tcam_lu_entry()
*
* DESCRIPTION:
*
* INPUTS:
*   None
*
* RETURNS:
*
* COMMENTS:
*
*******************************************************************************/
void tpm_print_tcam_lu_entry(uint32_t owner_id, uint32_t api_group, uint32_t lu_num, uint32_t lu_reset)
{
	uint16_t rule_num;
	tpm_error_code_t ret_code;
	uint16_t valid_num;
	tpm_api_entry_count_t count_array[TPM_MAX_LU_ENTRY_NUM];
	uint16_t unrelated_num;

	ret_code = tpm_get_pnc_lu_entry(owner_id, api_group, (uint16_t) lu_num, lu_reset, &valid_num,
					count_array, &unrelated_num);

	if (ret_code != TPM_RC_OK) {
		printk(KERN_ERR "Failed to call tpm_count_get_pnc_lu_entry, ret_code[%d] \n", ret_code);
		return;
	}

	printk("\n");
	print_horizontal_line(60);
	printk("  Input owner_id[%d], api_group[%d], lu_num[%d] lu_reset[%d]\n",
	       owner_id, api_group, lu_num, lu_reset);
	printk("  output valid_num[%d], unrelated_num[%d]\n", valid_num, unrelated_num);
	print_horizontal_line(60);
	printk("  Index    rule_idx    hit_counter \n");
	print_horizontal_line(60);

	for (rule_num = 0; rule_num < valid_num; rule_num++) {
		printk("  %4.4d     %4.4d        %6.6d\n",
		       rule_num, count_array[rule_num].rule_idx, count_array[rule_num].hit_count);
	}

	print_horizontal_line(60);
}
/*******************************************************************************
* tpm_print_pnc_all_hit_counters()
*
* DESCRIPTION:
*
* INPUTS:
*   None
*
* RETURNS:
*
* COMMENTS:
*
*******************************************************************************/
void tpm_print_pnc_all_hit_counters(uint32_t                owner_id,
				    tpm_api_type_t          api_type,
				    uint32_t                high_thresh_pkts,
				    uint8_t                 counters_reset,
				    uint16_t                valid_counters,
				    tpm_api_entry_count_t  *count_array)
{
	uint16_t              rule_num;

	printk("\n");
	print_horizontal_line(60);
	printk("  Input owner_id[%d], api_type[%d], high_thresh_pkts[%d] counters_reset[%d]\n",
	       owner_id, api_type, high_thresh_pkts, counters_reset);
	printk("  Output valid_counters[%d]\n", valid_counters);
	print_horizontal_line(60);
	printk("  Index    rule_idx    hit_counter \n");
	print_horizontal_line(60);

	for (rule_num = 0; rule_num < valid_counters; rule_num++) {
		printk("  %4.4d     %4.4d        %6.6d\n",
		       rule_num, count_array[rule_num].rule_idx, count_array[rule_num].hit_count);
	}

	print_horizontal_line(60);
}

/*******************************************************************************
* tpm_print_vlan_key()
*
* DESCRIPTION:
*
* INPUTS:
* vlan_key      - Print CPU WAN loopback entry
*
* RETURNS:
*
* COMMENTS:
*
*******************************************************************************/
void tpm_print_vlan_key(tpm_vlan_key_t *vlan_key)
{
	print_horizontal_line(49);
	printk("  TPID  VID  VID mask CFI CFI mask PBIT PBIT mask\n");
	print_horizontal_line(49);
	printk("  %4.4x  %4.4x  %4d   %4.4x    %1.1x     %1.1x      %2.2x     %2.2x\n",
	       vlan_key->tpid, vlan_key->tpid_mask, vlan_key->vid, vlan_key->vid_mask,
	       vlan_key->cfi, vlan_key->cfi_mask, vlan_key->pbit, vlan_key->pbit_mask);
	print_horizontal_line(49);
}

/*******************************************************************************
* tpm_print_ipv4_key()
*
* DESCRIPTION:
*
* INPUTS:
* ipv4_key      - Print ipv4 key
*
* RETURNS:
*
* COMMENTS:
*
*******************************************************************************/
void tpm_print_ipv4_key(tpm_ipv4_acl_key_t *ipv4_key, tpm_ipv4_add_key_t *ipv4_add_key)
{
	printk("IPV4:\n");
	printk("=======================================================\n");
	printk("    DST_IP       SRC_IP     DSCP PROT L4_DST L4_SRC\n");
	printk("=======================================================\n");
	printk("  %02x.%02x.%02x.%02x  %02x.%02x.%02x.%02x   %02x   %02x   %02x     %02x\n"
	       "  %02x.%02x.%02x.%02x  %02x.%02x.%02x.%02x   %02x \n",
	       ipv4_key->ipv4_dst_ip_add[0], ipv4_key->ipv4_dst_ip_add[1], ipv4_key->ipv4_dst_ip_add[2],
	       ipv4_key->ipv4_dst_ip_add[3], ipv4_key->ipv4_src_ip_add[0], ipv4_key->ipv4_src_ip_add[1],
	       ipv4_key->ipv4_src_ip_add[2], ipv4_key->ipv4_src_ip_add[3], ipv4_key->ipv4_dscp, ipv4_key->ipv4_proto,
	       ipv4_key->l4_dst_port, ipv4_key->l4_src_port, ipv4_key->ipv4_dst_ip_add_mask[0],
	       ipv4_key->ipv4_dst_ip_add_mask[1], ipv4_key->ipv4_dst_ip_add_mask[2], ipv4_key->ipv4_dst_ip_add_mask[3],
	       ipv4_key->ipv4_src_ip_add_mask[0], ipv4_key->ipv4_src_ip_add_mask[1], ipv4_key->ipv4_src_ip_add_mask[2],
	       ipv4_key->ipv4_src_ip_add_mask[3], ipv4_key->ipv4_dscp_mask);
	if (ipv4_add_key != NULL) {
		printk("=======================================================\n");
		printk("    IP_VER  IP_IHL  IP_LEN  IP_FLAG  IP_FRAG IP_TTL \n");
		printk("=======================================================\n");
		printk("     %01x        %01x     %04x      %02x      %04x   %02x   \n"
		       "     %01x        %01x      %01x        %01x        %01x \n",
		       ipv4_add_key->ipv4_ver, ipv4_add_key->ipv4_ihl, ipv4_add_key->ipv4_totlen,
		       ipv4_add_key->ipv4_flags, ipv4_add_key->ipv4_frag_offset, ipv4_add_key->ipv4_ttl,
		       ipv4_add_key->ipv4_ver_mask, ipv4_add_key->ipv4_ihl_mask, ipv4_add_key->ipv4_totlen_mask,
		       ipv4_add_key->ipv4_flags_mask, ipv4_add_key->ipv4_frag_offset_mask);
		printk("=======================================================\n");
	}
}

/*******************************************************************************
* tpm_print_l2_key()
*
* DESCRIPTION:
*
* INPUTS:
* l2_key      - Print l2 key
*
* RETURNS:
*
* COMMENTS:
*
*******************************************************************************/
void tpm_print_l2_key(tpm_l2_acl_key_t *l2_key)
{
	printk("\nL2 KEY:\n");

	tpm_print_mac_key(&(l2_key->mac));
	TPM_OS_DEB_WAIT();
	printk("\nVLAN 1:\n");
	tpm_print_vlan_key(&(l2_key->vlan1));
	printk("\nVLAN 2:\n");
	tpm_print_vlan_key(&(l2_key->vlan2));
	TPM_OS_DEB_WAIT();
	printk("L2 ethertype(%04x), pppoe_ses(%d), pppoe_proto(%x)\n",
	       l2_key->ether_type, l2_key->pppoe_hdr.ppp_session, l2_key->pppoe_hdr.ppp_proto);
	printk("gem_port(%x)\n", l2_key->gem_port);
	printk("=======================================================\n");
}

/*******************************************************************************
* tpm_print_l3_key()
*
* DESCRIPTION:
*
* INPUTS:
* l3_key      - Print l2 key
*
* RETURNS:
*
* COMMENTS:
*
*******************************************************************************/
void tpm_print_l3_key(tpm_l3_type_key_t *l3_key)
{
	printk("L3 KEY:\n");
	printk("L3 ethertype(%04x), pppoe_ses(%d), pppoe_proto(%x)\n",
	       l3_key->ether_type_key, l3_key->pppoe_key.ppp_session, l3_key->pppoe_key.ppp_proto);
	printk("=======================================================\n");
}

/*******************************************************************************
* tpm_print_etherports()
*
* DESCRIPTION:
*
* INPUTS:
* vlan_key      - Print vlan key
*
* RETURNS:
*
* COMMENTS:
*
*******************************************************************************/
void tpm_print_etherports(void)
{
	uint32_t i;

	printk("======================================================\n");
	printk(" TPM ethernet ports:                                  \n");
	printk("======================================================\n");
	printk("     ext   switch       chip             internal     \n");
	printk("                     connection         connection    \n");
	printk("======================================================\n");
	for (i = 0; i < TPM_MAX_NUM_ETH_PORTS; i++) {
		if (tpm_db.eth_ports[i].valid == TPM_DB_VALID) {
			printk(" %1d   %3d   ", i, tpm_db.eth_ports[i].port_src);

			if (tpm_db.eth_ports[i].int_connect == TPM_INTCON_SWITCH)
				printk(" %3d    ", tpm_db.eth_ports[i].switch_port);
			else
				printk("%8s", " ");

			printk("%15s  %17s \n",
			       tpm_db_chip_conn_str[tpm_db.eth_ports[i].chip_connect].enumString,
			       tpm_db_int_conn_str[tpm_db.eth_ports[i].int_connect].enumString);
		}
	}
	printk("======================================================\n");
	return;
}

/*******************************************************************************
* tpm_print_rx_modules()
*
* DESCRIPTION:
*
* INPUTS:
*
* RETURNS:
*
* COMMENTS:
*
*******************************************************************************/
void tpm_print_rx_modules(void)
{
	uint32_t i, j, q_val, q_size;

	printk("============================================================\n");
	printk(" TPM GMAC RX Queues:                                            \n");
	printk("============================================================\n");
	printk(" Queue  size\n");
	printk("============================================================\n");

	for (i = 0; i < TPM_MAX_NUM_GMACS; i++) {
		if (tpm_db_gmac_rx_val_get(i)) {
			printk("GMAC - %d\n", i);

			for (j = 0; j < TPM_MAX_NUM_RX_QUEUE; j++) {

				tpm_db_gmac_rx_q_conf_get(i, j, &q_val, &q_size);
				if (q_val)
					printk("q%1d  rxq_size %4d\n", j, q_size);
			}
		}
	}
	printk("======================================================\n");
	return;
}

/*******************************************************************************
* tpm_print_tx_modules()
*
* DESCRIPTION:
*
* INPUTS:
*
* RETURNS:
*
* COMMENTS:
*
*******************************************************************************/
void tpm_print_tx_modules(void)
{
	uint32_t i, j;

	printk("============================================================\n");
	printk(" TPM TX modules:                                            \n");
	printk("============================================================\n");
	printk(" Queue      Sched          Q-owner      owner   size  weight\n");
	printk("                                        q-num               \n");
	printk("============================================================\n");

	for (i = 0; i < TPM_MAX_NUM_TX_PORTS; i++) {
		if (tpm_db.gmac_tx[i].valid == TPM_DB_VALID) {
			printk("TX Device - %d\n", i);

			for (j = 0; j < TPM_MAX_NUM_TX_QUEUE; j++) {
				if (tpm_db.gmac_tx[i].tx_queue[j].valid == TPM_DB_VALID) {
					printk("   %1d   %13s  %17s   %1d     %4d  %5d\n",
					       j,
					       tpm_db_sched_str[tpm_db.gmac_tx[i].tx_queue[j].sched_method].enumString,
					       tpm_db_txq_owner_str[tpm_db.gmac_tx[i].tx_queue[j].queue_owner].
					       enumString, tpm_db.gmac_tx[i].tx_queue[j].owner_queue_num,
					       tpm_db.gmac_tx[i].tx_queue[j].queue_size,
					       tpm_db.gmac_tx[i].tx_queue[j].queue_weight);
				}
			}

		}
	}
	printk("======================================================\n");
	return;
}

void tpm_print_gmac_config(void)
{
	printk("=========================================================\n");
	printk(" TPM GMAC configuration:                                 \n");
	printk("=========================================================\n");
	printk("    Num                     Connection                   \n");
	printk(" tcont/llid         G0                      G1           \n");
	printk("    %4.4x    %18s  %18s\n",
	       tpm_db.num_valid_tcont_llid,
	       tpm_db_gmac_conn_str[tpm_db.gmac_port_conf[0].conn].enumString,
	       tpm_db_gmac_conn_str[tpm_db.gmac_port_conf[1].conn].enumString);
	printk("                    mh_en                  mh_en    \n");
	printk("                      %1d                      %1d\n",
	       tpm_db.gmac_mh_en[1], tpm_db.gmac_mh_en[0]);

	printk("====================================================\n");
	return;
}

void tpm_print_gmac_func(void)
{
	printk("=============================================================\n");
	printk(" TPM GMAC functions:                                         \n");
	printk("=============================================================\n");
	printk("        PMAC                 G0                   G1         \n");
	printk("=============================================================\n");
	printk(" %18s  %18s  %18s\n",
	       tpm_db_gmac_func_str[tpm_db.gmac_func[2]].enumString,
	       tpm_db_gmac_func_str[tpm_db.gmac_func[0]].enumString,
	       tpm_db_gmac_func_str[tpm_db.gmac_func[1]].enumString);
	printk("====================================================\n");
	return;
}

void tpm_print_bm_buffers(void)
{
	uint32_t i, valid, large_pkt_buf, small_pkt_buf;

	printk("=============================================================\n");
	printk(" Buffer Mngmt Pools:                                         \n");
	printk("=============================================================\n");
	printk("        Pool   cfg_val  large_bufs   small_bufs   \n");
	printk("=============================================================\n");
	for (i = 0; i < TPM_MAX_NUM_GMACS; i++) {
		tpm_db_gmac_bm_bufs_conf_get(i, &valid, &large_pkt_buf, &small_pkt_buf);
		printk("          %d     %d          %d          %d\n",
		       i, valid, large_pkt_buf, small_pkt_buf);
	}
	printk("====================================================\n");
	return;
}

void tpm_print_igmp(void)
{
#if 0
	printk("===================\n");
	printk(" IGMP:             \n");
	printk("===================\n");
	printk("Valid  Snoop  CPU-q\n");
	printk("===================\n");
	printk(" %3s    %3d    %2d \n",
	       (tpm_db.igmp_def.valid == TPM_DB_VALID ? "yes" : "no"),
	       tpm_db.igmp_def.igmp_snoop, tpm_db.igmp_def.igmp_cpu_queue);
	printk("========================\n");
	return;
#endif

	printk("===================\n");
	printk(" Multicast:   value\n");
	printk("===================\n");
	printk("Filter mode        %d\n", tpm_db.igmp_def.filter_mode);
	printk("Per UNI Vlan Xlate %d\n", tpm_db.igmp_def.per_uni_vlan_xlat);
	printk("MC PPPoE enable    %d\n", tpm_db.igmp_def.mc_pppoe_enable);
	printk("MC hwf queue       %d\n", tpm_db.igmp_def.mc_hwf_queue);
	printk("MC cpu queue       %d\n", tpm_db.igmp_def.mc_cpu_queue);
	printk("===================\n");
	return;
}

void tpm_print_misc(void)
{
	char *gmac_name[] = {"GMAC_0","GMAC_1","PMAC"};
	char *pon_type[] = {"EPON","GPON","P2P","NONE"};

	printk("==========================\n");
	printk(" TPM misc:          value \n");
	printk("==========================\n");
	printk("OMCI ETY            %4.4x\n", tpm_db.init_misc.omci_etype);
	printk("Debug port          %4d\n", tpm_db.init_misc.pnc_init_debug_port);
	printk("PON type            %s\n", pon_type[tpm_db.init_misc.pon_type]);

	if ((tpm_db.init_misc.active_wan <= TPM_MAX_GMAC) && (tpm_db.init_misc.active_wan >= TPM_ENUM_GMAC_0))
		printk("Active WAN          %s\n", gmac_name[tpm_db.init_misc.active_wan]);
	else
		printk("Active WAN          N/A");
	printk("DS MH select source %4d\n", tpm_db.init_misc.ds_mh_set_conf);
	printk("CFG PNC parse       %4d\n", tpm_db.init_misc.cfg_pnc_parse);
	printk("CPU loopback        %4d\n", tpm_db.init_misc.cpu_loopback);
	printk("Double Tag support  %4d\n", tpm_db.init_misc.dbl_tag);
	printk("IPV6 5T enable      %4d\n", tpm_db.init_misc.ipv6_5t_enable);
	printk("Virtual UNI-en:%4d uni-src %4d switch port %4d\n",
	       tpm_db.func_profile.virt_uni_info.enabled,
	       tpm_db.func_profile.virt_uni_info.uni_port,
	       tpm_db.func_profile.virt_uni_info.switch_port);
	printk("===============================\n");
	printk("TRACE DEBUG info    0x%08x\n", tpm_glob_trace);
	printk("===============================\n");

	return;
}

void tpm_print_owners(void)
{

	printk("\ntpm_print_owners : owners tables NOT USED YET \n");

	return;
}

void tpm_print_vlan_etype(void)
{
	uint32_t i;

	printk("========================\n");
	printk(" VLAN ETYs:             \n");
	printk("========================\n");
	for (i = 0; i < TPM_NUM_VLAN_ETYPE_REGS; i++) {
		if (tpm_db.vlan_etype[i].valid == TPM_DB_VALID)
			printk(" %2d   %4.4x\n", i, tpm_db.vlan_etype[i].tpid_ether_type);
	}

	return;
}

void tpm_print_valid_api_sections(void)
{
	tpm_api_sections_t cur_section = -1, next_section;
	int32_t last_valid;
	int32_t ret_code;
	uint32_t api_rng_size, num_valid_entries, tbl_start_ind;

	printk("==================================================\n");
	printk(" Valid API ranges:                         \n");
	printk("==================================================\n");
	printk("      Name       Size    Num     Last   Tbl\n");
	printk("                         entries  valid  Start\n");
	printk("==================================================\n");

	/* Loop through valid API ranges and print them */
	ret_code = tpm_db_api_section_val_get_next(cur_section, &next_section,
						   &api_rng_size, &num_valid_entries, &last_valid, &tbl_start_ind);
	IF_ERROR(ret_code);

	while (next_section != TPM_INVALID_SECTION) {
		printk("%15s  %4d    %4d    %4d    %4d\n",
		       api_sec_to_str(next_section), api_rng_size, num_valid_entries, last_valid, tbl_start_ind);

		cur_section = next_section;
		ret_code = tpm_db_api_section_val_get_next(cur_section, &next_section,
							   &api_rng_size, &num_valid_entries, &last_valid,
							   &tbl_start_ind);
		IF_ERROR(ret_code);
	}
	printk("===========================================\n");
	return;
}

void tpm_print_full_api_section(tpm_api_sections_t api_section)
{
	uint32_t rule_idx, bi_dir, i;
	int32_t ret_code;
	int32_t cur_rule, next_rule, last_valid;
	uint32_t api_rng_size, num_valid_entries, tbl_start_ind;
	tpm_pnc_ranges_t prim_pnc_range;
	tpm_rule_entry_t api_data;
	tpm_db_mod_conn_t mod_con;
	tpm_db_pnc_conn_t pnc_con;

	/* Print API Range Header */
	printk("====================================================\n");
	printk(" Full API range:                          \n");
	printk("====================================================\n");
	printk("      Name       Size    Num     Last    Start \n");
	printk("                         entries  valid     Ind  \n");
	printk("====================================================\n");

	ret_code =
	    tpm_db_api_section_get(api_section, &api_rng_size, &num_valid_entries, &prim_pnc_range, &last_valid,
				   &tbl_start_ind);
	if (ret_code != TPM_OK) {
		printk("%15s - invalid \n", api_sec_to_str(api_section));
		return;
	}

	printk("%15s %4d    %4d    %4d    %4d\n",
	       api_sec_to_str(api_section), api_rng_size, num_valid_entries, last_valid, tbl_start_ind);

	cur_rule = -1;

	tpm_db_api_entry_val_get_next(api_section, cur_rule, &next_rule, &rule_idx, &bi_dir,
				      &api_data, &mod_con, &pnc_con);

	printk("=========================================================\n");
	printk("  Rule  Rule  Bi-dir  Mod  Mod |  Ranges    PnC    PnC   \n");
	printk("  num   idx           cmd  bm  |  total    range  index  \n");
	printk("=========================================================\n");

	while (next_rule != -1) {
		printk("  %3d  %5d   %3s    %3d  %2d    %4d",
		       next_rule, rule_idx,
		       (bi_dir ? "yes" : "no"), mod_con.mod_cmd_ind, mod_con.mod_cmd_mac, pnc_con.num_pnc_ranges);

		for (i = 0; i < pnc_con.num_pnc_ranges; i++) {
			printk("   %02d     %03d\n",
			       pnc_con.pnc_conn_tbl[i].pnc_range, pnc_con.pnc_conn_tbl[i].pnc_index);
		}

		cur_rule = next_rule;
		tpm_db_api_entry_val_get_next(api_section, cur_rule, &next_rule, &rule_idx, &bi_dir,
					      &api_data, &mod_con, &pnc_con);
	}
	printk("=================================================================\n");
	return;
}

void tpm_print_valid_pnc_ranges(void)
{
	int32_t ret_code;
	tpm_db_pnc_range_t range_data;
	tpm_pnc_ranges_t cur_range, next_range;

	/* Print PNC Range Header */
	printk("==============================================================================================\n");
	printk(" Valid PnC ranges:                                                                            \n");
	printk("==============================================================================================\n");
	printk(" Range                        LU   Res Size Aging LU      Range         API      RSRV  Free     Num         Last    \n");
	printk("                                   Lvl      group skip  Start  End   Start  End  entr  entr     rsts        init        \n");
	printk("==============================================================================================\n");

	cur_range = -1;

	ret_code = tpm_db_pnc_rng_val_get_next(cur_range, &next_range, &range_data);
	IF_ERROR(ret_code);

	while (next_range != -1) {
		printk(" %24s    %2d   %2d %4d  %4d  %2d    %4d   %4d  %4d  %4d  %4d  %4d  %s\n",
		       pnc_rng_to_str(next_range),
		       range_data.pnc_range_conf.base_lu_id,
		       range_data.pnc_range_conf.min_reset_level,
		       range_data.pnc_range_conf.range_size,
		       range_data.pnc_range_conf.cntr_grp,
		       range_data.pnc_range_conf.lu_mask,
		       range_data.pnc_range_conf.range_start,
		       range_data.pnc_range_conf.range_end,
		       range_data.pnc_range_conf.api_start,
		       range_data.pnc_range_conf.api_end,
		       range_data.pnc_range_oper.free_entries,
		       range_data.pnc_range_oper.num_resets,
		       tpm_db_pnc_last_init_str[range_data.pnc_range_conf.init_last_entry].enumString);
		cur_range = next_range;
		ret_code = tpm_db_pnc_rng_val_get_next(cur_range, &next_range, &range_data);
		IF_ERROR(ret_code);
	}
	printk("================================================================================\n");
	return;
}

void tpm_print_pnc_shadow_range(uint32_t valid_only, uint32_t start, uint32_t end)
{
	uint32_t i;
	uint32_t valid_entry;
	tpm_pnc_all_t pnc_data;

	printk("======================================================================\n");
	printk(" Valid PnC shadow range:                                              \n");
	printk("======================================================================\n");

	if ((end >= (TPM_PNC_SIZE)) || (start > end)) {
		printk("Invalid params: start(%d) end(%d)\n", start, end);
		return;
	}

	for (i = start; i <= end; i++) {
		tpm_db_pnc_shdw_ent_get(i, &valid_entry, &pnc_data);
		if ((valid_only == TPM_FALSE) || (valid_entry == TPM_TRUE)) {
			printk("PNC Shadow Entry (%d)\n", i);
			tpm_pnc_print_sw_entry(&pnc_data);
		}
	}
	return;
}

void tpm_print_mh_port_vector_table(void)
{
	uint32_t i;

	printk("======================================================================\n");
	printk(" MH port vector table:                                                \n");
	printk("======================================================================\n");
	printk("=  REG#     UNI_VEC                 PNC_VEC               AMBER_VEC  =\n");
	printk("======================================================================\n");

	for (i = 0; i < TPM_TX_MAX_MH_REGS; i++) {
		printk("= %02d      0x%05x                0x%08x                 0x%04x   ==\n",
		       i, tpm_db.tpm_mh_port_vector_tbl[i].uni_vector,
		       tpm_db.tpm_mh_port_vector_tbl[i].pnc_vector, tpm_db.tpm_mh_port_vector_tbl[i].amber_port_vector);
	}
	printk("======================================================================\n");
	return;
}

void tpm_print_init_tables(void)
{
	tpm_print_etherports();
	tpm_print_rx_modules();
	tpm_print_tx_modules();
	tpm_print_gmac_config();
	tpm_print_gmac_func();
	tpm_print_bm_buffers();
	tpm_print_igmp();
	tpm_print_misc();
	tpm_print_owners();
	tpm_print_vlan_etype();
	tpm_print_mh_port_vector_table();
}

void tpm_print_api_dump_head(void)
{
	printk("==========================================================================================================================================================\n");
	printk("=  Section    Rule   Rule   PNC     Src_Port     Parse_BM      Parse_Flag_BM     Next       Pkt_Action          Target_Port         Mod_BM        Mod.   =\n");
	printk("=             No.    Ind.   Entry                                                Phase                       (Gem_Port)(Queue)                    Entry  =\n");
	printk("==========================================================================================================================================================\n");
}

char *tpm_db_src_port_str[] = {
       "UNI_0",
	"UNI_1",
	"UNI_2",
	"UNI_3",
	"UNI_4",
	"UNI_5",
	"UNI_6",
	"UNI_7",
	"UNI_VIRT",
	"WAN",
	"UNI_ANY",
	"PORT_ANY",
};

char *tpm_db_next_phase_str[] = {
	"L2",
	"L3",
	"IPv4",
	"IPv6_GEN",
	"IPv6_DIP",
	"IPv6_NH",
	"IPV6_L4",
	"CTC_CM",
	"DONE",
};

tpm_str_map_t tpm_db_none_parse_type_str[] = {
	{0, ""}
};

tpm_str_map_t tpm_db_l2_parse_type[] = {
	{TPM_L2_PARSE_MAC_DA, "DA"},
	{TPM_L2_PARSE_MAC_SA, "SA"},
	{TPM_L2_PARSE_ONE_VLAN_TAG, "ONE_TAG"},
	{TPM_L2_PARSE_TWO_VLAN_TAG, "TWO_TAGS"},
	{TPM_L2_PARSE_ETYPE, "ETYPE"},
	{TPM_L2_PARSE_PPPOE_SES, "PPPOE_SES"},
	{TPM_L2_PARSE_PPP_PROT, "PPP_PROT"},
	{TPM_L2_PARSE_GEMPORT, "GEMPORT"},
	{0, ""},
};

tpm_str_map_t tpm_db_l3_parse_type[] = {
	{TPM_L2_PARSE_ETYPE, "ETYPE"},
	{TPM_L2_PARSE_PPPOE_SES, "PPPOE_SES"},
	{TPM_L2_PARSE_PPP_PROT, "PPP_PROT"},
	{0, ""},
};

tpm_str_map_t tpm_db_ipv4_parse_type[] = {
	{TPM_IPv4_PARSE_SIP,        "IPV4_SRC"},
	{TPM_IPv4_PARSE_DIP,        "IPV4_DST"},
	{TPM_IPv4_PARSE_DSCP, "DSCP"},
	{TPM_IPv4_PARSE_PROTO,      "L4_PROTO"},
	{TPM_PARSE_L4_SRC, "L4_SRC"},
	{TPM_PARSE_L4_DST, "L4_DST"},
	{0, ""},
};

tpm_str_map_t tpm_db_ipv4_mc_parse_type[] = {
	{TPM_IPv4_PARSE_SIP, "SIP"},
	{TPM_IPv4_PARSE_DIP, "DIP"},
	{0, ""},
};

tpm_str_map_t tpm_db_ipv6_gen_parse_type[] = {
	{TPM_IPv6_PARSE_SIP, "SIP"},
	{TPM_IPv6_PARSE_DSCP, "DSCP"},
	{TPM_IPv6_PARSE_HOPL, "HOPL"},
	{0, ""},
};

tpm_str_map_t tpm_db_ipv6_gen_5t_parse_type[] = {
	{TPM_IPv6_PARSE_SIP, "SIP"},
	{TPM_PARSE_L4_SRC, "L4_SRC"},
	{TPM_PARSE_L4_DST, "L4_DST"},
	{0, ""},
};


tpm_str_map_t tpm_db_ipv6_dip_parse_type[] = {
	{TPM_IPv6_PARSE_DIP, "DIP"},
	{0, ""},
};

tpm_str_map_t tpm_db_ipv6_dip_5t_parse_type[] = {
	{TPM_IPv6_PARSE_SIP, "SIP"},
	{TPM_IPv6_PARSE_DIP, "DIP"},
	{TPM_PARSE_L4_SRC, "L4_SRC"},
	{TPM_PARSE_L4_DST, "L4_DST"},
	{0, ""},
};

tpm_str_map_t tpm_db_ipv6_mc_parse_type[] = {
	{TPM_IPv4_PARSE_DIP, "DIP"},
	{0, ""},
};

tpm_str_map_t tpm_db_ipv6_nh_parse_type[] = {
	{TPM_IPv6_PARSE_NH, "NH"},
	{0, ""},
};

tpm_str_map_t tpm_db_ipv6_l4_parse_type[] = {
	{TPM_PARSE_L4_SRC, "L4_SRC"},
	{TPM_PARSE_L4_DST, "L4_DST"},
	{0, ""},
};
tpm_str_map_t tpm_db_ctc_cm_parse_type[] = {
	{TPM_L2_PARSE_MAC_DA, "DA"},
	{TPM_L2_PARSE_MAC_SA, "SA"},
	{TPM_L2_PARSE_ONE_VLAN_TAG, "ONE_TAG"},
	{TPM_L2_PARSE_TWO_VLAN_TAG, "TWO_TAGS"},
	{TPM_L2_PARSE_ETYPE, "ETYPE"},
	{TPM_L2_PARSE_PPPOE_SES, "PPPOE_SES"},
	{TPM_L2_PARSE_PPP_PROT, "PPP_PROT"},

	{TPM_IPv4_PARSE_SIP << API_DUMP_IPV4_PARSE_BM_START,        "IPV4_SIP"},
	{TPM_IPv4_PARSE_DIP << API_DUMP_IPV4_PARSE_BM_START,        "IPV4_DIP"},
	{TPM_IPv4_PARSE_DSCP << API_DUMP_IPV4_PARSE_BM_START,       "IPV4_DSCP"},
	{TPM_IPv4_PARSE_PROTO << API_DUMP_IPV4_PARSE_BM_START,      "IPV4_PROTO"},
	{TPM_PARSE_L4_SRC << API_DUMP_IPV4_PARSE_BM_START,          "L4_SRC"},
	{TPM_PARSE_L4_DST << API_DUMP_IPV4_PARSE_BM_START,          "L4_DST"},

	{TPM_IPv6_PARSE_SIP << API_DUMP_IPV6_PARSE_BM_START,        "IPV6_SIP"},
	{TPM_IPv6_PARSE_DSCP << API_DUMP_IPV6_PARSE_BM_START,       "IPV6_DSCP"},
	{TPM_IPv6_PARSE_HOPL << API_DUMP_IPV6_PARSE_BM_START,       "IPV6_HOPL"},
	{TPM_IPv6_PARSE_DIP << API_DUMP_IPV6_PARSE_BM_START,        "IPV6_DIP"},
	{TPM_IPv6_PARSE_NH << API_DUMP_IPV6_PARSE_BM_START,         "IPV6_NH"},
	{TPM_PARSE_L4_SRC << API_DUMP_IPV6_PARSE_BM_START,          "L4_SRC"},
	{TPM_PARSE_L4_DST << API_DUMP_IPV6_PARSE_BM_START,          "L4_DST"},
	{0, ""},
};

tpm_str_map_t *tpm_db_parse_type_str[TPM_MAX_API_TYPES] = {
	/* TPM_API_MGMT */
	tpm_db_none_parse_type_str,
	/* TPM_API_MAC_LEARN */
	tpm_db_none_parse_type_str,
	/* TPM_API_DS_LOAD_BALANCE */
	tpm_db_l2_parse_type,
	/* TPM_API_CPU_LOOPBACK */
	tpm_db_none_parse_type_str,
	/* TPM_API_L2_PRIM */
	tpm_db_l2_parse_type,
	/* TPM_API_L3_TYPE */
	tpm_db_l3_parse_type,
	/* TPM_API_IPV4 */
	tpm_db_ipv4_parse_type,
	/* TPM_API_IPV4_MC */
	tpm_db_ipv4_mc_parse_type,
	/* TPM_API_IPV6_NH */
	tpm_db_ipv6_nh_parse_type,
	/* TPM_API_IPV6_L4 */
	tpm_db_ipv6_l4_parse_type,
	/* TPM_API_IPV6_GEN */
	tpm_db_ipv6_gen_parse_type,
	/* TPM_API_IPV6_DIP */
	tpm_db_ipv6_dip_parse_type,
	/* TPM_API_IPV6_MC */
	tpm_db_ipv6_mc_parse_type,
	/* TPM_API_CTC_CM */
	tpm_db_ctc_cm_parse_type,
};

tpm_str_map_t tpm_db_parse_flag_type_str[] = {
	{TPM_PARSE_FLAG_TAG1_TRUE, "TAG1_TRUE"},
	{TPM_PARSE_FLAG_TAG1_FALSE, "TAG1_FALSE"},
	{TPM_PARSE_FLAG_TAG2_TRUE, "TAG2_TRUE"},
	{TPM_PARSE_FLAG_TAG2_FALSE, "TAG2_FALSE"},
	{TPM_PARSE_FLAG_MTM_TRUE, "MTM_TRUE"},
	{TPM_PARSE_FLAG_MTM_FALSE, "MTM_FALSE"},
	{TPM_PARSE_FLAG_TO_CPU_TRUE, "TO_CPU_TRUE"},
	{TPM_PARSE_FLAG_TO_CPU_FALSE, "TO_CPU_FALSE"},
	{TPM_PARSE_FLAG_L4_UDP, "L4_UDP"},
	{TPM_PARSE_FLAG_L4_TCP, "L4_TCP"},
	{TPM_PARSE_FLAG_PPPOE_TRUE, "PPPOE_TRUE"},
	{TPM_PARSE_FLAG_PPPOE_FALSE, "PPPOE_FALSE"},
};

tpm_str_map_t tpm_db_action_type_str[] = {
	{TPM_ACTION_DROP_PK, "DROP_PK"},
	{TPM_ACTION_SET_TARGET_PORT, "SET_TRG_PORT"},
	{TPM_ACTION_SET_TARGET_QUEUE, "SET_TRG_Q"},
	{TPM_ACTION_SET_PKT_MOD, "SET_PKT_MOD"},
	{TPM_ACTION_TO_CPU, "TO_CPU"},
	{TPM_ACTION_MTM, "MTM"},
	{TPM_ACTION_CUST_CPU_PKT_PARSE, "CUST_PKT_PARSE"},
	{TPM_ACTION_SPEC_MC_VID, "SPEC_MC_VID"},
	{TPM_ACTION_UDP_CHKSUM_CALC, "UDP_CHKSUM_CALC"},
};

tpm_str_map_t tpm_db_target_type_str[] =
{
	{TPM_TRG_PORT_WAN,           "WAN_PORT"},
	{TPM_TRG_TCONT_0,            "TCONT_0"},
	{TPM_TRG_TCONT_1,            "TCONT_1"},
	{TPM_TRG_TCONT_2,            "TCONT_2"},
	{TPM_TRG_TCONT_3,            "TCONT_3"},
	{TPM_TRG_TCONT_4,            "TCONT_4"},
	{TPM_TRG_TCONT_5,            "TCONT_5"},
	{TPM_TRG_TCONT_6,            "TCONT_6"},
	{TPM_TRG_TCONT_7,            "TCONT_7"},
	{TPM_TRG_LLID_0,             "LLID_0"},
	{TPM_TRG_LLID_1,             "LLID_1"},
	{TPM_TRG_LLID_2,             "LLID_2"},
	{TPM_TRG_LLID_3,             "LLID_3"},
	{TPM_TRG_LLID_4,             "LLID_4"},
	{TPM_TRG_LLID_5,             "LLID_5"},
	{TPM_TRG_LLID_6,             "LLID_6"},
	{TPM_TRG_LLID_7,             "LLID_7"},
	{TPM_TRG_UNI_0,              "UNI_0"},
	{TPM_TRG_UNI_1,              "UNI_1"},
	{TPM_TRG_UNI_2,              "UNI_2"},
	{TPM_TRG_UNI_3,              "UNI_3"},
	{TPM_TRG_UNI_4,              "UNI_4"},
	{TPM_TRG_UNI_5,              "UNI_5"},
	{TPM_TRG_UNI_6,              "UNI_6"},
	{TPM_TRG_UNI_7,              "UNI_7"},
	{TPM_TRG_UNI_VIRT,           "UNI_VIRT"},
	{TPM_TRG_PORT_CPU,           "CPU"},
	{TPM_TRG_PORT_UNI_ANY,       "UNI_ANY"},
	{TPM_TRG_PORT_UNI_CPU_LOOP,  "UNI_CPU_LOOP"}
};
tpm_str_map_t tpm_db_mod_type_str[] = {
	{TPM_MH_SET, "MH_SET"},
	{TPM_MAC_DA_SET, "DA_SET"},
	{TPM_MAC_SA_SET, "SA_SET"},
	{TPM_VLAN_MOD, "VLAN_MOD"},
	{TPM_PPPOE_DEL, "PPPOE_DEL"},
	{TPM_PPPOE_ADD, "PPPOE_ADD"},
	{TPM_DSCP_SET, "DSCP_SET"},
	{TPM_TTL_DEC, "TTL_DEC"},
	{TPM_IPV4_UPDATE, "IPV4_UPDATE"},
	{TPM_IPV4_SRC_SET, "IPV4_SRC_SET"},
	{TPM_IPV4_DST_SET, "IPV4_DST_SET"},
	{TPM_IPV6_UPDATE, "IPV6_UPDATE"},
	{TPM_HOPLIM_DEC, "HOPLIM_DEC"},
	{TPM_IPV6_SRC_SET, "IPV6_SRC_SET"},
	{TPM_IPV6_DST_SET, "IPV6_DST_SET"},
	{TPM_L4_SRC_SET, "L4_SRC_SET"},
	{TPM_L4_DST_SET, "L4_DST_SET"},
};

char *tpm_db_mc_uni_mode_str[] = {
	"EXCLUDE",
	"TRANSPARENT",
	"STRIP",
	"TRANSLATE",
};

char *db_parse_type_to_str(uint32_t api_type, uint32_t parse_type)
{
	uint32_t i;
	tpm_init_ipv6_5t_enable_t ipv6_5t_enable;

	if (parse_type == 0)
		return "";

	if (api_type >= TPM_MAX_API_TYPES)
		return tpm_db_params_illegal_str;

	tpm_db_ipv6_5t_enable_get(&ipv6_5t_enable);
	if (ipv6_5t_enable == TPM_IPV6_5T_ENABLED) {
		tpm_db_parse_type_str[TPM_API_IPV6_GEN] = tpm_db_ipv6_gen_5t_parse_type;
		tpm_db_parse_type_str[TPM_API_IPV6_DIP] = tpm_db_ipv6_dip_5t_parse_type;
	}

	for (i = 0; tpm_db_parse_type_str[api_type][i].enum_in != 0; i++) {
		if (tpm_db_parse_type_str[api_type][i].enum_in == parse_type)
			return (&(tpm_db_parse_type_str[api_type][i].str_out[0]));
	}

	return tpm_db_params_illegal_str;
}

char *db_parse_flag_type_to_str(uint32_t parse_flag_type)
{
	uint32_t i;

	if (parse_flag_type == 0)
		return "";

	for (i = 0; i < (sizeof(tpm_db_parse_flag_type_str) / sizeof(tpm_str_map_t)); i++) {
		if (tpm_db_parse_flag_type_str[i].enum_in == parse_flag_type)
			return (&(tpm_db_parse_flag_type_str[i].str_out[0]));
	}

	return tpm_db_params_illegal_str;
}

char *db_target_type_to_str(uint32_t action_type, tpm_pkt_frwd_t  *pkt_frwd)
{
	static char target_str[50];
	char *port_str = "";
	char gem_str[10] = "";
	char q_str[10] = "";
	uint32_t i;
	tpm_dir_t            dir;
	tpm_db_pon_type_t    pon_type;
	tpm_gmacs_enum_t     act_wan = tpm_db_active_wan_get();

	memset(target_str, 0, sizeof(target_str));

	if (SET_TARGET_PORT(action_type)) {
		for (i = 0; i < (sizeof(tpm_db_target_type_str)/sizeof(tpm_str_map_t)); i++) {
			if (tpm_db_target_type_str[i].enum_in == pkt_frwd->trg_port) {
				port_str = &(tpm_db_target_type_str[i].str_out[0]);
				break;
			}
		}

		dir = TPM_DIR_US;
	/* Get pon_type */
		tpm_db_pon_type_get(&pon_type);

		if (TO_GPON(dir, pkt_frwd->trg_port, pon_type, act_wan)) {
			sprintf(gem_str, "%03d",  pkt_frwd->gem_port);
		}
	}

	if (SET_TARGET_QUEUE(action_type))
		sprintf(q_str, "Q%d",  pkt_frwd->trg_queue);


	sprintf(target_str, " %-9s %3s | %2s ", port_str, gem_str, q_str);

	return target_str;
}
char *db_action_type_to_str(uint32_t action_type)
{
	uint32_t i;

	if (action_type == 0)
		return "";

	for (i = 0; i < (sizeof(tpm_db_action_type_str) / sizeof(tpm_str_map_t)); i++) {
		if (tpm_db_action_type_str[i].enum_in == action_type)
			return (&(tpm_db_action_type_str[i].str_out[0]));
	}

	return tpm_db_params_illegal_str;
}

char *db_mod_type_to_str(uint32_t mod_type)
{
	uint32_t i;

	if (mod_type == 0)
		return "";

	for (i = 0; i < (sizeof(tpm_db_mod_type_str) / sizeof(tpm_str_map_t)); i++) {
		if (tpm_db_mod_type_str[i].enum_in == mod_type)
			return (&(tpm_db_mod_type_str[i].str_out[0]));
	}

	return tpm_db_params_illegal_str;
}

void tpm_print_api_dump_line(uint8_t first_rule,
			     uint8_t first_line,
			     uint32_t api_type,
			     uint32_t rule_num,
			     uint32_t rule_idx,
			     uint32_t pnc_entry,
			     uint32_t src_port,
			     uint32_t parse_type,
			     uint32_t parse_flag_type,
			     uint32_t next_phase,
			     uint32_t action_type,
			     uint32_t mod_type,
			     uint32_t mod_entry,
			     uint32_t set_port_q,
			     tpm_pkt_frwd_t *pkt_frwd)
{
	char rule_num_str[8] = "";
	char rule_idx_str[8] = "";
	char pnc_entry_str[8] = "";
	char mod_entry_str[8] = "";

	char *empty_str = "";

	char *api_type_str = empty_str;
	char *src_port_str = empty_str;
	char *next_phase_str = empty_str;

	char *parse_type_str = empty_str;
	char *parse_flag_type_str = empty_str;
	char *action_type_str = empty_str;
	char *mod_type_str = empty_str;
	char *target_port_q_str   = empty_str;

	if (first_line) {
		sprintf(rule_num_str, "%03d", rule_num);
		sprintf(rule_idx_str, "%03d", rule_idx);
		sprintf(pnc_entry_str, "%03d", pnc_entry);
		if (mod_entry != 0)
			sprintf(mod_entry_str, "%04d", mod_entry);

		if (first_rule) {
			if (api_type < TPM_MAX_API_TYPES)
				api_type_str = api_type_to_str(api_type);
			else
				api_type_str = tpm_db_params_illegal_str;
		}

		if (src_port <= TPM_SRC_PORT_WAN_OR_LAN)
			src_port_str = tpm_db_src_port_str[src_port];
		else
			src_port_str = tpm_db_params_illegal_str;

		if (next_phase <= STAGE_DONE)
			next_phase_str = tpm_db_next_phase_str[next_phase];
		else
			next_phase_str = tpm_db_params_illegal_str;

	}

	if (parse_type != 0)
		parse_type_str = db_parse_type_to_str(api_type, parse_type);

	if (parse_flag_type != 0)
		parse_flag_type_str = db_parse_flag_type_to_str(parse_flag_type);

	if (action_type != 0) {
		action_type_str = db_action_type_to_str(action_type);
	}

	if (set_port_q != 0)
		target_port_q_str = db_target_type_to_str(set_port_q, pkt_frwd);

	if (mod_type != 0)
		mod_type_str = db_mod_type_to_str(mod_type);

    printk("=  %8s | %4s | %4s | %5s | %8s | %13s | %13s | %8s | %16s |%20s| %12s | %6s  =\n",
		api_type_str, rule_num_str, rule_idx_str, pnc_entry_str,
		src_port_str, parse_type_str, parse_flag_type_str,
	       next_phase_str, action_type_str, target_port_q_str, mod_type_str, mod_entry_str);
}

void tpm_print_api_dump_rule(uint8_t first_rule,
				tpm_api_type_t api_type,
				uint32_t rule_num,
				uint32_t rule_idx, uint32_t pnc_entry, uint32_t mod_entry, tpm_rule_entry_t *rule)
{
	uint8_t first_line = TPM_TRUE;
	uint32_t src_port = TPM_SRC_PORT_ILLEGAL;
	uint32_t next_phase = STAGE_DONE;
	uint32_t parse_bm = 0;
	uint32_t parse_flag_bm = 0;
	uint32_t action_bm = 0;
	uint32_t mod_bm = 0;
	uint32_t tgt_port_bm = 0;
	uint32_t parse_type = 0x1;
	uint32_t parse_flag_type = 0x1;
	uint32_t action_type = 0x1;
	uint32_t mod_type = 0x1;
	uint32_t tgt_port = 0x1;
	uint32_t bit_cnt;
	uint32_t set_port_q = 0;
	tpm_pkt_frwd_t *pkt_frwd = NULL;
	tpm_pkt_frwd_t mc_frwd;

	if (rule == NULL)
		return;

	switch (api_type) {
	case TPM_API_L2_PRIM:
		src_port = rule->l2_prim_key.src_port;
		next_phase = rule->l2_prim_key.rule_action.next_phase;
		parse_bm = rule->l2_prim_key.parse_rule_bm;
		parse_flag_bm = rule->l2_prim_key.parse_flags_bm;
		action_bm = rule->l2_prim_key.rule_action.pkt_act;
		mod_bm = rule->l2_prim_key.pkt_mod_bm;
		pkt_frwd = &rule->l2_prim_key.pkt_frwd;
		break;

	case TPM_API_L3_TYPE:
		src_port = rule->l3_type_key.src_port;
		next_phase = rule->l3_type_key.rule_action.next_phase;
		parse_bm = rule->l3_type_key.parse_rule_bm;
		parse_flag_bm = rule->l3_type_key.parse_flags_bm;
		action_bm = rule->l3_type_key.rule_action.pkt_act;
		pkt_frwd  = &rule->l3_type_key.pkt_frwd;
		break;

	case TPM_API_IPV4:
		src_port = rule->ipv4_key.src_port;
		next_phase = rule->ipv4_key.rule_action.next_phase;
		parse_bm = rule->ipv4_key.parse_rule_bm;
		parse_flag_bm = rule->ipv4_key.parse_flags_bm;
		action_bm = rule->ipv4_key.rule_action.pkt_act;
		mod_bm = rule->ipv4_key.pkt_mod_bm;
		pkt_frwd = &rule->ipv4_key.pkt_frwd;
		break;

	case TPM_API_IPV4_MC:
		src_port = TPM_SRC_PORT_WAN;
		parse_bm = TPM_IPv4_PARSE_DIP;
		if (rule->ipv4_mc_key.ignore_ipv4_src == 0)
			parse_bm |= TPM_IPv4_PARSE_SIP;
		mod_bm = 0;	/* ?? */
		/*mc_frwd is only used to print target port and target queue for api_dump*/
		action_bm = TPM_ACTION_SET_TARGET_PORT | TPM_ACTION_SET_TARGET_QUEUE;
		mc_frwd.trg_port = rule->ipv4_mc_key.dest_port_bm;
		mc_frwd.trg_queue = tpm_db.igmp_def.mc_hwf_queue;
		pkt_frwd = &mc_frwd;
		break;

	case TPM_API_IPV6_GEN:
		src_port = rule->ipv6_gen_key.src_port;
		next_phase = rule->ipv6_gen_key.rule_action.next_phase;
		parse_bm = rule->ipv6_gen_key.parse_rule_bm;
		parse_flag_bm = rule->ipv6_gen_key.parse_flags_bm;
		action_bm = rule->ipv6_gen_key.rule_action.pkt_act;
		mod_bm = rule->ipv6_gen_key.pkt_mod_bm;
		pkt_frwd = &rule->ipv6_gen_key.pkt_frwd;
		break;

	case TPM_API_IPV6_DIP:
		src_port = rule->ipv6_dip_key.src_port;
		next_phase = rule->ipv6_dip_key.rule_action.next_phase;
		parse_bm = rule->ipv6_dip_key.parse_rule_bm;
		parse_flag_bm = rule->ipv6_dip_key.parse_flags_bm;
		action_bm = rule->ipv6_dip_key.rule_action.pkt_act;
		mod_bm = rule->ipv6_dip_key.pkt_mod_bm;
		pkt_frwd = &rule->ipv6_dip_key.pkt_frwd;
		break;

	case TPM_API_IPV6_NH:
		src_port = TPM_SRC_PORT_WAN_OR_LAN;
		next_phase = rule->ipv6_nh_key.rule_action.next_phase;
		parse_bm = rule->ipv6_nh_key.parse_rule_bm;
		parse_flag_bm = rule->ipv6_nh_key.parse_flags_bm;
		action_bm = rule->ipv6_nh_key.rule_action.pkt_act;
		pkt_frwd = &rule->ipv6_nh_key.pkt_frwd;
		break;

	case TPM_API_IPV6_L4:
		src_port = rule->ipv6_l4_key.src_port;
		next_phase = rule->ipv6_l4_key.rule_action.next_phase;
		parse_bm = rule->ipv6_l4_key.parse_rule_bm;
		parse_flag_bm = rule->ipv6_l4_key.parse_flags_bm;
		action_bm = rule->ipv6_l4_key.rule_action.pkt_act;
		mod_bm = rule->ipv6_l4_key.pkt_mod_bm;
		pkt_frwd = &rule->ipv6_l4_key.pkt_frwd;
		break;

	case TPM_API_IPV6_MC:
		src_port = TPM_SRC_PORT_WAN;
		parse_bm = TPM_IPv6_PARSE_DIP;
		mod_bm = 0;	/* ?? */
		/*mc_frwd is only used to print target port and target queue for api_dump*/
		action_bm = TPM_ACTION_SET_TARGET_PORT | TPM_ACTION_SET_TARGET_QUEUE;
		mc_frwd.trg_port = rule->ipv6_mc_key.dest_port_bm;
		mc_frwd.trg_queue = tpm_db.igmp_def.mc_hwf_queue;
		pkt_frwd = &mc_frwd;
		break;

	case TPM_API_CNM:
		src_port = rule->cnm_key.src_port;
		parse_bm = rule->cnm_key.l2_parse_rule_bm;
		parse_bm |= (rule->cnm_key.ipv4_parse_rule_bm << API_DUMP_IPV4_PARSE_BM_START);
		parse_bm |= (rule->cnm_key.ipv6_parse_rule_bm << API_DUMP_IPV6_PARSE_BM_START);
		action_bm = rule->cnm_key.pkt_act;
		pkt_frwd = &rule->cnm_key.pkt_frwd;
		break;
	default:
		return;
	}

	action_bm &= 0xFFFF;	/* DON'T show the internal actions! */
	tgt_port_bm = pkt_frwd->trg_port;

	set_port_q = action_bm & (TPM_ACTION_SET_TARGET_PORT | TPM_ACTION_SET_TARGET_QUEUE);

	do {
		if (parse_bm != 0) {
			for (bit_cnt = 0; (parse_bm & 0x1) == 0; parse_bm = parse_bm >> 1, bit_cnt++)
				;
			parse_type = parse_type << bit_cnt;
		} else
			parse_type = 0;

		if (parse_flag_bm != 0) {
			for (bit_cnt = 0; (parse_flag_bm & 0x1) == 0; parse_flag_bm = parse_flag_bm >> 1, bit_cnt++)
				;
			parse_flag_type = parse_flag_type << bit_cnt;
		} else
			parse_flag_type = 0;

		if (action_bm != 0) {
			for (bit_cnt = 0; (action_bm & 0x1) == 0; action_bm = action_bm >> 1, bit_cnt++)
				;
			action_type = action_type << bit_cnt;
		} else
			action_type = 0;

		if (mod_bm != 0) {
			for (bit_cnt = 0; (mod_bm & 0x1) == 0; mod_bm = mod_bm >> 1, bit_cnt++)
				;
			mod_type = mod_type << bit_cnt;
		} else
			mod_type = 0;

		if (tgt_port_bm != 0) {
			for (bit_cnt = 0; (tgt_port_bm & 0x1) == 0; tgt_port_bm = tgt_port_bm >> 1, bit_cnt++)
				;
			tgt_port = tgt_port << bit_cnt;
			pkt_frwd->trg_port = tgt_port;
		} else
			pkt_frwd->trg_port = 0;


		tpm_print_api_dump_line(first_rule, first_line, api_type, rule_num, rule_idx,
					pnc_entry, src_port, parse_type, parse_flag_type, next_phase,
					action_type, mod_type, mod_entry, set_port_q, pkt_frwd);

		first_line = TPM_FALSE;
		set_port_q &= ~TPM_ACTION_SET_TARGET_QUEUE;

		parse_bm &= ~0x1;
		parse_flag_bm &= ~0x1;
		action_bm &= ~0x1;
		mod_bm &= ~0x1;
		tgt_port_bm &= ~0x1;

		if ((parse_bm == 0) && (parse_flag_bm == 0) && (action_bm == 0) && (mod_bm == 0) && (tgt_port_bm == 0))
			break;

	} while (TPM_TRUE);

}

void tpm_print_api_dump(tpm_api_type_t api_type)
{
	int8_t first_rule = 1;
	int32_t current_rule, rcode;
	int32_t rule_index;
	int32_t bi_dir;
	int32_t next_rule;
	int32_t rule_num;
	tpm_rule_entry_t tpm_rule;
	tpm_error_code_t tpm_ret;
	tpm_db_mod_conn_t mod_con;
	tpm_db_pnc_conn_t pnc_con;
	tpm_api_sections_t api_section;
	char *api_type_str = "";

	tpm_print_api_dump_head();

	tpm_db_api_section_get_from_api_type(api_type, &api_section);
	current_rule = -1;

	tpm_ret = tpm_db_api_entry_val_get_next(api_section, current_rule, &next_rule, &rule_index,
						&bi_dir, &tpm_rule, &mod_con, &pnc_con);

	if (-1 == next_rule) {
		if (api_type < TPM_MAX_API_TYPES)
			api_type_str = api_type_to_str(api_type);
		else
			api_type_str = tpm_db_params_illegal_str;

		printk("=  %8s | %4s | %4s | %5s | %8s | %13s | %13s | %8s | %16s |%20s| %12s | %5s   =\n",
		       api_type_str, "", "", "", "", "", "", "", "", "", "", "");
	}

	while (-1 != next_rule) {
		if (first_rule == 0)
			printk("=           |------+------+-------+----------+---------------+---------------+----------+------------------+--------------------+--------------+---------=\n");
		/* Get the rule_num */
		rcode = tpm_db_api_rulenum_get(api_section, rule_index, &rule_num);
		if (rcode != TPM_DB_OK) {
			printk("get DB failed: %d\n", rcode);
			return;
		}

		tpm_print_api_dump_rule(first_rule, api_type, rule_num, rule_index, pnc_con.pnc_conn_tbl[0].pnc_index,
					mod_con.mod_cmd_ind, &tpm_rule);

		tpm_ret = tpm_db_api_entry_val_get_next(api_section, next_rule, &next_rule, &rule_index,
							&bi_dir, &tpm_rule, &mod_con, &pnc_con);
		first_rule = 0;
	}

	printk("==========================================================================================================================================================\n");
	return;
}

void tpm_print_api_dump_all(void)
{
	tpm_api_type_t api_type;

	tpm_api_sections_t api_section;
	uint32_t api_rng_size;
	uint32_t num_valid_entries;
	tpm_pnc_ranges_t prim_pnc_range;
	int32_t last_valid_entry;
	uint32_t tbl_start;
	tpm_db_pnc_range_conf_t range_conf;

	printk("\n");
	for (api_type = TPM_API_L2_PRIM; api_type < TPM_MAX_API_TYPES; api_type++) {
		tpm_db_api_section_get_from_api_type(api_type, &api_section);
		tpm_db_api_section_get(api_section, &api_rng_size, &num_valid_entries,
					&prim_pnc_range, &last_valid_entry, &tbl_start);

		/* Get Range Conf */
		tpm_db_pnc_rng_conf_get(prim_pnc_range, &range_conf);

		tpm_print_api_dump(api_type);
		printk("\n");
	}

	return;
}

int tpm_print_sram_next_lookup(struct tcam_entry *te, char *buf)
{
	unsigned int word;
	unsigned int lookup;

	word = LU_DONE_OFFS / DWORD_LEN;
	lookup = te->sram.word[word] >> (LU_DONE_OFFS % DWORD_LEN);
	lookup &= 0x1;

	if (lookup)
		return sprintf(buf, " D");

	word = LU_ID_OFFS / DWORD_LEN;
	lookup = te->sram.word[word] >> (LU_ID_OFFS % DWORD_LEN);
	lookup &= LU_MASK;

	return sprintf(buf, " %d", lookup);
}

int tpm_print_sram_next_lookup_shift(struct tcam_entry *te, char *buf)
{
	unsigned int word, value;

	word = NEXT_LU_SHIFT_OFFS / DWORD_LEN;
	value = te->sram.word[word] >> (NEXT_LU_SHIFT_OFFS % DWORD_LEN);
	value &= SHIFT_IDX_MASK;

	if (value)
		return sprintf(buf, " %1d", value);

	return sprintf(buf, " -");
}

int tpm_print_sram_shift_update(struct tcam_entry *te, char *buf)
{
	unsigned int word;
	unsigned int index;
	unsigned int value;

	word = SHIFT_VAL_OFFS / DWORD_LEN;
	value = te->sram.word[word] >> (SHIFT_VAL_OFFS % DWORD_LEN);
	value &= SHIFT_VAL_MASK;

	word = SHIFT_IDX_OFFS / DWORD_LEN;
	index = te->sram.word[word] >> (SHIFT_IDX_OFFS % DWORD_LEN);
	index &= SHIFT_IDX_MASK;

	if (value)
		return sprintf(buf, " [%2.2d]=%3.3d", index, value);

	return sprintf(buf, " [ 0]= 0");
}

int tpm_print_sram_rxq(struct tcam_entry *te, char *buf)
{
	unsigned int rxq, force;

	rxq = sram_sw_get_rxq(te, &force);
	if (rxq)
		return sprintf(buf, " %1.1sQ%1.1d", force ? "f" : " ", rxq);

	return sprintf(buf, " ---");
}

int tpm_print_sram_ainfo(struct tcam_entry *te, char *buf)
{
	unsigned int word, shift, data, mask;
	int i, off = 0;

	word = AI_VALUE_OFFS / DWORD_LEN;
	shift = AI_VALUE_OFFS % DWORD_LEN;
	data = ((te->sram.word[word] >> shift) & AI_MASK);
	shift = AI_MASK_OFFS % DWORD_LEN;
	mask = ((te->sram.word[word] >> shift) & AI_MASK);

	if (mask) {
		for (i = 0; i < AI_BITS; i++) {
			if (mask & (1 << i))
				off += sprintf(buf + off, "%d", ((data & (1 << i)) != 0));
			else
				off += sprintf(buf + off, "x");
		}
	} else
		off += sprintf(buf + off, "-------");

	return off;
}

int tpm_print_tcam_ainfo(struct tcam_entry *te, char *buf)
{
	int i, data, mask;
	int off = 0;

	mask = ((te->mask.u.word[AI_WORD] >> AI_OFFS) & AI_MASK);
	if (mask == 0)
		off += sprintf(buf + off, "-------");
	else {
		data = ((te->data.u.word[AI_WORD] >> AI_OFFS) & AI_MASK);
		for (i = 0; i < AI_BITS; i++)
			if (mask & (1 << i))
				off += sprintf(buf + off, "%d", ((data & (1 << i)) != 0));
			else
				off += sprintf(buf + off, "x");
	}

	return off;
}

int tpm_print_tcam_port_mask(unsigned int port_mask, char *buf)
{
	int off = 0;

	if (port_mask & 1)
		off += sprintf(buf + off, "--,");
	else
		off += sprintf(buf + off, "P ,");

	if (port_mask & 4)
		off += sprintf(buf + off, "--,");
	else
		off += sprintf(buf + off, "G0,");

	if (port_mask & 0x10)
		off += sprintf(buf + off, "--");
	else
		off += sprintf(buf + off, "G1");

	return off;
}

int tpm_print_sram_rinfo(struct tcam_entry *te, char *buf, unsigned int buf_len)
{
	unsigned int word, shift, rinfo_val, rinfo_mask;
	int off = 0;
	int i;

	word = RI_VALUE_OFFS / DWORD_LEN;
	shift = RI_VALUE_OFFS % DWORD_LEN;
	rinfo_val = ((te->sram.word[word] >> shift) & RI_MASK);

	word = RI_MASK_OFFS / DWORD_LEN;
	shift = RI_MASK_OFFS % DWORD_LEN;
	rinfo_mask = ((te->sram.word[word] >> shift) & RI_MASK);
	word++;
	rinfo_mask |= (te->sram.word[word] & 0x3FFFF) << 6;

	if (rinfo_val & 1)
		/* discard */
		off += sprintf(buf + off, "DIS ");

	/* L4 */
	if ((rinfo_val & 0x6) == 0x2)
		/* UDP */
		off += sprintf(buf + off, "UDP ");
	else if ((rinfo_val & 0x6) == 0x6)
		/* other */
		off += sprintf(buf + off, "L4-OTH ");
#if 0
    this code snippet is ifdefed till mask bits are supported in LSP
    to refrain from flooding with TCP
	else if ((rinfo_val & 0x6) == 0x0)
		/* TCP */
		off += sprintf(buf + off, "TCP ");
#endif

	/* L3 */
	if ((rinfo_val & 0x18) == 0x18)
		/* IPv4 not fragmented */
		off += sprintf(buf + off, "IPV4_NF ");
	else if ((rinfo_val & 0x18) == 0x8)
		/* IPv6 */
		off += sprintf(buf + off, "IPV6 ");
	else if ((rinfo_val & 0x18) == 0x10)
		/* IPv4 fragmented */
		off += sprintf(buf + off, "IPV4_FR ");
#if 0
    this code snippet is ifdefed till mask bits are supported in LSP
    to refrain from flooding with L3_OTH
	else if ((rinfo_val & 0x18) == 0x0)
		/* other */
		off += sprintf(buf + off, "L3_OTH ");
#endif

#if 0
	/* First fragmented */
	if (rinfo_val & 0x20)
		off += sprintf(buf + off, "ff ");
#endif

	/* Filtering method */
	if (rinfo_val & 0x1c0)
		off += sprintf(buf + off, "ERR FM-%d ", (rinfo_val & 0x1c0) >> 6);

	/* packet discard decision */
	if (rinfo_val & 0x200)
		off += sprintf(buf + off, "COL ");

#if 0
	/* TX port */
	if (rinfo_val & 0x3c00)
		off += sprintf(buf + off, "txp-%d ", (rinfo_val & 0x3c00) >> 10);
#endif

	/* Marvell Header */
	if (rinfo_val & 0x3c000)
		off += sprintf(buf + off, "MH_REG-%d ", (rinfo_val & 0x3c000) >> 14);

#if 0
	if (rinfo_val & 0x3c0000)
		off += sprintf(buf + off, "gen-%d ", (rinfo_val & 0x3c0000) >> 14);

	if (rinfo_val & 0xc00000)
		off += sprintf(buf + off, "prof-%d ", (rinfo_val & 0xc00000) >> 18);
#endif

	for (i = off; i < buf_len; i++)
		off += sprintf(buf + off, " ");

	return off;
}

int tpm_print_tcam(unsigned int print_index, struct tcam_entry *te, char *buf)
{
	unsigned int    *p_data = (unsigned int *)&te->data;
	unsigned int    *p_sram = (unsigned int *)&te->sram;
	unsigned int    *p_mask = (unsigned int *)&te->mask;
	unsigned int    value;
	unsigned int    mask;
	unsigned int    off = 0;
	int             i;
	unsigned int    port_val, port_mask, lookup_val, lookup_mask;
	unsigned int    bitmap_mask;
	unsigned int    shift;

	/* hw entry id */
	if (print_index)
		off += sprintf(buf + off, "[%4d]\n", te->ctrl.index);

	/* get LU value/mask */
	tcam_sw_get_lookup(te, &lookup_val, &lookup_mask);

	/* print the LU value */
	off += sprintf(buf + off, "    %1.1x ", lookup_val);

	/* print the port */
	tcam_sw_get_port(te, &port_val, &port_mask);
	off += tpm_print_tcam_port_mask(port_mask, buf + off);
	off += sprintf(buf+off, "  ");

	/* print tcam data bits */
	i = 0;
	while (i < TCAM_LEN - 1) {
		value = MV_BYTE_SWAP_32BIT(MV_32BIT_LE_FAST(p_data[i]));
		mask  = MV_BYTE_SWAP_32BIT(MV_32BIT_LE_FAST(p_mask[i]));

		for (shift = 28, bitmap_mask = 0xf0000000; bitmap_mask; shift -= 4) {
			if (bitmap_mask & mask)
				off += sprintf(buf + off, "%1.1x", (bitmap_mask & value) >> shift);
			else
				off += sprintf(buf + off, "-");
			bitmap_mask = bitmap_mask >> 4;
		}
		off += sprintf(buf + off, " ");
		i++;
	}

	/* print sram next LU */
	off += tpm_print_sram_next_lookup(te, buf + off);

	/* print sram next LU shift */
	off += tpm_print_sram_next_lookup_shift(te, buf + off);

	/* print sram next shift update */
	off += tpm_print_sram_shift_update(te, buf + off);

	/* print sram next RX queue */
	off += tpm_print_sram_rxq(te, buf + off);

	/* print entry name */
	if (!strncmp("empty", te->ctrl.text, 5))
		off += sprintf(buf + off, "                 ");
	else
		off += sprintf(buf + off, " %-16s", te->ctrl.text);
	off += sprintf(buf+off, " ");

	/* print sram aditional info (AI) */
	off += tpm_print_sram_ainfo(te, buf + off);

	/* print sram flow ID value */
	off += sprintf(buf + off, " %8.8x", p_sram[0]);

	off += sprintf(buf + off, "\n");

	/* print the LU mask */
	off += sprintf(buf + off, "    %1.1x ", lookup_mask);

	/* print tcam aditional info (AI) */
	off += tpm_print_tcam_ainfo(te, buf + off);
	off += sprintf(buf + off, "   ");

	/* print the tcam mask bits */
	i = 0;
	while (i < TCAM_LEN - 1) {
		mask  = MV_BYTE_SWAP_32BIT(MV_32BIT_LE_FAST(p_mask[i]));

		for (shift = 28, bitmap_mask = 0xf0000000; bitmap_mask; shift -= 4) {
			if (bitmap_mask & mask)
				off += sprintf(buf + off, "%1.1x", (bitmap_mask & mask) >> shift);
			else
				off += sprintf(buf + off, "-");
			bitmap_mask = bitmap_mask >> 4;
		}
		off += sprintf(buf + off, " ");
		i++;
	}
	off += sprintf(buf + off, " ");

	/* print sram result info */
	off += tpm_print_sram_rinfo(te, buf + off, 42);

	/* print sram flow ID mask */
	value = p_sram[1];
	for (bitmap_mask = 0x80; bitmap_mask; shift--) {
		if (bitmap_mask & value)
			off += sprintf(buf + off, "f");
		else
			off += sprintf(buf + off, "0");
		bitmap_mask = bitmap_mask >> 1;
	}

	off += sprintf(buf + off, "\n");

	return off;
}

void tpm_print_pnc_field_desc(void)
{
#ifdef CONFIG_MV_TPM_SYSFS_HELP
    printk("    ------------------------------ T C A M -------------------------  --------------- S R A M ----------------------------\n");
    printk("    +--- LU ID                                            Shift Update ---+    Entry name ---+    modL [3:0]   GEM [23:12]\n");
    printk("    | +--- Port/s                                  Next LU Shift reg ---+ |                  |    modM [7:4]   txp [27:24]\n");
    printk("    | |        +--- words value                             Next LU --+ | |  RxQ -+   +------+    modH [9:8]    +-- FlowID\n");
    printk("    | |        |                                                      | | |       |   |                +--AI    |\n");
    printk("    . [.,..,.] [......0 .......1 .......2 .......3 .......4 ......5]  . . [.....] [.] [..............] [.....]  [........]\n");
    printk("    . [.....]  [......0 .......1 .......2 .......3 .......4 ......5]  [.......................................] [........]\n");
    printk("    | |                                                            |  |                                        |\n");
    printk("    | +--- AI                                                      |  |                         FlowID mask ---+\n");
    printk("    +--- LU ID mask                                  words mask ---+  +--- SRAM RI\n");
#endif
}

int tpm_print_pnc(void)
{
	int i;
	struct tcam_entry te;
	char buff[1024];

	tpm_print_pnc_field_desc();
	for (i = 0; i < CONFIG_MV_PNC_TCAM_LINES; i++) {
		tcam_sw_clear(&te);
		tcam_hw_read(&te, i);
		if (te.ctrl.flags & TCAM_F_INV)
			continue;
		tpm_print_tcam(1, &te, buff);
		printk(buff);
	}

	return 0;
}
unsigned int tpm_tcam_hw_hits_hist_print(unsigned int   seq,
					 unsigned int   shift,
					 unsigned int   last_val,
					 unsigned int   new_val,
					 unsigned int   print_pnc)
{
	unsigned int off = 0;
	unsigned int pnc_new_entry  = (new_val >> shift) & 0x3FF;
	unsigned int pnc_last_entry = (last_val >> shift) & 0x3FF;
	char         buff[1024];

	off += sprintf(buff + off, "%d - %3.3d", seq, pnc_new_entry);
	if (pnc_new_entry != 0) {
		if (pnc_new_entry == pnc_last_entry)
			off += sprintf(buff + off, " *\n");
		else
			off += sprintf(buff + off, "\n");

		if (print_pnc) {
			struct tcam_entry te;

			tcam_sw_clear(&te);
			tcam_hw_read(&te, pnc_new_entry);
			if (!(te.ctrl.flags & TCAM_F_INV))
				off += tpm_print_tcam(0, &te, buff + off);
		}
		if (pnc_new_entry == pnc_last_entry) {
			printk(buff);
			return 0;
		}
	}
	off += sprintf(buff + off, "\n");
	printk(buff);

	return 0;
}


void tpm_tcam_hw_record(int port)
{
	MV_REG_WRITE(MV_PNC_HIT_SEQ0_REG, (port << 1) | 1);
}


int tpm_tcam_hw_hits(unsigned int print_pnc)
{
	unsigned int            new_val;
	static unsigned int     last_read[3] = {0, 0, 0};

	printk("seq hit recurring\n");
	printk("--- --- ---------\n");

	new_val = MV_REG_READ(MV_PNC_HIT_SEQ0_REG);
	tpm_tcam_hw_hits_hist_print(0, 10, last_read[0], new_val, print_pnc);
	tpm_tcam_hw_hits_hist_print(1, 20, last_read[0], new_val, print_pnc);
	last_read[0] = new_val;

	new_val = MV_REG_READ(MV_PNC_HIT_SEQ1_REG);
	tpm_tcam_hw_hits_hist_print(2,  0, last_read[1], new_val, print_pnc);
	tpm_tcam_hw_hits_hist_print(3, 10, last_read[1], new_val, print_pnc);
	tpm_tcam_hw_hits_hist_print(4, 20, last_read[1], new_val, print_pnc);
	last_read[1] = new_val;

	new_val = MV_REG_READ(MV_PNC_HIT_SEQ2_REG);
	tpm_tcam_hw_hits_hist_print(5,  0, last_read[2], new_val, print_pnc);
	tpm_tcam_hw_hits_hist_print(6, 10, last_read[2], new_val, print_pnc);
	tpm_tcam_hw_hits_hist_print(7, 20, last_read[2], new_val, print_pnc);
	last_read[2] = new_val;

	return 0;
}

int tpm_age_pnc_dump(void)
{
	unsigned int        tid, reg_val;
	char                buff[1024];
	struct tcam_entry   te;
	unsigned int        off;

	for (tid = 0; tid < CONFIG_MV_PNC_TCAM_LINES; tid++) {
		reg_val = mvPncAgingCntrRead(tid);

		if (!(reg_val & PNC_AGING_CNTR_MASK))
			continue;

		off = 0;
		off += sprintf(buff + off, "[%4d]: gr=%d - %10u", tid,
			       ((reg_val & PNC_AGING_GROUP_ALL_MASK) >> PNC_AGING_GROUP_OFFS),
			       ((reg_val & PNC_AGING_CNTR_MASK) >> PNC_AGING_CNTR_OFFS));

		if (reg_val & PNC_AGING_READ_LU_LOG_MASK)
			off += sprintf(buff + off, ", LU_READ");

		if (reg_val & PNC_AGING_READ_MU_LOG_MASK)
			off += sprintf(buff + off, ", MU_READ");

		if (reg_val & PNC_AGING_SKIP_LU_SCAN_MASK)
			off += sprintf(buff + off, ", LU_SKIP");

		if (reg_val & PNC_AGING_SKIP_MU_SCAN_MASK)
			off += sprintf(buff + off, ", MU_SKIP");

		off += sprintf(buff + off, "\n");
		printk(buff);

		tcam_sw_clear(&te);
		tcam_hw_read(&te, tid);

		if (!(te.ctrl.flags & TCAM_F_INV)) {
			tpm_print_tcam(0, &te, buff);
			printk(buff);
		}
	}

	return 0;
}

int tpm_age_pnc_dump_live(void)
{
	unsigned int        tid, reg_val;
	unsigned int        off;
	struct tcam_entry   te;
	char                buff[1024];
	unsigned int        tpm_age_first[CONFIG_MV_PNC_TCAM_LINES];

	for (tid = 0; tid < CONFIG_MV_PNC_TCAM_LINES; tid++)
		tpm_age_first[tid] = mvPncAgingCntrRead(tid);

	msleep(1000);

	for (tid = 0; tid < CONFIG_MV_PNC_TCAM_LINES; tid++) {
		reg_val = mvPncAgingCntrRead(tid);

		if (!(reg_val & PNC_AGING_CNTR_MASK))
			continue;

		if (tpm_age_first[tid] == reg_val)
			continue;

		off = 0;
		off += sprintf(buff + off, "[%4d]: gr=%d - %10u", tid,
			       ((reg_val & PNC_AGING_GROUP_ALL_MASK) >> PNC_AGING_GROUP_OFFS),
			       ((reg_val & PNC_AGING_CNTR_MASK) >> PNC_AGING_CNTR_OFFS));

		if (reg_val & PNC_AGING_READ_LU_LOG_MASK)
			off += sprintf(buff + off, ", LU_READ");

		if (reg_val & PNC_AGING_READ_MU_LOG_MASK)
			off += sprintf(buff + off, ", MU_READ");

		if (reg_val & PNC_AGING_SKIP_LU_SCAN_MASK)
			off += sprintf(buff + off, ", LU_SKIP");

		if (reg_val & PNC_AGING_SKIP_MU_SCAN_MASK)
			off += sprintf(buff + off, ", MU_SKIP");

		off += sprintf(buff + off, "\n");
		printk(buff);

		tcam_sw_clear(&te);
		tcam_hw_read(&te, tid);

		if (!(te.ctrl.flags & TCAM_F_INV)) {
			tpm_print_tcam(0, &te, buff);
			printk(buff);
		}
	}
	return 0;
}

void tpm_print_mc_vlan_cfg_head(void)
{
	print_horizontal_line(65);
	printk("=    MC VLAN      MC AI       Port        Mode      UNI MC VLAN =\n");
	print_horizontal_line(65);
}

void tpm_print_mc_vlan_cfg(tpm_mc_vid_cfg_t *mc_vid_cfg)
{
	int32_t src_port;
	char *src_port_str = "";
	char *mc_mode_str  = "";

	for (src_port = 0; src_port < TPM_MAX_NUM_UNI_PORTS; src_port++) {
		src_port_str = tpm_db_src_port_str[mc_vid_cfg->mc_vid_port_vids[src_port].tpm_src_port];
		mc_mode_str  = tpm_db_mc_uni_mode_str[mc_vid_cfg->mc_vid_port_vids[src_port].mc_uni_port_mode];
		printk("=  %11s | %8s |   %4s  |  %11s |", "", "", src_port_str, mc_mode_str);

		if (TPM_MC_UNI_MODE_TRANSLATE == mc_vid_cfg->mc_vid_port_vids[src_port].mc_uni_port_mode)
			printk("  %4d %4s=\n", mc_vid_cfg->mc_vid_port_vids[src_port].uni_port_vid, "");
		else
			printk("%11s=\n", "");
	}
	return;
}

void tpm_print_mc_vlan_cfg_all(void)
{
	uint32_t i, rcode;
	uint32_t ai_bit;
	uint32_t first_rule = 1;

	tpm_print_mc_vlan_cfg_head();
	for (i = 0; i < TPM_MC_VID_NUM_MAX; i++) {
		if (true == tpm_db.mc_vid_port_cfg[i].valid) {
			if (!first_rule)
				printk("=--------------|----------|----------|--------------|-----------=\n");

			rcode = tpm_db_mc_vlan_get_ai_bit(tpm_db.mc_vid_port_cfg[i].mc_vid, &ai_bit);
			if (rcode != TPM_DB_OK) {
				printk("get DB failed: %d\n", rcode);
				return;
			}
			printk("=     %4d     |    %2x    |%10s|%14s|%11s=\n",
				tpm_db.mc_vid_port_cfg[i].mc_vid, ai_bit, "", "", "");

			tpm_print_mc_vlan_cfg(&tpm_db.mc_vid_port_cfg[i]);
			first_rule = 0;
		}
	}
	print_horizontal_line(65);

	return;
}

void tpm_print_section_free_szie(tpm_api_type_t api_type)
{
	int32_t section_free_szie = 0;
	tpm_error_code_t rcode;

	rcode = tpm_get_section_free_size(api_type, &section_free_szie);
	if (rcode == TPM_OK)
		printk("Section free size: %4d\n", section_free_szie);

	return;
}

void tpm_print_gpon_omci_channel(void)
{
	uint32_t is_valid;
	tpm_gem_port_key_t gem_port = 0;
	uint32_t cpu_rx_queue;
	uint32_t cpu_tx_queue = 0;
	tpm_trg_port_type_t tcont_num;
	tpm_error_code_t rcode;

	rcode = tpm_omci_get_channel(&is_valid, &gem_port, &cpu_rx_queue, &tcont_num, &cpu_tx_queue);
	if (rcode == TPM_OK)
		printk("Valid = %d GEM = %d CPU_RX queue = %d CPU_TX queue = %d Tcont = 0x%4.4x\n",
		is_valid, gem_port, cpu_rx_queue, cpu_tx_queue, tcont_num);

	return;
}

void tpm_print_epon_oam_channel(void)
{
	uint32_t is_valid;
	uint32_t cpu_rx_queue;
	tpm_trg_port_type_t llid_num;
	tpm_error_code_t rcode;

	rcode = tpm_oam_epon_get_channel(&is_valid, &cpu_rx_queue, &llid_num);
	if (rcode == TPM_OK)
		printk("Valid = %d RX queue = %d LLID = 0x%4.4x\n", is_valid, cpu_rx_queue, llid_num);

	return;
}

void tpm_print_busy_apis(void)
{
	tpm_api_type_t i;
	uint32_t temp_api_busy_rulenums[TPM_MAX_PARALLEL_API_CALLS];
	uint32_t num_busy, j;

	for (i=0;i<TPM_MAX_API_TYPES;i++) {
		memset(&temp_api_busy_rulenums[0], 0, sizeof(temp_api_busy_rulenums));
		tpm_db_get_api_all_busy(i, &num_busy, &temp_api_busy_rulenums[0]);
		if (num_busy > 0) {
			printk("%s:\t",api_type_to_str(i));
			for (j=0;j<num_busy;j++) {
				printk("%d\t",temp_api_busy_rulenums[j]);
			}
			printk("\n");
		}
	}
}

void tpm_print_fc(unsigned int print_only)
{
	tpm_fc_info_t   *p_fc_inf = NULL;

	if (print_only == 0) {
		printk(KERN_INFO "Resetting Flow Control engine statistics\n");
		tpm_fc_clear_stat();
	} else if (print_only != 1) {
		printk(KERN_INFO "UNEXPECTED PARAMETER (%d)\n", print_only);
		return;
	}

	tpm_fc_get_info(&p_fc_inf);
	if (p_fc_inf == NULL) {
		printk(KERN_INFO "UNEXPECTED ERROR\n");
		return;
	}

	//TRC_OUTPUT(0,1);

	printk(KERN_INFO "---------------------------------------------------------------------------------\n");
	printk(KERN_INFO "FC is %s\n", (tpm_fc_is_running() == MV_TRUE) ? "ENABLED" : "DISABLED");
	printk(KERN_INFO "The Flow Control engine settings:\n");
	printk(KERN_INFO "\t Threshold: High = %ld, Low = %ld\n",
	       (long)p_fc_inf->cfg.thresh_high,
	       (long)p_fc_inf->cfg.thresh_low);
	printk(KERN_INFO "\t Port %d, Target port = %d, TX port = %d, TX Queue = %d\n",
	       p_fc_inf->cfg.port,
	       p_fc_inf->cfg.tgt_port,
	       p_fc_inf->cfg.tx_port,
	       p_fc_inf->cfg.tx_queue);
	printk(KERN_INFO "\t Queue status is checked every %lld ns\n", ktime_to_ns(p_fc_inf->cfg.hrt_hit_time));

#ifdef TPM_FC_DEBUG
	printk(KERN_INFO "\n");
	printk(KERN_INFO "Latched statistics for oneshot counter configured to %d hits\n", p_fc_inf->cfg.oneshot_count);
	printk(KERN_INFO "\t Total timer hits = %ld, Total late hits = %ld, timer wraprarounds = %ld \n",
		   (long)p_fc_inf->oneshot_stat.hrt_hits_num,
		   (long)p_fc_inf->oneshot_stat.hrt_lost_num,
		   (long)p_fc_inf->oneshot_stat.hrt_wraparound);
	printk(KERN_INFO "\t Highest \"late than expected\" period = %lld ns\n", p_fc_inf->oneshot_stat.hrt_lost_max_ns);
	printk(KERN_INFO "\t Number of late hits of \"higher than expected\" period distribution in %%:\n");
	printk(KERN_INFO "\t >200%%    - %lld\n", p_fc_inf->oneshot_stat.hrt_lost_200_up);
	printk(KERN_INFO "\t 150-200%% - %lld\n", p_fc_inf->oneshot_stat.hrt_lost_150_200);
	printk(KERN_INFO "\t 100-150%% - %lld\n", p_fc_inf->oneshot_stat.hrt_lost_100_150);
	printk(KERN_INFO "\t 50-100%%  - %lld\n", p_fc_inf->oneshot_stat.hrt_lost_50_100);
	printk(KERN_INFO "\t 25-50%%   - %lld\n", p_fc_inf->oneshot_stat.hrt_lost_25_50);
	printk(KERN_INFO "\t <25%%     - %lld\n", p_fc_inf->oneshot_stat.hrt_lost_25_less);
	printk(KERN_INFO "\n");

	printk(KERN_INFO "Full statistics since start/reset\n");
	printk(KERN_INFO "\t Total timer hits = %ld, Total late hits = %ld, timer wraprarounds = %ld \n",
	       (long)p_fc_inf->stat.hrt_hits_num,
	       (long)p_fc_inf->stat.hrt_lost_num,
	       (long)p_fc_inf->stat.hrt_wraparound);
	printk(KERN_INFO "\t Highest \"late than expected\" period = %lld ns\n", p_fc_inf->stat.hrt_lost_max_ns);
	printk(KERN_INFO "\t Number of late hits of \"higher than expected\" period distribution in %%:\n");
	printk(KERN_INFO "\t >200%%    - %lld\n", p_fc_inf->stat.hrt_lost_200_up);
	printk(KERN_INFO "\t 150-200%% - %lld\n", p_fc_inf->stat.hrt_lost_150_200);
	printk(KERN_INFO "\t 100-150%% - %lld\n", p_fc_inf->stat.hrt_lost_100_150);
	printk(KERN_INFO "\t 50-100%%  - %lld\n", p_fc_inf->stat.hrt_lost_50_100);
	printk(KERN_INFO "\t 25-50%%   - %lld\n", p_fc_inf->stat.hrt_lost_25_50);
	printk(KERN_INFO "\t <25%%     - %lld\n", p_fc_inf->stat.hrt_lost_25_less);
	printk(KERN_INFO "---------------------------------------------------------------------------------\n");
#endif
}

void tpm_print_mac_learn_entry_count(void)
{
	uint32_t entry_count = 0;
	tpm_error_code_t rcode;

	rcode = tpm_mac_learn_entry_num_get(&entry_count);
	if (rcode == TPM_OK)
		printk("MAC learn entry count: %d\n", entry_count);

	return;
}


