blob: de224ecb0f271f434212a1f3b4b905ca59b8501d [file] [log] [blame]
/*
**************************************************************************
* 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;
}
}