qcacmn: Use qdf flex mem to allocate rx ppdu info
To avoid fragmentation, use qdf flex mem framework to allocate rx ppdu info CRs-Fixed: 3230970 Change-Id: I2318f6c5f33e5337f6398263d6717da698be7c92
This commit is contained in:

committed by
Madan Koyyalamudi

parent
62f89b696a
commit
59b643e25f
@@ -389,6 +389,10 @@ enum cdp_mon_phyrx_abort_reason_code {
|
|||||||
* @mpdus_to_stack: Number of MPDUs delivered to stack
|
* @mpdus_to_stack: Number of MPDUs delivered to stack
|
||||||
* @status_buf_count: Number of status buffer received
|
* @status_buf_count: Number of status buffer received
|
||||||
* @empty_desc_ppdu: Number of empty desc received
|
* @empty_desc_ppdu: Number of empty desc received
|
||||||
|
* @total_ppdu_info_enq: Number of PPDUs enqueued to wq
|
||||||
|
* @total_ppdu_info_drop: Number of PPDUs dropped
|
||||||
|
* @total_ppdu_info_alloc: Number of PPDU info allocated
|
||||||
|
* @total_ppdu_info_free: Number of PPDU info freeed
|
||||||
*/
|
*/
|
||||||
struct cdp_pdev_mon_stats {
|
struct cdp_pdev_mon_stats {
|
||||||
#ifndef REMOVE_MON_DBG_STATS
|
#ifndef REMOVE_MON_DBG_STATS
|
||||||
@@ -432,6 +436,10 @@ struct cdp_pdev_mon_stats {
|
|||||||
uint32_t mpdus_buf_to_stack;
|
uint32_t mpdus_buf_to_stack;
|
||||||
uint32_t status_buf_count;
|
uint32_t status_buf_count;
|
||||||
uint32_t empty_desc_ppdu;
|
uint32_t empty_desc_ppdu;
|
||||||
|
uint32_t total_ppdu_info_enq;
|
||||||
|
uint32_t total_ppdu_info_drop;
|
||||||
|
uint32_t total_ppdu_info_alloc;
|
||||||
|
uint32_t total_ppdu_info_free;
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef QCA_SUPPORT_LITE_MONITOR
|
#ifdef QCA_SUPPORT_LITE_MONITOR
|
||||||
|
@@ -1220,6 +1220,7 @@ dp_mon_register_feature_ops_1_0(struct dp_soc *soc)
|
|||||||
dp_mon_filter_reset_undecoded_metadata_capture_1_0;
|
dp_mon_filter_reset_undecoded_metadata_capture_1_0;
|
||||||
#endif
|
#endif
|
||||||
mon_ops->mon_rx_stats_update_rssi_dbm_params = NULL;
|
mon_ops->mon_rx_stats_update_rssi_dbm_params = NULL;
|
||||||
|
mon_ops->mon_rx_print_advanced_stats = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct dp_mon_ops monitor_ops_1_0 = {
|
struct dp_mon_ops monitor_ops_1_0 = {
|
||||||
|
@@ -70,6 +70,7 @@ QDF_STATUS dp_mon_pdev_ext_init_2_0(struct dp_pdev *pdev)
|
|||||||
TAILQ_INIT(&mon_pdev_be->rx_mon_queue);
|
TAILQ_INIT(&mon_pdev_be->rx_mon_queue);
|
||||||
|
|
||||||
qdf_spinlock_create(&mon_pdev_be->rx_mon_wq_lock);
|
qdf_spinlock_create(&mon_pdev_be->rx_mon_wq_lock);
|
||||||
|
dp_rx_mon_ppdu_info_pool_init(mon_pdev);
|
||||||
|
|
||||||
return QDF_STATUS_SUCCESS;
|
return QDF_STATUS_SUCCESS;
|
||||||
|
|
||||||
@@ -93,12 +94,13 @@ QDF_STATUS dp_mon_pdev_ext_deinit_2_0(struct dp_pdev *pdev)
|
|||||||
if (!mon_pdev_be->rx_mon_workqueue)
|
if (!mon_pdev_be->rx_mon_workqueue)
|
||||||
return QDF_STATUS_E_FAILURE;
|
return QDF_STATUS_E_FAILURE;
|
||||||
|
|
||||||
dp_rx_mon_drain_wq(pdev);
|
|
||||||
qdf_flush_workqueue(0, mon_pdev_be->rx_mon_workqueue);
|
qdf_flush_workqueue(0, mon_pdev_be->rx_mon_workqueue);
|
||||||
qdf_destroy_workqueue(0, mon_pdev_be->rx_mon_workqueue);
|
qdf_destroy_workqueue(0, mon_pdev_be->rx_mon_workqueue);
|
||||||
qdf_flush_work(&mon_pdev_be->rx_mon_work);
|
qdf_flush_work(&mon_pdev_be->rx_mon_work);
|
||||||
qdf_disable_work(&mon_pdev_be->rx_mon_work);
|
qdf_disable_work(&mon_pdev_be->rx_mon_work);
|
||||||
mon_pdev_be->rx_mon_workqueue = NULL;
|
mon_pdev_be->rx_mon_workqueue = NULL;
|
||||||
|
dp_rx_mon_drain_wq(pdev);
|
||||||
|
dp_rx_mon_ppdu_info_pool_deinit(mon_pdev_be);
|
||||||
qdf_spinlock_destroy(&mon_pdev_be->rx_mon_wq_lock);
|
qdf_spinlock_destroy(&mon_pdev_be->rx_mon_wq_lock);
|
||||||
|
|
||||||
return QDF_STATUS_SUCCESS;
|
return QDF_STATUS_SUCCESS;
|
||||||
@@ -1532,6 +1534,8 @@ dp_mon_register_feature_ops_2_0(struct dp_soc *soc)
|
|||||||
#endif
|
#endif
|
||||||
mon_ops->mon_rx_stats_update_rssi_dbm_params =
|
mon_ops->mon_rx_stats_update_rssi_dbm_params =
|
||||||
dp_mon_rx_stats_update_rssi_dbm_params_2_0;
|
dp_mon_rx_stats_update_rssi_dbm_params_2_0;
|
||||||
|
mon_ops->mon_rx_print_advanced_stats =
|
||||||
|
dp_mon_rx_print_advanced_stats_2_0;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct dp_mon_ops monitor_ops_2_0 = {
|
struct dp_mon_ops monitor_ops_2_0 = {
|
||||||
|
@@ -20,6 +20,8 @@
|
|||||||
|
|
||||||
#if !defined(DISABLE_MON_CONFIG)
|
#if !defined(DISABLE_MON_CONFIG)
|
||||||
#include <qdf_lock.h>
|
#include <qdf_lock.h>
|
||||||
|
#include <qdf_flex_mem.h>
|
||||||
|
#include <qdf_atomic.h>
|
||||||
#include <dp_types.h>
|
#include <dp_types.h>
|
||||||
#include <dp_mon.h>
|
#include <dp_mon.h>
|
||||||
#include <dp_mon_filter.h>
|
#include <dp_mon_filter.h>
|
||||||
@@ -145,6 +147,9 @@ struct dp_mon_desc_pool {
|
|||||||
* @xlna_bypass_threshold: Low noise amplifier bypass threshold
|
* @xlna_bypass_threshold: Low noise amplifier bypass threshold
|
||||||
* @xbar_config: 3 Bytes of xbar_config are used for RF to BB mapping
|
* @xbar_config: 3 Bytes of xbar_config are used for RF to BB mapping
|
||||||
* @min_nf_dbm: min noise floor in active chains per channel
|
* @min_nf_dbm: min noise floor in active chains per channel
|
||||||
|
* @rx_ppdu_info_pool: rx ppdu info mem pool
|
||||||
|
* @rx_ppdu_info_pool_head: rx ppdu info mem pool head segment
|
||||||
|
* @rx_ppdu_info_pool_head_bytes: ppdu info pool head for array indexing
|
||||||
*/
|
*/
|
||||||
struct dp_mon_pdev_be {
|
struct dp_mon_pdev_be {
|
||||||
struct dp_mon_pdev mon_pdev;
|
struct dp_mon_pdev mon_pdev;
|
||||||
@@ -174,6 +179,9 @@ struct dp_mon_pdev_be {
|
|||||||
uint32_t xbar_config;
|
uint32_t xbar_config;
|
||||||
int8_t min_nf_dbm;
|
int8_t min_nf_dbm;
|
||||||
#endif
|
#endif
|
||||||
|
struct qdf_flex_mem_pool rx_ppdu_info_pool;
|
||||||
|
struct qdf_flex_mem_segment rx_ppdu_info_pool_head;
|
||||||
|
uint8_t rx_ppdu_info_pool_head_bytes[QDF_FM_BITMAP_BITS * (sizeof(struct hal_rx_ppdu_info))];
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -23,6 +23,7 @@
|
|||||||
#include "hal_be_api_mon.h"
|
#include "hal_be_api_mon.h"
|
||||||
#include "dp_internal.h"
|
#include "dp_internal.h"
|
||||||
#include "qdf_mem.h" /* qdf_mem_malloc,free */
|
#include "qdf_mem.h" /* qdf_mem_malloc,free */
|
||||||
|
#include <qdf_flex_mem.h>
|
||||||
#include "dp_mon.h"
|
#include "dp_mon.h"
|
||||||
#include <dp_rx_mon.h>
|
#include <dp_rx_mon.h>
|
||||||
#include <dp_mon_2.0.h>
|
#include <dp_mon_2.0.h>
|
||||||
@@ -37,6 +38,57 @@
|
|||||||
|
|
||||||
#define F_MASK 0xFFFF
|
#define F_MASK 0xFFFF
|
||||||
|
|
||||||
|
static struct hal_rx_ppdu_info*
|
||||||
|
dp_mon_ppdu_info_alloc(struct dp_mon_pdev_be *mon_pdev_be)
|
||||||
|
{
|
||||||
|
struct hal_rx_ppdu_info *ppdu_info = NULL;
|
||||||
|
|
||||||
|
ppdu_info = qdf_flex_mem_alloc(&mon_pdev_be->rx_ppdu_info_pool);
|
||||||
|
if (!ppdu_info) {
|
||||||
|
dp_mon_debug("out of memory");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ppdu_info;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* dp_mon_free_ppdu_info() - Free PPDU info
|
||||||
|
*
|
||||||
|
* @pdev: DP pdev handle
|
||||||
|
* @ppdu_info: PPDU info
|
||||||
|
*
|
||||||
|
* Return: void
|
||||||
|
*/
|
||||||
|
static void dp_mon_free_ppdu_info(struct dp_mon_pdev *mon_pdev,
|
||||||
|
struct hal_rx_ppdu_info *ppdu_info)
|
||||||
|
{
|
||||||
|
struct dp_mon_pdev_be *mon_pdev_be =
|
||||||
|
dp_get_be_mon_pdev_from_dp_mon_pdev(mon_pdev);
|
||||||
|
qdf_flex_mem_free(&mon_pdev_be->rx_ppdu_info_pool, ppdu_info);
|
||||||
|
mon_pdev->rx_mon_stats.total_ppdu_info_free++;
|
||||||
|
}
|
||||||
|
|
||||||
|
void dp_rx_mon_ppdu_info_pool_init(struct dp_mon_pdev *mon_pdev)
|
||||||
|
{
|
||||||
|
struct dp_mon_pdev_be *mon_pdev_be =
|
||||||
|
dp_get_be_mon_pdev_from_dp_mon_pdev(mon_pdev);
|
||||||
|
|
||||||
|
mon_pdev_be->rx_ppdu_info_pool_head.node =
|
||||||
|
(qdf_list_node_t)QDF_LIST_NODE_INIT_SINGLE(QDF_LIST_ANCHOR(mon_pdev_be->rx_ppdu_info_pool.seg_list));
|
||||||
|
mon_pdev_be->rx_ppdu_info_pool_head.bytes =
|
||||||
|
mon_pdev_be->rx_ppdu_info_pool_head_bytes;
|
||||||
|
mon_pdev_be->rx_ppdu_info_pool.seg_list = (qdf_list_t)QDF_LIST_INIT_SINGLE(mon_pdev_be->rx_ppdu_info_pool_head.node);
|
||||||
|
mon_pdev_be->rx_ppdu_info_pool.reduction_limit = DP_RXMON_PPDU_INFO_SEG_MAX;
|
||||||
|
mon_pdev_be->rx_ppdu_info_pool.item_size = sizeof(struct hal_rx_ppdu_info);
|
||||||
|
qdf_flex_mem_init(&mon_pdev_be->rx_ppdu_info_pool);
|
||||||
|
}
|
||||||
|
|
||||||
|
void dp_rx_mon_ppdu_info_pool_deinit(struct dp_mon_pdev_be *mon_pdev_be)
|
||||||
|
{
|
||||||
|
qdf_flex_mem_deinit(&mon_pdev_be->rx_ppdu_info_pool);
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef QCA_TEST_MON_PF_TAGS_STATS
|
#ifdef QCA_TEST_MON_PF_TAGS_STATS
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -219,7 +271,7 @@ dp_rx_mon_free_ppdu_info(struct dp_pdev *pdev,
|
|||||||
struct hal_rx_ppdu_info *ppdu_info)
|
struct hal_rx_ppdu_info *ppdu_info)
|
||||||
{
|
{
|
||||||
uint8_t user;
|
uint8_t user;
|
||||||
struct dp_mon_pdev *mon_pdev;
|
struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
|
||||||
|
|
||||||
mon_pdev = (struct dp_mon_pdev *)pdev->monitor_pdev;
|
mon_pdev = (struct dp_mon_pdev *)pdev->monitor_pdev;
|
||||||
for (user = 0; user < ppdu_info->com_info.num_users; user++) {
|
for (user = 0; user < ppdu_info->com_info.num_users; user++) {
|
||||||
@@ -235,6 +287,7 @@ dp_rx_mon_free_ppdu_info(struct dp_pdev *pdev,
|
|||||||
dp_mon_free_parent_nbuf(mon_pdev, mpdu);
|
dp_mon_free_parent_nbuf(mon_pdev, mpdu);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
dp_mon_free_ppdu_info(mon_pdev, ppdu_info);
|
||||||
}
|
}
|
||||||
|
|
||||||
void dp_rx_mon_drain_wq(struct dp_pdev *pdev)
|
void dp_rx_mon_drain_wq(struct dp_pdev *pdev)
|
||||||
@@ -376,6 +429,7 @@ dp_rx_mon_process_ppdu_info(struct dp_pdev *pdev,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
dp_mon_free_ppdu_info(mon_pdev, ppdu_info);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -418,7 +472,6 @@ void dp_rx_mon_process_ppdu(void *context)
|
|||||||
|
|
||||||
mon_pdev_be->rx_mon_queue_depth--;
|
mon_pdev_be->rx_mon_queue_depth--;
|
||||||
dp_rx_mon_process_ppdu_info(pdev, ppdu_info);
|
dp_rx_mon_process_ppdu_info(pdev, ppdu_info);
|
||||||
qdf_mem_free(ppdu_info);
|
|
||||||
}
|
}
|
||||||
qdf_spin_unlock_bh(&mon_pdev_be->rx_mon_wq_lock);
|
qdf_spin_unlock_bh(&mon_pdev_be->rx_mon_wq_lock);
|
||||||
}
|
}
|
||||||
@@ -433,9 +486,10 @@ void dp_rx_mon_process_ppdu(void *context)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
static QDF_STATUS
|
static QDF_STATUS
|
||||||
dp_rx_mon_add_ppdu_info_to_wq(struct dp_mon_pdev *mon_pdev,
|
dp_rx_mon_add_ppdu_info_to_wq(struct dp_pdev *pdev,
|
||||||
struct hal_rx_ppdu_info *ppdu_info)
|
struct hal_rx_ppdu_info *ppdu_info)
|
||||||
{
|
{
|
||||||
|
struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
|
||||||
struct dp_mon_pdev_be *mon_pdev_be =
|
struct dp_mon_pdev_be *mon_pdev_be =
|
||||||
dp_get_be_mon_pdev_from_dp_mon_pdev(mon_pdev);
|
dp_get_be_mon_pdev_from_dp_mon_pdev(mon_pdev);
|
||||||
|
|
||||||
@@ -446,9 +500,15 @@ dp_rx_mon_add_ppdu_info_to_wq(struct dp_mon_pdev *mon_pdev,
|
|||||||
|
|
||||||
if (qdf_likely(ppdu_info)) {
|
if (qdf_likely(ppdu_info)) {
|
||||||
qdf_spin_lock_bh(&mon_pdev_be->rx_mon_wq_lock);
|
qdf_spin_lock_bh(&mon_pdev_be->rx_mon_wq_lock);
|
||||||
|
if (mon_pdev_be->rx_mon_queue_depth < DP_RX_MON_WQ_THRESHOLD) {
|
||||||
TAILQ_INSERT_TAIL(&mon_pdev_be->rx_mon_queue,
|
TAILQ_INSERT_TAIL(&mon_pdev_be->rx_mon_queue,
|
||||||
ppdu_info, ppdu_list_elem);
|
ppdu_info, ppdu_list_elem);
|
||||||
mon_pdev_be->rx_mon_queue_depth++;
|
mon_pdev_be->rx_mon_queue_depth++;
|
||||||
|
mon_pdev->rx_mon_stats.total_ppdu_info_enq++;
|
||||||
|
} else {
|
||||||
|
mon_pdev->rx_mon_stats.total_ppdu_info_drop++;
|
||||||
|
dp_rx_mon_free_ppdu_info(pdev, ppdu_info);
|
||||||
|
}
|
||||||
qdf_spin_unlock_bh(&mon_pdev_be->rx_mon_wq_lock);
|
qdf_spin_unlock_bh(&mon_pdev_be->rx_mon_wq_lock);
|
||||||
|
|
||||||
if (mon_pdev_be->rx_mon_queue_depth > DP_MON_QUEUE_DEPTH_MAX) {
|
if (mon_pdev_be->rx_mon_queue_depth > DP_MON_QUEUE_DEPTH_MAX) {
|
||||||
@@ -489,11 +549,6 @@ dp_rx_mon_handle_full_mon(struct dp_pdev *pdev,
|
|||||||
---------------------------------------------------------------------------
|
---------------------------------------------------------------------------
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
if (!mpdu) {
|
|
||||||
dp_mon_debug("nbuf is NULL, return");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
head_msdu = mpdu;
|
head_msdu = mpdu;
|
||||||
|
|
||||||
mpdu_meta = (struct hal_rx_mon_mpdu_info *)qdf_nbuf_data(mpdu);
|
mpdu_meta = (struct hal_rx_mon_mpdu_info *)qdf_nbuf_data(mpdu);
|
||||||
@@ -1189,13 +1244,13 @@ dp_rx_mon_process_status_tlv(struct dp_pdev *pdev)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
ppdu_info = qdf_mem_malloc(sizeof(*ppdu_info));
|
ppdu_info = dp_mon_ppdu_info_alloc(mon_pdev_be);
|
||||||
|
|
||||||
if (!ppdu_info) {
|
if (!ppdu_info) {
|
||||||
dp_mon_err("ppdu_info malloc failed pdev: %pK", pdev);
|
dp_mon_err("ppdu_info malloc failed pdev: %pK", pdev);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
mon_pdev->rx_mon_stats.total_ppdu_info_alloc++;
|
||||||
status_buf_count = mon_pdev_be->desc_count;
|
status_buf_count = mon_pdev_be->desc_count;
|
||||||
for (idx = 0; idx < status_buf_count; idx++) {
|
for (idx = 0; idx < status_buf_count; idx++) {
|
||||||
mon_desc = mon_pdev_be->status[idx];
|
mon_desc = mon_pdev_be->status[idx];
|
||||||
@@ -1440,11 +1495,11 @@ dp_rx_mon_srng_process_2_0(struct dp_soc *soc, struct dp_intr *int_ctx,
|
|||||||
dp_rx_handle_cfr(soc, pdev, ppdu_info);
|
dp_rx_handle_cfr(soc, pdev, ppdu_info);
|
||||||
|
|
||||||
/* Call API to add PPDU info workqueue */
|
/* Call API to add PPDU info workqueue */
|
||||||
status = dp_rx_mon_add_ppdu_info_to_wq(mon_pdev, ppdu_info);
|
status = dp_rx_mon_add_ppdu_info_to_wq(pdev, ppdu_info);
|
||||||
|
|
||||||
if (status != QDF_STATUS_SUCCESS) {
|
if (status != QDF_STATUS_SUCCESS) {
|
||||||
if (ppdu_info)
|
if (ppdu_info)
|
||||||
qdf_mem_free(ppdu_info);
|
dp_mon_free_ppdu_info(mon_pdev, ppdu_info);
|
||||||
}
|
}
|
||||||
|
|
||||||
work_done++;
|
work_done++;
|
||||||
@@ -1683,3 +1738,42 @@ dp_mon_rx_stats_update_rssi_dbm_params_2_0(struct dp_soc *soc,
|
|||||||
soc->features.rssi_dbm_conv_support;
|
soc->features.rssi_dbm_conv_support;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
void dp_mon_rx_print_advanced_stats_2_0(struct dp_soc *soc,
|
||||||
|
struct dp_pdev *pdev)
|
||||||
|
{
|
||||||
|
struct cdp_pdev_mon_stats *rx_mon_stats;
|
||||||
|
struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
|
||||||
|
struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc;
|
||||||
|
struct dp_mon_pdev_be *mon_pdev_be =
|
||||||
|
dp_get_be_mon_pdev_from_dp_mon_pdev(mon_pdev);
|
||||||
|
|
||||||
|
rx_mon_stats = &mon_pdev->rx_mon_stats;
|
||||||
|
|
||||||
|
DP_PRINT_STATS("total_ppdu_info_alloc = %d",
|
||||||
|
rx_mon_stats->total_ppdu_info_alloc);
|
||||||
|
DP_PRINT_STATS("total_ppdu_info_free = %d",
|
||||||
|
rx_mon_stats->total_ppdu_info_free);
|
||||||
|
DP_PRINT_STATS("total_ppdu_info_enq = %d",
|
||||||
|
rx_mon_stats->total_ppdu_info_enq);
|
||||||
|
DP_PRINT_STATS("total_ppdu_info_drop = %d",
|
||||||
|
rx_mon_stats->total_ppdu_info_drop);
|
||||||
|
DP_PRINT_STATS("rx_hdr_not_received = %d",
|
||||||
|
rx_mon_stats->rx_hdr_not_received);
|
||||||
|
DP_PRINT_STATS("parent_buf_alloc = %d",
|
||||||
|
rx_mon_stats->parent_buf_alloc);
|
||||||
|
DP_PRINT_STATS("parent_buf_free = %d",
|
||||||
|
rx_mon_stats->parent_buf_free);
|
||||||
|
DP_PRINT_STATS("mpdus_buf_to_stack = %d",
|
||||||
|
rx_mon_stats->mpdus_buf_to_stack);
|
||||||
|
DP_PRINT_STATS("frag_alloc = %d",
|
||||||
|
mon_soc->stats.frag_alloc);
|
||||||
|
DP_PRINT_STATS("frag_free = %d",
|
||||||
|
mon_soc->stats.frag_free);
|
||||||
|
DP_PRINT_STATS("status_buf_count = %d",
|
||||||
|
rx_mon_stats->status_buf_count);
|
||||||
|
DP_PRINT_STATS("pkt_buf_count = %d",
|
||||||
|
rx_mon_stats->pkt_buf_count);
|
||||||
|
DP_PRINT_STATS("rx_mon_queue_depth= %d",
|
||||||
|
mon_pdev_be->rx_mon_queue_depth);
|
||||||
|
}
|
||||||
|
@@ -19,11 +19,16 @@
|
|||||||
#define _DP_RX_MON_2_0_H_
|
#define _DP_RX_MON_2_0_H_
|
||||||
|
|
||||||
#include <qdf_nbuf_frag.h>
|
#include <qdf_nbuf_frag.h>
|
||||||
|
#include <qdf_flex_mem.h>
|
||||||
|
#include <dp_mon_2.0.h>
|
||||||
#include <hal_be_api_mon.h>
|
#include <hal_be_api_mon.h>
|
||||||
|
|
||||||
#define DP_RX_MON_PACKET_OFFSET 8
|
#define DP_RX_MON_PACKET_OFFSET 8
|
||||||
#define DP_RX_MON_RX_HDR_OFFSET 8
|
#define DP_RX_MON_RX_HDR_OFFSET 8
|
||||||
#define DP_GET_NUM_QWORDS(num) ((num) >> 3)
|
#define DP_GET_NUM_QWORDS(num) ((num) >> 3)
|
||||||
|
#define DP_RX_MON_WQ_THRESHOLD 128
|
||||||
|
#define DP_RXMON_PPDU_INFO_SEG_MAX (DP_RX_MON_WQ_THRESHOLD / QDF_FM_BITMAP_BITS)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* dp_rx_mon_buffers_alloc() - allocate rx monitor buffers
|
* dp_rx_mon_buffers_alloc() - allocate rx monitor buffers
|
||||||
* @soc: DP soc handle
|
* @soc: DP soc handle
|
||||||
@@ -200,4 +205,29 @@ dp_mon_rx_stats_update_rssi_dbm_params_2_0(struct dp_soc *soc,
|
|||||||
* Return: Void
|
* Return: Void
|
||||||
*/
|
*/
|
||||||
void dp_rx_mon_drain_wq(struct dp_pdev *pdev);
|
void dp_rx_mon_drain_wq(struct dp_pdev *pdev);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* dp_rx_mon_ppdu_info_pool_init() - PPDU info pool init
|
||||||
|
*
|
||||||
|
* Return: void
|
||||||
|
*/
|
||||||
|
void dp_rx_mon_ppdu_info_pool_init(struct dp_mon_pdev *mon_pdev);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* dp_rx_mon_ppdu_info_pool_deinit() - PPDU info pool deinit
|
||||||
|
*
|
||||||
|
* Return: void
|
||||||
|
*/
|
||||||
|
void dp_rx_mon_ppdu_info_pool_deinit(struct dp_mon_pdev_be *mon_pdev_be);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* dp_mon_rx_print_advanced_stats_2_0 () - print advanced monitor statistics
|
||||||
|
*
|
||||||
|
* @soc: DP soc handle
|
||||||
|
* @pdev: DP pdev handle
|
||||||
|
*
|
||||||
|
* Return: void
|
||||||
|
*/
|
||||||
|
void dp_mon_rx_print_advanced_stats_2_0(struct dp_soc *soc,
|
||||||
|
struct dp_pdev *pdev);
|
||||||
#endif /* _DP_RX_MON_2_0_H_ */
|
#endif /* _DP_RX_MON_2_0_H_ */
|
||||||
|
@@ -827,7 +827,6 @@ dp_print_pdev_rx_mon_stats(struct dp_pdev *pdev)
|
|||||||
uint32_t *dest_ring_ppdu_ids;
|
uint32_t *dest_ring_ppdu_ids;
|
||||||
int i, idx;
|
int i, idx;
|
||||||
struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
|
struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
|
||||||
struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc;
|
|
||||||
|
|
||||||
rx_mon_stats = &mon_pdev->rx_mon_stats;
|
rx_mon_stats = &mon_pdev->rx_mon_stats;
|
||||||
|
|
||||||
@@ -903,24 +902,8 @@ dp_print_pdev_rx_mon_stats(struct dp_pdev *pdev)
|
|||||||
qdf_mem_free(dest_ring_ppdu_ids);
|
qdf_mem_free(dest_ring_ppdu_ids);
|
||||||
DP_PRINT_STATS("mon_rx_dest_stuck = %d",
|
DP_PRINT_STATS("mon_rx_dest_stuck = %d",
|
||||||
rx_mon_stats->mon_rx_dest_stuck);
|
rx_mon_stats->mon_rx_dest_stuck);
|
||||||
|
|
||||||
DP_PRINT_STATS("rx_hdr_not_received = %d",
|
|
||||||
rx_mon_stats->rx_hdr_not_received);
|
|
||||||
DP_PRINT_STATS("parent_buf_alloc = %d",
|
|
||||||
rx_mon_stats->parent_buf_alloc);
|
|
||||||
DP_PRINT_STATS("parent_buf_free = %d",
|
|
||||||
rx_mon_stats->parent_buf_free);
|
|
||||||
DP_PRINT_STATS("mpdus_buf_to_stack = %d",
|
|
||||||
rx_mon_stats->mpdus_buf_to_stack);
|
|
||||||
DP_PRINT_STATS("frag_alloc = %d",
|
|
||||||
mon_soc->stats.frag_alloc);
|
|
||||||
DP_PRINT_STATS("frag_free = %d",
|
|
||||||
mon_soc->stats.frag_free);
|
|
||||||
DP_PRINT_STATS("status_buf_count = %d",
|
|
||||||
rx_mon_stats->status_buf_count);
|
|
||||||
DP_PRINT_STATS("pkt_buf_count = %d",
|
|
||||||
rx_mon_stats->pkt_buf_count);
|
|
||||||
dp_pdev_get_undecoded_capture_stats(mon_pdev, rx_mon_stats);
|
dp_pdev_get_undecoded_capture_stats(mon_pdev, rx_mon_stats);
|
||||||
|
dp_mon_rx_print_advanced_stats(pdev->soc, pdev);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef QCA_SUPPORT_BPR
|
#ifdef QCA_SUPPORT_BPR
|
||||||
|
@@ -783,6 +783,9 @@ struct dp_mon_ops {
|
|||||||
void (*mon_lite_mon_disable_rx)(struct dp_pdev *pdev);
|
void (*mon_lite_mon_disable_rx)(struct dp_pdev *pdev);
|
||||||
void (*mon_rx_stats_update_rssi_dbm_params)
|
void (*mon_rx_stats_update_rssi_dbm_params)
|
||||||
(struct dp_soc *soc, struct dp_mon_pdev *mon_pdev);
|
(struct dp_soc *soc, struct dp_mon_pdev *mon_pdev);
|
||||||
|
/* Print advanced monitor stats */
|
||||||
|
void (*mon_rx_print_advanced_stats)
|
||||||
|
(struct dp_soc *soc, struct dp_pdev *pdev);
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -3786,6 +3789,35 @@ dp_mon_rx_stats_update_rssi_dbm_params(struct dp_soc *soc,
|
|||||||
monitor_ops->mon_rx_stats_update_rssi_dbm_params(soc, mon_pdev);
|
monitor_ops->mon_rx_stats_update_rssi_dbm_params(soc, mon_pdev);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* dp_mon_rx_print_advanced_stats () - print advanced monitor stats
|
||||||
|
*
|
||||||
|
* @soc: DP soc handle
|
||||||
|
* @pdev: DP pdev handle
|
||||||
|
*
|
||||||
|
* Return: void
|
||||||
|
*/
|
||||||
|
static inline void
|
||||||
|
dp_mon_rx_print_advanced_stats(struct dp_soc *soc,
|
||||||
|
struct dp_pdev *pdev)
|
||||||
|
{
|
||||||
|
struct dp_mon_soc *mon_soc = soc->monitor_soc;
|
||||||
|
struct dp_mon_ops *monitor_ops;
|
||||||
|
|
||||||
|
if (!mon_soc) {
|
||||||
|
dp_mon_debug("mon soc is NULL");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
monitor_ops = mon_soc->mon_ops;
|
||||||
|
if (!monitor_ops ||
|
||||||
|
!monitor_ops->mon_rx_print_advanced_stats) {
|
||||||
|
dp_mon_debug("callback not registered");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
return monitor_ops->mon_rx_print_advanced_stats(soc, pdev);
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef QCA_ENHANCED_STATS_SUPPORT
|
#ifdef QCA_ENHANCED_STATS_SUPPORT
|
||||||
QDF_STATUS dp_peer_qos_stats_notify(struct dp_pdev *dp_pdev,
|
QDF_STATUS dp_peer_qos_stats_notify(struct dp_pdev *dp_pdev,
|
||||||
struct cdp_rx_stats_ppdu_user *ppdu_user);
|
struct cdp_rx_stats_ppdu_user *ppdu_user);
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
|
* Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
|
||||||
|
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||||
*
|
*
|
||||||
* Permission to use, copy, modify, and/or distribute this software for
|
* Permission to use, copy, modify, and/or distribute this software for
|
||||||
* any purpose with or without fee is hereby granted, provided that the
|
* any purpose with or without fee is hereby granted, provided that the
|
||||||
@@ -51,7 +52,7 @@ struct qdf_flex_mem_pool {
|
|||||||
qdf_list_t seg_list;
|
qdf_list_t seg_list;
|
||||||
struct qdf_spinlock lock;
|
struct qdf_spinlock lock;
|
||||||
uint16_t reduction_limit;
|
uint16_t reduction_limit;
|
||||||
uint16_t item_size;
|
uint32_t item_size;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Reference in New Issue
Block a user