diff --git a/core/dp/txrx/ol_txrx.c b/core/dp/txrx/ol_txrx.c index 7c87da93051f..ed56021a8032 100644 --- a/core/dp/txrx/ol_txrx.c +++ b/core/dp/txrx/ol_txrx.c @@ -32,6 +32,7 @@ #include /* qdf_device_t, qdf_print */ #include /* qdf_spinlock */ #include /* qdf_atomic_read */ +#include #if defined(HIF_PCI) || defined(HIF_SNOC) || defined(HIF_AHB) /* Required for WLAN_FEATURE_FASTPATH */ @@ -93,6 +94,11 @@ #include "wlan_roam_debug.h" #ifdef QCA_SUPPORT_TXRX_LOCAL_PEER_ID +#define DPT_DEBUGFS_PERMS (QDF_FILE_USR_READ | \ + QDF_FILE_USR_WRITE | \ + QDF_FILE_GRP_READ | \ + QDF_FILE_OTH_READ) + ol_txrx_peer_handle ol_txrx_peer_find_by_local_id(struct cdp_pdev *pdev, uint8_t local_peer_id); @@ -1256,6 +1262,82 @@ static void ol_txrx_tso_stats_clear(ol_txrx_pdev_handle pdev) } #endif /* defined(FEATURE_TSO) && defined(FEATURE_TSO_DEBUG) */ +/** + * ol_txrx_read_dpt_buff_debugfs() - read dp trace buffer + * @file: file to read + * @arg: pdev object + * + * Return: QDF_STATUS + */ +static QDF_STATUS ol_txrx_read_dpt_buff_debugfs(qdf_debugfs_file_t file, + void *arg) +{ + struct ol_txrx_pdev_t *pdev = (struct ol_txrx_pdev_t *)arg; + uint32_t i = 0; + QDF_STATUS status = QDF_STATUS_SUCCESS; + + if (pdev->state == QDF_DPT_DEBUGFS_STATE_SHOW_STATE_INVALID) + return QDF_STATUS_E_INVAL; + else if (pdev->state == QDF_DPT_DEBUGFS_STATE_SHOW_COMPLETE) { + pdev->state = QDF_DPT_DEBUGFS_STATE_SHOW_STATE_INIT; + return QDF_STATUS_SUCCESS; + } + + i = qdf_dpt_get_curr_pos_debugfs(file, pdev->state); + status = qdf_dpt_dump_stats_debugfs(file, i); + if (status == QDF_STATUS_E_FAILURE) + pdev->state = QDF_DPT_DEBUGFS_STATE_SHOW_IN_PROGRESS; + else if (status == QDF_STATUS_SUCCESS) + pdev->state = QDF_DPT_DEBUGFS_STATE_SHOW_COMPLETE; + + return status; +} + +/** + * ol_txrx_write_dpt_buff_debugfs() - set dp trace parameters + * @priv: pdev object + * @buf: buff to get value for dpt parameters + * @len: buf length + * + * Return: QDF_STATUS + */ +static QDF_STATUS ol_txrx_write_dpt_buff_debugfs(void *priv, + const char *buf, + qdf_size_t len) +{ + return QDF_STATUS_SUCCESS; +} + +static int ol_txrx_debugfs_init(struct ol_txrx_pdev_t *pdev) +{ + pdev->dpt_debugfs_fops.show = ol_txrx_read_dpt_buff_debugfs; + pdev->dpt_debugfs_fops.write = ol_txrx_write_dpt_buff_debugfs; + pdev->dpt_debugfs_fops.priv = pdev; + + pdev->dpt_stats_log_dir = qdf_debugfs_create_dir("dpt_stats", NULL); + + if (!pdev->dpt_stats_log_dir) { + QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, + "%s: error while creating debugfs dir for %s", + __func__, "dpt_stats"); + pdev->state = QDF_DPT_DEBUGFS_STATE_SHOW_STATE_INVALID; + return -EBUSY; + } + + if (!qdf_debugfs_create_file("dump_set_dpt_logs", DPT_DEBUGFS_PERMS, + pdev->dpt_stats_log_dir, + &pdev->dpt_debugfs_fops)) { + QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, + "%s: debug Entry creation failed!", + __func__); + pdev->state = QDF_DPT_DEBUGFS_STATE_SHOW_STATE_INVALID; + return -EBUSY; + } + + pdev->state = QDF_DPT_DEBUGFS_STATE_SHOW_STATE_INIT; + return 0; +} + /** * ol_txrx_pdev_attach() - allocate txrx pdev * @ctrl_pdev: cfg pdev @@ -1340,6 +1422,8 @@ ol_txrx_pdev_attach(ol_txrx_soc_handle soc, struct cdp_cfg *ctrl_pdev, pdev->tid_to_ac[OL_TX_NUM_TIDS + OL_TX_VDEV_DEFAULT_MGMT] = OL_TX_SCHED_WRR_ADV_CAT_MCAST_MGMT; + ol_txrx_debugfs_init(pdev); + return (struct cdp_pdev *)pdev; fail3: @@ -2075,6 +2159,11 @@ static void ol_txrx_pdev_pre_detach(struct cdp_pdev *ppdev, int force) #endif } +static void ol_txrx_debugfs_exit(ol_txrx_pdev_handle pdev) +{ + qdf_debugfs_remove_dir_recursive(pdev->dpt_stats_log_dir); +} + /** * ol_txrx_pdev_detach() - delete the data SW state * @ppdev - the data physical device object being removed @@ -2142,6 +2231,8 @@ static void ol_txrx_pdev_detach(struct cdp_pdev *ppdev, int force) ol_txrx_pdev_txq_log_destroy(pdev); ol_txrx_pdev_grp_stat_destroy(pdev); + ol_txrx_debugfs_exit(pdev); + qdf_mem_free(pdev); } diff --git a/core/dp/txrx/ol_txrx_types.h b/core/dp/txrx/ol_txrx_types.h index 94be443b4943..aeeab84d2b34 100644 --- a/core/dp/txrx/ol_txrx_types.h +++ b/core/dp/txrx/ol_txrx_types.h @@ -51,6 +51,7 @@ #include "ol_txrx_osif_api.h" /* ol_rx_callback */ #include "cdp_txrx_flow_ctrl_v2.h" #include "cdp_txrx_peer_ops.h" +#include /* * The target may allocate multiple IDs for a peer. @@ -538,6 +539,7 @@ struct ol_txrx_stats_req_internal { int offset; }; + /* * As depicted in the diagram below, the pdev contains an array of * NUM_EXT_TID ol_tx_active_queues_in_tid_t elements. @@ -1009,6 +1011,11 @@ struct ol_txrx_pdev_t { struct ol_txrx_peer_t *self_peer; qdf_work_t peer_unmap_timer_work; + /* dp debug fs */ + struct dentry *dpt_stats_log_dir; + enum qdf_dpt_debugfs_state state; + struct qdf_debugfs_fops dpt_debugfs_fops; + #ifdef IPA_OFFLOAD ipa_uc_op_cb_type ipa_uc_op_cb; void *usr_ctxt;