diff --git a/dp/wifi3.0/dp_htt.c b/dp/wifi3.0/dp_htt.c index 9c755e02d0..fb1a731ce2 100644 --- a/dp/wifi3.0/dp_htt.c +++ b/dp/wifi3.0/dp_htt.c @@ -1086,6 +1086,7 @@ int htt_h2t_rx_ring_cfg(struct htt_soc *htt_soc, int pdev_id, dp_mon_rx_packet_length_set(soc->dp_soc, msg_word, htt_tlv_filter); dp_mon_rx_hdr_length_set(soc->dp_soc, msg_word, htt_tlv_filter); + dp_mon_rx_mac_filter_set(soc->dp_soc, msg_word, htt_tlv_filter); /* word 2 */ msg_word++; diff --git a/dp/wifi3.0/dp_internal.h b/dp/wifi3.0/dp_internal.h index acbbe7e39a..2f660d5e1f 100644 --- a/dp/wifi3.0/dp_internal.h +++ b/dp/wifi3.0/dp_internal.h @@ -947,6 +947,12 @@ dp_mon_rx_wmask_subscribe(struct dp_soc *soc, uint32_t *msg_word, { } +static inline void +dp_mon_rx_mac_filter_set(struct dp_soc *soc, uint32_t *msg_word, + struct htt_rx_ring_tlv_filter *tlv_filter) +{ +} + #ifdef WLAN_TELEMETRY_STATS_SUPPORT static inline void dp_monitor_peer_telemetry_stats(struct dp_peer *peer, diff --git a/dp/wifi3.0/monitor/1.0/dp_mon_1.0.c b/dp/wifi3.0/monitor/1.0/dp_mon_1.0.c index 66c87eb293..c7f2f86d07 100644 --- a/dp/wifi3.0/monitor/1.0/dp_mon_1.0.c +++ b/dp/wifi3.0/monitor/1.0/dp_mon_1.0.c @@ -1223,6 +1223,7 @@ dp_mon_register_feature_ops_1_0(struct dp_soc *soc) dp_mon_filter_reset_undecoded_metadata_capture_1_0; #endif mon_ops->mon_rx_print_advanced_stats = NULL; + mon_ops->mon_mac_filter_set = dp_mon_mac_filter_set; } struct dp_mon_ops monitor_ops_1_0 = { diff --git a/dp/wifi3.0/monitor/1.0/dp_mon_filter_1.0.c b/dp/wifi3.0/monitor/1.0/dp_mon_filter_1.0.c index c6c8402b9a..fc8157a598 100644 --- a/dp/wifi3.0/monitor/1.0/dp_mon_filter_1.0.c +++ b/dp/wifi3.0/monitor/1.0/dp_mon_filter_1.0.c @@ -1059,6 +1059,20 @@ QDF_STATUS dp_mon_filter_update_1_0(struct dp_pdev *pdev) return status; } +#ifdef QCA_MAC_FILTER_FW_SUPPORT +void dp_mon_mac_filter_set(uint32_t *msg_word, + struct htt_rx_ring_tlv_filter *tlv_filter) +{ + if (!msg_word || !tlv_filter) + return; + + if (tlv_filter->enable_mon_mac_filter > 0) + HTT_RX_RING_SELECTION_CFG_RXPCU_FILTER_SET(*msg_word, 1); + else + HTT_RX_RING_SELECTION_CFG_RXPCU_FILTER_SET(*msg_word, 0); +} +#endif + #if defined(WLAN_CFR_ENABLE) && defined(WLAN_ENH_CFR_ENABLE) /* * dp_cfr_filter_1_0() - Configure HOST RX monitor status ring for CFR diff --git a/dp/wifi3.0/monitor/1.0/dp_mon_filter_1.0.h b/dp/wifi3.0/monitor/1.0/dp_mon_filter_1.0.h index f39ecf09e3..4afe3b9155 100644 --- a/dp/wifi3.0/monitor/1.0/dp_mon_filter_1.0.h +++ b/dp/wifi3.0/monitor/1.0/dp_mon_filter_1.0.h @@ -216,4 +216,20 @@ static inline void dp_mon_filter_reset_rx_pktlog_cbf_1_0(struct dp_pdev *pdev) QDF_STATUS dp_mon_filter_update_1_0(struct dp_pdev *pdev); +#ifdef QCA_MAC_FILTER_FW_SUPPORT +/** + * dp_mon_mac_filter_set() - Setup rx monitor mac filter feature + * @msg_word: msg word + * @htt_tlv_filter: rx ring filter configuration + */ +void dp_mon_mac_filter_set(uint32_t *msg_word, + struct htt_rx_ring_tlv_filter *tlv_filter); +#else +static inline +void dp_mon_mac_filter_set(uint32_t *msg_word, + struct htt_rx_ring_tlv_filter *tlv_filter) +{ +} +#endif + #endif /* _DP_MON_FILTER_1_0_H_ */ diff --git a/dp/wifi3.0/monitor/2.0/dp_mon_2.0.c b/dp/wifi3.0/monitor/2.0/dp_mon_2.0.c index 78ab18210b..fae61a4353 100644 --- a/dp/wifi3.0/monitor/2.0/dp_mon_2.0.c +++ b/dp/wifi3.0/monitor/2.0/dp_mon_2.0.c @@ -1438,6 +1438,7 @@ dp_mon_register_feature_ops_2_0(struct dp_soc *soc) mon_ops->rx_enable_fpmo = dp_rx_mon_enable_fpmo; mon_ops->mon_rx_print_advanced_stats = dp_mon_rx_print_advanced_stats_2_0; + mon_ops->mon_mac_filter_set = NULL; } struct dp_mon_ops monitor_ops_2_0 = { diff --git a/dp/wifi3.0/monitor/dp_mon.c b/dp/wifi3.0/monitor/dp_mon.c index d9fb86b885..8e885ee251 100644 --- a/dp/wifi3.0/monitor/dp_mon.c +++ b/dp/wifi3.0/monitor/dp_mon.c @@ -5976,8 +5976,6 @@ void dp_mon_cdp_ops_register(struct dp_soc *soc) if (target_type == TARGET_TYPE_QCN9000) ops->ctrl_ops->txrx_update_mon_mac_filter = dp_update_mon_mac_filter; - else - ops->ctrl_ops->txrx_update_mon_mac_filter = NULL; break; case TARGET_TYPE_QCN9224: case TARGET_TYPE_QCA5332: @@ -5997,7 +5995,6 @@ void dp_mon_cdp_ops_register(struct dp_soc *soc) dp_cfr_filter_register_2_0(ops); #endif #endif /* QCA_MONITOR_2_0_SUPPORT */ - ops->ctrl_ops->txrx_update_mon_mac_filter = NULL; break; default: dp_mon_err("%s: Unknown tgt type %d", __func__, target_type); diff --git a/dp/wifi3.0/monitor/dp_mon.h b/dp/wifi3.0/monitor/dp_mon.h index 91753d65d0..28b87eaab3 100644 --- a/dp/wifi3.0/monitor/dp_mon.h +++ b/dp/wifi3.0/monitor/dp_mon.h @@ -827,6 +827,8 @@ struct dp_mon_ops { (struct dp_soc *soc, struct dp_pdev *pdev); QDF_STATUS (*mon_rx_ppdu_info_cache_create)(struct dp_pdev *pdev); void (*mon_rx_ppdu_info_cache_destroy)(struct dp_pdev *pdev); + void (*mon_mac_filter_set)(uint32_t *msg_word, + struct htt_rx_ring_tlv_filter *tlv_filter); }; /** @@ -3881,6 +3883,27 @@ dp_rx_mon_enable(struct dp_soc *soc, uint32_t *msg_word, monitor_ops->rx_mon_enable(msg_word, tlv_filter); } +static inline void +dp_mon_rx_mac_filter_set(struct dp_soc *soc, uint32_t *msg_word, + struct htt_rx_ring_tlv_filter *tlv_filter) +{ + 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_mac_filter_set) { + dp_mon_debug("callback not registered"); + return; + } + + monitor_ops->mon_mac_filter_set(msg_word, tlv_filter); +} + #ifdef QCA_ENHANCED_STATS_SUPPORT QDF_STATUS dp_peer_qos_stats_notify(struct dp_pdev *dp_pdev, struct cdp_rx_stats_ppdu_user *ppdu_user); diff --git a/dp/wifi3.0/monitor/dp_mon_filter.c b/dp/wifi3.0/monitor/dp_mon_filter.c index 2f7ca1b0d2..c568434185 100644 --- a/dp/wifi3.0/monitor/dp_mon_filter.c +++ b/dp/wifi3.0/monitor/dp_mon_filter.c @@ -104,6 +104,8 @@ void dp_mon_filter_show_filter(struct dp_mon_pdev *mon_pdev, DP_MON_FILTER_PRINT("phy_err_mask_cont: 0x%x", tlv_filter->phy_err_mask_cont); #endif + DP_MON_FILTER_PRINT("mon_mac_filter: %d", + tlv_filter->enable_mon_mac_filter); } #ifdef QCA_UNDECODED_METADATA_SUPPORT @@ -260,6 +262,8 @@ void dp_mon_filter_h2t_setup(struct dp_soc *soc, struct dp_pdev *pdev, DP_MON_FILTER_SET(tlv_filter, FILTER_MD_CTRL, dst_filter); dp_mon_set_fp_phy_err_filter(tlv_filter, mon_filter); + tlv_filter->enable_mon_mac_filter = + mon_filter->tlv_filter.enable_mon_mac_filter; } dp_mon_filter_show_filter(mon_pdev, 0, filter);