瀏覽代碼

qcacmn: Add RxMON filter config support

Add RxMON filter config support for WKK

Change-Id: I2f2972d1bc6f6d0b5c8db69bdf21b22854f35fa4
Amir Patel 3 年之前
父節點
當前提交
76c23ddc4b

+ 0 - 198
dp/wifi3.0/monitor/1.0/dp_mon_filter_1.0.c

@@ -27,204 +27,6 @@
 #include <dp_rx_mon_1.0.h>
 #include <dp_mon_filter_1.0.h>
 
-/**
- * dp_mon_filter_mode_type_to_str
- *  Monitor Filter mode to string
- */
-int8_t *dp_mon_filter_mode_type_to_str[DP_MON_FILTER_MAX_MODE] = {
-#ifdef QCA_ENHANCED_STATS_SUPPORT
-	"DP MON FILTER ENHACHED STATS MODE",
-#endif /* QCA_ENHANCED_STATS_SUPPORT */
-#ifdef QCA_MCOPY_SUPPORT
-	"DP MON FILTER MCOPY MODE",
-#endif /* QCA_MCOPY_SUPPORT */
-#if defined(ATH_SUPPORT_NAC_RSSI) || defined(ATH_SUPPORT_NAC)
-	"DP MON FILTER SMART MONITOR MODE",
-#endif /* ATH_SUPPORT_NAC_RSSI || ATH_SUPPORT_NAC */
-	"DP_MON FILTER MONITOR MODE",
-#ifdef WLAN_RX_PKT_CAPTURE_ENH
-	"DP MON FILTER RX CAPTURE MODE",
-#endif /* WLAN_RX_PKT_CAPTURE_ENH */
-#ifdef WDI_EVENT_ENABLE
-	"DP MON FILTER PKT LOG FULL MODE",
-	"DP MON FILTER PKT LOG LITE MODE",
-	"DP MON FILTER PKT LOG CBF MODE",
-#ifdef QCA_WIFI_QCN9224
-	"DP MON FILTER PKT LOG HYBRID MODE",
-#endif
-#endif /* WDI_EVENT_ENABLE */
-};
-
-void dp_mon_filter_show_filter(struct dp_mon_pdev *mon_pdev,
-			       enum dp_mon_filter_mode mode,
-			       struct dp_mon_filter *filter)
-{
-	struct htt_rx_ring_tlv_filter *tlv_filter = &filter->tlv_filter;
-
-	DP_MON_FILTER_PRINT("[%s]: Valid: %d",
-			    dp_mon_filter_mode_type_to_str[mode],
-			    filter->valid);
-	DP_MON_FILTER_PRINT("mpdu_start: %d", tlv_filter->mpdu_start);
-	DP_MON_FILTER_PRINT("msdu_start: %d", tlv_filter->msdu_start);
-	DP_MON_FILTER_PRINT("packet: %d", tlv_filter->packet);
-	DP_MON_FILTER_PRINT("msdu_end: %d", tlv_filter->msdu_end);
-	DP_MON_FILTER_PRINT("mpdu_end: %d", tlv_filter->mpdu_end);
-	DP_MON_FILTER_PRINT("packet_header: %d",
-			    tlv_filter->packet_header);
-	DP_MON_FILTER_PRINT("attention: %d", tlv_filter->attention);
-	DP_MON_FILTER_PRINT("ppdu_start: %d", tlv_filter->ppdu_start);
-	DP_MON_FILTER_PRINT("ppdu_end: %d", tlv_filter->ppdu_end);
-	DP_MON_FILTER_PRINT("ppdu_end_user_stats: %d",
-			    tlv_filter->ppdu_end_user_stats);
-	DP_MON_FILTER_PRINT("ppdu_end_user_stats_ext: %d",
-			    tlv_filter->ppdu_end_user_stats_ext);
-	DP_MON_FILTER_PRINT("ppdu_end_status_done: %d",
-			    tlv_filter->ppdu_end_status_done);
-	DP_MON_FILTER_PRINT("header_per_msdu: %d", tlv_filter->header_per_msdu);
-	DP_MON_FILTER_PRINT("enable_fp: %d", tlv_filter->enable_fp);
-	DP_MON_FILTER_PRINT("enable_md: %d", tlv_filter->enable_md);
-	DP_MON_FILTER_PRINT("enable_mo: %d", tlv_filter->enable_mo);
-	DP_MON_FILTER_PRINT("fp_mgmt_filter: 0x%x", tlv_filter->fp_mgmt_filter);
-	DP_MON_FILTER_PRINT("mo_mgmt_filter: 0x%x", tlv_filter->mo_mgmt_filter);
-	DP_MON_FILTER_PRINT("fp_ctrl_filter: 0x%x", tlv_filter->fp_ctrl_filter);
-	DP_MON_FILTER_PRINT("mo_ctrl_filter: 0x%x", tlv_filter->mo_ctrl_filter);
-	DP_MON_FILTER_PRINT("fp_data_filter: 0x%x", tlv_filter->fp_data_filter);
-	DP_MON_FILTER_PRINT("mo_data_filter: 0x%x", tlv_filter->mo_data_filter);
-	DP_MON_FILTER_PRINT("md_data_filter: 0x%x", tlv_filter->md_data_filter);
-	DP_MON_FILTER_PRINT("md_mgmt_filter: 0x%x", tlv_filter->md_mgmt_filter);
-	DP_MON_FILTER_PRINT("md_ctrl_filter: 0x%x", tlv_filter->md_ctrl_filter);
-}
-
-/**
- * dp_mon_filter_h2t_setup() - Setup the filter for the Target setup
- * @soc: DP soc handle
- * @pdev: DP pdev handle
- * @srng_type: The srng type for which filter wll be set
- * @tlv_filter: tlv filter
- */
-static void dp_mon_filter_h2t_setup(struct dp_soc *soc, struct dp_pdev *pdev,
-				    enum dp_mon_filter_srng_type srng_type,
-				    struct dp_mon_filter *filter)
-{
-	int32_t current_mode = 0;
-	struct htt_rx_ring_tlv_filter *tlv_filter = &filter->tlv_filter;
-	struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
-
-	/*
-	 * Loop through all the modes.
-	 */
-	for (current_mode = 0; current_mode < DP_MON_FILTER_MAX_MODE;
-						current_mode++) {
-		struct dp_mon_filter *mon_filter =
-			&mon_pdev->filter[current_mode][srng_type];
-		uint32_t src_filter = 0, dst_filter = 0;
-
-		/*
-		 * Check if the correct mode is enabled or not.
-		 */
-		if (!mon_filter->valid)
-			continue;
-
-		filter->valid = true;
-
-		/*
-		 * Set the super bit fields
-		 */
-		src_filter =
-			DP_MON_FILTER_GET(&mon_filter->tlv_filter, FILTER_TLV);
-		dst_filter = DP_MON_FILTER_GET(tlv_filter, FILTER_TLV);
-		dst_filter |= src_filter;
-		DP_MON_FILTER_SET(tlv_filter, FILTER_TLV, dst_filter);
-
-		/*
-		 * Set the filter management filter.
-		 */
-		src_filter = DP_MON_FILTER_GET(&mon_filter->tlv_filter,
-					       FILTER_FP_MGMT);
-		dst_filter = DP_MON_FILTER_GET(tlv_filter, FILTER_FP_MGMT);
-		dst_filter |= src_filter;
-		DP_MON_FILTER_SET(tlv_filter, FILTER_FP_MGMT, dst_filter);
-
-		/*
-		 * Set the monitor other management filter.
-		 */
-		src_filter = DP_MON_FILTER_GET(&mon_filter->tlv_filter,
-					       FILTER_MO_MGMT);
-		dst_filter = DP_MON_FILTER_GET(tlv_filter, FILTER_MO_MGMT);
-		dst_filter |= src_filter;
-		DP_MON_FILTER_SET(tlv_filter, FILTER_MO_MGMT, dst_filter);
-
-		/*
-		 * Set the filter pass control filter.
-		 */
-		src_filter = DP_MON_FILTER_GET(&mon_filter->tlv_filter,
-					       FILTER_FP_CTRL);
-		dst_filter = DP_MON_FILTER_GET(tlv_filter, FILTER_FP_CTRL);
-		dst_filter |= src_filter;
-		DP_MON_FILTER_SET(tlv_filter, FILTER_FP_CTRL, dst_filter);
-
-		/*
-		 * Set the monitor other control filter.
-		 */
-		src_filter = DP_MON_FILTER_GET(&mon_filter->tlv_filter,
-					       FILTER_MO_CTRL);
-		dst_filter = DP_MON_FILTER_GET(tlv_filter, FILTER_MO_CTRL);
-		dst_filter |= src_filter;
-		DP_MON_FILTER_SET(tlv_filter, FILTER_MO_CTRL, dst_filter);
-
-		/*
-		 * Set the filter pass data filter.
-		 */
-		src_filter = DP_MON_FILTER_GET(&mon_filter->tlv_filter,
-					       FILTER_FP_DATA);
-		dst_filter = DP_MON_FILTER_GET(tlv_filter,
-					       FILTER_FP_DATA);
-		dst_filter |= src_filter;
-		DP_MON_FILTER_SET(tlv_filter,
-				  FILTER_FP_DATA, dst_filter);
-
-		/*
-		 * Set the monitor other data filter.
-		 */
-		src_filter = DP_MON_FILTER_GET(&mon_filter->tlv_filter,
-					       FILTER_MO_DATA);
-		dst_filter = DP_MON_FILTER_GET(tlv_filter, FILTER_MO_DATA);
-		dst_filter |= src_filter;
-		DP_MON_FILTER_SET(tlv_filter, FILTER_MO_DATA, dst_filter);
-
-		/*
-		 * Set the monitor direct data filter.
-		 */
-		src_filter = DP_MON_FILTER_GET(&mon_filter->tlv_filter,
-					       FILTER_MD_DATA);
-		dst_filter = DP_MON_FILTER_GET(tlv_filter,
-					       FILTER_MD_DATA);
-		dst_filter |= src_filter;
-		DP_MON_FILTER_SET(tlv_filter,
-				  FILTER_MD_DATA, dst_filter);
-
-		/*
-		 * Set the monitor direct management filter.
-		 */
-		src_filter = DP_MON_FILTER_GET(&mon_filter->tlv_filter,
-					       FILTER_MD_MGMT);
-		dst_filter = DP_MON_FILTER_GET(tlv_filter, FILTER_MD_MGMT);
-		dst_filter |= src_filter;
-		DP_MON_FILTER_SET(tlv_filter, FILTER_MD_MGMT, dst_filter);
-
-		/*
-		 * Set the monitor direct management filter.
-		 */
-		src_filter = DP_MON_FILTER_GET(&mon_filter->tlv_filter,
-					       FILTER_MD_CTRL);
-		dst_filter = DP_MON_FILTER_GET(tlv_filter, FILTER_MD_CTRL);
-		dst_filter |= src_filter;
-		DP_MON_FILTER_SET(tlv_filter, FILTER_MD_CTRL, dst_filter);
-	}
-
-	dp_mon_filter_show_filter(mon_pdev, 0, filter);
-}
-
 #if defined(QCA_MCOPY_SUPPORT) || defined(ATH_SUPPORT_NAC_RSSI) \
 	|| defined(ATH_SUPPORT_NAC) || defined(WLAN_RX_PKT_CAPTURE_ENH)
 /**

+ 0 - 44
dp/wifi3.0/monitor/1.0/dp_mon_filter_1.0.h

@@ -17,50 +17,6 @@
 #ifndef _DP_MON_FILTER_1_0_H_
 #define _DP_MON_FILTER_1_0_H_
 
-/**
- * Accessor Macros to access the software
- * defined HTT filter htt_rx_ring_tlv_filter.
- */
-#define DP_MON_FILTER_TLV_OFFSET                      0x00000000
-#define DP_MON_FILTER_TLV_MASK                        0xffffffff
-#define DP_MON_FILTER_TLV_LSB                         0
-
-#define DP_MON_FILTER_FP_MGMT_OFFSET                  0x00000004
-#define DP_MON_FILTER_FP_MGMT_MASK                    0x0000ffff
-#define DP_MON_FILTER_FP_MGMT_LSB                     0
-
-#define DP_MON_FILTER_MO_MGMT_OFFSET                  0x00000004
-#define DP_MON_FILTER_MO_MGMT_MASK                    0xffff0000
-#define DP_MON_FILTER_MO_MGMT_LSB                     16
-
-#define DP_MON_FILTER_FP_CTRL_OFFSET                  0x00000008
-#define DP_MON_FILTER_FP_CTRL_MASK                    0x0000ffff
-#define DP_MON_FILTER_FP_CTRL_LSB                     0
-
-#define DP_MON_FILTER_MO_CTRL_OFFSET                  0x00000008
-#define DP_MON_FILTER_MO_CTRL_MASK                    0xffff0000
-#define DP_MON_FILTER_MO_CTRL_LSB                     16
-
-#define DP_MON_FILTER_FP_DATA_OFFSET                  0x0000000c
-#define DP_MON_FILTER_FP_DATA_MASK                    0x0000ffff
-#define DP_MON_FILTER_FP_DATA_LSB                     0
-
-#define DP_MON_FILTER_MO_DATA_OFFSET                  0x0000000c
-#define DP_MON_FILTER_MO_DATA_MASK                    0xffff0000
-#define DP_MON_FILTER_MO_DATA_LSB                     16
-
-#define DP_MON_FILTER_MD_DATA_OFFSET                  0x00000010
-#define DP_MON_FILTER_MD_DATA_MASK                    0x0000ffff
-#define DP_MON_FILTER_MD_DATA_LSB                     0
-
-#define DP_MON_FILTER_MD_MGMT_OFFSET                  0x00000010
-#define DP_MON_FILTER_MD_MGMT_MASK                    0xffff0000
-#define DP_MON_FILTER_MD_MGMT_LSB                     16
-
-#define DP_MON_FILTER_MD_CTRL_OFFSET                  0x00000014
-#define DP_MON_FILTER_MD_CTRL_MASK                    0x0000ffff
-#define DP_MON_FILTER_MD_CTRL_LSB                     0
-
 #ifdef QCA_ENHANCED_STATS_SUPPORT
 /**
  * dp_mon_filter_setup_enhanced_stats() - Setup the enhanced stats filter

+ 76 - 9
dp/wifi3.0/monitor/2.0/dp_mon_filter_2.0.c

@@ -1062,7 +1062,6 @@ void dp_mon_filter_reset_tx_mon_mode_2_0(struct dp_pdev *pdev)
 	struct dp_mon_soc *mon_soc;
 	struct dp_mon_pdev_be *mon_pdev_be;
 	struct dp_mon_soc_be *mon_soc_be = NULL;
-	struct dp_mon_pdev_be *mon_pdev_be = NULL;
 
 	if (!pdev) {
 		dp_mon_filter_err("pdev Context is null");
@@ -1089,11 +1088,12 @@ void dp_mon_filter_setup_rx_mon_mode_2_0(struct dp_pdev *pdev)
 {
 	struct dp_mon_filter_be filter = {0};
 	struct dp_mon_filter *rx_tlv_filter;
-	struct dp_soc *soc = NULL;
-	//enum dp_mon_filter_mode mode = DP_MON_FILTER_MONITOR_MODE;
-	//enum dp_mon_filter_srng_type srng_type =
-	//			DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS;
+	struct dp_soc *soc;
+	enum dp_mon_filter_mode mode = DP_MON_FILTER_MONITOR_MODE;
+	enum dp_mon_filter_srng_type srng_type =
+				DP_MON_FILTER_SRNG_TYPE_RXMON_DEST;
 	struct dp_mon_pdev *mon_pdev;
+	struct dp_mon_pdev_be *mon_pdev_be;
 
 	if (!pdev) {
 		dp_mon_filter_err("pdev Context is null");
@@ -1107,16 +1107,59 @@ void dp_mon_filter_setup_rx_mon_mode_2_0(struct dp_pdev *pdev)
 	}
 
 	mon_pdev = pdev->monitor_pdev;
+	if (!mon_pdev) {
+		dp_mon_filter_err("mon_pdev Context is null");
+		return;
+	}
+	mon_pdev_be = dp_get_be_mon_pdev_from_dp_mon_pdev(mon_pdev);
+
 	rx_tlv_filter = &filter.rx_tlv_filter;
 	rx_tlv_filter->valid = true;
 
-	/* Update for RxMon: Enabled the filter */
+	dp_mon_filter_set_status_cmn(mon_pdev, rx_tlv_filter);
+	dp_mon_filter_show_filter(mon_pdev, mode, rx_tlv_filter);
 
-	/* Update for Rxmon: Store the above filter */
+	/* Store the above filter */
+	mon_pdev_be->filter_be[mode][srng_type] = filter;
 }
 
 void dp_mon_filter_reset_rx_mon_mode_2_0(struct dp_pdev *pdev)
 {
+	struct dp_mon_filter_be filter = {0};
+	struct dp_mon_filter *rx_tlv_filter;
+	struct dp_soc *soc = NULL;
+
+	enum dp_mon_filter_mode mode = DP_MON_FILTER_MONITOR_MODE;
+	enum dp_mon_filter_srng_type srng_type =
+		DP_MON_FILTER_SRNG_TYPE_RXMON_DEST;
+	struct dp_mon_pdev *mon_pdev;
+	struct dp_mon_pdev_be *mon_pdev_be;
+
+	if (!pdev) {
+		dp_mon_filter_err("pdev Context is null");
+		return;
+	}
+
+	soc = pdev->soc;
+	if (!soc) {
+		dp_mon_filter_err("Soc Context is null");
+		return;
+	}
+
+	mon_pdev = pdev->monitor_pdev;
+	if (!mon_pdev) {
+		dp_mon_filter_err("mon_pdev Context is null");
+		return;
+	}
+	mon_pdev_be = dp_get_be_mon_pdev_from_dp_mon_pdev(mon_pdev);
+
+	rx_tlv_filter = &filter.rx_tlv_filter;
+	rx_tlv_filter->valid = true;
+
+	qdf_mem_zero(&(filter), sizeof(struct dp_mon_filter));
+	/* Store the above filter */
+	srng_type = DP_MON_FILTER_SRNG_TYPE_RXMON_DEST;
+	mon_pdev_be->filter_be[mode][srng_type] = filter;
 }
 
 void dp_mon_filter_show_filter_be(struct dp_mon_pdev_be *mon_pdev,
@@ -1670,7 +1713,31 @@ QDF_STATUS dp_tx_mon_filter_update_2_0(struct dp_pdev *pdev)
 
 QDF_STATUS dp_rx_mon_filter_update_2_0(struct dp_pdev *pdev)
 {
-	/* set filters */
-	/* call htt_h2t_rx_ring_cfg */
+	struct dp_soc *soc = pdev->soc;
+	struct dp_mon_filter_be filter = {0};
+	struct dp_mon_filter_be *filter_ptr;
+	struct htt_rx_ring_tlv_filter *rx_tlv_filter;
+	enum dp_mon_filter_mode mode = DP_MON_FILTER_MONITOR_MODE;
+	enum dp_mon_filter_srng_type srng_type =
+		DP_MON_FILTER_SRNG_TYPE_RXMON_DEST;
+	struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
+	struct dp_mon_pdev_be *mon_pdev_be =
+		dp_get_be_mon_pdev_from_dp_mon_pdev(mon_pdev);
+
+	if (!pdev) {
+		dp_mon_filter_err("pdev Context is null");
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	filter_ptr = &mon_pdev_be->filter_be[mode][srng_type];
+	if (!filter_ptr) {
+		dp_mon_filter_err("Filter not allocated");
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	rx_tlv_filter = &filter.rx_tlv_filter.tlv_filter;
+	dp_mon_filter_h2t_setup(soc, pdev, srng_type, &filter.rx_tlv_filter);
+	dp_mon_ht2_rx_ring_cfg(soc, pdev, srng_type,
+			       &filter.rx_tlv_filter.tlv_filter);
 	return QDF_STATUS_SUCCESS;
 }

+ 203 - 0
dp/wifi3.0/monitor/dp_mon_filter.c

@@ -23,6 +23,204 @@
 #include <dp_mon_filter.h>
 #include <dp_mon.h>
 
+/**
+ * dp_mon_filter_mode_type_to_str
+ *  Monitor Filter mode to string
+ */
+int8_t *dp_mon_filter_mode_type_to_str[DP_MON_FILTER_MAX_MODE] = {
+#ifdef QCA_ENHANCED_STATS_SUPPORT
+	"DP MON FILTER ENHACHED STATS MODE",
+#endif /* QCA_ENHANCED_STATS_SUPPORT */
+#ifdef QCA_MCOPY_SUPPORT
+	"DP MON FILTER MCOPY MODE",
+#endif /* QCA_MCOPY_SUPPORT */
+#if defined(ATH_SUPPORT_NAC_RSSI) || defined(ATH_SUPPORT_NAC)
+	"DP MON FILTER SMART MONITOR MODE",
+#endif /* ATH_SUPPORT_NAC_RSSI || ATH_SUPPORT_NAC */
+	"DP_MON FILTER MONITOR MODE",
+#ifdef WLAN_RX_PKT_CAPTURE_ENH
+	"DP MON FILTER RX CAPTURE MODE",
+#endif /* WLAN_RX_PKT_CAPTURE_ENH */
+#ifdef WDI_EVENT_ENABLE
+	"DP MON FILTER PKT LOG FULL MODE",
+	"DP MON FILTER PKT LOG LITE MODE",
+	"DP MON FILTER PKT LOG CBF MODE",
+#ifdef QCA_WIFI_QCN9224
+	"DP MON FILTER PKT LOG HYBRID MODE",
+#endif
+#endif /* WDI_EVENT_ENABLE */
+};
+
+void dp_mon_filter_show_filter(struct dp_mon_pdev *mon_pdev,
+			       enum dp_mon_filter_mode mode,
+			       struct dp_mon_filter *filter)
+{
+	struct htt_rx_ring_tlv_filter *tlv_filter = &filter->tlv_filter;
+
+	DP_MON_FILTER_PRINT("[%s]: Valid: %d",
+			    dp_mon_filter_mode_type_to_str[mode],
+			    filter->valid);
+	DP_MON_FILTER_PRINT("mpdu_start: %d", tlv_filter->mpdu_start);
+	DP_MON_FILTER_PRINT("msdu_start: %d", tlv_filter->msdu_start);
+	DP_MON_FILTER_PRINT("packet: %d", tlv_filter->packet);
+	DP_MON_FILTER_PRINT("msdu_end: %d", tlv_filter->msdu_end);
+	DP_MON_FILTER_PRINT("mpdu_end: %d", tlv_filter->mpdu_end);
+	DP_MON_FILTER_PRINT("packet_header: %d",
+			    tlv_filter->packet_header);
+	DP_MON_FILTER_PRINT("attention: %d", tlv_filter->attention);
+	DP_MON_FILTER_PRINT("ppdu_start: %d", tlv_filter->ppdu_start);
+	DP_MON_FILTER_PRINT("ppdu_end: %d", tlv_filter->ppdu_end);
+	DP_MON_FILTER_PRINT("ppdu_end_user_stats: %d",
+			    tlv_filter->ppdu_end_user_stats);
+	DP_MON_FILTER_PRINT("ppdu_end_user_stats_ext: %d",
+			    tlv_filter->ppdu_end_user_stats_ext);
+	DP_MON_FILTER_PRINT("ppdu_end_status_done: %d",
+			    tlv_filter->ppdu_end_status_done);
+	DP_MON_FILTER_PRINT("header_per_msdu: %d", tlv_filter->header_per_msdu);
+	DP_MON_FILTER_PRINT("enable_fp: %d", tlv_filter->enable_fp);
+	DP_MON_FILTER_PRINT("enable_md: %d", tlv_filter->enable_md);
+	DP_MON_FILTER_PRINT("enable_mo: %d", tlv_filter->enable_mo);
+	DP_MON_FILTER_PRINT("fp_mgmt_filter: 0x%x", tlv_filter->fp_mgmt_filter);
+	DP_MON_FILTER_PRINT("mo_mgmt_filter: 0x%x", tlv_filter->mo_mgmt_filter);
+	DP_MON_FILTER_PRINT("fp_ctrl_filter: 0x%x", tlv_filter->fp_ctrl_filter);
+	DP_MON_FILTER_PRINT("mo_ctrl_filter: 0x%x", tlv_filter->mo_ctrl_filter);
+	DP_MON_FILTER_PRINT("fp_data_filter: 0x%x", tlv_filter->fp_data_filter);
+	DP_MON_FILTER_PRINT("mo_data_filter: 0x%x", tlv_filter->mo_data_filter);
+	DP_MON_FILTER_PRINT("md_data_filter: 0x%x", tlv_filter->md_data_filter);
+	DP_MON_FILTER_PRINT("md_mgmt_filter: 0x%x", tlv_filter->md_mgmt_filter);
+	DP_MON_FILTER_PRINT("md_ctrl_filter: 0x%x", tlv_filter->md_ctrl_filter);
+}
+
+/**
+ * dp_mon_filter_h2t_setup() - Setup the filter for the Target setup
+ * @soc: DP soc handle
+ * @pdev: DP pdev handle
+ * @srng_type: The srng type for which filter wll be set
+ * @tlv_filter: tlv filter
+ */
+void dp_mon_filter_h2t_setup(struct dp_soc *soc, struct dp_pdev *pdev,
+			     enum dp_mon_filter_srng_type srng_type,
+			     struct dp_mon_filter *filter)
+{
+	int32_t current_mode = 0;
+	struct htt_rx_ring_tlv_filter *tlv_filter = &filter->tlv_filter;
+	struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
+
+	/*
+	 * Loop through all the modes.
+	 */
+	for (current_mode = 0; current_mode < DP_MON_FILTER_MAX_MODE;
+						current_mode++) {
+		struct dp_mon_filter *mon_filter =
+			&mon_pdev->filter[current_mode][srng_type];
+		uint32_t src_filter = 0, dst_filter = 0;
+
+		/*
+		 * Check if the correct mode is enabled or not.
+		 */
+		if (!mon_filter->valid)
+			continue;
+
+		filter->valid = true;
+
+		/*
+		 * Set the super bit fields
+		 */
+		src_filter =
+			DP_MON_FILTER_GET(&mon_filter->tlv_filter, FILTER_TLV);
+		dst_filter = DP_MON_FILTER_GET(tlv_filter, FILTER_TLV);
+		dst_filter |= src_filter;
+		DP_MON_FILTER_SET(tlv_filter, FILTER_TLV, dst_filter);
+
+		/*
+		 * Set the filter management filter.
+		 */
+		src_filter = DP_MON_FILTER_GET(&mon_filter->tlv_filter,
+					       FILTER_FP_MGMT);
+		dst_filter = DP_MON_FILTER_GET(tlv_filter, FILTER_FP_MGMT);
+		dst_filter |= src_filter;
+		DP_MON_FILTER_SET(tlv_filter, FILTER_FP_MGMT, dst_filter);
+
+		/*
+		 * Set the monitor other management filter.
+		 */
+		src_filter = DP_MON_FILTER_GET(&mon_filter->tlv_filter,
+					       FILTER_MO_MGMT);
+		dst_filter = DP_MON_FILTER_GET(tlv_filter, FILTER_MO_MGMT);
+		dst_filter |= src_filter;
+		DP_MON_FILTER_SET(tlv_filter, FILTER_MO_MGMT, dst_filter);
+
+		/*
+		 * Set the filter pass control filter.
+		 */
+		src_filter = DP_MON_FILTER_GET(&mon_filter->tlv_filter,
+					       FILTER_FP_CTRL);
+		dst_filter = DP_MON_FILTER_GET(tlv_filter, FILTER_FP_CTRL);
+		dst_filter |= src_filter;
+		DP_MON_FILTER_SET(tlv_filter, FILTER_FP_CTRL, dst_filter);
+
+		/*
+		 * Set the monitor other control filter.
+		 */
+		src_filter = DP_MON_FILTER_GET(&mon_filter->tlv_filter,
+					       FILTER_MO_CTRL);
+		dst_filter = DP_MON_FILTER_GET(tlv_filter, FILTER_MO_CTRL);
+		dst_filter |= src_filter;
+		DP_MON_FILTER_SET(tlv_filter, FILTER_MO_CTRL, dst_filter);
+
+		/*
+		 * Set the filter pass data filter.
+		 */
+		src_filter = DP_MON_FILTER_GET(&mon_filter->tlv_filter,
+					       FILTER_FP_DATA);
+		dst_filter = DP_MON_FILTER_GET(tlv_filter,
+					       FILTER_FP_DATA);
+		dst_filter |= src_filter;
+		DP_MON_FILTER_SET(tlv_filter,
+				  FILTER_FP_DATA, dst_filter);
+
+		/*
+		 * Set the monitor other data filter.
+		 */
+		src_filter = DP_MON_FILTER_GET(&mon_filter->tlv_filter,
+					       FILTER_MO_DATA);
+		dst_filter = DP_MON_FILTER_GET(tlv_filter, FILTER_MO_DATA);
+		dst_filter |= src_filter;
+		DP_MON_FILTER_SET(tlv_filter, FILTER_MO_DATA, dst_filter);
+
+		/*
+		 * Set the monitor direct data filter.
+		 */
+		src_filter = DP_MON_FILTER_GET(&mon_filter->tlv_filter,
+					       FILTER_MD_DATA);
+		dst_filter = DP_MON_FILTER_GET(tlv_filter,
+					       FILTER_MD_DATA);
+		dst_filter |= src_filter;
+		DP_MON_FILTER_SET(tlv_filter,
+				  FILTER_MD_DATA, dst_filter);
+
+		/*
+		 * Set the monitor direct management filter.
+		 */
+		src_filter = DP_MON_FILTER_GET(&mon_filter->tlv_filter,
+					       FILTER_MD_MGMT);
+		dst_filter = DP_MON_FILTER_GET(tlv_filter, FILTER_MD_MGMT);
+		dst_filter |= src_filter;
+		DP_MON_FILTER_SET(tlv_filter, FILTER_MD_MGMT, dst_filter);
+
+		/*
+		 * Set the monitor direct management filter.
+		 */
+		src_filter = DP_MON_FILTER_GET(&mon_filter->tlv_filter,
+					       FILTER_MD_CTRL);
+		dst_filter = DP_MON_FILTER_GET(tlv_filter, FILTER_MD_CTRL);
+		dst_filter |= src_filter;
+		DP_MON_FILTER_SET(tlv_filter, FILTER_MD_CTRL, dst_filter);
+	}
+
+	dp_mon_filter_show_filter(mon_pdev, 0, filter);
+}
+
 QDF_STATUS
 dp_mon_ht2_rx_ring_cfg(struct dp_soc *soc,
 		       struct dp_pdev *pdev,
@@ -88,6 +286,11 @@ dp_mon_ht2_rx_ring_cfg(struct dp_soc *soc,
 			ring_buf_size = RX_DATA_BUFFER_SIZE;
 			break;
 
+		case DP_MON_FILTER_SRNG_TYPE_RXMON_DEST:
+			hal_ring_hdl =
+				soc->rxdma_mon_dst_ring[lmac_id].hal_srng;
+			hal_ring_type = RXDMA_MONITOR_DST;
+			ring_buf_size = RX_DATA_BUFFER_SIZE;
 		default:
 			return QDF_STATUS_E_FAILURE;
 		}

+ 67 - 0
dp/wifi3.0/monitor/dp_mon_filter.h

@@ -20,6 +20,50 @@
 #ifndef _DP_MON_FILTER_H_
 #define _DP_MON_FILTER_H_
 
+/**
+ * Accessor Macros to access the software
+ * defined HTT filter htt_rx_ring_tlv_filter.
+ */
+#define DP_MON_FILTER_TLV_OFFSET                      0x00000000
+#define DP_MON_FILTER_TLV_MASK                        0xffffffff
+#define DP_MON_FILTER_TLV_LSB                         0
+
+#define DP_MON_FILTER_FP_MGMT_OFFSET                  0x00000004
+#define DP_MON_FILTER_FP_MGMT_MASK                    0x0000ffff
+#define DP_MON_FILTER_FP_MGMT_LSB                     0
+
+#define DP_MON_FILTER_MO_MGMT_OFFSET                  0x00000004
+#define DP_MON_FILTER_MO_MGMT_MASK                    0xffff0000
+#define DP_MON_FILTER_MO_MGMT_LSB                     16
+
+#define DP_MON_FILTER_FP_CTRL_OFFSET                  0x00000008
+#define DP_MON_FILTER_FP_CTRL_MASK                    0x0000ffff
+#define DP_MON_FILTER_FP_CTRL_LSB                     0
+
+#define DP_MON_FILTER_MO_CTRL_OFFSET                  0x00000008
+#define DP_MON_FILTER_MO_CTRL_MASK                    0xffff0000
+#define DP_MON_FILTER_MO_CTRL_LSB                     16
+
+#define DP_MON_FILTER_FP_DATA_OFFSET                  0x0000000c
+#define DP_MON_FILTER_FP_DATA_MASK                    0x0000ffff
+#define DP_MON_FILTER_FP_DATA_LSB                     0
+
+#define DP_MON_FILTER_MO_DATA_OFFSET                  0x0000000c
+#define DP_MON_FILTER_MO_DATA_MASK                    0xffff0000
+#define DP_MON_FILTER_MO_DATA_LSB                     16
+
+#define DP_MON_FILTER_MD_DATA_OFFSET                  0x00000010
+#define DP_MON_FILTER_MD_DATA_MASK                    0x0000ffff
+#define DP_MON_FILTER_MD_DATA_LSB                     0
+
+#define DP_MON_FILTER_MD_MGMT_OFFSET                  0x00000010
+#define DP_MON_FILTER_MD_MGMT_MASK                    0xffff0000
+#define DP_MON_FILTER_MD_MGMT_LSB                     16
+
+#define DP_MON_FILTER_MD_CTRL_OFFSET                  0x00000014
+#define DP_MON_FILTER_MD_CTRL_MASK                    0x0000ffff
+#define DP_MON_FILTER_MD_CTRL_LSB                     0
+
 #define DP_MON_FILTER_GET(src, field) \
 	((*((uint32_t *)((uint8_t *)(src) + DP_MON_ ## field ## _OFFSET)) & \
 	(DP_MON_ ## field ## _MASK)) >> DP_MON_ ## field ## _LSB) \
@@ -381,4 +425,27 @@ void dp_mon_filter_dealloc(struct dp_mon_pdev *mon_pdev);
  */
 struct dp_mon_filter **dp_mon_filter_alloc(struct dp_mon_pdev *mon_pdev);
 
+/*
+ * dp_mon_filter_h2t_setup () - Setup filter
+ * @soc: Dp soc handle
+ * @pdev: pdev handle
+ * @srng_type: srng type
+ * @filter: filter
+ */
+void dp_mon_filter_h2t_setup(struct dp_soc *soc, struct dp_pdev *pdev,
+			     enum dp_mon_filter_srng_type srng_type,
+			     struct dp_mon_filter *filter);
+
+/**
+ * dp_mon_ht2_rx_ring_cfg () - Configure filter to HW
+ * @soc: Dp soc handle
+ * @pdev: Dp pdev handle
+ * @srng_type: SRNG type
+ * @tlv_filter: filter
+ */
+QDF_STATUS
+dp_mon_ht2_rx_ring_cfg(struct dp_soc *soc,
+		       struct dp_pdev *pdev,
+		       enum dp_mon_filter_srng_type srng_type,
+		       struct htt_rx_ring_tlv_filter *tlv_filter);
 #endif /* #ifndef _DP_MON_FILTER_H_ */