Jelajahi Sumber

qcacmn: Enable monitor mac filter for special vap

Add change to enable mac based filter for monitor special vap.

Change-Id: Ib189071443d5a98a84d160e7043e9bc4faf189c5
CRs-Fixed: 3317599
Santosh Anbu 2 tahun lalu
induk
melakukan
c6fd7ded28

+ 1 - 0
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++;

+ 6 - 0
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,

+ 1 - 0
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 = {

+ 14 - 0
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

+ 16 - 0
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_ */

+ 1 - 0
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 = {

+ 0 - 3
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);

+ 23 - 0
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);

+ 4 - 0
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);