/*
 **************************************************************************
 * Copyright (c) 2019-2021, The Linux Foundation. All rights reserved.
 *
 * Permission to use, copy, modify, and/or distribute this software for
 * any purpose with or without fee is hereby granted, provided that the
 * above copyright notice and this permission notice appear in all copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
 * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 **************************************************************************
 */

#include "nss_stats.h"
#include "nss_core.h"
#include <nss_wifili_if.h>
#include "nss_strings.h"
#include "nss_wifili_strings.h"

/*
 * nss_wifili_strings_stats_txrx
 *	wifili txrx statistics
 */
struct nss_stats_info nss_wifili_strings_stats_txrx[NSS_WIFILI_STATS_TXRX_MAX] = {
	{"rx_msdu_error"			, NSS_STATS_TYPE_ERROR},
	{"rx_inv_peer_rcv"			, NSS_STATS_TYPE_SPECIAL},
	{"rx_wds_srcport_exception"		, NSS_STATS_TYPE_EXCEPTION},
	{"rx_wds_srcport_exception_fail"	, NSS_STATS_TYPE_DROP},
	{"rx_deliverd"				, NSS_STATS_TYPE_SPECIAL},
	{"rx_deliver_drops"			, NSS_STATS_TYPE_DROP},
	{"rx_intra_bss_ucast"			, NSS_STATS_TYPE_SPECIAL},
	{"rx_intra_bss_ucast_fail"		, NSS_STATS_TYPE_DROP},
	{"rx_intra_bss_mcast"			, NSS_STATS_TYPE_SPECIAL},
	{"rx_intra_bss_mcast_fail"		, NSS_STATS_TYPE_DROP},
	{"rx_sg_rcv_send"			, NSS_STATS_TYPE_SPECIAL},
	{"rx_sg_rcv_fail"			, NSS_STATS_TYPE_DROP},
	{"rx_mcast_echo"			, NSS_STATS_TYPE_SPECIAL},
	{"rx_inv_tid"				, NSS_STATS_TYPE_SPECIAL},
	{"stats_rx_frag_inv_sc"			, NSS_STATS_TYPE_SPECIAL},
	{"stats_rx_frag_inv_fc"			, NSS_STATS_TYPE_SPECIAL},
	{"stats_rx_frag_non_frag"		, NSS_STATS_TYPE_SPECIAL},
	{"stats_rx_frag_retry"			, NSS_STATS_TYPE_SPECIAL},
	{"stats_rx_frag_ooo"			, NSS_STATS_TYPE_SPECIAL},
	{"stats_rx_frag_ooo_seq"		, NSS_STATS_TYPE_SPECIAL},
	{"stats_rx_frag_all_frag_rcv"		, NSS_STATS_TYPE_SPECIAL},
	{"stats_rx_frag_deliver"		, NSS_STATS_TYPE_SPECIAL},
	{"tx_enqueue"				, NSS_STATS_TYPE_SPECIAL},
	{"tx_enqueue_drop"			, NSS_STATS_TYPE_DROP},
	{"tx_dequeue"				, NSS_STATS_TYPE_SPECIAL},
	{"tx_hw_enqueue_fail"			, NSS_STATS_TYPE_DROP},
	{"tx_sent_count"			, NSS_STATS_TYPE_SPECIAL}
};

/*
 * nss_wifili_strings_stats_tcl
 *	wifili tcl stats
 */
struct nss_stats_info nss_wifili_strings_stats_tcl[NSS_WIFILI_STATS_TCL_MAX] = {
	{"tcl_no_hw_desc"	, NSS_STATS_TYPE_SPECIAL},
	{"tcl_ring_full"	, NSS_STATS_TYPE_SPECIAL},
	{"tcl_ring_sent"	, NSS_STATS_TYPE_SPECIAL}
};

/*
 * nss_wifili_strings_stats_tx_comp
 *	wifili tx comp stats
 */
struct nss_stats_info nss_wifili_strings_stats_tx_comp[NSS_WIFILI_STATS_TX_DESC_FREE_MAX] = {
	{"tx_desc_free_inv_bufsrc"		, NSS_STATS_TYPE_ERROR},
	{"tx_desc_free_inv_cookie"		, NSS_STATS_TYPE_SPECIAL},
	{"tx_desc_free_hw_ring_empty"		, NSS_STATS_TYPE_SPECIAL},
	{"tx_desc_free_reaped"			, NSS_STATS_TYPE_SPECIAL},
	{"tx_capture_enqueue_count"		, NSS_STATS_TYPE_SPECIAL},
	{"tx_capture_enqueue_fail_count"	, NSS_STATS_TYPE_ERROR}
};

/*
 * nss_wifili_strings_stats_reo
 *	wifili tx reo stats
 */
struct nss_stats_info nss_wifili_strings_stats_reo[NSS_WIFILI_STATS_REO_MAX] = {
	{"reo_error"		, NSS_STATS_TYPE_ERROR},
	{"reo_reaped"		, NSS_STATS_TYPE_SPECIAL},
	{"reo_inv_cookie"	, NSS_STATS_TYPE_SPECIAL},
	{"stats_reo_frag_rcv"	, NSS_STATS_TYPE_SPECIAL}
};

/*
 * nss_wifili_strings_stats_txsw_pool
 *	wifili tx desc stats
 */
struct nss_stats_info nss_wifili_strings_stats_txsw_pool[NSS_WIFILI_STATS_TX_DESC_MAX] = {
	{"tx_desc_in_use"		, NSS_STATS_TYPE_SPECIAL},
	{"tx_desc_alloc_fail"		, NSS_STATS_TYPE_SPECIAL},
	{"tx_desc_already_allocated"	, NSS_STATS_TYPE_SPECIAL},
	{"tx_desc_invalid_free"		, NSS_STATS_TYPE_SPECIAL},
	{"tx_desc_free_src_fw"		, NSS_STATS_TYPE_SPECIAL},
	{"tx_desc_free_completion"	, NSS_STATS_TYPE_SPECIAL},
	{"tx_desc_no_pb"		, NSS_STATS_TYPE_SPECIAL},
	{"tx_desc_queuelimit_drop"	, NSS_STATS_TYPE_DROP}
};

/*
 * nss_wifili_strings_stats_ext_txsw_pool
 *	wifili tx ext desc stats
 */
struct nss_stats_info nss_wifili_strings_stats_ext_txsw_pool[NSS_WIFILI_STATS_EXT_TX_DESC_MAX] = {
	{"ext_tx_desc_in_use"			, NSS_STATS_TYPE_SPECIAL},
	{"ext_tx_desc_alloc_fail"		, NSS_STATS_TYPE_SPECIAL},
	{"ext_tx_desc_already_allocated"	, NSS_STATS_TYPE_SPECIAL},
	{"ext_tx_desc_invalid_free"		, NSS_STATS_TYPE_SPECIAL}
};

/*
 * nss_wifili_strings_stats_rxdma_pool
 *	wifili rx desc stats
 */
struct nss_stats_info nss_wifili_strings_stats_rxdma_pool[NSS_WIFILI_STATS_RX_DESC_MAX] = {
	{"rx_desc_no_pb"	, NSS_STATS_TYPE_SPECIAL},
	{"rx_desc_alloc_fail"	, NSS_STATS_TYPE_SPECIAL},
	{"rx_desc_in_use"	, NSS_STATS_TYPE_SPECIAL}
};

/*
 * nss_wifili_strings_stats_rxdma_ring
 *	wifili rx dma ring stats
 */
struct nss_stats_info nss_wifili_strings_stats_rxdma_ring[NSS_WIFILI_STATS_RXDMA_DESC_MAX] = {
	{"rxdma_hw_desc_unavailable"	, NSS_STATS_TYPE_SPECIAL},
	{"rxdma_buf_replenished"	, NSS_STATS_TYPE_SPECIAL}
};

/*
 * nss_wifili_strings_stats_wbm
 *	wifili wbm ring stats
 */
struct nss_stats_info nss_wifili_strings_stats_wbm[NSS_WIFILI_STATS_WBM_MAX] = {
	{"wbm_ie_local_alloc_fail"	, NSS_STATS_TYPE_ERROR},
	{"wbm_src_dma"			, NSS_STATS_TYPE_SPECIAL},
	{"wbm_src_dma_code_inv"		, NSS_STATS_TYPE_SPECIAL},
	{"wbm_src_reo"			, NSS_STATS_TYPE_SPECIAL},
	{"wbm_src_reo_code_nullq"	, NSS_STATS_TYPE_SPECIAL},
	{"wbm_src_reo_code_inv"		, NSS_STATS_TYPE_ERROR},
	{"wbm_src_inv"			, NSS_STATS_TYPE_ERROR}
};

/*
 * nss_wifili_txrx_strings_read()
 *	Read wifili Tx Rx statistics names.
 */
static ssize_t nss_wifili_txrx_strings_read(struct file *fp, char __user *ubuf, size_t sz, loff_t *ppos)
{
	return nss_strings_print(ubuf, sz, ppos, nss_wifili_strings_stats_txrx, NSS_WIFILI_STATS_TXRX_MAX);
}

/*
 * nss_wifili_tcl_ring_strings_read()
 *	Read wifili TCL ring statistics names.
 */
static ssize_t nss_wifili_tcl_ring_strings_read(struct file *fp, char __user *ubuf, size_t sz, loff_t *ppos)
{
	return nss_strings_print(ubuf, sz, ppos, nss_wifili_strings_stats_tcl, NSS_WIFILI_STATS_TCL_MAX);
}

/*
 * nss_wifili_tcl_comp_strings_read()
 *	Read wifili TCL comp statistics names.
 */
static ssize_t nss_wifili_tcl_comp_strings_read(struct file *fp, char __user *ubuf, size_t sz, loff_t *ppos)
{
	return nss_strings_print(ubuf, sz, ppos, nss_wifili_strings_stats_tx_comp, NSS_WIFILI_STATS_TX_DESC_FREE_MAX);
}

/*
 * nss_wifili_reo_ring_strings_read()
 *	Read wifili reorder ring statistics names.
 */
static ssize_t nss_wifili_reo_ring_strings_read(struct file *fp, char __user *ubuf, size_t sz, loff_t *ppos)
{
	return nss_strings_print(ubuf, sz, ppos, nss_wifili_strings_stats_reo, NSS_WIFILI_STATS_REO_MAX);
}

/*
 * nss_wifili_tx_sw_strings_read()
 *	Read wifili Tx sw statistics names.
 */
static ssize_t nss_wifili_tx_sw_strings_read(struct file *fp, char __user *ubuf, size_t sz, loff_t *ppos)
{
	return nss_strings_print(ubuf, sz, ppos, nss_wifili_strings_stats_txsw_pool, NSS_WIFILI_STATS_TX_DESC_MAX);
}

/*
 * nss_wifili_tx_ext_sw_strings_read()
 *	Read wifili Tx ext sw statistics names.
 */
static ssize_t nss_wifili_tx_ext_sw_strings_read(struct file *fp, char __user *ubuf, size_t sz, loff_t *ppos)
{
	return nss_strings_print(ubuf, sz, ppos, nss_wifili_strings_stats_ext_txsw_pool, NSS_WIFILI_STATS_EXT_TX_DESC_MAX);
}

/*
 * nss_wifili_rx_dma_pool_strings_read()
 *	Read wifili Rx DMA pool statistics names.
 */
static ssize_t nss_wifili_rx_dma_pool_strings_read(struct file *fp, char __user *ubuf, size_t sz, loff_t *ppos)
{
	return nss_strings_print(ubuf, sz, ppos, nss_wifili_strings_stats_rxdma_pool, NSS_WIFILI_STATS_RX_DESC_MAX);
}

/*
 * nss_wifili_rx_dma_ring_strings_read()
 *	Read wifili Rx DMA ring statistics names.
 */
static ssize_t nss_wifili_rx_dma_ring_strings_read(struct file *fp, char __user *ubuf, size_t sz, loff_t *ppos)
{
	return nss_strings_print(ubuf, sz, ppos, nss_wifili_strings_stats_rxdma_ring, NSS_WIFILI_STATS_RXDMA_DESC_MAX);
}

/*
 * nss_wifili_wbm_ring_strings_read()
 *	Read wifili WBM ring statistics names.
 */
static ssize_t nss_wifili_wbm_ring_strings_read(struct file *fp, char __user *ubuf, size_t sz, loff_t *ppos)
{
	return nss_strings_print(ubuf, sz, ppos, nss_wifili_strings_stats_wbm, NSS_WIFILI_STATS_WBM_MAX);
}

/*
 * nss_wifili_txrx_strings_ops
 */
NSS_STRINGS_DECLARE_FILE_OPERATIONS(wifili_txrx);

/*
 * nss_wifili_tcl_ring_strings_ops
 */
NSS_STRINGS_DECLARE_FILE_OPERATIONS(wifili_tcl_ring);

/*
 * nss_wifili_tcl_comp_strings_ops
 */
NSS_STRINGS_DECLARE_FILE_OPERATIONS(wifili_tcl_comp);

/*
 * nss_wifili_reo_ring_strings_ops
 */
NSS_STRINGS_DECLARE_FILE_OPERATIONS(wifili_reo_ring);

/*
 * nss_wifili_tx_sw_strings_ops
 */
NSS_STRINGS_DECLARE_FILE_OPERATIONS(wifili_tx_sw);

/*
 * nss_wifili_tx_ext_sw_strings_ops
 */
NSS_STRINGS_DECLARE_FILE_OPERATIONS(wifili_tx_ext_sw);

/*
 * nss_wifili_rx_dma_pool_strings_ops
 */
NSS_STRINGS_DECLARE_FILE_OPERATIONS(wifili_rx_dma_pool);

/*
 * nss_wifili_rx_dma_ring_strings_ops
 */
NSS_STRINGS_DECLARE_FILE_OPERATIONS(wifili_rx_dma_ring);

/*
 * nss_wifili_wbm_ring_strings_ops
 */
NSS_STRINGS_DECLARE_FILE_OPERATIONS(wifili_wbm_ring);

/*
 * nss_wifili_strings_dentry_create()
 *	Create wifili statistics strings debug entry.
 */
void nss_wifili_strings_dentry_create(void)
{
	struct dentry *wifili_d = NULL;
	struct dentry *wifili_txrx_d = NULL;
	struct dentry *wifili_tcl_ring_d = NULL;
	struct dentry *wifili_tcl_comp_d = NULL;
	struct dentry *wifili_reo_ring_d = NULL;
	struct dentry *wifili_tx_sw_d = NULL;
	struct dentry *wifili_tx_ext_sw_d = NULL;
	struct dentry *wifili_rx_dma_pool_d = NULL;
	struct dentry *wifili_rx_dma_ring_d = NULL;
	struct dentry *wifili_wbm_ring_d = NULL;

	if (!nss_top_main.strings_dentry) {
		nss_warning("qca-nss-drv/strings is not present");
		return;
	}

	wifili_d = debugfs_create_dir("wifili", nss_top_main.strings_dentry);
	if (!wifili_d) {
		nss_warning("Failed to create qca-nss-drv/strings/wifili directory");
		return;
	}

	wifili_txrx_d = debugfs_create_file("txrx_str", 0400, wifili_d, &nss_top_main, &nss_wifili_txrx_strings_ops);
	if (!wifili_txrx_d) {
		nss_warning("Failed to create qca-nss-drv/strings/wifili/txrx_str file");
		debugfs_remove_recursive(wifili_d);
		return;
	}

	wifili_tcl_ring_d = debugfs_create_file("tcl_ring_str", 0400, wifili_d, &nss_top_main, &nss_wifili_tcl_ring_strings_ops);
	if (!wifili_tcl_ring_d) {
		nss_warning("Failed to create qca-nss-drv/strings/wifili/tcl_ring_str file");
		debugfs_remove_recursive(wifili_d);
		return;
	}

	wifili_tcl_comp_d = debugfs_create_file("tcl_comp_str", 0400, wifili_d, &nss_top_main, &nss_wifili_tcl_comp_strings_ops);
	if (!wifili_tcl_comp_d) {
		nss_warning("Failed to create qca-nss-drv/strings/wifili/tcl_comp_str file");
		debugfs_remove_recursive(wifili_d);
		return;
	}

	wifili_reo_ring_d = debugfs_create_file("reo_ring_str", 0400, wifili_d, &nss_top_main, &nss_wifili_reo_ring_strings_ops);
	if (!wifili_reo_ring_d) {
		nss_warning("Failed to create qca-nss-drv/strings/wifili/reo_ring_str file");
		debugfs_remove_recursive(wifili_d);
		return;
	}

	wifili_tx_sw_d = debugfs_create_file("tx_sw_str", 0400, wifili_d, &nss_top_main, &nss_wifili_tx_sw_strings_ops);
	if (!wifili_tx_sw_d) {
		nss_warning("Failed to create qca-nss-drv/strings/wifili/tx_sw_str file");
		debugfs_remove_recursive(wifili_d);
		return;
	}

	wifili_tx_ext_sw_d = debugfs_create_file("tx_ext_sw_str", 0400, wifili_d, &nss_top_main, &nss_wifili_tx_ext_sw_strings_ops);
	if (!wifili_tx_ext_sw_d) {
		nss_warning("Failed to create qca-nss-drv/strings/wifili/tx_ext_sw_str file");
		debugfs_remove_recursive(wifili_d);
		return;
	}

	wifili_rx_dma_pool_d = debugfs_create_file("rx_dma_pool_str", 0400, wifili_d, &nss_top_main, &nss_wifili_rx_dma_pool_strings_ops);
	if (!wifili_rx_dma_pool_d) {
		nss_warning("Failed to create qca-nss-drv/strings/wifili/rx_dma_pool_str file");
		debugfs_remove_recursive(wifili_d);
		return;
	}

	wifili_rx_dma_ring_d = debugfs_create_file("rx_dma_ring_str", 0400, wifili_d, &nss_top_main, &nss_wifili_rx_dma_ring_strings_ops);
	if (!wifili_rx_dma_ring_d) {
		nss_warning("Failed to create qca-nss-drv/strings/wifili/rx_dma_ring_str file");
		debugfs_remove_recursive(wifili_d);
		return;
	}

	wifili_wbm_ring_d = debugfs_create_file("wbm_ring_str", 0400, wifili_d, &nss_top_main, &nss_wifili_wbm_ring_strings_ops);
	if (!wifili_wbm_ring_d) {
		nss_warning("Failed to create qca-nss-drv/strings/wifili/wbm_ring_str file");
		debugfs_remove_recursive(wifili_d);
		return;
	}
}
