/*
 * Wifi dongle status Filter and Report
 *
 * Copyright (C) 2020, Broadcom.
 *
 *      Unless you and Broadcom execute a separate written software license
 * agreement governing use of this software, this software is licensed to you
 * under the terms of the GNU General Public License version 2 (the "GPL"),
 * available at http://www.broadcom.com/licenses/GPLv2.php, with the
 * following added to such license:
 *
 *      As a special exception, the copyright holders of this software give you
 * permission to link this software with independent modules, and to copy and
 * distribute the resulting executable under terms of your choice, provided that
 * you also meet, for each linked independent module, the terms and conditions of
 * the license of that module.  An independent module is a module which is not
 * derived from this software.  The special exception does not apply to any
 * modifications of the software.
 *
 *
 * <<Broadcom-WL-IPTag/Open:>>
 *
 * $Id$
 */

/*
 * Filter MODULE and Report MODULE
 */

#include <typedefs.h>
#include <osl.h>
#include <dngl_stats.h>
#include <dhd.h>
#include <dhd_dbg.h>
#include <dhd_debug.h>
#include <event_log.h>
#include <event_trace.h>
#include <bcmtlv.h>
#include <bcmwifi_channels.h>
#include <dhd_event_log_filter.h>
#include <wl_cfg80211.h>
#include <dhd_bitpack.h>
#include <dhd_pktlog.h>
#ifdef DHD_STATUS_LOGGING
#include <dhd_statlog.h>
#endif /* DHD_STATUS_LOGGING */

#define htod32(i) (i)
#define htod16(i) (i)
#define dtoh32(i) (i)
#define dtoh16(i) (i)
#define htodchanspec(i) (i)
#define dtohchanspec(i) (i)

#define DHD_FILTER_ERR_INTERNAL(fmt, ...) DHD_ERROR(("EWPF-" fmt, ##__VA_ARGS__))
#define DHD_FILTER_TRACE_INTERNAL(fmt, ...) DHD_TRACE(("EWPF-" fmt, ##__VA_ARGS__))

#define DHD_FILTER_ERR(x) DHD_FILTER_ERR_INTERNAL x
#define DHD_FILTER_TRACE(x) DHD_FILTER_TRACE_INTERNAL x

/* ========= EWP Filter functions ============= */
//#define EWPF_DEBUG
#define EWPF_DEBUG_BUF_LEN	512
#define EWPF_VAL_CNT_PLINE	16

#define EWPF_REPORT_MAX_DATA	32	/* MAX record per slice */

#define EWPF_INVALID	(-1)
#define EWPF_XTLV_INVALID		0

#define EWPF_MAX_IDX_TYPE		4
#define EWPF_IDX_TYPE_SLICE		1
#define EWPF_IDX_TYPE_IFACE		2
#define EWPF_IDX_TYPE_EVENT		3
#define EWPF_IDX_TYPE_KEY_INFO		4

#define EWPF_MAX_SLICE			2	/* MAX slice in dongle */
#define EWPF_SLICE_MAIN			0	/* SLICE ID for 5GHZ */
#define EWPF_SLICE_AUX			1	/* SLICE ID for 2GHZ */

#define EWPF_MAX_IFACE			2	/* MAX IFACE supported, 0: STA */
#define EWPF_MAX_EVENT			1	/* MAX EVENT counter supported */
#define EWPF_MAX_KEY_INFO			1	/* MAX KEY INFO counter supported */

#define EWPF_ARM_TO_MSEC		1
#define EWPF_NO_UNIT_CONV		1
#define EWPF_MSEC_TO_SEC		1000
#define EWPF_USEC_TO_MSEC		1000
#define EWPF_NSEC_TO_MSEC		1000000
#define EWPF_USEC_TO_SEC		1000000
#define EWPF_EPOCH				1000
#define EWPF_NONSEC_TO_SEC		1000000000
#define EWPF_REPORT_YEAR_MUL	10000
#define EWPF_REPORT_MON_MUL		100
#define EWPF_REPORT_HOUR_MUL	10000
#define EWPF_REPORT_MIN_MUL		100
#define EWPF_REPORT_MINUTES		60
#define EWPF_REPORT_YEAR_BASE	1900

#define EWPF_NO_ABS		FALSE
#define EWPF_NEED_ABS		TRUE

#define EWPF_MAX_INFO_TYPE	5
#define EWPF_INFO_VER		0
#define EWPF_INFO_TYPE		1
#define EWPF_INFO_ECNT		2
#define EWPF_INFO_IOVAR		3
#define EWPF_INFO_CPLOG		4
#define EWPF_INFO_DHDSTAT	5

#define EWPF_UPDATE_ARM_CYCLE_OFFSET	1

/* EWPF element of slice type */
typedef struct {
	uint32 armcycle; /* dongle arm cycle for this record */
	union {
		wl_periodic_compact_cntrs_v1_t compact_cntr_v1;
		wl_periodic_compact_cntrs_v2_t compact_cntr_v2;
		wl_periodic_compact_cntrs_v3_t compact_cntr_v3;
	};
	evt_hist_compact_toss_stats_v1_t hist_tx_toss_stat;
	evt_hist_compact_toss_stats_v1_t hist_rx_toss_stat;
	wlc_btc_stats_v4_t btc_stat;
	wl_compact_he_cnt_wlc_v2_t compact_he_cnt;
} EWPF_slc_elem_t;

/* EWPF element for interface type */
typedef struct {
	uint32 armcycle; /* dongle arm cycle for this record */
	wl_if_stats_t if_stat;
	wl_lqm_t lqm;
	wl_if_infra_stats_t infra;
	wl_if_mgt_stats_t mgmt_stat;
	wl_if_state_compact_t if_comp_stat;
	wl_adps_dump_summary_v2_t adps_dump_summary;
	wl_adps_energy_gain_v1_t adps_energy_gain;
	wl_roam_stats_v1_t roam_stat;
} EWPF_ifc_elem_t;

typedef struct {
	uint32 first_armcycle; /* first dongle arm cycle for this record */
	uint32 updated_armcycle; /* last updated dongle arm cycle for this record */
	wl_event_based_statistics_v4_t event_stat;
} EWPF_event_elem_t;

typedef struct {
	uint32 first_armcycle; /* first dongle arm cycle for this record */
	uint32 updated_armcycle; /* last updaated dongle arm cycle for this record */
	key_update_info_v1_t key_update_info;
} EWPF_key_info_elem_t;

typedef struct {
	uint32 first_armcycle; /* first dongle arm cycle for this record */
	uint32 updated_armcycle; /* last updated dongle arm cycle for this record */
	wl_roam_stats_v1_t roam_stat;
} EWPF_roam_stats_event_elem_t;

typedef struct {
	int enabled;			/* enabled/disabled */
	dhd_pub_t *dhdp;
	uint32 tmp_armcycle;	/* global ARM CYCLE for TAG */
	int idx_type;			/* 0 : SLICE, 1: IFACE */
	int xtlv_idx;			/* Slice/Interface index : global for TAG */
	void *s_ring[EWPF_MAX_SLICE];
	void *i_ring[EWPF_MAX_IFACE];
	void *e_ring[EWPF_MAX_EVENT];
	void *k_ring[EWPF_MAX_KEY_INFO];

	/* used by Report module */
	uint8 last_bssid[ETHER_ADDR_LEN];	/* BSSID of last conencted/request */
	int last_channel;
	uint32 last_armcycle;	/* ARM CYCLE prior last connection */
} EWP_filter_t;

/* status gathering functions : XTLV callback functions */
typedef int (*EWPF_filter_cb)(void *ctx, const uint8 *data, uint16 type, uint16 len);
static int evt_xtlv_print_cb(void *ctx, const uint8 *data, uint16 type, uint16 len);
static int evt_xtlv_copy_cb(void *ctx, const uint8 *data, uint16 type, uint16 len);
static int evt_xtlv_idx_cb(void *ctx, const uint8 *data, uint16 type, uint16 len);
static int evt_xtlv_type_cb(void *ctx, const uint8 *data, uint16 type, uint16 len);
static int filter_main_cb(void *ctx, const uint8 *data, uint16 type, uint16 len);
static int evt_xtlv_roam_cb(void *ctx, const uint8 *data, uint16 type, uint16 len);

/* ========= Event Handler functions and its callbacks: ============= */
typedef struct _EWPF_tbl {
	uint16 xtlv_id; /* XTLV ID, to handle */
	EWPF_filter_cb cb_func; /* specific call back function, usually for structre */
	int idx_type;			/* structure specific info: belonged type */
	int	max_idx;			/* structure specific info: ALLOWED MAX IDX */
	uint32 offset; /* offset of structure in EWPF_elem-t, valid if cb is not null */
	uint32 member_length;	/* MAX length of reserved for this structure */
	struct _EWPF_tbl *tbl; /* sub table if XTLV map to XLTV */
} EWPF_tbl_t;

/* Context structre for XTLV callback */
typedef struct {
	dhd_pub_t *dhdp;
	EWPF_tbl_t *tbl;
} EWPF_ctx_t;

#define SLICE_INFO(a) EWPF_IDX_TYPE_SLICE, EWPF_MAX_SLICE, OFFSETOF(EWPF_slc_elem_t, a), \
	sizeof(((EWPF_slc_elem_t *)NULL)->a)
#define IFACE_INFO(a) EWPF_IDX_TYPE_IFACE, EWPF_MAX_IFACE, OFFSETOF(EWPF_ifc_elem_t, a), \
	sizeof(((EWPF_ifc_elem_t *)NULL)->a)
#define EVENT_INFO(a) EWPF_IDX_TYPE_EVENT, EWPF_MAX_EVENT, OFFSETOF(EWPF_event_elem_t, a), \
		sizeof(((EWPF_event_elem_t *)NULL)->a)
#define KEY_INFO(a) EWPF_IDX_TYPE_KEY_INFO, EWPF_MAX_KEY_INFO, OFFSETOF(EWPF_key_info_elem_t, a), \
		sizeof(((EWPF_key_info_elem_t *)NULL)->a)

#define SLICE_U_SIZE(a) sizeof(((EWPF_slc_elem_t *)NULL)->a)
#define SLICE_INFO_UNION(a) EWPF_IDX_TYPE_SLICE, EWPF_MAX_SLICE, OFFSETOF(EWPF_slc_elem_t, a)
#define NONE_INFO(a) 0, 0, a, 0
/* XTLV TBL for WL_SLICESTATS_XTLV_PERIODIC_STATE */
static EWPF_tbl_t EWPF_periodic[] =
{
	{
		WL_STATE_COMPACT_COUNTERS,
		evt_xtlv_copy_cb,
		SLICE_INFO(compact_cntr_v3),
		NULL
	},
	{
		WL_STATE_COMPACT_HE_COUNTERS,
		evt_xtlv_copy_cb,
		SLICE_INFO(compact_he_cnt),
		NULL
	},
	{EWPF_XTLV_INVALID, NULL, NONE_INFO(0), NULL}
};

static EWPF_tbl_t EWPF_if_periodic[] =
{
	{
		WL_STATE_IF_COMPACT_STATE,
		evt_xtlv_copy_cb,
		IFACE_INFO(if_comp_stat),
		NULL
	},
	{
		WL_STATE_IF_ADPS_STATE,
		evt_xtlv_copy_cb,
		IFACE_INFO(adps_dump_summary),
		NULL
	},
	{
		WL_STATE_IF_ADPS_ENERGY_GAIN,
		evt_xtlv_copy_cb,
		IFACE_INFO(adps_energy_gain),
		NULL
	},
	{EWPF_XTLV_INVALID, NULL, NONE_INFO(0), NULL}
};

static EWPF_tbl_t EWPF_roam[] =
{
	{
		WL_IFSTATS_XTLV_ROAM_STATS_EVENT,
		evt_xtlv_print_cb,
		NONE_INFO(0),
		NULL
	},
	{
		WL_IFSTATS_XTLV_ROAM_STATS_PERIODIC,
		evt_xtlv_copy_cb,
		IFACE_INFO(roam_stat),
		NULL
	},
	{EWPF_XTLV_INVALID, NULL, NONE_INFO(0), NULL}
};

/* XTLV TBL for EVENT_LOG_TAG_STATS */
static EWPF_tbl_t EWPF_main[] =
{
	/* MAIN XTLV */
	{
		WL_IFSTATS_XTLV_WL_SLICE,
		evt_xtlv_type_cb,
		NONE_INFO(0),
		EWPF_main
	},
	{
		WL_IFSTATS_XTLV_IF,
		evt_xtlv_type_cb,
		NONE_INFO(0),
		EWPF_main
	},
	/* ID XTLVs */
	{
		WL_IFSTATS_XTLV_SLICE_INDEX,
		evt_xtlv_idx_cb,
		NONE_INFO(0),
		NULL
	},
	{
		WL_IFSTATS_XTLV_IF_INDEX,
		evt_xtlv_idx_cb,
		NONE_INFO(0),
		NULL
	},
	/* NORMAL XTLVS */
	{
		WL_SLICESTATS_XTLV_PERIODIC_STATE,
		NULL,
		NONE_INFO(0),
		EWPF_periodic
	},
	{
		WL_IFSTATS_XTLV_IF_LQM,
		evt_xtlv_copy_cb,
		IFACE_INFO(lqm),
		NULL
	},
	{
		WL_IFSTATS_XTLV_GENERIC,
		evt_xtlv_copy_cb,
		IFACE_INFO(if_stat),
		NULL
	},
	{
		WL_IFSTATS_XTLV_MGT_CNT,
		evt_xtlv_copy_cb,
		IFACE_INFO(mgmt_stat),
		NULL
	},
	{
		WL_IFSTATS_XTLV_IF_PERIODIC_STATE,
		NULL,
		NONE_INFO(0),
		EWPF_if_periodic
	},
	{
		WL_IFSTATS_XTLV_INFRA_SPECIFIC,
		evt_xtlv_copy_cb,
		IFACE_INFO(infra),
		NULL
	},
	{
		WL_SLICESTATS_XTLV_HIST_TX_STATS,
		evt_xtlv_copy_cb,
		SLICE_INFO(hist_tx_toss_stat),
		NULL
	},
	{
		WL_SLICESTATS_XTLV_HIST_RX_STATS,
		evt_xtlv_copy_cb,
		SLICE_INFO(hist_rx_toss_stat),
		NULL
	},
	{
		WL_IFSTATS_XTLV_WL_SLICE_BTCOEX,
		evt_xtlv_copy_cb,
		SLICE_INFO(btc_stat),
		NULL
	},
	{
		WL_IFSTATS_XTLV_IF_EVENT_STATS,
		evt_xtlv_copy_cb,
		EVENT_INFO(event_stat),
		NULL
	},
	{
		WL_IFSTATS_XTLV_IF_EVENT_STATS,
		evt_xtlv_print_cb,
		NONE_INFO(0),
		NULL
	},
	{
		WL_IFSTATS_XTLV_KEY_PLUMB_INFO,
		evt_xtlv_copy_cb,
		KEY_INFO(key_update_info),
		NULL
	},
	{
		WL_IFSTATS_XTLV_ROAM_STATS_EVENT,
		evt_xtlv_roam_cb,
		NONE_INFO(0),
		EWPF_roam
	},
	{
		WL_IFSTATS_XTLV_ROAM_STATS_PERIODIC,
		evt_xtlv_roam_cb,
		IFACE_INFO(roam_stat),
		EWPF_roam
	},

	{EWPF_XTLV_INVALID, NULL, NONE_INFO(0), NULL}
};

#if defined(DHD_EWPR_VER2) && defined(DHD_STATUS_LOGGING)

#define EWP_DHD_STAT_SIZE 2

uint8
dhd_statlog_filter[] =
{
	ST(WLAN_POWER_ON),	/* Wi-Fi Power on */
	ST(WLAN_POWER_OFF),	/* Wi-Fi Power off */
	ST(ASSOC_START),	/* connect to the AP triggered by upper layer */
	ST(AUTH_DONE),		/* complete to authenticate with the AP */
	ST(ASSOC_REQ),		/* send or receive Assoc Req */
	ST(ASSOC_RESP),		/* send or receive Assoc Resp */
	ST(ASSOC_DONE),		/* complete to disconnect to the associated AP */
	ST(DISASSOC_START),	/* disconnect to the associated AP by upper layer */
	ST(DISASSOC_INT_START),	/* initiate the disassoc by DHD */
	ST(DISASSOC_DONE),	/* complete to disconnect to the associated AP */
	ST(DISASSOC),		/* send or receive Disassoc */
	ST(DEAUTH),		/* send or receive Deauth */
	ST(LINKDOWN),		/* receive the link down event */
	ST(REASSOC_START),	/* reassoc the candidate AP */
	ST(REASSOC_INFORM),	/* inform reassoc completion to upper layer */
	ST(REASSOC_DONE),	/* complete to reassoc */
	ST(EAPOL_M1),		/* send or receive the EAPOL M1 */
	ST(EAPOL_M2),		/* send or receive the EAPOL M2 */
	ST(EAPOL_M3),		/* send or receive the EAPOL M3 */
	ST(EAPOL_M4),		/* send or receive the EAPOL M4 */
	ST(EAPOL_GROUPKEY_M1),	/* send or receive the EAPOL Group key handshake M1 */
	ST(EAPOL_GROUPKEY_M2),	/* send or receive the EAPOL Group key handshake M2 */
	ST(EAP_REQ_IDENTITY),	/* send or receive the EAP REQ IDENTITY */
	ST(EAP_RESP_IDENTITY),	/* send or receive the EAP RESP IDENTITY */
	ST(EAP_REQ_TLS),	/* send or receive the EAP REQ TLS */
	ST(EAP_RESP_TLS),	/* send or receive the EAP RESP TLS */
	ST(EAP_REQ_LEAP),	/* send or receive the EAP REQ LEAP */
	ST(EAP_RESP_LEAP),	/* send or receive the EAP RESP LEAP */
	ST(EAP_REQ_TTLS),	/* send or receive the EAP REQ TTLS */
	ST(EAP_RESP_TTLS),	/* send or receive the EAP RESP TTLS */
	ST(EAP_REQ_AKA),	/* send or receive the EAP REQ AKA */
	ST(EAP_RESP_AKA),	/* send or receive the EAP RESP AKA */
	ST(EAP_REQ_PEAP),	/* send or receive the EAP REQ PEAP */
	ST(EAP_RESP_PEAP),	/* send or receive the EAP RESP PEAP */
	ST(EAP_REQ_FAST),	/* send or receive the EAP REQ FAST */
	ST(EAP_RESP_FAST),	/* send or receive the EAP RESP FAST */
	ST(EAP_REQ_PSK),	/* send or receive the EAP REQ PSK */
	ST(EAP_RESP_PSK),	/* send or receive the EAP RESP PSK */
	ST(EAP_REQ_AKAP),	/* send or receive the EAP REQ AKAP */
	ST(EAP_RESP_AKAP),	/* send or receive the EAP RESP AKAP */
	ST(EAP_SUCCESS),	/* send or receive the EAP SUCCESS */
	ST(EAP_FAILURE),	/* send or receive the EAP FAILURE */
	ST(EAPOL_START),	/* send or receive the EAPOL-START */
	ST(WSC_START),		/* send or receive the WSC START */
	ST(WSC_DONE),		/* send or receive the WSC DONE */
	ST(WPS_M1),		/* send or receive the WPS M1 */
	ST(WPS_M2),		/* send or receive the WPS M2 */
	ST(WPS_M3),		/* send or receive the WPS M3 */
	ST(WPS_M4),		/* send or receive the WPS M4 */
	ST(WPS_M5),		/* send or receive the WPS M5 */
	ST(WPS_M6),		/* send or receive the WPS M6 */
	ST(WPS_M7),		/* send or receive the WPS M7 */
	ST(WPS_M8),		/* send or receive the WPS M8 */
	ST(8021X_OTHER),	/* send or receive the other 8021X frames */
	ST(INSTALL_KEY),	/* install the key */
	ST(DELETE_KEY),		/* remove the key */
	ST(INSTALL_PMKSA),	/* install PMKID information */
	ST(INSTALL_OKC_PMK),	/* install PMKID information for OKC */
	ST(DHCP_DISCOVER),	/* send or recv DHCP Discover */
	ST(DHCP_OFFER),		/* send or recv DHCP Offer */
	ST(DHCP_REQUEST),	/* send or recv DHCP Request */
	ST(DHCP_DECLINE),	/* send or recv DHCP Decline */
	ST(DHCP_ACK),		/* send or recv DHCP ACK */
	ST(DHCP_NAK),		/* send or recv DHCP NACK */
	ST(DHCP_RELEASE),	/* send or recv DHCP Release */
	ST(DHCP_INFORM),	/* send or recv DHCP Inform */
	ST(REASSOC_SUCCESS),	/* reassociation success */
	ST(REASSOC_FAILURE),	/* reassociation failure */
	ST(AUTH_TIMEOUT),	/* authentication timeout */
	ST(AUTH_FAIL),		/* authentication failure */
	ST(AUTH_NO_ACK),	/* authentication failure due to no ACK */
	ST(AUTH_OTHERS),	/* authentication failure with other status */
	ST(ASSOC_TIMEOUT),	/* association timeout */
	ST(ASSOC_FAIL),		/* association failure */
	ST(ASSOC_NO_ACK),	/* association failure due to no ACK */
	ST(ASSOC_ABORT),	/* association abort */
	ST(ASSOC_UNSOLICITED),	/* association unsolicited */
	ST(ASSOC_NO_NETWORKS),	/* association failure due to no networks */
	ST(ASSOC_OTHERS),	/* association failure due to no networks */
	ST(REASSOC_DONE_OTHERS)	/* complete to reassoc with other reason */
};
#endif /* DHD_EWPR_VER2 && DHD_STATUS_LOGGING  */

/* ========= Module functions : exposed to others ============= */
int
dhd_event_log_filter_init(dhd_pub_t *dhdp, uint8 *buf, uint32 buf_size)
{

	EWP_filter_t *filter;
	int idx;
	uint32 req_size;
	uint32 s_ring_size; /* slice ring */
	uint32 i_ring_size; /* interface ring */
	uint32 e_ring_size; /* event counter ring */
	uint32 k_ring_size; /* key info ring */
	uint8 *buf_ptr = buf;
	EWPF_ctx_t ctx;
	wl_event_based_statistics_v4_t dummy_event_stat;
	key_update_info_v1_t dummy_key_update_info;
#if defined(DHD_EWPR_VER2) && defined(DHD_STATUS_LOGGING)
	stat_bdmask_req_t req;
#endif /* DHD_EWPR_VER2 && DHD_STATUS_LOGGING */

	DHD_FILTER_ERR(("STARTED\n"));

	if (!dhdp || !buf) {
		DHD_FILTER_ERR(("INVALID PTR: dhdp:%p buf:%p\n", dhdp, buf));
		return BCME_ERROR;
	}

	i_ring_size = s_ring_size = e_ring_size = k_ring_size = dhd_ring_get_hdr_size();
	s_ring_size += ((uint32)sizeof(EWPF_slc_elem_t)) * EWPF_REPORT_MAX_DATA;
	i_ring_size += ((uint32)sizeof(EWPF_ifc_elem_t)) * EWPF_REPORT_MAX_DATA;
	e_ring_size += ((uint32)sizeof(EWPF_event_elem_t)) * EWPF_REPORT_MAX_DATA;
	k_ring_size += ((uint32)sizeof(EWPF_key_info_elem_t)) * EWPF_REPORT_MAX_DATA;

	req_size = s_ring_size * EWPF_MAX_SLICE + i_ring_size * EWPF_MAX_IFACE +
		e_ring_size * EWPF_MAX_EVENT + k_ring_size * EWPF_MAX_KEY_INFO;
	req_size += (uint32)sizeof(EWP_filter_t);

	if (buf_size < req_size) {
		DHD_FILTER_ERR(("BUF SIZE IS TO SHORT: req:%d buf_size:%d\n",
			req_size, buf_size));
		return BCME_ERROR;
	}

	BCM_REFERENCE(dhdp);
	filter = (EWP_filter_t *)buf;
	buf_ptr += sizeof(EWP_filter_t);

	/* initialize control block */
	memset(filter, 0, sizeof(EWP_filter_t));

	filter->idx_type = EWPF_INVALID;
	filter->xtlv_idx = EWPF_INVALID;
	filter->tmp_armcycle = 0;

	for (idx = 0; idx < EWPF_MAX_SLICE; idx++) {
		filter->s_ring[idx] = dhd_ring_init(dhdp, buf_ptr, s_ring_size,
			sizeof(EWPF_slc_elem_t), EWPF_REPORT_MAX_DATA,
			DHD_RING_TYPE_FIXED);
		if (!filter->s_ring[idx]) {
			DHD_FILTER_ERR(("FAIL TO INIT SLICE RING: %d\n", idx));
			return BCME_ERROR;
		}
		buf_ptr += s_ring_size;
	}

	for (idx = 0; idx < EWPF_MAX_IFACE; idx++) {
		filter->i_ring[idx] = dhd_ring_init(dhdp, buf_ptr, i_ring_size,
			sizeof(EWPF_ifc_elem_t), EWPF_REPORT_MAX_DATA,
			DHD_RING_TYPE_FIXED);
		if (!filter->i_ring[idx]) {
			DHD_FILTER_ERR(("FAIL TO INIT INTERFACE RING: %d\n", idx));
			return BCME_ERROR;
		}
		buf_ptr += i_ring_size;
	}

	for (idx = 0; idx < EWPF_MAX_EVENT; idx++) {
		filter->e_ring[idx] = dhd_ring_init(dhdp, buf_ptr, e_ring_size,
			sizeof(EWPF_event_elem_t), EWPF_REPORT_MAX_DATA,
			DHD_RING_TYPE_FIXED);
		if (!filter->e_ring[idx]) {
			DHD_FILTER_ERR(("FAIL TO INIT INTERFACE RING: %d\n", idx));
			return BCME_ERROR;
		}
		buf_ptr += e_ring_size;
	}

	for (idx = 0; idx < EWPF_MAX_KEY_INFO; idx++) {
		filter->k_ring[idx] = dhd_ring_init(dhdp, buf_ptr, k_ring_size,
			sizeof(EWPF_key_info_elem_t), EWPF_REPORT_MAX_DATA,
			DHD_RING_TYPE_FIXED);
		if (!filter->k_ring[idx]) {
			DHD_FILTER_ERR(("FAIL TO INIT INTERFACE RING: %d\n", idx));
			return BCME_ERROR;
		}
		buf_ptr += k_ring_size;
	}

	dhdp->event_log_filter = filter;
	filter->dhdp = dhdp;
	filter->enabled = TRUE;

	/*
	 * put dummy element of event based encounters to prevent error
	 * in case of no event happened when data collection is triggered
	 */
	ctx.dhdp = dhdp;
	ctx.tbl = EWPF_main;
	memset(&dummy_event_stat, 0x00, sizeof(dummy_event_stat));
	evt_xtlv_copy_cb(&ctx, (uint8 *)&dummy_event_stat, WL_IFSTATS_XTLV_IF_EVENT_STATS,
		sizeof(wl_event_based_statistics_v4_t));

	memset(&dummy_key_update_info, 0x00, sizeof(dummy_key_update_info));
	evt_xtlv_copy_cb(&ctx, (uint8 *)&dummy_key_update_info, WL_IFSTATS_XTLV_KEY_PLUMB_INFO,
		sizeof(key_update_info_v1_t));

#if defined(DHD_EWPR_VER2) && defined(DHD_STATUS_LOGGING)
	/* create status filter for bigdata logging */
	req.req_buf = dhd_statlog_filter;
	req.req_buf_len = sizeof(dhd_statlog_filter);
	dhd_statlog_generate_bdmask(dhdp, &req);
#endif /* DHD_EWPR_VER2 && DHD_STATUS_LOGGING */

	return BCME_OK;
}

void
dhd_event_log_filter_deinit(dhd_pub_t *dhdp)
{
	EWP_filter_t *filter;
	int idx;

	if (!dhdp) {
		return;
	}

	if (dhdp->event_log_filter) {
		filter = (EWP_filter_t *)dhdp->event_log_filter;
		for (idx = 0; idx < EWPF_MAX_SLICE; idx ++) {
			dhd_ring_deinit(dhdp, filter->s_ring[idx]);
		}
		for (idx = 0; idx < EWPF_MAX_IFACE; idx ++) {
			dhd_ring_deinit(dhdp, filter->i_ring[idx]);
		}
		for (idx = 0; idx < EWPF_MAX_EVENT; idx ++) {
			dhd_ring_deinit(dhdp, filter->e_ring[idx]);
		}
		for (idx = 0; idx < EWPF_MAX_KEY_INFO; idx ++) {
			dhd_ring_deinit(dhdp, filter->k_ring[idx]);
		}
		dhdp->event_log_filter = NULL;
	}
}

void
dhd_event_log_filter_notify_connect_request(dhd_pub_t *dhdp, uint8 *bssid, int channel)
{
	EWP_filter_t *filter;
	void *last_elem;

	if (!dhdp || !dhdp->event_log_filter) {
		return;
	}

	filter = (EWP_filter_t *)dhdp->event_log_filter;
	if (filter->enabled != TRUE) {
		DHD_FILTER_ERR(("EWP Filter is not enabled\n"));
		return;
	}

	memcpy(filter->last_bssid, bssid, ETHER_ADDR_LEN);
	filter->last_channel = channel;

	/* Refer STA interface */
	last_elem = dhd_ring_get_last(filter->i_ring[0]);
	if (last_elem == NULL) {
		filter->last_armcycle = 0;
	} else {
		/* EXCLUDE before connect start */
		filter->last_armcycle = *(uint32 *)last_elem + EWPF_EPOCH + 1;
	}
}

void
dhd_event_log_filter_notify_connect_done(dhd_pub_t *dhdp, uint8 *bssid, int roam)
{
	EWP_filter_t *filter;
	void *last_elem;
	int channel;
	char buf[EWPF_DEBUG_BUF_LEN];
	int ret;
	uint32 armcycle;
	struct channel_info *ci;

	if (!dhdp || !dhdp->event_log_filter) {
		return;
	}

	filter = (EWP_filter_t *)dhdp->event_log_filter;
	if (filter->enabled != TRUE) {
		DHD_FILTER_ERR(("EWP Filter is not enabled\n"));
		return;
	}

	/* GET CHANNEL */
	*(uint32 *)buf = htod32(EWPF_DEBUG_BUF_LEN);
	ret = dhd_wl_ioctl_cmd(dhdp, WLC_GET_CHANNEL, buf, EWPF_DEBUG_BUF_LEN, FALSE, 0);
	if (ret != BCME_OK) {
		DHD_FILTER_ERR(("FAIL TO GET BSS INFO: %d\n", ret));
		return;
	}

	ci = (struct channel_info *)(buf + sizeof(uint32));
	channel = dtoh32(ci->hw_channel);
	DHD_FILTER_TRACE(("CHANNEL:prev %d new:%d\n", filter->last_channel, channel));

	memcpy(filter->last_bssid, bssid, ETHER_ADDR_LEN);
	filter->last_channel = channel;
	if (roam == FALSE) {
		return;
	}

	/* update connect time for roam */
	/* Refer STA interface */
	last_elem = dhd_ring_get_last(filter->i_ring[0]);
	if (last_elem == NULL) {
		armcycle = 0;
	} else {
		/* EXCLUDE before roam done */
		armcycle = *(uint32 *)last_elem + EWPF_EPOCH + 1;
	}

	filter->last_armcycle = armcycle;
}

static int
evt_xtlv_print_cb(void *ctx, const uint8 *data, uint16 type, uint16 len)
{
	EWPF_ctx_t *cur_ctx = (EWPF_ctx_t *)ctx;
	EWP_filter_t *filter = (EWP_filter_t *)cur_ctx->dhdp->event_log_filter;
	uint32 armcycle = 0;
	uint8 bssid[ETHER_ADDR_LEN];
	uint32 initial_assoc_time = 0;
	uint32 prev_roam_time = 0;
	uint32 last_roam_event_type = 0;
	uint32 last_roam_event_status = 0;
	uint32 last_roam_event_reason = 0;
	wl_wips_event_info_t wips_event;
	bzero(&wips_event, sizeof(wips_event));

	DHD_FILTER_TRACE(("%s type:%d %x len:%d %x\n", __FUNCTION__, type, type, len, len));

	/* get current armcycle */
	if (filter) {
		armcycle = filter->tmp_armcycle;
	}
	if (type == WL_IFSTATS_XTLV_IF_EVENT_STATS) {
		wl_event_based_statistics_v1_t *elem;

		elem = (wl_event_based_statistics_v1_t *)(uintptr_t)data;
		if (elem->txdeauthivalclass > 0) {
			memcpy(bssid, &elem->BSSID, ETHER_ADDR_LEN);
			DHD_ERROR(("DHD STA sent DEAUTH frame with invalid class : %d times"
				", BSSID("MACDBG")\n", elem->txdeauthivalclass, MAC2STRDBG(bssid)));
		}
		if (elem->version == WL_EVENT_STATISTICS_VER_2) {
			wl_event_based_statistics_v2_t *elem_v2;

			elem_v2 = (wl_event_based_statistics_v2_t *)(uintptr_t)data;
			memcpy(&wips_event.bssid, &elem_v2->last_deauth, ETHER_ADDR_LEN);
			wips_event.misdeauth = elem_v2->misdeauth;
			wips_event.current_RSSI = elem_v2->cur_rssi;
			wips_event.deauth_RSSI = elem_v2->deauth_rssi;
			wips_event.timestamp = elem_v2->timestamp;
		} else if (elem->version == WL_EVENT_STATISTICS_VER_3) {
			wl_event_based_statistics_v3_t *elem_v3;

			elem_v3 = (wl_event_based_statistics_v3_t *)(uintptr_t)data;
			memcpy(&wips_event.bssid, &elem_v3->last_deauth, ETHER_ADDR_LEN);
			wips_event.misdeauth = elem_v3->misdeauth;
			wips_event.current_RSSI = elem_v3->cur_rssi;
			wips_event.deauth_RSSI = elem_v3->deauth_rssi;
			wips_event.timestamp = elem_v3->timestamp;
			/* roam statistics */
			initial_assoc_time = elem_v3->initial_assoc_time;
			prev_roam_time = elem_v3->prev_roam_time;
			last_roam_event_type = elem_v3->last_roam_event_type;
			last_roam_event_status = elem_v3->last_roam_event_status;
			last_roam_event_reason = elem_v3->last_roam_event_reason;
		} else if (elem->version == WL_EVENT_STATISTICS_VER_4) {
			wl_event_based_statistics_v4_t *elem_v4;

			elem_v4 = (wl_event_based_statistics_v4_t *)(uintptr_t)data;
			memcpy(&wips_event.bssid, &elem_v4->last_deauth, ETHER_ADDR_LEN);
			wips_event.misdeauth = elem_v4->misdeauth;
			wips_event.current_RSSI = elem_v4->cur_rssi;
			wips_event.deauth_RSSI = elem_v4->deauth_rssi;
			wips_event.timestamp = elem_v4->timestamp;
		}
		if (wips_event.misdeauth > 1) {
			DHD_ERROR(("WIPS attack!! cnt=%d, curRSSI=%d, deauthRSSI=%d "
				", time=%d, MAC="MACDBG"\n",
				wips_event.misdeauth, wips_event.current_RSSI,
				wips_event.deauth_RSSI,	wips_event.timestamp,
				MAC2STRDBG(&wips_event.bssid)));
#if defined(WL_CFG80211) && defined(WL_WIPSEVT)
			wl_cfg80211_wips_event_ext(&wips_event);
#endif /* WL_CFG80211 && WL_WIPSEVT */
		}
	} else if (type == WL_IFSTATS_XTLV_ROAM_STATS_EVENT) {
		wl_roam_stats_v1_t *roam_elem;
		roam_elem = (wl_roam_stats_v1_t *)(uintptr_t)data;
		if (roam_elem->version == WL_ROAM_STATS_VER_1) {
			wl_roam_stats_v1_t *roam_elem_v1;

			roam_elem_v1 = (wl_roam_stats_v1_t *)(uintptr_t)data;
			/* roam statistics */
			initial_assoc_time = roam_elem_v1->initial_assoc_time;
			prev_roam_time = roam_elem_v1->prev_roam_time;
			last_roam_event_type = roam_elem_v1->last_roam_event_type;
			last_roam_event_status = roam_elem_v1->last_roam_event_status;
			last_roam_event_reason = roam_elem_v1->last_roam_event_reason;
		}
	} else {
		DHD_FILTER_ERR(("%s TYPE(%d) IS NOT SUPPORTED TO PRINT\n",
			__FUNCTION__, type));
		return BCME_ERROR;
	}
	if (initial_assoc_time > 0 && prev_roam_time > 0) {
		DHD_ERROR(("Last roam event before disconnection : "
			"current armcycle %d, initial assoc time %d, "
			"last event time %d, type %d, status %d, reason %d\n",
			armcycle, initial_assoc_time, prev_roam_time,
			last_roam_event_type, last_roam_event_status,
			last_roam_event_reason));
	}

	return BCME_OK;
}

#ifdef BCM_SDC
static int
evt_get_last_toss_hist(uint8 *ptr, const uint8 *data, uint16 len)
{
	bcm_xtlv_t *bcm_xtlv_desc = (bcm_xtlv_t *)data;
	wl_hist_compact_toss_stats_v2_t *ewp_stats;
	evt_hist_compact_toss_stats_v1_t bidata_stats;
	int16 max_rcidx = EWPF_INVALID, secnd_rcidx = EWPF_INVALID;
	uint16 cur_rnidx = 0, prev_rnidx = 0;
	uint16 max_rccnt = 0, cur_rccnt = 0;
	uint16 idx;

	if (!ptr || !data) {
		return BCME_ERROR;
	}

	if (bcm_xtlv_desc->len != sizeof(wl_hist_compact_toss_stats_v2_t)) {
		DHD_FILTER_ERR(("%s : size is not matched  %d\n", __FUNCTION__,
			bcm_xtlv_desc->len));
		return BCME_ERROR;
	}

	ewp_stats = (wl_hist_compact_toss_stats_v2_t *)(&bcm_xtlv_desc->data[0]);
	if (ewp_stats->htr_type == WL_STATE_HIST_TX_TOSS_REASONS) {
		if (ewp_stats->version != WL_HIST_COMPACT_TOSS_STATS_TX_VER_2) {
			DHD_FILTER_ERR(("%s : unsupported version %d (type: %d)\n",
				__FUNCTION__, ewp_stats->version, ewp_stats->htr_type));
			return BCME_ERROR;
		}
	} else if (ewp_stats->htr_type == WL_STATE_HIST_RX_TOSS_REASONS) {
		if (ewp_stats->version != WL_HIST_COMPACT_TOSS_STATS_RX_VER_2) {
			DHD_FILTER_ERR(("%s : unsupported version %d (type: %d)\n",
				__FUNCTION__, ewp_stats->version, ewp_stats->htr_type));
			return BCME_ERROR;
		}
	} else {
		DHD_FILTER_ERR(("%s : unsupported type %d\n", __FUNCTION__,
			ewp_stats->htr_type));
		return BCME_ERROR;
	}
	/*
	 * htr_rnidx is pointing the next empty slot to be used
	 * Need to get previous index which is valid
	 */
	if (ewp_stats->htr_rnidx > 0) {
		cur_rnidx = ewp_stats->htr_rnidx - 1;
	} else {
		cur_rnidx = WLC_HIST_TOSS_LEN - 1;
	}
	if (cur_rnidx > 0) {
		prev_rnidx = cur_rnidx - 1;
	} else {
		prev_rnidx = WLC_HIST_TOSS_LEN - 1;
	}
	/*
	 * Need to get largest count of toss reasons
	 */
	for (idx = 0; idx < WLC_HIST_TOSS_LEN; idx ++) {
		cur_rccnt = (uint16)((ewp_stats->htr_rc[idx] &
			HIST_TOSS_RC_COUNT_MASK)>>HIST_TOSS_RC_COUNT_POS);
		DHD_FILTER_TRACE(("%s: idx %d htr_rc %04x cur_rccnt %d\n",
			__FUNCTION__, idx, ewp_stats->htr_rc[idx], cur_rccnt));
		if (ewp_stats->htr_rc_ts[idx] && max_rccnt < cur_rccnt) {
			max_rccnt = cur_rccnt;
			secnd_rcidx = max_rcidx;
			max_rcidx = idx;
			DHD_FILTER_TRACE(("%s: max_rcidx updated -"
				"max_rcidx %d secnd_rcidx %d\n",
				__FUNCTION__, max_rcidx, secnd_rcidx));
		}
	}

	memset(&bidata_stats, 0x00, sizeof(bidata_stats));
	bidata_stats.version = ewp_stats->version;
	bidata_stats.htr_type = ewp_stats->htr_type;
	bidata_stats.htr_num = ewp_stats->htr_num;
	bidata_stats.htr_rn_last = ewp_stats->htr_running[cur_rnidx];
	bidata_stats.htr_rn_ts_last = ewp_stats->htr_rn_ts[cur_rnidx];
	bidata_stats.htr_rn_prev = ewp_stats->htr_running[prev_rnidx];
	bidata_stats.htr_rn_ts_prev = ewp_stats->htr_rn_ts[prev_rnidx];
	if (max_rcidx != EWPF_INVALID) {
		bidata_stats.htr_rc_max = ewp_stats->htr_rc[max_rcidx];
		bidata_stats.htr_rc_ts_max = ewp_stats->htr_rc_ts[max_rcidx];
	}
	if (secnd_rcidx != EWPF_INVALID) {
		bidata_stats.htr_rc_secnd = ewp_stats->htr_rc[secnd_rcidx];
		bidata_stats.htr_rc_ts_secnd = ewp_stats->htr_rc_ts[secnd_rcidx];
	}
	DHD_FILTER_TRACE(("%s: ver %d type %d num %d "
		"htr_rn_last %d htr_rn_ts_last %d htr_rn_prev %d htr_rn_ts_prev %d "
		"htr_rc_max %d htr_rc_ts_max %d htr_rc_secnd %d htr_rc_ts_secnd %d\n",
		__FUNCTION__, bidata_stats.version,
		bidata_stats.htr_type, bidata_stats.htr_num,
		bidata_stats.htr_rn_last, bidata_stats.htr_rn_ts_last,
		bidata_stats.htr_rn_prev, bidata_stats.htr_rn_ts_prev,
		bidata_stats.htr_rc_max, bidata_stats.htr_rc_ts_max,
		bidata_stats.htr_rc_secnd, bidata_stats.htr_rc_ts_secnd));

	memcpy(ptr, &bidata_stats, sizeof(bidata_stats));

	return BCME_OK;
}
#endif /* BCM_SDC */

static int
evt_xtlv_copy_cb(void *ctx, const uint8 *data, uint16 type, uint16 len)
{
	EWPF_ctx_t *cur_ctx = (EWPF_ctx_t *)ctx;
	EWP_filter_t *filter = (EWP_filter_t *)cur_ctx->dhdp->event_log_filter;
	uint32 *armcycle;
	EWPF_tbl_t *tbl;
	void *ring;
	void *target;
	uint8 *ptr;
	int tbl_idx;
	uint32 elem_size;

	DHD_FILTER_TRACE(("%s type:%d %x len:%d %x\n", __FUNCTION__, type, type, len, len));

	for (tbl_idx = 0; ; tbl_idx++) {
		if (cur_ctx->tbl[tbl_idx].xtlv_id == EWPF_XTLV_INVALID) {
			DHD_FILTER_ERR(("%s NOT SUPPORTED TYPE(%d)\n", __FUNCTION__, type));
			return BCME_OK;
		}
		if (cur_ctx->tbl[tbl_idx].xtlv_id == type) {
			tbl = &cur_ctx->tbl[tbl_idx];
			break;
		}
	}

	/* Set index type and xtlv_idx for event stats and key plumb info */
	if (type == WL_IFSTATS_XTLV_IF_EVENT_STATS) {
		filter->idx_type = EWPF_IDX_TYPE_EVENT;
		filter->xtlv_idx = 0;
		DHD_FILTER_TRACE(("EVENT XTLV\n"));
	} else if (type == WL_IFSTATS_XTLV_KEY_PLUMB_INFO) {
		filter->idx_type = EWPF_IDX_TYPE_KEY_INFO;
		filter->xtlv_idx = 0;
		DHD_FILTER_TRACE(("KEY INFO XTLV\n"));
	}

	/* Check Validation */
	if (filter->idx_type == EWPF_INVALID ||
		filter->xtlv_idx == EWPF_INVALID ||
		filter->idx_type != tbl->idx_type ||
		filter->xtlv_idx >= tbl->max_idx) {
		DHD_FILTER_ERR(("XTLV VALIDATION FAILED: type:%x xtlv:%x idx:%d\n",
			filter->idx_type, tbl->xtlv_id, filter->xtlv_idx));
		return BCME_OK;
	}

	/* SET RING INFO */
	if (filter->idx_type == EWPF_IDX_TYPE_SLICE) {
		ring = filter->s_ring[filter->xtlv_idx];
		elem_size = sizeof(EWPF_slc_elem_t);
	} else if (filter->idx_type == EWPF_IDX_TYPE_IFACE) {
		ring = filter->i_ring[filter->xtlv_idx];
		elem_size = sizeof(EWPF_ifc_elem_t);
	} else if (filter->idx_type == EWPF_IDX_TYPE_EVENT) {
		DHD_FILTER_TRACE(("%s: EWPF_IDX_TYPE_EVENT FOUND\n",
		__FUNCTION__));
		ring = filter->e_ring[filter->xtlv_idx];
		elem_size = sizeof(EWPF_event_elem_t);
	} else if (filter->idx_type == EWPF_IDX_TYPE_KEY_INFO) {
		DHD_FILTER_TRACE(("%s: EWPF_IDX_TYPE_KEY_INFO FOUND\n",
		__FUNCTION__));
		ring = filter->k_ring[filter->xtlv_idx];
		elem_size = sizeof(EWPF_key_info_elem_t);
	} else {
		DHD_FILTER_TRACE(("%s unsupported idx_type:%d\n",
			__FUNCTION__, filter->idx_type));
		return BCME_OK;
	}

	/* Check armcycle epoch is changed */
	target = dhd_ring_get_last(ring);
	if (target != NULL) {
		armcycle = (uint32 *)target;
		if (*armcycle + EWPF_EPOCH <= filter->tmp_armcycle) {
			/* EPOCH is changed (longer than 1sec) */
			target = NULL;
		} else if (*armcycle - EWPF_EPOCH >= filter->tmp_armcycle) {
			/* dongle is rebooted */
			target = NULL;
		}
	}

	if (target == NULL) {
		/* Get new idx */
		target = dhd_ring_get_empty(ring);
		if (target == NULL) {
			/* no available slot due to oldest slot is locked */
			DHD_FILTER_ERR(("SKIP to logging xltv(%x) due to locking\n", type));
			return BCME_OK;
		}

		/* clean up target */
		armcycle = (uint32 *)target;
		memset(target, 0, elem_size);
		memcpy(armcycle, &filter->tmp_armcycle, sizeof(*armcycle));
	}

#ifdef EWPF_DEBUG
	DHD_FILTER_ERR(("idx:%d write_:%p %u %u\n",
		filter->xtlv_idx, target, *armcycle, filter->tmp_armcycle));
#endif

	/* Additionally put updated armcycle for event based EWP */
	if (filter->idx_type == EWPF_IDX_TYPE_EVENT ||
		filter->idx_type == EWPF_IDX_TYPE_KEY_INFO) {
		DHD_FILTER_TRACE(("%s: updated armcycle for event based EWP\n",
		__FUNCTION__));
		memcpy((uint32 *)(armcycle + EWPF_UPDATE_ARM_CYCLE_OFFSET),
			&filter->tmp_armcycle, sizeof(*armcycle));
	}

	ptr = (uint8 *)target;

#ifdef DHD_EWPR_VER2
	if (tbl->xtlv_id == WL_SLICESTATS_XTLV_HIST_TX_STATS ||
			tbl->xtlv_id == WL_SLICESTATS_XTLV_HIST_RX_STATS) {
#ifdef BCM_SDC
		int err;

		DHD_FILTER_TRACE(("TOSS_REASONS received (%d)\n", tbl->xtlv_id));

		err = evt_get_last_toss_hist(ptr + cur_ctx->tbl[tbl_idx].offset, data, len);
		if (err) {
			DHD_FILTER_ERR(("%s: get toss hist failed\n",
				__FUNCTION__));
			return BCME_ERROR;
		}
#else
		DHD_FILTER_ERR(("%s: Unabled to copy hist TX/RX stats, BCM_SDC must be included\n",
			__FUNCTION__));
#endif /* BCM_SDC */
	} else
#endif /* DHD_EWPR_VER2 */
	{
		/* XXX multiversion shall be use same structure of old version */
		if (len > cur_ctx->tbl[tbl_idx].member_length) {
			DHD_FILTER_TRACE(("data Length is too big to save: (alloc = %d), "
				"(data = %d)\n", cur_ctx->tbl[tbl_idx].member_length, len));
			len = cur_ctx->tbl[tbl_idx].member_length;
		}

		memcpy(ptr + cur_ctx->tbl[tbl_idx].offset, data, len);
	}
	return BCME_OK;
}

static int
evt_xtlv_idx_cb(void *ctx, const uint8 *data, uint16 type, uint16 len)
{
	EWPF_ctx_t *cur_ctx = (EWPF_ctx_t *)ctx;
	EWP_filter_t *filter = (EWP_filter_t *)cur_ctx->dhdp->event_log_filter;

	filter->xtlv_idx = data[0];

	if (filter->idx_type == EWPF_IDX_TYPE_SLICE) {
		if (type != WL_IFSTATS_XTLV_SLICE_INDEX ||
			filter->xtlv_idx >= EWPF_MAX_SLICE) {
			goto idx_fail;
		}
	} else if (filter->idx_type == EWPF_IDX_TYPE_IFACE) {
		if (type != WL_IFSTATS_XTLV_IF_INDEX ||
			filter->xtlv_idx >= EWPF_MAX_IFACE) {
			DHD_FILTER_ERR(("CHANGE IFACE TO 0 in FORCE\n"));
			return BCME_OK;
		}
	} else {
		goto idx_fail;
	}
	return BCME_OK;

idx_fail:
	DHD_FILTER_ERR(("UNEXPECTED IDX XTLV: filter_type:%d input_type%x idx:%d\n",
		filter->idx_type, type, filter->xtlv_idx));
	filter->idx_type = EWPF_INVALID;
	filter->xtlv_idx = EWPF_INVALID;
	return BCME_OK;
}

static int
evt_xtlv_type_cb(void *ctx, const uint8 *data, uint16 type, uint16 len)
{
	EWPF_ctx_t *cur_ctx = (EWPF_ctx_t *)ctx;
	EWP_filter_t *filter = (EWP_filter_t *)cur_ctx->dhdp->event_log_filter;

	if (type == WL_IFSTATS_XTLV_WL_SLICE) {
		filter->idx_type = EWPF_IDX_TYPE_SLICE;
		DHD_FILTER_TRACE(("SLICE XTLV\n"));
	} else if (type == WL_IFSTATS_XTLV_IF) {
		filter->idx_type = EWPF_IDX_TYPE_IFACE;
		DHD_FILTER_TRACE(("IFACE XTLV\n"));
	}

	bcm_unpack_xtlv_buf(ctx, data, len,
		BCM_XTLV_OPTION_ALIGN32, filter_main_cb);
	return BCME_OK;
}

static int
evt_xtlv_roam_cb(void *ctx, const uint8 *data, uint16 type, uint16 len)
{

	EWPF_ctx_t *cur_ctx = (EWPF_ctx_t *)ctx;
	EWPF_tbl_t *new_tbl = EWPF_roam;
	EWPF_ctx_t sub_ctx;
	int idx;

	for (idx = 0; ; idx++) {
		if (new_tbl[idx].xtlv_id == EWPF_XTLV_INVALID) {
			DHD_FILTER_TRACE(("%s NOT SUPPORTED TYPE(%d)\n", __FUNCTION__, type));
			return BCME_OK;
		}
		if (new_tbl[idx].xtlv_id == type) {
			break;
		}
	}

	/* MULTI version may not applied */
	if (len > sizeof(cur_ctx->dhdp->roam_evt)) {
		DHD_FILTER_ERR(("data length is too big :max= %d, cur=%d\n",
				(int)sizeof(cur_ctx->dhdp->roam_evt), len));
		len = sizeof(cur_ctx->dhdp->roam_evt);
	}

	/* save latest roam event to report via get_bss_info */
	(void)memcpy_s((char *)&cur_ctx->dhdp->roam_evt, sizeof(cur_ctx->dhdp->roam_evt),
			data, len);

	sub_ctx.dhdp = cur_ctx->dhdp;
	sub_ctx.tbl = new_tbl;
	new_tbl[idx].cb_func(&sub_ctx, data, type, len);
	return BCME_OK;
}

static int
filter_main_cb(void *ctx, const uint8 *data, uint16 type, uint16 len)
{
	EWPF_ctx_t *cur_ctx = (EWPF_ctx_t *)ctx;
	EWPF_ctx_t sub_ctx;
	int idx;
	int err = BCME_OK;

	DHD_FILTER_TRACE(("%s type:%x len:%d\n", __FUNCTION__, type, len));

	sub_ctx.dhdp = cur_ctx->dhdp;
	for (idx = 0; ; idx++) {
		if (cur_ctx->tbl[idx].xtlv_id == EWPF_XTLV_INVALID) {
			DHD_FILTER_TRACE(("%s NOT SUPPORTED TYPE(%d)\n", __FUNCTION__, type));
			return BCME_OK;
		}
		if (cur_ctx->tbl[idx].xtlv_id == type) {
			/* parse sub xtlv */
			if (cur_ctx->tbl[idx].cb_func == NULL) {
				sub_ctx.tbl = cur_ctx->tbl[idx].tbl;
				err = bcm_unpack_xtlv_buf(&sub_ctx, data, len,
						BCM_XTLV_OPTION_ALIGN32, filter_main_cb);
				return err;
			}

			/* handle for structure/variable */
			err = cur_ctx->tbl[idx].cb_func(ctx, data, type, len);
			if (err != BCME_OK) {
				return err;
			}
		}
	}

	return err;
}

void
dhd_event_log_filter_event_handler(dhd_pub_t *dhdp, prcd_event_log_hdr_t *plog_hdr, uint32 *data)
{
	int err;
	EWP_filter_t *filter;
	EWPF_ctx_t ctx;

	if (!dhdp->event_log_filter) {
		DHD_FILTER_ERR(("NO FILTER MODULE\n"));
		return;
	}

	if (!plog_hdr || !data) {
		/* XXX Validation check is done by caller */
		DHD_FILTER_ERR(("INVALID PARAMETER\n"));
		return;
	}

	filter = (EWP_filter_t *)dhdp->event_log_filter;
	if (filter->enabled != TRUE) {
		DHD_FILTER_ERR(("FITLER IS NOT STARTED\n"));
		return;
	}

	/* get ARMCYCLE */
	filter->tmp_armcycle = plog_hdr->armcycle;
	filter->idx_type = EWPF_INVALID;
	filter->xtlv_idx = EWPF_INVALID;

#ifdef EWPF_DEBUG
	{
		char buf[EWPF_DEBUG_BUF_LEN];
		int idx;

		memset(buf, 0, sizeof(buf));
		DHD_FILTER_ERR(("tag %d(%x) count %d(%x)\n",
			plog_hdr->tag, plog_hdr->tag, plog_hdr->count, plog_hdr->count));
		for (idx = 0; idx < plog_hdr->count; idx++) {
			sprintf(&buf[strlen(buf)], "%08x ", data[idx]);
			if ((idx + 1) % EWPF_VAL_CNT_PLINE == 0) {
				DHD_FILTER_ERR(("%s\n", buf));
				memset(buf, 0, sizeof(buf));
			}
		}
		if (strlen(buf) > 0) {
			DHD_FILTER_ERR(("%s\n", buf));
		}
	}
#endif /* EWPF_DEBUG */

	ctx.dhdp = dhdp;
	ctx.tbl = EWPF_main;
	if ((err = bcm_unpack_xtlv_buf(
		&ctx,
		(const uint8 *)data,
		(plog_hdr->count - 1) * sizeof(uint32),
		BCM_XTLV_OPTION_ALIGN32,
		filter_main_cb))) {
		DHD_FILTER_ERR(("FAIL TO UNPACK XTLV: err(%d)\n", err));
	}
}
/* ========= Private Command(Serialize) ============= */
/* XXX REPORT MODULE will be done after discuss with customer */
/* XXX Current implementation is temporal to verify FILTER MODULE works */
//#define EWPR_DEBUG
#ifdef EWPR_DEBUG
#undef DHD_FILTER_TRACE
#define DHD_FILTER_TRACE DHD_FILTER_ERR
#endif /* EWPR_DEBUG */
#define EWPR_DEBUG_BUF_LEN	512

#define EWP_REPORT_ELEM_PRINT_BUF	256
#define EWP_REPORT_NAME_MAX		64

#ifdef DHD_EWPR_VER2
#define EWP_REPORT_VERSION	0x20190514
#define EWP_REPORT_SET_DEFAULT	0x01
#define EWPR_CSDCLIENT_DIFF	10
#define EWPR_INTERVAL	3
#define EWPR_DELTA_CNT	1	/* 3 seconds before */
#define EWPR_ARRAY_CNT	10	/* INTERVAL * ARRAY total 30 seconds to lock */
#define EWPR_DELTA_LAST_POS		6

#define INDEX_STR_SIZE		6
#define	DHD_STAT_STR_SIZE	2
#define REPORT_VERSION_STR_SIZE	8
#define DELIMITER_LEN		1
#else
#define EWP_REPORT_VERSION	0x20170905
#define EWPR_CSDCLIENT_DIFF	4
#define EWPR_INTERVAL	3
#define EWPR_ARRAY_CNT	10	/* INTERVAL * ARRAY total 30 seconds to lock */
#endif /* DHD_EWPR_VER2 */

#define EWPR_DELTA3_POS		3
#define EWPR_DELTA2_POS		2
#define EWPR_DELTA1_POS		1
#define EWPR_NOW_POS		0

#define EWPR_DELTA1_CNT	2	/* 6 seconds before */
#define EWPR_DELTA2_CNT	5	/* 15 seconds before */
#define EWPR_DELTA3_CNT	9	/* 27 seconds before */

#define EWPR_CNT_PER_LINE	5

/* EWP Reporter display format */
#define EWP_DEC	1
#define EWP_HEX	2
#define EWP_BIN	3

/* EWP Filter Data type */
/* BASIC : signed + length */
#define EWP_UINT8	2
#define EWP_UINT16	4
#define EWP_UINT32	8
#define EWP_UINT64	16
#define EWP_INT8	102
#define EWP_INT16	104
#define EWP_INT32	108
#define EWP_BIT		201

/* NON BAISC : need special handling */
#define EWP_NON_BASIC	200
#define EWP_DATE		201
#define EWP_TIME		202
#define EWP_BSSID		203
#define EWP_OUI			204

/* Delimiter between values */
#define KEY_DEL	' '
#define RAW_DEL '_'

/* IOVAR BUF SIZE */
#define EWPR_IOV_BUF_LEN	64

typedef struct {
	void *ring;				/* INPUT ring to lock */
	void **elem_list;		/* OUTPUT elem ptr list for each delta */
	uint32 max_armcycle;	/* IN/OUT arm cycle should be less than this */
	uint32 min_armcycle;	/* IN/OUT arm cycle should be bigger than this */
	uint32 max_period;		/* IN allowed time diff between first and last */
	uint32 delta_cnt;		/* IN finding delta count */
	uint32 *delta_list;		/* IN delta values to find */
} ewpr_lock_param_t;

#define MAX_MULTI_VER	3
typedef struct {
	uint32	version;		/* VERSION for multiple version struct */
	uint32	offset;			/* offset of the member at the version */
} ewpr_MVT_offset_elem_t;	/* elem for multi version type */

typedef struct {
	uint32	version_offset;		/* offset of version */
	ewpr_MVT_offset_elem_t opv[MAX_MULTI_VER];	/* offset per version */
} ewpr_MVT_offset_t;			/* multi_version type */

typedef struct {
	char name[EWP_REPORT_NAME_MAX];
	int ring_type;		/* Ring Type : EWPF_IDX_TYPE_SLICE, EWPF_IDX_TYPE_IFACE */
	int	is_multi_version;		/* is multi version */
	union {
		uint32 offset;			/* Offset from start of element structure */
		ewpr_MVT_offset_t v_info;
	};
	int data_type;				/* Data type : one of EWP Filter Data Type */
	int display_format;			/* Display format : one of EWP Reporter display */
	int display_type;			/* MAX display BYTE : valid for HEX and BIN FORM */
#ifdef DHD_EWPR_VER2
	int info_type;			/* info type : EWPF_INFO_ECNT, EWPF_INFO_IOVAR, ... */
	int display_bit_length;		/* packing bit : valid for BIN FORM */
	int display_array_size;		/* array size */
	int display_method;		/* serial or diff */
	int unit_convert;		/* unit conversion
					 * 0 or 1 : no conversion, put data as is
					 * greater than 1, divide value by unit_convert
					 */
	bool need_abs;			/* need absolute function for negative value */
#endif /* DHD_EWPR_VER2 */
} ewpr_serial_info_t;

/* offset defines */
#define EWPR_CNT_VERSION_OFFSET \
	OFFSETOF(EWPF_slc_elem_t, compact_cntr_v3)

#define EWPR_CNT_V1_OFFSET(a) \
	WL_PERIODIC_COMPACT_CNTRS_VER_1, \
	(OFFSETOF(EWPF_slc_elem_t, compact_cntr_v1) + OFFSETOF(wl_periodic_compact_cntrs_v1_t, a))
#define EWPR_CNT_V2_OFFSET(a) \
	WL_PERIODIC_COMPACT_CNTRS_VER_2, \
	(OFFSETOF(EWPF_slc_elem_t, compact_cntr_v2) + OFFSETOF(wl_periodic_compact_cntrs_v2_t, a))
#define EWPR_CNT_V3_OFFSET(a) \
	WL_PERIODIC_COMPACT_CNTRS_VER_3, \
	(OFFSETOF(EWPF_slc_elem_t, compact_cntr_v3) + OFFSETOF(wl_periodic_compact_cntrs_v3_t, a))
#define EWPR_STAT_OFFSET(a) \
	(OFFSETOF(EWPF_ifc_elem_t, if_stat) + OFFSETOF(wl_if_stats_t, a))
#define EWPR_INFRA_OFFSET(a) \
	(OFFSETOF(EWPF_ifc_elem_t, infra) + OFFSETOF(wl_if_infra_stats_t, a))
#define EWPR_MGMT_OFFSET(a) \
	(OFFSETOF(EWPF_ifc_elem_t, mgmt_stat) + OFFSETOF(wl_if_mgt_stats_t, a))
#define EWPR_LQM_OFFSET(a) \
	(OFFSETOF(EWPF_ifc_elem_t, lqm) + OFFSETOF(wl_lqm_t, a))
#define EWPR_SIGNAL_OFFSET(a) \
	(EWPR_LQM_OFFSET(current_bss) + OFFSETOF(wl_rx_signal_metric_t, a))
#define EWPR_IF_COMP_OFFSET(a) \
	(OFFSETOF(EWPF_ifc_elem_t, if_comp_stat) + OFFSETOF(wl_if_state_compact_t, a))
#define EWPR_EVENT_COUNTER_OFFSET(a) \
	(OFFSETOF(EWPF_event_elem_t, event_stat) + OFFSETOF(wl_event_based_statistics_v4_t, a))
#define EWPR_KEY_INFO_OFFSET(a) \
	(OFFSETOF(EWPF_key_info_elem_t, key_update_info) + OFFSETOF(key_update_info_v1_t, a))
#define EWPR_TX_TOSS_HIST_OFFSET(a) \
	(OFFSETOF(EWPF_slc_elem_t, hist_tx_toss_stat) + \
		OFFSETOF(evt_hist_compact_toss_stats_v1_t, a))
#define EWPR_RX_TOSS_HIST_OFFSET(a) \
	(OFFSETOF(EWPF_slc_elem_t, hist_rx_toss_stat) + \
		OFFSETOF(evt_hist_compact_toss_stats_v1_t, a))
#define EWPR_BTC_STAT_OFFSET(a) \
	(OFFSETOF(EWPF_slc_elem_t, btc_stat) + \
		OFFSETOF(wlc_btc_stats_v4_t, a))
#define EWPR_COMPACT_HE_CNT_OFFSET(a) \
	(OFFSETOF(EWPF_slc_elem_t, compact_he_cnt) + \
		OFFSETOF(wl_compact_he_cnt_wlc_v2_t, a))
#define EWPR_ROAM_STATS_PERIODIC_OFFSET(a) \
	(OFFSETOF(EWPF_ifc_elem_t, roam_stat) + OFFSETOF(wl_roam_stats_v1_t, a))

/* serail info type define */
#define EWPR_SERIAL_CNT(a) {\
	#a, EWPF_IDX_TYPE_SLICE, TRUE, \
	.v_info = { EWPR_CNT_VERSION_OFFSET, \
		{{EWPR_CNT_V1_OFFSET(a)}, \
		{EWPR_CNT_V2_OFFSET(a)}, \
		{EWPR_CNT_V3_OFFSET(a)}}}, \
	EWP_UINT32, EWP_HEX, EWP_UINT32}
#define EWPR_SERIAL_CNT_16(a) {\
	#a, EWPF_IDX_TYPE_SLICE, TRUE, \
	.v_info = { EWPR_CNT_VERSION_OFFSET, \
		{{EWPR_CNT_V1_OFFSET(a)}, \
		{EWPR_CNT_V2_OFFSET(a)}, \
		{EWPR_CNT_V3_OFFSET(a)}}}, \
	EWP_UINT32, EWP_HEX, EWP_UINT16}
#define EWPR_SERIAL_STAT(a) {\
	#a, EWPF_IDX_TYPE_IFACE, FALSE, .offset = EWPR_STAT_OFFSET(a), \
	EWP_UINT64, EWP_HEX, EWP_UINT32}
#define EWPR_SERIAL_INFRA(a) {\
	#a, EWPF_IDX_TYPE_IFACE, FALSE, .offset = EWPR_INFRA_OFFSET(a), \
	EWP_UINT32, EWP_HEX, EWP_UINT16}
#define EWPR_SERIAL_MGMT(a) {\
	#a, EWPF_IDX_TYPE_IFACE, FALSE, .offset = EWPR_MGMT_OFFSET(a), \
	EWP_UINT32, EWP_HEX, EWP_UINT16}
#define EWPR_SERIAL_LQM(a) {\
	#a, EWPF_IDX_TYPE_IFACE, FALSE, .offset = EWPR_LQM_OFFSET(a), \
	EWP_INT32, EWP_DEC, EWP_INT8}
#define EWPR_SERIAL_SIGNAL(a) {\
	#a, EWPF_IDX_TYPE_IFACE, FALSE, .offset = EWPR_SIGNAL_OFFSET(a), \
	EWP_INT32, EWP_DEC, EWP_INT8}
#define EWPR_SERIAL_IFCOMP_8(a) {\
	#a, EWPF_IDX_TYPE_IFACE, FALSE, .offset = EWPR_IF_COMP_OFFSET(a), \
	EWP_INT8, EWP_DEC, EWP_INT8}
#define EWPR_SERIAL_IFCOMP_16(a) {\
	#a, EWPF_IDX_TYPE_IFACE, FALSE, .offset = EWPR_IF_COMP_OFFSET(a), \
	EWP_UINT16, EWP_DEC, EWP_UINT16}
#define EWPR_SERIAL_ARM(a) {\
	"armcycle:" #a, EWPF_IDX_TYPE_##a, FALSE, {0, }, \
	EWP_UINT32, EWP_DEC, EWP_UINT32}
#define EWPR_SERIAL_NONE {"", EWPF_INVALID, FALSE, {0, }, 0, 0, 0}

#ifdef DHD_EWPR_VER2

#define RAW_BUFFER_SIZE		720u
#define BASE64_BUFFER_SIZE	960u /* 33 percent larger than original binary data */
#define EWPR_HEADER_SIZE	39u
#define	EWPR_MAX_STR_SIZE	EWPR_HEADER_SIZE + EWPR_HEADER_SIZE

#define EWPR_DISPLAY_METHOD_SINGLE	0
#define EWPR_DISPLAY_METHOD_DIFF	1

#define MAX_BIT_SIZE	8
#define MAX_BIT_SHIFT	7

#define INDEX_UNSPECIFIED 0u

enum ewpr_context_type {
	EWP_CONTEXT_TYPE_UNWANTED_NETWORK = 0,
	EWP_CONTEXT_TYPE_ASSOC_FAIL = 1,
	EWP_CONTEXT_TYPE_ABNORMAL_DISCONNECT = 2,
	EWP_CONTEXT_TYPE_MAX = 3
};

enum ewpr_unwanted_net_sub_type {
	EWP_UNWANT_NET_SUB_TYPE_UNSPECIFIED = 0,
	EWP_UNWANT_NET_SUB_TYPE_ARP_FAIL = 1,
	EWP_UNWANT_NET_SUB_TYPE_TXBAD = 2,
	EWP_UNWANT_NET_SUB_TYPE_MAX = 3
};

enum ewpr_assoc_fail_sub_type {
	EWP_ASSOC_FAIL_SUB_TYPE_UNSPECIFIED = 0,
	EWP_ASSOC_FAIL_SUB_TYPE_DHCP_FAIL = 1,
	EWP_ASSOC_FAIL_SUB_TYPE_EAP_FAIL = 2,
	EWP_ASSOC_FAIL_SUB_TYPE_EAP_TIMEOUT = 3,
	EWP_ASSOC_FAIL_SUB_TYPE_4WAY_FAIL = 4,
	EWP_ASSOC_FAIL_SUB_TYPE_MAX = 5
};

enum ewpr_abnormal_disconnect_sub_type {
	EWP_ABNRML_DISCONNCET_SUB_TYPE_UNSPECIFIED = 0,
	EWP_ABNRML_DISCONNCET_SUB_TYPE_DISCONNECT_BY_HOST = 1,
	EWP_ABNRML_DISCONNCET_SUB_TYPE_MAX = 2
};

typedef struct {
	uint32 index1;
	uint32 index2;
	uint32 index3;
	ewpr_serial_info_t *table;
} ewpr_serial_context_info_t;

#define EWPR_SINGLE_DEFAULT EWPR_DISPLAY_METHOD_SINGLE, EWPF_NO_UNIT_CONV
#define EWPR_DIFF_DEFAULT EWPR_DISPLAY_METHOD_DIFF, EWPF_NO_UNIT_CONV

#define EWPR_SINGLE_NSEC_TO_MSEC EWPR_DISPLAY_METHOD_SINGLE, EWPF_NSEC_TO_MSEC
#define EWPR_SINGLE_USEC_TO_MSEC EWPR_DISPLAY_METHOD_SINGLE, EWPF_USEC_TO_MSEC
#define EWPR_SINGLE_USEC_TO_SEC EWPR_DISPLAY_METHOD_SINGLE, EWPF_USEC_TO_SEC

/* serail info type define */
#define EWPR_SERIAL_CNT_V3_BIT(a, b, c, d) {\
	#a, EWPF_IDX_TYPE_SLICE, TRUE, \
	.v_info = { EWPR_CNT_VERSION_OFFSET, \
		{{EWPR_CNT_V3_OFFSET(a)}}}, \
	EWP_UINT32, EWP_BIN, EWP_BIT, EWPF_INFO_ECNT, b, c, d}
#define EWPR_SERIAL_STAT_BIT(a, b, c, d) {\
	#a, EWPF_IDX_TYPE_IFACE, FALSE, .offset = EWPR_STAT_OFFSET(a), \
	EWP_UINT64, EWP_BIN, EWP_BIT, EWPF_INFO_ECNT, b, c, d}
#define EWPR_SERIAL_INFRA_BIT(a, b, c, d) {\
	#a, EWPF_IDX_TYPE_IFACE, FALSE, .offset = EWPR_INFRA_OFFSET(a), \
	EWP_UINT32, EWP_BIN, EWP_BIT, EWPF_INFO_ECNT, b, c, d}
#define EWPR_SERIAL_MGMT_BIT(a, b, c, d) {\
	#a, EWPF_IDX_TYPE_IFACE, FALSE, .offset = EWPR_MGMT_OFFSET(a), \
	EWP_UINT32, EWP_BIN, EWP_BIT, EWPF_INFO_ECNT, b, c, d}
#define EWPR_SERIAL_LQM_BIT(a, b, c, d) {\
	#a, EWPF_IDX_TYPE_IFACE, FALSE, .offset = EWPR_LQM_OFFSET(a), \
	EWP_INT32, EWP_BIN, EWP_BIT, EWPF_INFO_ECNT, b, c, d}
#define EWPR_SERIAL_SIGNAL_BIT(a, b, c, d) {\
	#a, EWPF_IDX_TYPE_IFACE, FALSE, .offset = EWPR_SIGNAL_OFFSET(a), \
	EWP_INT32, EWP_BIN, EWP_BIT, EWPF_INFO_ECNT, b, c, d}
#define EWPR_SERIAL_IFCOMP_BIT(a, b, c, d) {\
	#a, EWPF_IDX_TYPE_IFACE, FALSE, .offset = EWPR_IF_COMP_OFFSET(a), \
	EWP_INT8, EWP_BIN, EWP_BIT, EWPF_INFO_ECNT, b, c, d}
#define EWPR_SERIAL_EVENT_COUNTER_16_BIT(a, b, c, d) {\
	#a, EWPF_IDX_TYPE_EVENT, FALSE, .offset = EWPR_EVENT_COUNTER_OFFSET(a), \
	EWP_UINT16, EWP_BIN, EWP_BIT, EWPF_INFO_ECNT, b, c, d}
#define EWPR_SERIAL_EVENT_COUNTER_32_BIT(a, b, c, d) {\
	#a, EWPF_IDX_TYPE_EVENT, FALSE, .offset = EWPR_EVENT_COUNTER_OFFSET(a), \
	EWP_UINT32, EWP_BIN, EWP_BIT, EWPF_INFO_ECNT, b, c, d}
#define EWPR_SERIAL_KEY_INFO_BIT(a, b, c, d) {\
	#a, EWPF_IDX_TYPE_KEY_INFO, FALSE, .offset = EWPR_KEY_INFO_OFFSET(a), \
	EWP_UINT32, EWP_BIN, EWP_BIT, EWPF_INFO_ECNT, b, c, d}
#define EWPR_SERIAL_ROAM_STAT_PERIODIC_16_BIT(a, b, c, d) {\
	#a, EWPF_IDX_TYPE_IFACE, FALSE, .offset = EWPR_ROAM_STATS_PERIODIC_OFFSET(a), \
	EWP_UINT16, EWP_BIN, EWP_BIT, EWPF_INFO_ECNT, b, c, d}
#define EWPR_SERIAL_ROAM_STAT_PERIODIC_32_BIT(a, b, c, d) {\
	#a, EWPF_IDX_TYPE_IFACE, FALSE, .offset = EWPR_ROAM_STATS_PERIODIC_OFFSET(a), \
	EWP_UINT32, EWP_BIN, EWP_BIT, EWPF_INFO_ECNT, b, c, d}
#define EWPR_SERIAL_ARM_BIT(a, b, c, d) {\
	#a, EWPF_IDX_TYPE_##a, FALSE, {0, }, \
	EWP_UINT32, EWP_BIN, EWP_BIT, EWPF_INFO_ECNT, b, c, d}
#define EWPR_SERIAL_IOVAR_BIT(a, b) {\
	#a, 0, 0, .offset = 0, \
	EWP_UINT32, EWP_BIN, EWP_BIT, EWPF_INFO_IOVAR, b, 1, EWPR_SINGLE_DEFAULT}
#define EWPR_SERIAL_VERSION_BIT(a, b) {\
	#a, 0, 0, .offset = 0, \
	EWP_UINT32, EWP_BIN, EWP_BIT, EWPF_INFO_VER, b, 1, EWPR_SINGLE_DEFAULT}
#define EWPR_SERIAL_TYPE_BIT(a, b) {\
	#a, 0, 0, .offset = 0, \
	EWP_UINT32, EWP_BIN, EWP_BIT, EWPF_INFO_TYPE, b, 1, EWPR_SINGLE_DEFAULT}
#define EWPR_SERIAL_CPLOG_BIT(a, b, c) {\
	#a, 0, 0, .offset = 0, \
	EWP_UINT32, EWP_BIN, EWP_BIT, EWPF_INFO_CPLOG, b, c, EWPR_SINGLE_DEFAULT}
#define EWPR_SERIAL_DHDSTAT_BIT(a, b, c, d) {\
	#a, 0, 0, .offset = 0, \
	EWP_UINT32, EWP_BIN, EWP_BIT, EWPF_INFO_DHDSTAT, b, c, d}
#define EWPR_SERIAL_TX_TOSS_HIST_BIT(a, b, c, d) {\
	#a, EWPF_IDX_TYPE_SLICE, FALSE, .offset = EWPR_TX_TOSS_HIST_OFFSET(a), \
	EWP_UINT32, EWP_BIN, EWP_BIT, EWPF_INFO_ECNT, b, c, d}
#define EWPR_SERIAL_RX_TOSS_HIST_BIT(a, b, c, d) {\
	#a, EWPF_IDX_TYPE_SLICE, FALSE, .offset = EWPR_RX_TOSS_HIST_OFFSET(a), \
	EWP_UINT32, EWP_BIN, EWP_BIT, EWPF_INFO_ECNT, b, c, d}
#define EWPR_SERIAL_BTC_STAT_16_BIT(a, b, c, d) {\
	#a, EWPF_IDX_TYPE_SLICE, FALSE, .offset = EWPR_BTC_STAT_OFFSET(a), \
	EWP_UINT16, EWP_BIN, EWP_BIT, EWPF_INFO_ECNT, b, c, d}
#define EWPR_SERIAL_BTC_STAT_32_BIT(a, b, c, d) {\
	#a, EWPF_IDX_TYPE_SLICE, FALSE, .offset = EWPR_BTC_STAT_OFFSET(a), \
	EWP_UINT32, EWP_BIN, EWP_BIT, EWPF_INFO_ECNT, b, c, d}
#define EWPR_SERIAL_COMPACT_HE_CNT_BIT(a, b, c, d) {\
	#a, EWPF_IDX_TYPE_SLICE, FALSE, .offset = EWPR_COMPACT_HE_CNT_OFFSET(a), \
	EWP_UINT32, EWP_BIN, EWP_BIT, EWPF_INFO_ECNT, b, c, d}

#define EWPR_SERIAL_NONE_BIT {"", EWPF_INVALID, FALSE, {0, }, 0, 0, 0, 0, 0, 0, 0}

#ifdef EWPR_DEBUG
static void ewpr_print_byte_as_bits(char val);
#endif /* EWPR_DEBUG */

static int32
ewpr_diff_bit_pack(ewpr_serial_info_t *info, char *buf, int buf_len,
	void *_f_op, void *_s_op, int32 bit_offset);
static int32
ewpr_single_bit_pack(ewpr_serial_info_t *info, char *buf, int buf_len,
	void *_ptr, int32 bit_offset);
static int32
ewpr_bit_pack_basic(char *buf, int buf_len, uint32 data, int32 format,
	int32 display_type, int32 display_bit_length, int32 bit_offset);

static char*
ewpr_base64_encode(dhd_pub_t *dhdp, char* input, int32 length);
#endif /* DHD_EWPR_VER2 */

ewpr_serial_info_t
ewpr_serial_CSDCLIENT_key_tbl[] = {
	EWPR_SERIAL_STAT(txframe),
	EWPR_SERIAL_STAT(txerror),
	EWPR_SERIAL_STAT(rxframe),
	EWPR_SERIAL_STAT(rxerror),
	EWPR_SERIAL_STAT(txretrans),
	EWPR_SERIAL_INFRA(rxbeaconmbss),
	EWPR_SERIAL_CNT(txallfrm),
	EWPR_SERIAL_CNT(rxrsptmout),
	EWPR_SERIAL_CNT(rxbadplcp),
	EWPR_SERIAL_CNT(rxcrsglitch),
	EWPR_SERIAL_CNT(rxbadfcs),
	EWPR_SERIAL_CNT_16(rxbeaconmbss),
	EWPR_SERIAL_CNT_16(rxbeaconobss),
	EWPR_SERIAL_NONE
};

ewpr_serial_info_t
ewpr_serial_CSDCLIENT_diff_tbl[] = {
	EWPR_SERIAL_STAT(txframe),
	EWPR_SERIAL_STAT(txerror),
	EWPR_SERIAL_STAT(rxframe),
	EWPR_SERIAL_STAT(rxerror),
	EWPR_SERIAL_STAT(txretrans),
	EWPR_SERIAL_INFRA(rxbeaconmbss),
	EWPR_SERIAL_MGMT(txassocreq),
	EWPR_SERIAL_MGMT(txreassocreq),
	EWPR_SERIAL_MGMT(txdisassoc),
	EWPR_SERIAL_MGMT(rxdisassoc),
	EWPR_SERIAL_MGMT(rxassocrsp),
	EWPR_SERIAL_MGMT(rxreassocrsp),
	EWPR_SERIAL_MGMT(txauth),
	EWPR_SERIAL_MGMT(rxauth),
	EWPR_SERIAL_MGMT(txdeauth),
	EWPR_SERIAL_MGMT(rxdeauth),
	EWPR_SERIAL_MGMT(txaction),
	EWPR_SERIAL_MGMT(rxaction),
	EWPR_SERIAL_CNT(txallfrm),
	EWPR_SERIAL_CNT(rxrsptmout),
	EWPR_SERIAL_CNT(rxbadplcp),
	EWPR_SERIAL_CNT(rxcrsglitch),
	EWPR_SERIAL_CNT(rxbadfcs),
	EWPR_SERIAL_CNT_16(rxbeaconmbss),
	EWPR_SERIAL_CNT_16(rxbeaconobss),
	EWPR_SERIAL_NONE
};

ewpr_serial_info_t
ewpr_serial_CSDCLIENT_array_tbl[] = {
	EWPR_SERIAL_IFCOMP_8(rssi_sum),
	EWPR_SERIAL_IFCOMP_8(snr),
	EWPR_SERIAL_IFCOMP_8(noise_level),
	EWPR_SERIAL_NONE
};

#ifdef EWPR_DEBUG
ewpr_serial_info_t
ewpr_serial_dbg_tbl[] = {
	EWPR_SERIAL_ARM(IFACE),
	EWPR_SERIAL_ARM(SLICE),
	EWPR_SERIAL_NONE
};
#endif /* EWPR_DEBUG */

#ifdef DHD_EWPR_VER2

ewpr_serial_info_t
ewpr_serial_bit_unwanted_network_default_tbl[] = {
	EWPR_SERIAL_VERSION_BIT(version, 32),
	EWPR_SERIAL_TYPE_BIT(type, 5),
	EWPR_SERIAL_DHDSTAT_BIT(dhdstat_last_ts, 32, 1, EWPR_SINGLE_USEC_TO_SEC),
	EWPR_SERIAL_DHDSTAT_BIT(dhdstat_last, 8, 1, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_DHDSTAT_BIT(dhdstat_prev_ts, 32, 1, EWPR_SINGLE_USEC_TO_SEC),
	EWPR_SERIAL_DHDSTAT_BIT(dhdstat_prev, 8, 1, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_IOVAR_BIT(auth, 8),
	EWPR_SERIAL_IOVAR_BIT(wsec, 8),
	EWPR_SERIAL_IOVAR_BIT(mfp, 1),
	EWPR_SERIAL_IOVAR_BIT(bip, 8),
	EWPR_SERIAL_ARM_BIT(IFACE, 32, 1, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_STAT_BIT(txframe, 17, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_STAT_BIT(txerror, 17, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_STAT_BIT(rxframe, 17, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_STAT_BIT(rxerror, 17, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_STAT_BIT(txretrans, 17, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_MGMT_BIT(txassocreq, 4, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_MGMT_BIT(txreassocreq, 4, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_MGMT_BIT(txdisassoc, 4, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_MGMT_BIT(rxdisassoc, 4, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_MGMT_BIT(rxassocrsp, 4, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_MGMT_BIT(rxreassocrsp, 4, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_MGMT_BIT(txauth, 4, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_MGMT_BIT(rxauth, 4, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_MGMT_BIT(txdeauth, 4, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_MGMT_BIT(rxdeauth, 4, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_MGMT_BIT(txaction, 7, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_MGMT_BIT(rxaction, 7, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_CNT_V3_BIT(txallfrm, 17, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_CNT_V3_BIT(rxrsptmout, 17, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_CNT_V3_BIT(rxbadplcp, 17, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_CNT_V3_BIT(rxcrsglitch, 17, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_CNT_V3_BIT(rxbadfcs, 17, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_CNT_V3_BIT(rxbeaconmbss, 5, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_CNT_V3_BIT(rxbeaconobss, 12, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_CNT_V3_BIT(lqcm_report, 19, 6, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_CNT_V3_BIT(tx_toss_cnt, 18, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_CNT_V3_BIT(rx_toss_cnt, 18, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_CNT_V3_BIT(rxretry, 17, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_CNT_V3_BIT(rxdup, 15, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_CNT_V3_BIT(chswitch_cnt, 8, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_CNT_V3_BIT(pm_dur, 12, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_CNT_V3_BIT(rxholes, 15, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_BTC_STAT_16_BIT(bt_dcsn_map, 16, 3, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_BTC_STAT_16_BIT(bt_dcsn_cnt, 12, 3, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_BTC_STAT_16_BIT(bt_a2dp_hiwat_cnt, 12, 3, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_BTC_STAT_16_BIT(bt_datadelay_cnt, 12, 3, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_BTC_STAT_16_BIT(bt_crtpri_cnt, 12, 3, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_BTC_STAT_16_BIT(bt_pri_cnt, 12, 3, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_BTC_STAT_16_BIT(a2dpbuf5cnt, 12, 3, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_BTC_STAT_16_BIT(a2dpbuf6cnt, 12, 3, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_BTC_STAT_16_BIT(a2dpbuf7cnt, 12, 3, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_BTC_STAT_32_BIT(bt_gnt_dur, 12, 3, EWPR_SINGLE_USEC_TO_MSEC),
	EWPR_SERIAL_IFCOMP_BIT(rssi_sum, 7, 6, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_IFCOMP_BIT(snr, 7, 6, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_IFCOMP_BIT(noise_level, 7, 6, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_ROAM_STAT_PERIODIC_32_BIT(initial_assoc_time, 32, 1, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_ROAM_STAT_PERIODIC_32_BIT(prev_roam_time, 32, 1, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_ROAM_STAT_PERIODIC_32_BIT(last_roam_event_type, 8, 1, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_ROAM_STAT_PERIODIC_32_BIT(last_roam_event_status, 6, 1, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_ROAM_STAT_PERIODIC_32_BIT(last_roam_event_reason, 6, 1, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_ROAM_STAT_PERIODIC_16_BIT(roam_success_cnt, 10, 1, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_ROAM_STAT_PERIODIC_16_BIT(roam_fail_cnt, 10, 1, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_ROAM_STAT_PERIODIC_16_BIT(roam_attempt_cnt, 11, 1, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_ROAM_STAT_PERIODIC_16_BIT(max_roam_target_cnt, 5, 1, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_ROAM_STAT_PERIODIC_16_BIT(min_roam_target_cnt, 5, 1, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_ROAM_STAT_PERIODIC_16_BIT(max_cached_ch_cnt, 5, 1, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_ROAM_STAT_PERIODIC_16_BIT(min_cached_ch_cnt, 5, 1, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_ROAM_STAT_PERIODIC_16_BIT(partial_roam_scan_cnt, 11, 1, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_ROAM_STAT_PERIODIC_16_BIT(full_roam_scan_cnt, 11, 1, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_COMPACT_HE_CNT_BIT(he_rxtrig_myaid, 10, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_COMPACT_HE_CNT_BIT(he_colormiss_cnt, 10, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_COMPACT_HE_CNT_BIT(he_rxmsta_back, 10, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_COMPACT_HE_CNT_BIT(he_txtbppdu, 10, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_COMPACT_HE_CNT_BIT(he_null_tbppdu, 10, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_KEY_INFO_BIT(timestamp, 32, 1, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_KEY_INFO_BIT(algo, 6, 1, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_KEY_INFO_BIT(key_flags, 16, 1, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_TX_TOSS_HIST_BIT(htr_rn_ts_last, 32, 1, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_TX_TOSS_HIST_BIT(htr_rn_last, 32, 1, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_TX_TOSS_HIST_BIT(htr_rn_ts_prev, 32, 1, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_TX_TOSS_HIST_BIT(htr_rn_prev, 32, 1, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_TX_TOSS_HIST_BIT(htr_rc_ts_max, 32, 1, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_TX_TOSS_HIST_BIT(htr_rc_max, 32, 1, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_TX_TOSS_HIST_BIT(htr_rc_ts_secnd, 32, 1, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_TX_TOSS_HIST_BIT(htr_rc_secnd, 32, 1, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_RX_TOSS_HIST_BIT(htr_rn_ts_last, 32, 1, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_RX_TOSS_HIST_BIT(htr_rn_last, 32, 1, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_RX_TOSS_HIST_BIT(htr_rn_ts_prev, 32, 1, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_RX_TOSS_HIST_BIT(htr_rn_prev, 32, 1, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_RX_TOSS_HIST_BIT(htr_rc_ts_max, 32, 1, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_RX_TOSS_HIST_BIT(htr_rc_max, 32, 1, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_RX_TOSS_HIST_BIT(htr_rc_ts_secnd, 32, 1, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_RX_TOSS_HIST_BIT(htr_rc_secnd, 32, 1, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_CPLOG_BIT(packtlog, 22, 70),
	EWPR_SERIAL_NONE
};

ewpr_serial_info_t
ewpr_serial_bit_assoc_fail_default_tbl[] = {
	EWPR_SERIAL_VERSION_BIT(version, 32),
	EWPR_SERIAL_TYPE_BIT(type, 5),
	EWPR_SERIAL_DHDSTAT_BIT(dhdstat_last_ts, 32, 1, EWPR_SINGLE_USEC_TO_SEC),
	EWPR_SERIAL_DHDSTAT_BIT(dhdstat_last, 8, 1, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_DHDSTAT_BIT(dhdstat_prev_ts, 32, 1, EWPR_SINGLE_USEC_TO_SEC),
	EWPR_SERIAL_DHDSTAT_BIT(dhdstat_prev, 8, 1, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_IOVAR_BIT(auth, 8),
	EWPR_SERIAL_IOVAR_BIT(wsec, 8),
	EWPR_SERIAL_IOVAR_BIT(mfp, 1),
	EWPR_SERIAL_IOVAR_BIT(bip, 8),
	EWPR_SERIAL_ARM_BIT(IFACE, 32, 1, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_STAT_BIT(txframe, 17, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_STAT_BIT(txerror, 17, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_STAT_BIT(rxframe, 17, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_STAT_BIT(rxerror, 17, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_STAT_BIT(txretrans, 17, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_MGMT_BIT(txassocreq, 4, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_MGMT_BIT(txreassocreq, 4, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_MGMT_BIT(txdisassoc, 4, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_MGMT_BIT(rxdisassoc, 4, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_MGMT_BIT(rxassocrsp, 4, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_MGMT_BIT(rxreassocrsp, 4, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_MGMT_BIT(txauth, 4, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_MGMT_BIT(rxauth, 4, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_MGMT_BIT(txdeauth, 4, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_MGMT_BIT(rxdeauth, 4, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_MGMT_BIT(txaction, 7, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_MGMT_BIT(rxaction, 7, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_CNT_V3_BIT(txallfrm, 17, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_CNT_V3_BIT(rxrsptmout, 17, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_CNT_V3_BIT(rxbadplcp, 17, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_CNT_V3_BIT(rxcrsglitch, 17, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_CNT_V3_BIT(rxbadfcs, 17, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_CNT_V3_BIT(rxbeaconmbss, 5, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_CNT_V3_BIT(rxbeaconobss, 12, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_CNT_V3_BIT(lqcm_report, 19, 6, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_CNT_V3_BIT(tx_toss_cnt, 18, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_CNT_V3_BIT(rx_toss_cnt, 18, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_CNT_V3_BIT(rxretry, 17, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_CNT_V3_BIT(rxdup, 15, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_CNT_V3_BIT(chswitch_cnt, 8, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_CNT_V3_BIT(pm_dur, 12, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_CNT_V3_BIT(rxholes, 15, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_BTC_STAT_16_BIT(bt_dcsn_map, 16, 3, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_BTC_STAT_16_BIT(bt_dcsn_cnt, 12, 3, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_BTC_STAT_16_BIT(bt_a2dp_hiwat_cnt, 12, 3, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_BTC_STAT_16_BIT(bt_datadelay_cnt, 12, 3, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_BTC_STAT_16_BIT(bt_crtpri_cnt, 12, 3, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_BTC_STAT_16_BIT(bt_pri_cnt, 12, 3, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_BTC_STAT_16_BIT(a2dpbuf5cnt, 12, 3, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_BTC_STAT_16_BIT(a2dpbuf6cnt, 12, 3, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_BTC_STAT_16_BIT(a2dpbuf7cnt, 12, 3, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_BTC_STAT_32_BIT(bt_gnt_dur, 12, 3, EWPR_SINGLE_USEC_TO_MSEC),
	EWPR_SERIAL_IFCOMP_BIT(rssi_sum, 7, 6, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_IFCOMP_BIT(snr, 7, 6, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_IFCOMP_BIT(noise_level, 7, 6, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_COMPACT_HE_CNT_BIT(he_rxtrig_myaid, 10, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_COMPACT_HE_CNT_BIT(he_colormiss_cnt, 10, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_COMPACT_HE_CNT_BIT(he_rxmsta_back, 10, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_COMPACT_HE_CNT_BIT(he_txtbppdu, 10, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_COMPACT_HE_CNT_BIT(he_null_tbppdu, 10, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_KEY_INFO_BIT(timestamp, 32, 1, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_KEY_INFO_BIT(algo, 6, 1, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_KEY_INFO_BIT(key_flags, 16, 1, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_TX_TOSS_HIST_BIT(htr_rn_ts_last, 32, 1, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_TX_TOSS_HIST_BIT(htr_rn_last, 32, 1, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_TX_TOSS_HIST_BIT(htr_rn_ts_prev, 32, 1, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_TX_TOSS_HIST_BIT(htr_rn_prev, 32, 1, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_TX_TOSS_HIST_BIT(htr_rc_ts_max, 32, 1, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_TX_TOSS_HIST_BIT(htr_rc_max, 32, 1, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_TX_TOSS_HIST_BIT(htr_rc_ts_secnd, 32, 1, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_TX_TOSS_HIST_BIT(htr_rc_secnd, 32, 1, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_RX_TOSS_HIST_BIT(htr_rn_ts_last, 32, 1, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_RX_TOSS_HIST_BIT(htr_rn_last, 32, 1, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_RX_TOSS_HIST_BIT(htr_rn_ts_prev, 32, 1, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_RX_TOSS_HIST_BIT(htr_rn_prev, 32, 1, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_RX_TOSS_HIST_BIT(htr_rc_ts_max, 32, 1, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_RX_TOSS_HIST_BIT(htr_rc_max, 32, 1, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_RX_TOSS_HIST_BIT(htr_rc_ts_secnd, 32, 1, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_RX_TOSS_HIST_BIT(htr_rc_secnd, 32, 1, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_CPLOG_BIT(packtlog, 22, 70),
	EWPR_SERIAL_NONE
};

ewpr_serial_info_t
ewpr_serial_bit_abnormal_disconnect_default_tbl[] = {
	EWPR_SERIAL_VERSION_BIT(version, 32),
	EWPR_SERIAL_TYPE_BIT(type, 5),
	EWPR_SERIAL_DHDSTAT_BIT(dhdstat_last_ts, 32, 1, EWPR_SINGLE_USEC_TO_SEC),
	EWPR_SERIAL_DHDSTAT_BIT(dhdstat_last, 8, 1, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_DHDSTAT_BIT(dhdstat_prev_ts, 32, 1, EWPR_SINGLE_USEC_TO_SEC),
	EWPR_SERIAL_DHDSTAT_BIT(dhdstat_prev, 8, 1, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_IOVAR_BIT(auth, 8),
	EWPR_SERIAL_IOVAR_BIT(wsec, 8),
	EWPR_SERIAL_IOVAR_BIT(mfp, 1),
	EWPR_SERIAL_IOVAR_BIT(bip, 8),
	EWPR_SERIAL_ARM_BIT(IFACE, 32, 1, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_STAT_BIT(txframe, 17, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_STAT_BIT(txerror, 17, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_STAT_BIT(rxframe, 17, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_STAT_BIT(rxerror, 17, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_STAT_BIT(txretrans, 17, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_MGMT_BIT(txassocreq, 4, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_MGMT_BIT(txreassocreq, 4, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_MGMT_BIT(txdisassoc, 4, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_MGMT_BIT(rxdisassoc, 4, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_MGMT_BIT(rxassocrsp, 4, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_MGMT_BIT(rxreassocrsp, 4, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_MGMT_BIT(txauth, 4, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_MGMT_BIT(rxauth, 4, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_MGMT_BIT(txdeauth, 4, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_MGMT_BIT(rxdeauth, 4, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_MGMT_BIT(txaction, 7, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_MGMT_BIT(rxaction, 7, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_CNT_V3_BIT(txallfrm, 17, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_CNT_V3_BIT(rxrsptmout, 17, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_CNT_V3_BIT(rxbadplcp, 17, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_CNT_V3_BIT(rxcrsglitch, 17, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_CNT_V3_BIT(rxbadfcs, 17, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_CNT_V3_BIT(rxbeaconmbss, 5, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_CNT_V3_BIT(rxbeaconobss, 12, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_CNT_V3_BIT(lqcm_report, 19, 6, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_CNT_V3_BIT(tx_toss_cnt, 18, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_CNT_V3_BIT(rx_toss_cnt, 18, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_CNT_V3_BIT(rxretry, 17, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_CNT_V3_BIT(rxdup, 15, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_CNT_V3_BIT(chswitch_cnt, 8, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_CNT_V3_BIT(pm_dur, 12, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_CNT_V3_BIT(rxholes, 15, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_BTC_STAT_16_BIT(bt_dcsn_map, 16, 3, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_BTC_STAT_16_BIT(bt_dcsn_cnt, 12, 3, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_BTC_STAT_16_BIT(bt_a2dp_hiwat_cnt, 12, 3, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_BTC_STAT_16_BIT(bt_datadelay_cnt, 12, 3, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_BTC_STAT_16_BIT(bt_crtpri_cnt, 12, 3, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_BTC_STAT_16_BIT(bt_pri_cnt, 12, 3, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_BTC_STAT_16_BIT(a2dpbuf5cnt, 12, 3, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_BTC_STAT_16_BIT(a2dpbuf6cnt, 12, 3, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_BTC_STAT_16_BIT(a2dpbuf7cnt, 12, 3, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_BTC_STAT_32_BIT(bt_gnt_dur, 12, 3, EWPR_SINGLE_USEC_TO_MSEC),
	EWPR_SERIAL_IFCOMP_BIT(rssi_sum, 7, 6, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_IFCOMP_BIT(snr, 7, 6, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_IFCOMP_BIT(noise_level, 7, 6, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_ROAM_STAT_PERIODIC_32_BIT(initial_assoc_time, 32, 1, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_ROAM_STAT_PERIODIC_32_BIT(prev_roam_time, 32, 1, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_ROAM_STAT_PERIODIC_32_BIT(last_roam_event_type, 8, 1, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_ROAM_STAT_PERIODIC_32_BIT(last_roam_event_status, 6, 1, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_ROAM_STAT_PERIODIC_32_BIT(last_roam_event_reason, 6, 1, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_ROAM_STAT_PERIODIC_16_BIT(roam_success_cnt, 10, 1, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_ROAM_STAT_PERIODIC_16_BIT(roam_fail_cnt, 10, 1, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_ROAM_STAT_PERIODIC_16_BIT(roam_attempt_cnt, 11, 1, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_ROAM_STAT_PERIODIC_16_BIT(max_roam_target_cnt, 5, 1, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_ROAM_STAT_PERIODIC_16_BIT(min_roam_target_cnt, 5, 1, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_ROAM_STAT_PERIODIC_16_BIT(max_cached_ch_cnt, 5, 1, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_ROAM_STAT_PERIODIC_16_BIT(min_cached_ch_cnt, 5, 1, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_ROAM_STAT_PERIODIC_16_BIT(partial_roam_scan_cnt, 11, 1, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_ROAM_STAT_PERIODIC_16_BIT(full_roam_scan_cnt, 11, 1, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_COMPACT_HE_CNT_BIT(he_rxtrig_myaid, 10, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_COMPACT_HE_CNT_BIT(he_colormiss_cnt, 10, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_COMPACT_HE_CNT_BIT(he_rxmsta_back, 10, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_COMPACT_HE_CNT_BIT(he_txtbppdu, 10, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_COMPACT_HE_CNT_BIT(he_null_tbppdu, 10, 6, EWPR_DIFF_DEFAULT),
	EWPR_SERIAL_KEY_INFO_BIT(timestamp, 32, 1, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_KEY_INFO_BIT(algo, 6, 1, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_KEY_INFO_BIT(key_flags, 16, 1, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_TX_TOSS_HIST_BIT(htr_rn_ts_last, 32, 1, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_TX_TOSS_HIST_BIT(htr_rn_last, 32, 1, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_TX_TOSS_HIST_BIT(htr_rn_ts_prev, 32, 1, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_TX_TOSS_HIST_BIT(htr_rn_prev, 32, 1, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_TX_TOSS_HIST_BIT(htr_rc_ts_max, 32, 1, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_TX_TOSS_HIST_BIT(htr_rc_max, 32, 1, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_TX_TOSS_HIST_BIT(htr_rc_ts_secnd, 32, 1, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_TX_TOSS_HIST_BIT(htr_rc_secnd, 32, 1, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_RX_TOSS_HIST_BIT(htr_rn_ts_last, 32, 1, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_RX_TOSS_HIST_BIT(htr_rn_last, 32, 1, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_RX_TOSS_HIST_BIT(htr_rn_ts_prev, 32, 1, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_RX_TOSS_HIST_BIT(htr_rn_prev, 32, 1, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_RX_TOSS_HIST_BIT(htr_rc_ts_max, 32, 1, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_RX_TOSS_HIST_BIT(htr_rc_max, 32, 1, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_RX_TOSS_HIST_BIT(htr_rc_ts_secnd, 32, 1, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_RX_TOSS_HIST_BIT(htr_rc_secnd, 32, 1, EWPR_SINGLE_DEFAULT),
	EWPR_SERIAL_CPLOG_BIT(packtlog, 22, 70),
	EWPR_SERIAL_NONE
};

ewpr_serial_context_info_t ewpr_serial_context_info[] = {
	{EWP_CONTEXT_TYPE_UNWANTED_NETWORK, EWP_UNWANT_NET_SUB_TYPE_UNSPECIFIED,
	INDEX_UNSPECIFIED, &ewpr_serial_bit_unwanted_network_default_tbl[0]},
	{EWP_CONTEXT_TYPE_UNWANTED_NETWORK, EWP_UNWANT_NET_SUB_TYPE_ARP_FAIL,
	INDEX_UNSPECIFIED, &ewpr_serial_bit_unwanted_network_default_tbl[0]},
	{EWP_CONTEXT_TYPE_UNWANTED_NETWORK, EWP_UNWANT_NET_SUB_TYPE_TXBAD,
	INDEX_UNSPECIFIED, &ewpr_serial_bit_unwanted_network_default_tbl[0]},
	{EWP_CONTEXT_TYPE_ASSOC_FAIL, EWP_ASSOC_FAIL_SUB_TYPE_UNSPECIFIED,
	INDEX_UNSPECIFIED, &ewpr_serial_bit_assoc_fail_default_tbl[0]},
	{EWP_CONTEXT_TYPE_ASSOC_FAIL, EWP_ASSOC_FAIL_SUB_TYPE_DHCP_FAIL,
	INDEX_UNSPECIFIED, &ewpr_serial_bit_assoc_fail_default_tbl[0]},
	{EWP_CONTEXT_TYPE_ASSOC_FAIL, EWP_ASSOC_FAIL_SUB_TYPE_EAP_FAIL,
	INDEX_UNSPECIFIED, &ewpr_serial_bit_assoc_fail_default_tbl[0]},
	{EWP_CONTEXT_TYPE_ASSOC_FAIL, EWP_ASSOC_FAIL_SUB_TYPE_EAP_TIMEOUT,
	INDEX_UNSPECIFIED, &ewpr_serial_bit_assoc_fail_default_tbl[0]},
	{EWP_CONTEXT_TYPE_ASSOC_FAIL, EWP_ASSOC_FAIL_SUB_TYPE_4WAY_FAIL,
	INDEX_UNSPECIFIED, &ewpr_serial_bit_assoc_fail_default_tbl[0]},
	{EWP_CONTEXT_TYPE_ABNORMAL_DISCONNECT, EWP_ABNRML_DISCONNCET_SUB_TYPE_UNSPECIFIED,
	INDEX_UNSPECIFIED, &ewpr_serial_bit_abnormal_disconnect_default_tbl[0]},
	{EWP_CONTEXT_TYPE_ABNORMAL_DISCONNECT, EWP_ABNRML_DISCONNCET_SUB_TYPE_DISCONNECT_BY_HOST,
	INDEX_UNSPECIFIED, &ewpr_serial_bit_abnormal_disconnect_default_tbl[0]},
	{EWP_CONTEXT_TYPE_MAX, INDEX_UNSPECIFIED, INDEX_UNSPECIFIED, NULL}
};
#endif /* DHD_EWPR_VER2 */

int ewpr_set_period_lock(ewpr_lock_param_t *param);
int ewpr_diff_serial(ewpr_serial_info_t *info, char *buf,
	int buf_len, void *_f_op, void *_s_op, char del);
int ewpr_single_serial(ewpr_serial_info_t *info, char *buf, int buf_len, void *ptr, char del);

int
ewpr_serial_basic(char *buf, int buf_len, uint32 data, int format, int display_type, char del)
{
	if (format == EWP_HEX) {
		switch (display_type) {
			case EWP_INT8:
			case EWP_UINT8:
				return scnprintf(buf, buf_len, "%c%02x", del, data & 0xff);
			case EWP_INT16:
			case EWP_UINT16:
				return scnprintf(buf, buf_len, "%c%04x", del, data & 0xffff);
			case EWP_INT32:
			case EWP_UINT32:
				return scnprintf(buf, buf_len, "%c%08x", del, data & 0xffffffff);
			default:
				DHD_FILTER_ERR(("INVALID TYPE for Serial:%d", display_type));
				return 0;
		}
	}

	if (format == EWP_DEC) {
		int32 sdata = (int32) data;
		switch (display_type) {
			case EWP_INT8:
			case EWP_UINT8:
				return scnprintf(buf, buf_len, "%c%04d", del, sdata);
			case EWP_INT16:
			case EWP_UINT16:
				return scnprintf(buf, buf_len, "%c%06d", del, sdata);
			case EWP_INT32:
			case EWP_UINT32:
				return scnprintf(buf, buf_len, "%c%011d", del, sdata);
			default:
				DHD_FILTER_ERR(("INVALID TYPE for Serial:%d", display_type));
				return 0;
		}
	}

	if (format == EWP_BIN) {
		int32 sdata = (int32) data;
		switch (display_type) {
			case EWP_BIT:
				return scnprintf(buf, buf_len, "%c%011d", del, sdata);
			default:
				DHD_FILTER_ERR(("INVALID TYPE for Serial:%d", display_type));
				return 0;
		}
	}

	DHD_FILTER_ERR(("INVALID FORMAT for Serial:%d", format));
	return 0;
}

static int
ewpr_get_multi_offset(uint16 looking_version, ewpr_serial_info_t *info)
{
	int idx;
	ewpr_MVT_offset_elem_t *opv;

	DHD_FILTER_TRACE(("FINDING MULTI OFFSET: type = %s version = %d\n",
		info->name, looking_version));
	for (idx = 0; idx < MAX_MULTI_VER; idx ++) {
		opv = &(info->v_info.opv[idx]);

		/* END OF MULTI VERSION */
		if (opv->version == 0) {
			break;
		}
		if (looking_version == opv->version) {
			return opv->offset;
		}
	}
	/* return first version if no version is found */
	return info->v_info.opv[0].offset;
}
int
ewpr_single_serial(ewpr_serial_info_t *info, char *buf, int buf_len, void *_ptr, char del)
{
	uint32 sval = 0;
	char *ptr = (char *)_ptr;
	uint32 offset = EWPF_INVALID;
	uint16	version;

	if (info->is_multi_version == TRUE) {
		version = *(uint16 *)((char *)_ptr + info->v_info.version_offset);
		offset = ewpr_get_multi_offset(version, info);
	} else {
		offset = info->offset;
	}

	if (offset == EWPF_INVALID) {
		DHD_FILTER_ERR(("INVALID TYPE to OFFSET:%s\n", info->name));
		return 0;
	}

	ptr += offset;

	switch (info->data_type) {
		case EWP_INT8:
			sval = *(int8 *)ptr;
			break;
		case EWP_UINT8:
			sval = *(uint8 *)ptr;
			break;
		case EWP_INT16:
			sval = *(int16 *)ptr;
			break;
		case EWP_UINT16:
			sval = *(uint16 *)ptr;
			break;
		case EWP_INT32:
			sval = *(int32 *)ptr;
			break;
		case EWP_UINT32:
			sval = *(uint32 *)ptr;
			break;
		/* XXX UINT64 is used only for debug */
#ifdef EWPR_DEBUG
		case EWP_UINT64:
			sval = (uint32)(*(uint64 *)ptr);
			break;
#endif /* EWPR_DEBUG */
		case EWP_BIT:
		default:
			DHD_FILTER_ERR(("INVALID TYPE for Single Serial:%d", info->data_type));
			return 0;
	}

	return ewpr_serial_basic(buf, buf_len, sval, info->display_format, info->display_type, del);
}

int
ewpr_diff_serial(ewpr_serial_info_t *info,
	char *buf, int buf_len, void *_f_op, void *_s_op, char del)
{
	char *f_op = (char *)_f_op;
	char *s_op = (char *)_s_op;
	uint32 diff;
	uint32 offset = EWPF_INVALID;
	uint16	version;

	if (info->is_multi_version == TRUE) {
		version = *(uint16 *)(f_op + info->v_info.version_offset);
		offset = ewpr_get_multi_offset(version, info);
	} else {
		offset = info->offset;
	}

	if (offset == EWPF_INVALID) {
		DHD_FILTER_ERR(("INVALID TYPE to OFFSET:%s\n", info->name));
		return 0;
	}

	f_op = f_op + offset;
	s_op = s_op + offset;

	switch (info->data_type) {
		case EWP_INT8:
		case EWP_UINT8:
			diff = *(uint8 *)f_op - *(uint8 *)s_op;
			break;
		case EWP_INT16:
		case EWP_UINT16:
			diff = *(uint16 *)f_op - *(uint16 *)s_op;
			break;
		case EWP_INT32:
		case EWP_UINT32:
			diff = *(uint32 *)f_op - *(uint32 *)s_op;
			break;
		case EWP_UINT64:
			diff = (uint32)(*(uint64 *)f_op - *(uint64 *)s_op);
			break;
		case EWP_BIT:
		default:
			DHD_FILTER_ERR(("INVALID TYPE to DIFF:%d", info->data_type));
			return 0;
	}

	return ewpr_serial_basic(buf, buf_len, diff, info->display_format, info->display_type, del);
}

#ifdef EWPR_DEBUG
void
ewpr_debug_dump(ewpr_serial_info_t *tbl, void **ring)
{
	void *elem;
	int idx, idx2;
	ewpr_serial_info_t *info;
	char buf[EWPR_DEBUG_BUF_LEN];
	uint32 bytes_written;
	int lock_cnt;

	for (idx = 0; strlen(tbl[idx].name) != 0; idx++) {
		info = &tbl[idx];
#ifdef DHD_EWPR_VER2
		if (info->info_type != EWPF_INFO_ECNT) {
			DHD_FILTER_ERR(("%s: unable to dump value\n", info->name));
			break;
		}
#endif /* DHD_EWPR_VER2 */
		memset(buf, 0, sizeof(buf));
		lock_cnt = dhd_ring_lock_get_count(ring[info->ring_type - 1]);
		elem = dhd_ring_lock_get_first(ring[info->ring_type - 1]);
		bytes_written = scnprintf(buf, EWPR_DEBUG_BUF_LEN, "%s:", info->name);
		for (idx2 = 0; elem && (idx2 < lock_cnt); idx2++) {
			bytes_written += ewpr_single_serial(info, &buf[bytes_written],
				EWPR_DEBUG_BUF_LEN - bytes_written, elem, KEY_DEL);
			elem = dhd_ring_get_next(ring[info->ring_type - 1], elem);
		}
		DHD_FILTER_ERR(("%s\n", buf));
	}
}
#endif /* EWPR_DEBUG */

uint32
dhd_event_log_filter_serialize(dhd_pub_t *dhdp, char *in_buf, uint32 tot_len, int type)
{
	EWP_filter_t *filter = (EWP_filter_t *)dhdp->event_log_filter;
	void *ring[EWPF_MAX_IDX_TYPE];
	char *ret_buf = in_buf;
	int slice_id;
	int iface_id;
	int idx, idx2;
	uint32 bytes_written = 0;
	void *elem[EWPF_MAX_IDX_TYPE][EWPR_CSDCLIENT_DIFF];
	void **elem_list;
	int lock_cnt, lock_cnt2;
	char *last_print;
	void *arr_elem;
	uint32 delta_list[EWPR_CSDCLIENT_DIFF];
	ewpr_lock_param_t lock_param;
	int print_name = FALSE;
	char cookie_str[DEBUG_DUMP_TIME_BUF_LEN];
	char iov_buf[EWPR_IOV_BUF_LEN];

	if (type != 0) {
		DHD_FILTER_ERR(("NOT SUPPORTED TYPE: %d\n", type));
		return 0;
	}

	iface_id = 0; /* STA INTERFACE ONLY */
	if (filter->last_channel <= CH_MAX_2G_CHANNEL) {
		slice_id = EWPF_SLICE_AUX;
	} else {
		slice_id = EWPF_SLICE_MAIN;
	}
	ring[EWPF_IDX_TYPE_SLICE - 1] = filter->s_ring[slice_id];
	ring[EWPF_IDX_TYPE_IFACE - 1] = filter->i_ring[iface_id];

	/* Configure common LOCK parameter */
	lock_param.max_armcycle = (uint32)EWPF_INVALID;
	lock_param.min_armcycle = filter->last_armcycle;
	lock_param.max_period = (EWPR_ARRAY_CNT - 1)* EWPR_INTERVAL;
	lock_param.max_period *= EWPF_MSEC_TO_SEC * EWPF_ARM_TO_MSEC;
	lock_param.delta_cnt = ARRAYSIZE(delta_list);
	lock_param.delta_list = delta_list;

	delta_list[EWPR_DELTA3_POS] = EWPR_DELTA3_CNT;
	delta_list[EWPR_DELTA2_POS] = EWPR_DELTA2_CNT;
	delta_list[EWPR_DELTA1_POS] = EWPR_DELTA1_CNT;
	delta_list[EWPR_NOW_POS] = 0;
	lock_param.ring = ring[EWPF_IDX_TYPE_IFACE -1];
	lock_param.elem_list = elem[EWPF_IDX_TYPE_IFACE -1];
	lock_cnt = ewpr_set_period_lock(&lock_param);
	if (lock_cnt <= 0) {
		DHD_FILTER_ERR(("FAIL TO GET IFACE LOCK: %d\n", iface_id));
		bytes_written = 0;
		goto finished;
	}

	delta_list[EWPR_DELTA3_POS] = EWPR_DELTA3_CNT;
	delta_list[EWPR_DELTA2_POS] = EWPR_DELTA2_CNT;
	delta_list[EWPR_DELTA1_POS] = EWPR_DELTA1_CNT;
	delta_list[EWPR_NOW_POS] = 0;
	lock_param.ring = ring[EWPF_IDX_TYPE_SLICE -1];
	lock_param.elem_list = elem[EWPF_IDX_TYPE_SLICE -1];
	lock_cnt2 = ewpr_set_period_lock(&lock_param);
	if (lock_cnt2 <= 0) {
		DHD_FILTER_ERR(("FAIL TO GET SLICE LOCK: %d\n", slice_id));
		goto finished;
	}

	if (lock_cnt != lock_cnt2) {
		DHD_FILTER_ERR(("Lock Count is Diff: iface:%d slice:%d\n", lock_cnt, lock_cnt2));
		lock_cnt = MIN(lock_cnt, lock_cnt2);
	}

#ifdef EWPR_DEBUG
	print_name = TRUE;
	ewpr_debug_dump(ewpr_serial_dbg_tbl, ring);
	ewpr_debug_dump(ewpr_serial_CSDCLIENT_diff_tbl, ring);
	ewpr_debug_dump(ewpr_serial_CSDCLIENT_array_tbl, ring);
#endif /* EWPR_DEBUG */

	memset(ret_buf, 0, tot_len);
	memset(cookie_str, 0, DEBUG_DUMP_TIME_BUF_LEN);
	bytes_written = 0;
	last_print = ret_buf;

	/* XXX Counters BIG DATA not matched to file yet */
	get_debug_dump_time(cookie_str);
#ifdef DHD_LOG_DUMP
	dhd_logdump_cookie_save(dhdp, cookie_str, "ECNT");
#endif

	/* KEY DATA */
	bytes_written += scnprintf(&ret_buf[bytes_written],
		tot_len - bytes_written, "%08x", EWP_REPORT_VERSION);
	bytes_written += scnprintf(&ret_buf[bytes_written],
		tot_len - bytes_written, "%c%s", KEY_DEL, cookie_str);
	DHD_FILTER_ERR(("%d: %s\n", bytes_written, last_print));
	last_print = &ret_buf[bytes_written];

	for (idx = 0; strlen(ewpr_serial_CSDCLIENT_key_tbl[idx].name) != 0; idx++) {
		ewpr_serial_info_t *info = &ewpr_serial_CSDCLIENT_key_tbl[idx];
		elem_list = elem[info->ring_type - 1];
		if (print_name) {
			bytes_written += scnprintf(&ret_buf[bytes_written],
				tot_len - bytes_written, " %s:", info->name);
		}
		bytes_written += ewpr_diff_serial(info, &ret_buf[bytes_written],
			tot_len - bytes_written,
			elem_list[EWPR_NOW_POS],
			elem_list[EWPR_DELTA1_POS],
			KEY_DEL);
		if ((idx + 1) % EWPR_CNT_PER_LINE == 0) {
			DHD_FILTER_ERR(("%d:%s\n", bytes_written, last_print));
			last_print = &ret_buf[bytes_written];
		}
	}

	/* RAW DATA */
	/* XXX FIRST data shall use space:KEY delimiter */
	bytes_written += scnprintf(&ret_buf[bytes_written],
		tot_len - bytes_written, "%c%08x", KEY_DEL, EWP_REPORT_VERSION);
	bytes_written += scnprintf(&ret_buf[bytes_written],
		tot_len - bytes_written, "%c%s", RAW_DEL, cookie_str);

	for (idx = 0; strlen(ewpr_serial_CSDCLIENT_diff_tbl[idx].name) != 0; idx++) {
		ewpr_serial_info_t *info = &ewpr_serial_CSDCLIENT_diff_tbl[idx];
		elem_list = elem[info->ring_type - 1];
		if (print_name) {
			bytes_written += scnprintf(&ret_buf[bytes_written],
				tot_len - bytes_written, " %s:", info->name);
		}
		bytes_written += ewpr_diff_serial(info, &ret_buf[bytes_written],
			tot_len - bytes_written,
			elem_list[EWPR_NOW_POS],
			elem_list[EWPR_DELTA1_POS],
			RAW_DEL);
		bytes_written += ewpr_diff_serial(info, &ret_buf[bytes_written],
			tot_len - bytes_written,
			elem_list[EWPR_DELTA1_POS],
			elem_list[EWPR_DELTA2_POS],
			RAW_DEL);
		if ((idx + 1) % EWPR_CNT_PER_LINE == 0) {
			DHD_FILTER_ERR(("%d:%s\n", bytes_written, last_print));
			last_print = &ret_buf[bytes_written];
		}
	}

	/* FILL BSS SPECIFIC DATA LATER */
	if (dhd_iovar(dhdp, 0, "auth", NULL, 0, iov_buf, ARRAYSIZE(iov_buf), FALSE) < 0) {
		DHD_FILTER_ERR(("fail to get auth\n"));
		*(uint32 *)iov_buf = EWPF_INVALID;

	}
	bytes_written += scnprintf(&ret_buf[bytes_written],
			tot_len - bytes_written, "%c%08x", RAW_DEL, *(uint32 *)iov_buf);

	if (dhd_iovar(dhdp, 0, "wsec", NULL, 0, iov_buf, ARRAYSIZE(iov_buf), FALSE) < 0) {
		DHD_FILTER_ERR(("fail to get wsec\n"));
		*(uint32 *)iov_buf = EWPF_INVALID;

	}
	bytes_written += scnprintf(&ret_buf[bytes_written],
			tot_len - bytes_written, "%c%08x", RAW_DEL, *(uint32 *)iov_buf);

	if (dhd_iovar(dhdp, 0, "mfp", NULL, 0, iov_buf, ARRAYSIZE(iov_buf), FALSE) < 0) {
		DHD_FILTER_ERR(("fail to get mfp\n"));
		*(uint8 *)iov_buf = EWPF_INVALID;

	}
	bytes_written += scnprintf(&ret_buf[bytes_written],
			tot_len - bytes_written, "%c%02x", RAW_DEL, *(uint8 *)iov_buf);

	if (dhd_iovar(dhdp, 0, "bip", NULL, 0, iov_buf, ARRAYSIZE(iov_buf), FALSE) < 0) {
		DHD_FILTER_ERR(("fail to get bip\n"));
		*(uint8 *)iov_buf = EWPF_INVALID;
	}
	bytes_written += scnprintf(&ret_buf[bytes_written],
			tot_len - bytes_written, "%c%02x", RAW_DEL, *(uint8 *)iov_buf);

	for (idx = 0; strlen(ewpr_serial_CSDCLIENT_array_tbl[idx].name) != 0; idx++) {
		ewpr_serial_info_t *info = &ewpr_serial_CSDCLIENT_array_tbl[idx];
		if (print_name) {
			bytes_written += scnprintf(&ret_buf[bytes_written],
				tot_len - bytes_written, " %s:", info->name);
		}
		for (idx2 = 0; idx2 < EWPR_ARRAY_CNT - lock_cnt; idx2++) {
			bytes_written += ewpr_serial_basic(&ret_buf[bytes_written],
				tot_len - bytes_written, 0,
				info->display_format, info->display_type, RAW_DEL);
		}
		arr_elem = elem[info->ring_type - 1][EWPR_DELTA3_POS];
		for (; idx2 < EWPR_ARRAY_CNT; idx2++) {
			if (arr_elem == NULL) {
				DHD_FILTER_ERR(("ARR IS NULL : %d %p \n",
					idx2, elem[info->ring_type - 1][EWPR_DELTA3_POS]));
				break;
			}
			bytes_written += ewpr_single_serial(info, &ret_buf[bytes_written],
				tot_len - bytes_written, arr_elem, RAW_DEL);
			arr_elem = dhd_ring_get_next(ring[info->ring_type - 1], arr_elem);
		}
		DHD_FILTER_ERR(("%d:%s\n", bytes_written, last_print));
		last_print = &ret_buf[bytes_written];
	}

finished:
	DHD_FILTER_ERR(("RET LEN:%d\n", (int)strlen(ret_buf)));
	dhd_ring_lock_free(ring[EWPF_IDX_TYPE_SLICE - 1]);
	dhd_ring_lock_free(ring[EWPF_IDX_TYPE_IFACE - 1]);
	return bytes_written;
}

int
ewpr_set_period_lock(ewpr_lock_param_t *param)
{
	void *last;
	void *first;
	void *cur;
	int lock_cnt;
	int idx2;
	int delta_idx;
	uint32 last_armcycle;
	uint32 first_armcycle;
	uint32 cur_armcycle = 0;
	void *ring = param->ring;

	/* GET LATEST PTR */
	last = dhd_ring_get_last(ring);
	while (TRUE) {
		if (last == NULL) {
			DHD_FILTER_ERR(("NO LAST\n"));
			return -1;
		}
		last_armcycle = *(uint32 *)last;
		if (last_armcycle <= param->max_armcycle ||
			last_armcycle + EWPF_EPOCH >= param->max_armcycle) {
			break;
		}
		last = dhd_ring_get_prev(ring, last);
	}

	if (last_armcycle != param->max_armcycle) {
		DHD_FILTER_TRACE(("MAX ARMCYCLE IS CHANGEd new:%u prev:%u\n",
			last_armcycle, param->max_armcycle));
		param->max_armcycle = last_armcycle;
	}

	if (last_armcycle < param->min_armcycle) {
		param->min_armcycle = 0;
	}

	/* GET FIRST PTR */
	first_armcycle = last_armcycle;
	first = last;
	while (TRUE) {
		cur = dhd_ring_get_prev(ring, first);
		if (cur == NULL) {
			break;
		}
		cur_armcycle = *(uint32 *)cur;
		if (cur_armcycle >= first_armcycle) {
			DHD_FILTER_TRACE(("case 1: %u %u\n", first_armcycle, cur_armcycle));
			/* dongle is rebooted */
			break;
		}
		if (cur_armcycle + EWPF_EPOCH < param->min_armcycle) {
			DHD_FILTER_TRACE(("case 2: %u %u\n", param->min_armcycle, cur_armcycle));
			/* Reach Limitation */
			break;
		}
		if (cur_armcycle + param->max_period + EWPF_EPOCH < last_armcycle) {
			DHD_FILTER_TRACE(("case 3: %u %u\n", param->max_period, cur_armcycle));
			/* exceed max period */
			break;
		}
		first = cur;
		first_armcycle = cur_armcycle;
	}

	if (first_armcycle != param->min_armcycle) {
		DHD_FILTER_TRACE(("MIN ARMCYCLE IS CHANGEd new:%u prev:%u %u\n",
			first_armcycle, param->min_armcycle, cur_armcycle));
		param->min_armcycle = first_armcycle;
	}

	DHD_FILTER_TRACE(("ARM CYCLE of first(%u), last(%u)\n", first_armcycle, last_armcycle));

	dhd_ring_lock(ring, first, last);

	lock_cnt = dhd_ring_lock_get_count(ring);
	if (lock_cnt <= 0) {
		DHD_FILTER_ERR((" NO VALID RECORD : %d\n", lock_cnt));
		return -1;
	}
	DHD_FILTER_TRACE(("Lock Count:%d\n", lock_cnt));

	/* Validate delta position */
	for (idx2 = 0; idx2 < param->delta_cnt - 1; idx2++) {
		if (param->delta_list[idx2] >= param->delta_list[idx2 + 1]) {
			DHD_FILTER_ERR(("INVALID DELTA at %d\n", idx2 + 1));
			param->delta_list[idx2 + 1] = param->delta_list[idx2];
		}
	}

	delta_idx = 0;
	for (idx2 = 0; idx2 < lock_cnt && delta_idx < param->delta_cnt; idx2++) {
		if (idx2 == 0) {
			cur = dhd_ring_lock_get_last(ring);
		} else {
			cur = dhd_ring_get_prev(ring, cur);
		}

		if (idx2 >= param->delta_list[delta_idx]) {
			param->elem_list[delta_idx] = cur;
			delta_idx ++;
		}
	}

	/* COPY last elem to rest of the list */
	delta_idx--;
	for (idx2 = delta_idx + 1; idx2 < param->delta_cnt; idx2++) {
		param->elem_list[idx2] = cur;
	}
	return lock_cnt;
}

#ifdef DHD_EWPR_VER2
static int
ewpr_single_bit_pack(ewpr_serial_info_t * info, char * buf, int buf_len,
	void * _ptr, int bit_offset)
{
	int32 sval = 0;
	char *ptr = (char *)_ptr;
	uint32 offset = EWPF_INVALID;
	uint16	version;
	bool is_signed = FALSE;

	if (info->is_multi_version == TRUE) {
		version = *(uint16 *)((char *)_ptr + info->v_info.version_offset);
		offset = ewpr_get_multi_offset(version, info);
	} else {
		offset = info->offset;
	}

	if (offset == EWPF_INVALID) {
		DHD_FILTER_ERR(("INVALID TYPE to OFFSET:%s\n", info->name));
		return 0;
	}

	ptr += offset;

	switch (info->data_type) {
		case EWP_INT8:
			sval = *(int8 *)ptr;
			is_signed = TRUE;
			break;
		case EWP_UINT8:
			sval = *(uint8 *)ptr;
			break;
		case EWP_INT16:
			sval = *(int16 *)ptr;
			is_signed = TRUE;
			break;
		case EWP_UINT16:
			sval = *(uint16 *)ptr;
			break;
		case EWP_INT32:
			sval = *(int32 *)ptr;
			is_signed = TRUE;
			break;
		case EWP_UINT32:
			sval = *(uint32 *)ptr;
			break;
#ifdef EWPR_DEBUG
		case EWP_UINT64:
			sval = (int32)(*(uint64 *)ptr);
			break;
#endif /* EWPR_DEBUG */
		default:
			DHD_FILTER_ERR(("INVALID TYPE for Single Serial:%d", info->data_type));
			return 0;
	}

	/* convert negative value to positive before bit packing */
	if (is_signed) {
		if (sval < 0) {
			DHD_FILTER_TRACE(("convert to positive value %d\n", sval));
			sval = ABS(sval);
		}
	}

	if (info->unit_convert > 1) {
		DHD_FILTER_TRACE(("convert unit %d / %d\n", sval, info->unit_convert));
		sval = sval / info->unit_convert;
	}

	if (is_signed) {
		DHD_FILTER_TRACE(("%s : signed value : %d, bit length: %d",
			info->name, sval, info->display_bit_length));
	} else {
		DHD_FILTER_TRACE(("%s : unsigned value : %u, bit length: %d",
			info->name, sval, info->display_bit_length));
	}

	return ewpr_bit_pack_basic(buf, buf_len, sval, info->display_format,
			info->display_type, info->display_bit_length, bit_offset);
}

static int
ewpr_diff_bit_pack(ewpr_serial_info_t *info, char *buf, int buf_len,
	void *_f_op, void *_s_op, int bit_offset)
{
	char *f_op = (char *)_f_op;
	char *s_op = (char *)_s_op;
	int32 diff;
	uint32 offset = EWPF_INVALID;
	uint16	version;

	if (info->is_multi_version == TRUE) {
		version = *(uint16 *)(f_op + info->v_info.version_offset);
		offset = ewpr_get_multi_offset(version, info);
	} else {
		offset = info->offset;
	}

	if (offset == EWPF_INVALID) {
		DHD_FILTER_ERR(("INVALID TYPE to OFFSET:%s\n", info->name));
		return 0;
	}

	f_op = f_op + offset;
	s_op = s_op + offset;

	switch (info->data_type) {
		case EWP_INT8:
		case EWP_UINT8:
			diff = *(uint8 *)f_op - *(uint8 *)s_op;
			break;
		case EWP_INT16:
		case EWP_UINT16:
			diff = *(uint16 *)f_op - *(uint16 *)s_op;
			break;
		case EWP_INT32:
		case EWP_UINT32:
			diff = *(uint32 *)f_op - *(uint32 *)s_op;
			break;
		case EWP_UINT64:
			diff = (uint32)(*(uint64 *)f_op - *(uint64 *)s_op);
			break;
		default:
			DHD_FILTER_ERR(("INVALID TYPE to DIFF:%d", info->data_type));
			return 0;
	}

	if (diff < 0) {
		DHD_FILTER_TRACE(("convert to positive value %d\n", diff));
		diff = ABS(diff);
	}

	if (info->unit_convert > 1) {
		DHD_FILTER_TRACE(("convert unit %d / %d\n", diff, info->unit_convert));
		diff = diff / info->unit_convert;
	}

	DHD_FILTER_TRACE(("%s : value : %d, bit length: %d",
		info->name, diff, info->display_bit_length));
	return ewpr_bit_pack_basic(buf, buf_len, diff, info->display_format,
		info->display_type, info->display_bit_length, bit_offset);
}

static int
ewpr_bit_pack_basic(char *buf, int buf_len, uint32 data, int format, int display_type,
	int display_bit_length, int bit_offset)
{
	if (format == EWP_BIN) {
		uint32 sdata = (uint32) data;
		switch (display_type) {
			case EWP_BIT:
				/* call bit packing */
				return dhd_bit_pack(buf, buf_len, bit_offset,
					sdata, display_bit_length);
			default:
				DHD_FILTER_ERR(("INVALID TYPE for Serial:%d", display_type));
				return 0;
		}
	}

	DHD_FILTER_ERR(("INVALID FORMAT for Serial:%d", format));
	return 0;
}

static ewpr_serial_info_t*
ewpr_find_context_info(int index1, int index2, int index3)
{
	int idx = 0;
	ewpr_serial_info_t *context_info = NULL;

	for (idx = 0; ewpr_serial_context_info[idx].table != NULL; idx++) {
		if (index1 == ewpr_serial_context_info[idx].index1 &&
				index2 == ewpr_serial_context_info[idx].index2 &&
				index3 == ewpr_serial_context_info[idx].index3) {
			context_info = ewpr_serial_context_info[idx].table;
			break;
		}
	}

	if (context_info == NULL) {
		DHD_FILTER_ERR(("unable to find context info for index number: %02x:%02x:%02x\n",
			index1, index2, index3));
		return NULL;
	}

	return context_info;
}

static int
ewpr_find_context_type(ewpr_serial_info_t* context_info)
{
	int idx = 0;
	int context_type = BCME_ERROR;

	/* index2, index3 are reserved */

	for (idx = 0; ewpr_serial_context_info[idx].table != NULL; idx++) {
		if (context_info == ewpr_serial_context_info[idx].table) {
			context_type = idx;
			break;
		}
	}

	return context_type;
}

static uint32
ewpr_scnprintf(char *buf, uint32 buf_len, uint32 input_len, char *data_type, char *fmt, ...)
{
	va_list args;

	if (buf_len < input_len) {
		DHD_FILTER_ERR(("%s: input length(%d) is larger than "
			"remain buffer length(%d)\n", data_type,
			input_len, buf_len));
	}
	va_start(args, fmt);
	buf_len = vscnprintf(buf, buf_len, fmt, args);
	va_end(args);

	return buf_len;
}

uint32
dhd_event_log_filter_serialize_bit(dhd_pub_t *dhdp, char *in_buf, uint32 tot_len,
	int index1, int index2, int index3)
{
	EWP_filter_t *filter = (EWP_filter_t *)dhdp->event_log_filter;
	void *ring[EWPF_MAX_IDX_TYPE];
	char *ret_buf = in_buf;
	int slice_id;
	int iface_id;
	int event_id;
	int key_info_id;
	int idx;
	int idx2;
	uint32 bytes_written = 0;
	int bits_written = 0;
	void *elem[EWPF_MAX_IDX_TYPE][EWPR_CSDCLIENT_DIFF];
	void **elem_list;
	int lock_cnt, lock_cnt2;
	uint32 delta_list[EWPR_CSDCLIENT_DIFF];
	ewpr_lock_param_t lock_param;
	char cookie_str[DEBUG_DUMP_TIME_BUF_LEN];
	char iov_buf[EWPR_IOV_BUF_LEN];
	char *raw_buf = NULL;
	char *raw_encode_buf = NULL;
	int raw_buf_size;
	int ret = 0;
	ewpr_serial_info_t *context_info = NULL;
	int context_type;
	uint32 conv_cnt = 0;

#ifdef DHD_STATUS_LOGGING
	stat_elem_t dhd_stat[EWP_DHD_STAT_SIZE];
	stat_query_t query;

	memset(&dhd_stat[0], 0x00, sizeof(stat_elem_t) * EWP_DHD_STAT_SIZE);
#endif /* DHD_STATUS_LOGGING */

	context_info = ewpr_find_context_info(index1, index2, index3);
	if (!context_info) {
		return bytes_written;
	}

	if (tot_len < EWPR_MAX_STR_SIZE) {
		DHD_FILTER_ERR(("%s: insufficient buffer size %d\n",
			__FUNCTION__, tot_len));
		return bytes_written;
	}

	iface_id = 0; /* STA INTERFACE ONLY */
	event_id = 0; /* COMMON ID */
	key_info_id = 0; /* COMMON ID */
	if (filter->last_channel <= CH_MAX_2G_CHANNEL) {
		slice_id = EWPF_SLICE_AUX;
	} else {
		slice_id = EWPF_SLICE_MAIN;
	}
	ring[EWPF_IDX_TYPE_SLICE - 1] = filter->s_ring[slice_id];
	ring[EWPF_IDX_TYPE_IFACE - 1] = filter->i_ring[iface_id];
	ring[EWPF_IDX_TYPE_EVENT - 1] = filter->e_ring[event_id];
	ring[EWPF_IDX_TYPE_KEY_INFO - 1] = filter->k_ring[key_info_id];

	/* Configure common LOCK parameter */
	lock_param.max_armcycle = (uint32)EWPF_INVALID;
	lock_param.min_armcycle = filter->last_armcycle;
	lock_param.max_period = (EWPR_ARRAY_CNT - 1)* EWPR_INTERVAL;
	lock_param.max_period *= EWPF_MSEC_TO_SEC * EWPF_ARM_TO_MSEC;
	lock_param.delta_cnt = ARRAYSIZE(delta_list);
	lock_param.delta_list = delta_list;

	for (idx = 0; idx < EWPR_CSDCLIENT_DIFF; idx++) {
		delta_list[idx] = idx * EWPR_DELTA_CNT;
	}

	lock_param.ring = ring[EWPF_IDX_TYPE_IFACE -1];
	lock_param.elem_list = elem[EWPF_IDX_TYPE_IFACE -1];
	lock_cnt = ewpr_set_period_lock(&lock_param);
	if (lock_cnt <= 0) {
		DHD_FILTER_ERR(("FAIL TO GET IFACE LOCK: %d\n", iface_id));
		bytes_written = 0;
		goto finished;
	}

	for (idx = 0; idx < EWPR_CSDCLIENT_DIFF; idx++) {
		delta_list[idx] = idx * EWPR_DELTA_CNT;
	}

	lock_param.ring = ring[EWPF_IDX_TYPE_SLICE -1];
	lock_param.elem_list = elem[EWPF_IDX_TYPE_SLICE -1];
	lock_cnt2 = ewpr_set_period_lock(&lock_param);
	if (lock_cnt2 <= 0) {
		DHD_FILTER_ERR(("FAIL TO GET SLICE LOCK: %d\n", slice_id));
		goto finished;
	}

	if (lock_cnt != lock_cnt2) {
		DHD_FILTER_ERR(("Lock Count is Diff: iface:%d slice:%d\n", lock_cnt, lock_cnt2));
		lock_cnt = MIN(lock_cnt, lock_cnt2);
	}

	for (idx = 0; idx < EWPR_CSDCLIENT_DIFF; idx++) {
		delta_list[idx] = idx * EWPR_DELTA_CNT;
	}

	lock_param.ring = ring[EWPF_IDX_TYPE_EVENT -1];
	lock_param.elem_list = elem[EWPF_IDX_TYPE_EVENT -1];
	lock_cnt = ewpr_set_period_lock(&lock_param);
	if (lock_cnt <= 0) {
		DHD_FILTER_ERR(("FAIL TO GET EVENT ECNT LOCK: %d\n", iface_id));
		bytes_written = 0;
		goto finished;
	}

	for (idx = 0; idx < EWPR_CSDCLIENT_DIFF; idx++) {
		delta_list[idx] = idx * EWPR_DELTA_CNT;
	}

	lock_param.ring = ring[EWPF_IDX_TYPE_KEY_INFO -1];
	lock_param.elem_list = elem[EWPF_IDX_TYPE_KEY_INFO -1];
	lock_cnt = ewpr_set_period_lock(&lock_param);
	if (lock_cnt <= 0) {
		DHD_FILTER_ERR(("FAIL TO GET KEY INFO LOCK: %d\n", iface_id));
		bytes_written = 0;
		goto finished;
	}

#ifdef EWPR_DEBUG
	ewpr_debug_dump(context_info, ring);
#endif /* EWPR_DEBUG */

	memset(ret_buf, 0, tot_len);
	memset(cookie_str, 0, DEBUG_DUMP_TIME_BUF_LEN);
	bytes_written = 0;
	bits_written = 0;

	/* XXX Counters BIG DATA not matched to file yet */
	get_debug_dump_time(cookie_str);
#ifdef DHD_LOG_DUMP
	dhd_logdump_cookie_save(dhdp, cookie_str, "ECNT");
#endif /* DHD_LOG_DUMP */

	/* KEY DATA */
	bytes_written += ewpr_scnprintf(&ret_buf[bytes_written],
		tot_len - bytes_written, REPORT_VERSION_STR_SIZE,
		"report version", "%08x", EWP_REPORT_VERSION);

	bytes_written += ewpr_scnprintf(&ret_buf[bytes_written],
		tot_len - bytes_written, DELIMITER_LEN + strlen(cookie_str),
		"cookie string", "%c%s", KEY_DEL, cookie_str);

	bytes_written += ewpr_scnprintf(&ret_buf[bytes_written],
		tot_len - bytes_written, DELIMITER_LEN + INDEX_STR_SIZE,
		"host trigger index", "%c%02x%02x%02x", KEY_DEL, index1, index2, index3);

#ifdef DHD_STATUS_LOGGING
	DHD_FILTER_TRACE(("print dhd_stat size:%d * %d, size of filter list: %d\n",
		(uint32)sizeof(dhd_stat[0]), EWP_DHD_STAT_SIZE,
		(uint32)sizeof(dhd_statlog_filter)));
	query.req_buf = NULL;
	query.req_buf_len = 0;
	query.resp_buf = (char *)dhd_stat;
	query.resp_buf_len = DHD_STATLOG_RING_SIZE(EWP_DHD_STAT_SIZE);
	query.req_num = EWP_DHD_STAT_SIZE;
	ret = dhd_statlog_get_latest_info(dhdp, (void *)&query);
	if (ret < 0) {
		DHD_FILTER_ERR(("fail to get dhd statlog - %d\n", ret));
	}
#ifdef EWPR_DEBUG
	for (idx = 0; idx < EWP_DHD_STAT_SIZE; idx++) {
		DHD_FILTER_TRACE(("DHD status index: %d, timestamp: %llu, stat: %d\n",
			idx, dhd_stat[idx].ts, dhd_stat[idx].stat));
	}
#endif
	bytes_written += ewpr_scnprintf(&ret_buf[bytes_written],
		tot_len - bytes_written, DELIMITER_LEN + DHD_STAT_STR_SIZE,
		"current dhd status", "%c%02x", KEY_DEL, dhd_stat[0].stat);

	bytes_written += ewpr_scnprintf(&ret_buf[bytes_written],
		tot_len - bytes_written, DELIMITER_LEN + DHD_STAT_STR_SIZE,
		"previous dhd status", "%c%02x", KEY_DEL, dhd_stat[1].stat);
#else
	/* reserved for dhd status information */
	bytes_written += ewpr_scnprintf(&ret_buf[bytes_written],
		tot_len - bytes_written, DELIMITER_LEN + DHD_STAT_STR_SIZE,
		"current dhd status", "%c%02x", KEY_DEL, 0x00);

	bytes_written += ewpr_scnprintf(&ret_buf[bytes_written],
		tot_len - bytes_written, DELIMITER_LEN + DHD_STAT_STR_SIZE,
		"previous dhd status", "%c%02x", KEY_DEL, 0x00);
#endif /* DHD_STATUS_LOGGING */

	/* RAW DATA */
	raw_buf = MALLOCZ(dhdp->osh, RAW_BUFFER_SIZE);

	for (idx = 0; strlen(context_info[idx].name) != 0; idx++) {
		ewpr_serial_info_t *info = &context_info[idx];
		elem_list = elem[info->ring_type - 1];
		DHD_FILTER_TRACE(("%s : array_size: %d\n", info->name, info->display_array_size));
		switch (info->info_type) {
			case EWPF_INFO_VER:
				DHD_FILTER_TRACE(("write %s - value: %d\n", info->name,
					EWP_REPORT_VERSION));
				bits_written = dhd_bit_pack(raw_buf, RAW_BUFFER_SIZE, bits_written,
					EWP_REPORT_VERSION, info->display_bit_length);
				break;
			case EWPF_INFO_TYPE:
				context_type = ewpr_find_context_type(context_info);
				if (context_type < 0) {
					DHD_FILTER_ERR(("fail to get context_type - %d\n",
						context_type));
					break;
				}
				DHD_FILTER_TRACE(("write %s - value: %d\n", info->name,
					(uint32)context_type));
				bits_written = dhd_bit_pack(raw_buf, RAW_BUFFER_SIZE, bits_written,
					(uint32)context_type, info->display_bit_length);
				break;
			case EWPF_INFO_DHDSTAT:
				if (strcmp("dhdstat_last_ts", info->name) == 0) {
#ifdef DHD_STATUS_LOGGING
					if (info->unit_convert > 1) {
						conv_cnt = dhd_stat[0].ts_tz / info->unit_convert;
					} else {
						conv_cnt = dhd_stat[0].ts_tz;
					}
					DHD_FILTER_TRACE(("DHD status last timestamp:"
						" %llu, %u", dhd_stat[0].ts_tz,
						conv_cnt));
					bits_written = dhd_bit_pack(raw_buf, RAW_BUFFER_SIZE,
						bits_written, conv_cnt,
						info->display_bit_length);
#else
					DHD_FILTER_TRACE(("No DHD status log timestamp\n"));
					bits_written = dhd_bit_pack(raw_buf, RAW_BUFFER_SIZE,
						bits_written, 0x00, info->display_bit_length);
#endif /* DHD_STATUS_LOGGING */
				} else if (strcmp("dhdstat_last", info->name) == 0) {
#ifdef DHD_STATUS_LOGGING
					DHD_FILTER_TRACE(("DHD status last stat: %d(0x%02x)",
						dhd_stat[0].stat, dhd_stat[0].stat));
					bits_written = dhd_bit_pack(raw_buf, RAW_BUFFER_SIZE,
						bits_written, (uint32)dhd_stat[0].stat,
						info->display_bit_length);
#else
					DHD_FILTER_TRACE(("No DHD status log value\n"));
					bits_written = dhd_bit_pack(raw_buf, RAW_BUFFER_SIZE,
						bits_written, 0x00, info->display_bit_length);
#endif /* DHD_STATUS_LOGGING */
				} else if (strcmp("dhdstat_prev_ts", info->name) == 0) {
#ifdef DHD_STATUS_LOGGING
					if (info->unit_convert > 1) {
						conv_cnt = dhd_stat[1].ts_tz / info->unit_convert;
					} else {
						conv_cnt = dhd_stat[1].ts_tz;
					}
					DHD_FILTER_TRACE(("DHD status prev timestamp:"
						" %llu, %u", dhd_stat[1].ts_tz,
						conv_cnt));
					bits_written = dhd_bit_pack(raw_buf, RAW_BUFFER_SIZE,
						bits_written, conv_cnt,
						info->display_bit_length);
#else
					DHD_FILTER_TRACE(("No DHD status log timestamp\n"));
					bits_written = dhd_bit_pack(raw_buf, RAW_BUFFER_SIZE,
						bits_written, 0x00, info->display_bit_length);
#endif /* DHD_STATUS_LOGGING */
				} else if (strcmp("dhdstat_prev", info->name) == 0) {
#ifdef DHD_STATUS_LOGGING
					DHD_FILTER_TRACE(("DHD status prev stat: %d(0x%02x)",
						dhd_stat[1].stat, dhd_stat[1].stat));
					bits_written = dhd_bit_pack(raw_buf, RAW_BUFFER_SIZE,
						bits_written, (uint32)dhd_stat[1].stat,
						info->display_bit_length);
#else
					DHD_FILTER_TRACE(("No DHD status log value\n"));
					bits_written = dhd_bit_pack(raw_buf, RAW_BUFFER_SIZE,
						bits_written, 0x00, info->display_bit_length);
#endif /* DHD_STATUS_LOGGING */
				} else {
					DHD_FILTER_ERR(("unknown dhdstat name - %s\n",
						info->name));
				}
				break;
			case EWPF_INFO_ECNT:
				for (idx2 = 0; idx2 < info->display_array_size; idx2++) {
					if (info->display_method == EWPR_DISPLAY_METHOD_SINGLE) {
						bits_written = ewpr_single_bit_pack(info, raw_buf,
							RAW_BUFFER_SIZE, elem_list[idx2],
							bits_written);
					} else {
						bits_written = ewpr_diff_bit_pack(info, raw_buf,
							RAW_BUFFER_SIZE, elem_list[idx2],
							elem_list[idx2+1], bits_written);
					}
				}
				break;
			case EWPF_INFO_IOVAR:
				if (dhd_iovar(dhdp, 0, info->name, NULL, 0, iov_buf,
						ARRAYSIZE(iov_buf), FALSE) < 0) {
					DHD_FILTER_ERR(("fail to get auth\n"));
					*(uint32 *)iov_buf = EWPF_INVALID;
				}
				DHD_FILTER_TRACE(("write %s - value: %d\n", info->name,
					*(uint8 *)iov_buf));
				bits_written = dhd_bit_pack(raw_buf, RAW_BUFFER_SIZE,
					bits_written, *(uint8 *)iov_buf,
					info->display_bit_length);
				break;
			case EWPF_INFO_CPLOG:
				DHD_FILTER_TRACE(("write compact packt log\n"));
				ret = 0;
#if defined(DHD_PKT_LOGGING) && defined(DHD_COMPACT_PKT_LOG)
				ret = dhd_cpkt_log_proc(dhdp, raw_buf, RAW_BUFFER_SIZE,
					bits_written, info->display_array_size);
#endif /* DHD_PKT_LOGGING && DHD_COMPACT_PKT_LOG */
				if (ret < 0) {
					DHD_FILTER_ERR(("fail to get compact packet log - %d\n",
						ret));
					break;
				}
				/* update bit offset */
				DHD_FILTER_TRACE(("%d bits written\n", ret));
				if (ret > 0) {
					bits_written = ret;
				}
				break;
			default:
				DHD_FILTER_ERR(("unsupported info type\n"));
				break;
		}
		DHD_FILTER_TRACE(("%d bits written\n", bits_written));
	}

	/* encode data */
	raw_buf_size = BYTE_SIZE(bits_written);
	raw_encode_buf = ewpr_base64_encode(dhdp, raw_buf, raw_buf_size);

#ifdef EWPR_DEBUG
	DHD_FILTER_ERR(("raw_buf:\n"));
	for (idx = 0; idx < raw_buf_size; idx++) {
		ewpr_print_byte_as_bits(raw_buf[idx]);
	}
#endif /* EWPR_DEBUG */
	DHD_FILTER_TRACE(("base64 encoding result:\n"));
	DHD_FILTER_TRACE(("%s", raw_encode_buf));

	bytes_written += ewpr_scnprintf(&ret_buf[bytes_written],
		tot_len - bytes_written, DELIMITER_LEN + strlen(raw_encode_buf),
		"base64 encoded raw data", "%c%s", KEY_DEL, raw_encode_buf);

finished:
	DHD_FILTER_ERR(("RET LEN:%d\n", (int)strlen(ret_buf)));
	DHD_FILTER_TRACE(("ret_buf: %s", ret_buf));

	dhd_ring_lock_free(ring[EWPF_IDX_TYPE_SLICE - 1]);
	dhd_ring_lock_free(ring[EWPF_IDX_TYPE_IFACE - 1]);
	dhd_ring_lock_free(ring[EWPF_IDX_TYPE_EVENT - 1]);
	dhd_ring_lock_free(ring[EWPF_IDX_TYPE_KEY_INFO - 1]);

	MFREE(dhdp->osh, raw_buf, RAW_BUFFER_SIZE);
	MFREE(dhdp->osh, raw_encode_buf, BASE64_BUFFER_SIZE);
	return bytes_written;
}

#ifdef EWPR_DEBUG
static void
ewpr_print_byte_as_bits(char val)
{
	int32 idx;
	char buf[EWPR_DEBUG_BUF_LEN];
	for (idx = 0; idx < MAX_BIT_SIZE; idx++) {
		scnprintf(&buf[idx], EWPR_DEBUG_BUF_LEN-idx, "%c",
			(val & (1 << (MAX_BIT_SHIFT-idx))) ? '1' : '0');
	}
	buf[MAX_BIT_SIZE] = 0x0;
	DHD_FILTER_ERR(("%s\n", buf));
}
#endif /* EWPR_DEBUG */

static char*
ewpr_base64_encode(dhd_pub_t *dhdp, char* input, int32 length)
{
	/* set up a destination buffer large enough to hold the encoded data */
	char *output = MALLOCZ(dhdp->osh, BASE64_BUFFER_SIZE);
	int32 cnt = 0;

	if (length > RAW_BUFFER_SIZE) {
		DHD_FILTER_ERR(("%s: input data size is too big, size is limited to %d\n",
			__FUNCTION__, RAW_BUFFER_SIZE));
		length = RAW_BUFFER_SIZE;
	}

	cnt = dhd_base64_encode(input, length, output, BASE64_BUFFER_SIZE);
	if (cnt == 0) {
		DHD_FILTER_ERR(("%s: base64 encoding error\n", __FUNCTION__));
	}
	return output;
}
#endif /* DHD_EWPR_VER2 */

#ifdef WLADPS_ENERGY_GAIN
#define ADPS_GAIN_ENERGY_CONV_UNIT	100000	/* energy unit(10^-2) * dur unit(10^-3) */
static int
dhd_calculate_adps_energy_gain(wl_adps_energy_gain_v1_t *data)
{
	int i;
	int energy_gain = 0;

	/* energy unit: (uAh * 10^-2)/sec */
	int pm0_idle_energy[MAX_BANDS] =
		{ADPS_GAIN_2G_PM0_IDLE, ADPS_GAIN_5G_PM0_IDLE};
	int txpspoll_energy[MAX_BANDS] =
		{ADPS_GAIN_2G_TX_PSPOLL, ADPS_GAIN_5G_TX_PSPOLL};

	/* dur unit: mSec */
	for (i = 0; i < MAX_BANDS; i++) {
		energy_gain += (data->gain_data[i].pm_dur_gain * pm0_idle_energy[i]);
		energy_gain -= (data->gain_data[i].step0_dur * txpspoll_energy[i]);
	}
	energy_gain /= ADPS_GAIN_ENERGY_CONV_UNIT;

	return energy_gain;
}

int dhd_event_log_filter_adps_energy_gain(dhd_pub_t *dhdp)
{
	int ret;

	void *last_elem;
	EWP_filter_t *filter;
	EWPF_ifc_elem_t *ifc_elem;

	if (!dhdp || !dhdp->event_log_filter) {
		return 0;
	}

	filter = (EWP_filter_t *)dhdp->event_log_filter;

	if (filter->enabled != TRUE) {
		DHD_FILTER_ERR(("%s - EWP Filter is not enabled\n", __FUNCTION__));
		return 0;
	}

	/* Refer to STA interface */
	last_elem = dhd_ring_get_last(filter->i_ring[0]);
	if (last_elem == NULL) {
		DHD_FILTER_ERR(("%s - last_elem is NULL\n", __FUNCTION__));
		return 0;
	}

	ifc_elem = (EWPF_ifc_elem_t *)last_elem;
	ret = dhd_calculate_adps_energy_gain(&ifc_elem->adps_energy_gain);

	return ret;
}
#endif /* WLADPS_ENERGY_GAIN */
