diff --git a/dp/wifi3.0/monitor/2.0/dp_mon_filter_2.0.c b/dp/wifi3.0/monitor/2.0/dp_mon_filter_2.0.c index eccea12440..85b2088a0a 100644 --- a/dp/wifi3.0/monitor/2.0/dp_mon_filter_2.0.c +++ b/dp/wifi3.0/monitor/2.0/dp_mon_filter_2.0.c @@ -3119,6 +3119,7 @@ dp_mon_filter_reset_tx_lite_mon(struct dp_mon_pdev_be *be_mon_pdev) if (!config) return; config->subtype_filtering = false; + config->sw_peer_filtering = false; } diff --git a/dp/wifi3.0/monitor/2.0/dp_tx_mon_2.0.c b/dp/wifi3.0/monitor/2.0/dp_tx_mon_2.0.c index 5ea4abf4f1..f9880118d7 100644 --- a/dp/wifi3.0/monitor/2.0/dp_tx_mon_2.0.c +++ b/dp/wifi3.0/monitor/2.0/dp_tx_mon_2.0.c @@ -728,8 +728,10 @@ dp_lite_mon_filter_peer(struct dp_lite_mon_tx_config *config, { struct dp_lite_mon_peer *peer; - /* Return here if peer filtering is not required */ - if (!config->tx_config.peer_count) + /* Return here if sw peer filtering is not required or if peer count + * is zero + */ + if (!config->sw_peer_filtering || !config->tx_config.peer_count) return QDF_STATUS_SUCCESS; TAILQ_FOREACH(peer, &config->tx_config.peer_list, peer_list_elem) { @@ -806,7 +808,8 @@ dp_lite_mon_filter_peer_subtype(struct dp_lite_mon_tx_config *config, QDF_STATUS ret; /* Return here if subtype and peer filtering is not required */ - if (!config->subtype_filtering && !config->tx_config.peer_count) + if (!config->subtype_filtering && !config->sw_peer_filtering && + !config->tx_config.peer_count) return QDF_STATUS_SUCCESS; if (dp_tx_mon_nbuf_get_num_frag(buf)) { diff --git a/wlan_cfg/cfg_dp.h b/wlan_cfg/cfg_dp.h index 06aa57a7e0..1f8e86b552 100644 --- a/wlan_cfg/cfg_dp.h +++ b/wlan_cfg/cfg_dp.h @@ -1267,6 +1267,10 @@ CFG_INI_BOOL("dp_handle_invalid_decap_type_disable", false, \ "Enable/Disable DP TLV out of order WAR") +#define CFG_DP_TXMON_SW_PEER_FILTERING \ + CFG_INI_BOOL("tx_litemon_sw_peer_filtering", false, \ + "Enable SW based tx monitor peer fitlering") + /* * * dp_rx_fisa_enable - Control Rx datapath FISA @@ -1876,5 +1880,6 @@ CFG(CFG_DP_NAPI_SCALE_FACTOR) \ CFG(CFG_DP_HOST_AST_DB_ENABLE) \ CFG_DP_SAWF_STATS_CONFIG \ - CFG(CFG_DP_HANDLE_INVALID_DECAP_TYPE_DISABLE) + CFG(CFG_DP_HANDLE_INVALID_DECAP_TYPE_DISABLE) \ + CFG(CFG_DP_TXMON_SW_PEER_FILTERING) #endif /* _CFG_DP_H_ */ diff --git a/wlan_cfg/wlan_cfg.c b/wlan_cfg/wlan_cfg.c index d2f2f8cf2b..db4ef1202d 100644 --- a/wlan_cfg/wlan_cfg.c +++ b/wlan_cfg/wlan_cfg.c @@ -2946,6 +2946,8 @@ wlan_cfg_soc_attach(struct cdp_ctrl_objmgr_psoc *psoc) wlan_soc_sawf_stats_cfg_attach(psoc, wlan_cfg_ctx); wlan_cfg_ctx->is_handle_invalid_decap_type_disabled = cfg_get(psoc, CFG_DP_HANDLE_INVALID_DECAP_TYPE_DISABLE); + wlan_cfg_ctx->txmon_sw_peer_filtering = + cfg_get(psoc, CFG_DP_TXMON_SW_PEER_FILTERING); return wlan_cfg_ctx; } @@ -4236,3 +4238,10 @@ uint8_t wlan_cfg_get_napi_scale_factor(struct wlan_cfg_dp_soc_ctxt *cfg) { return cfg->napi_scale_factor; } + +bool wlan_cfg_get_txmon_sw_peer_filtering(struct wlan_cfg_dp_soc_ctxt *cfg) +{ + return cfg->txmon_sw_peer_filtering; +} + +qdf_export_symbol(wlan_cfg_get_txmon_sw_peer_filtering); diff --git a/wlan_cfg/wlan_cfg.h b/wlan_cfg/wlan_cfg.h index 0d9ccfa53c..fc9c56ccef 100644 --- a/wlan_cfg/wlan_cfg.h +++ b/wlan_cfg/wlan_cfg.h @@ -440,6 +440,7 @@ struct wlan_cfg_dp_soc_ctxt { #endif uint8_t num_rxdma_dst_rings_per_pdev; bool txmon_hw_support; + bool txmon_sw_peer_filtering; uint8_t num_rxdma_status_rings_per_pdev; #ifdef WLAN_TX_PKT_CAPTURE_ENH uint32_t tx_capt_max_mem_allowed; @@ -2253,6 +2254,10 @@ void wlan_cfg_set_txmon_hw_support(struct wlan_cfg_dp_soc_ctxt *cfg, */ bool wlan_cfg_get_txmon_hw_support(struct wlan_cfg_dp_soc_ctxt *cfg); +void wlan_cfg_set_txmon_sw_peer_filtering(struct wlan_cfg_dp_soc_ctxt *cfg, + bool txmon_sw_peer_filtering); +bool wlan_cfg_get_txmon_sw_peer_filtering(struct wlan_cfg_dp_soc_ctxt *cfg); + #ifdef WLAN_TX_PKT_CAPTURE_ENH /* * wlan_cfg_get_tx_capt_max_mem - Get max memory allowed for TX capture feature