Kaynağa Gözat

qcacmn: Fix to receive correct buffer address

Fix to receive correct descriptor buffer address
for tx monitor

Fix to send correct filter settings enabled

Disabled default filter display log level to debug.

Change-Id: I7ca1b1110cdcb10ca65ab8c414c19a81f1f4d331
CRs-Fixed: 3121965
Naga 3 yıl önce
ebeveyn
işleme
03c268ac2d

+ 1 - 0
dp/wifi3.0/dp_htt.c

@@ -998,6 +998,7 @@ int htt_h2t_rx_ring_cfg(struct htt_soc *htt_soc, int pdev_id,
 		ring_buf_size);
 
 	dp_mon_rx_packet_length_set(soc->dp_soc, msg_word, htt_tlv_filter);
+	dp_rx_mon_enable(soc->dp_soc, msg_word, htt_tlv_filter);
 
 	/* word 2 */
 	msg_word++;

+ 6 - 2
dp/wifi3.0/dp_htt.h

@@ -535,6 +535,7 @@ struct dp_tx_mon_wordmask_config {
  * @mgmt_mpdu_log: enable mgmt mpdu level logging
  * @ctrl_mpdu_log: enable ctrl mpdu level logging
  * @data_mpdu_log: enable data mpdu level logging
+ * @enable: enable tx monitor
  *
  * NOTE: Do not change the layout of this structure
  */
@@ -563,6 +564,7 @@ struct htt_tx_ring_tlv_filter {
 	uint8_t  mgmt_mpdu_log:1,
 		 ctrl_mpdu_log:1,
 		 data_mpdu_log:1;
+	uint8_t  enable:1;
 };
 #endif /* QCA_MONITOR_2_0_SUPPORT */
 
@@ -605,6 +607,7 @@ struct htt_tx_ring_tlv_filter {
  * @mgmt_mpdu_log: enable mgmt mpdu level logging
  * @ctrl_mpdu_log: enable ctrl mpdu level logging
  * @data_mpdu_log: enable data mpdu level logging
+ * @enable: enable rx monitor
  *
  * NOTE: Do not change the layout of this structure
  */
@@ -649,10 +652,11 @@ struct htt_rx_ring_tlv_filter {
 	uint16_t rx_pkt_tlv_offset;
 	uint16_t mgmt_dma_length:3,
 		 ctrl_dma_length:3,
-		 data_dma_lepngth:3,
+		 data_dma_length:3,
 		 mgmt_mpdu_log:1,
 		 ctrl_mpdu_log:1,
-		 data_mpdu_log:1;
+		 data_mpdu_log:1,
+		 enable:1;
 #endif
 	uint8_t rx_mon_global_en;
 };

+ 1 - 0
dp/wifi3.0/monitor/1.0/dp_mon_1.0.c

@@ -969,6 +969,7 @@ dp_mon_register_feature_ops_1_0(struct dp_soc *soc)
 	mon_ops->mon_pktlogmod_exit = dp_pktlogmod_exit;
 #endif
 	mon_ops->rx_packet_length_set = NULL;
+	mon_ops->rx_mon_enable = NULL;
 	mon_ops->rx_wmask_subscribe = NULL;
 	mon_ops->rx_enable_mpdu_logging = NULL;
 	mon_ops->mon_neighbour_peers_detach = dp_neighbour_peers_detach;

+ 4 - 13
dp/wifi3.0/monitor/2.0/dp_mon_2.0.c

@@ -236,6 +236,7 @@ dp_mon_buffers_replenish(struct dp_soc *dp_soc,
 		(*desc_list)->mon_desc.unmapped = 0;
 		(*desc_list)->mon_desc.buf_addr = mon_desc.buf_addr;
 		(*desc_list)->mon_desc.paddr = mon_desc.paddr;
+		(*desc_list)->mon_desc.magic = DP_MON_DESC_MAGIC;
 
 		hal_mon_buff_addr_info_set(dp_soc->hal_soc,
 					   mon_ring_entry,
@@ -450,11 +451,9 @@ dp_set_bpr_enable_2_0(struct dp_pdev *pdev, int val)
 static
 QDF_STATUS dp_mon_soc_htt_srng_setup_2_0(struct dp_soc *soc)
 {
-	QDF_STATUS status;
-#ifdef QCA_TXMON_HW_SUPPORT
 	struct dp_mon_soc *mon_soc = soc->monitor_soc;
 	struct dp_mon_soc_be *mon_soc_be = dp_get_be_mon_soc_from_dp_mon_soc(mon_soc);
-#endif
+	QDF_STATUS status;
 
 	hal_set_low_threshold(soc->rxdma_mon_buf_ring[0].hal_srng, 0);
 	status = htt_srng_setup(soc->htt_handle, 0,
@@ -466,17 +465,14 @@ QDF_STATUS dp_mon_soc_htt_srng_setup_2_0(struct dp_soc *soc)
 		return status;
 	}
 
-#ifdef QCA_TXMON_HW_SUPPORT
 	hal_set_low_threshold(mon_soc_be->tx_mon_buf_ring.hal_srng, 0);
 	status = htt_srng_setup(soc->htt_handle, 0,
 				mon_soc_be->tx_mon_buf_ring.hal_srng,
 				TX_MONITOR_BUF);
-
 	if (status != QDF_STATUS_SUCCESS) {
 		dp_err("Failed to send htt srng setup message for Tx mon buf ring");
 		return status;
 	}
-#endif
 
 	return status;
 }
@@ -487,10 +483,8 @@ QDF_STATUS dp_mon_pdev_htt_srng_setup_2_0(struct dp_soc *soc,
 					  int mac_id,
 					  int mac_for_pdev)
 {
-#ifdef QCA_TXMON_HW_SUPPORT
 	struct dp_mon_soc *mon_soc = soc->monitor_soc;
 	struct dp_mon_soc_be *mon_soc_be = dp_get_be_mon_soc_from_dp_mon_soc(mon_soc);
-#endif
 	QDF_STATUS status;
 
 	status = htt_srng_setup(soc->htt_handle, mac_for_pdev,
@@ -502,7 +496,6 @@ QDF_STATUS dp_mon_pdev_htt_srng_setup_2_0(struct dp_soc *soc,
 		return status;
 	}
 
-#ifdef QCA_TXMON_HW_SUPPORT
 	status = htt_srng_setup(soc->htt_handle, mac_for_pdev,
 				mon_soc_be->tx_mon_dst_ring[mac_id].hal_srng,
 				TX_MONITOR_DST);
@@ -511,7 +504,6 @@ QDF_STATUS dp_mon_pdev_htt_srng_setup_2_0(struct dp_soc *soc,
 		dp_mon_err("Failed to send htt srng message for Tx mon dst ring");
 		return status;
 	}
-#endif
 
 	return status;
 }
@@ -985,10 +977,8 @@ static void dp_mon_register_intr_ops_2_0(struct dp_soc *soc)
 
 	mon_soc->mon_ops->rx_mon_refill_buf_ring =
 			NULL,
-#ifdef QCA_TXMON_HW_SUPPORT
 	mon_soc->mon_ops->tx_mon_refill_buf_ring =
-			dp_tx_mon_refill_buf_ring_2_0,
-#endif
+			NULL,
 	mon_soc->mon_rx_process = dp_rx_mon_process_2_0;
 }
 
@@ -1106,6 +1096,7 @@ dp_mon_register_feature_ops_2_0(struct dp_soc *soc)
 	mon_ops->mon_pktlogmod_exit = dp_pktlogmod_exit;
 #endif
 	mon_ops->rx_packet_length_set = dp_rx_mon_packet_length_set;
+	mon_ops->rx_mon_enable = dp_rx_mon_enable_set;
 	mon_ops->rx_wmask_subscribe = dp_rx_mon_word_mask_subscribe;
 	mon_ops->rx_enable_mpdu_logging = dp_rx_mon_enable_mpdu_logging;
 	mon_ops->mon_neighbour_peers_detach = dp_neighbour_peers_detach;

+ 3 - 0
dp/wifi3.0/monitor/2.0/dp_mon_2.0.h

@@ -29,6 +29,7 @@
 
 #define DP_MON_RING_FILL_LEVEL_DEFAULT 2048
 #define DP_MON_DATA_BUFFER_SIZE     2048
+#define DP_MON_DESC_MAGIC 0xdeadabcd
 
 /**
  * struct dp_mon_filter_be - Monitor TLV filter
@@ -53,6 +54,7 @@ struct dp_mon_filter_be {
  * @unmapped: used to mark desc an unmapped if the corresponding
  * nbuf is already unmapped
  * @cookie: unique desc identifier
+ * @magic: magic number to validate desc data
  */
 struct dp_mon_desc {
 	uint8_t *buf_addr;
@@ -60,6 +62,7 @@ struct dp_mon_desc {
 	uint8_t in_use:1,
 		unmapped:1;
 	uint32_t cookie;
+	uint32_t magic;
 };
 
 /**

+ 128 - 59
dp/wifi3.0/monitor/2.0/dp_mon_filter_2.0.c

@@ -108,14 +108,23 @@ void dp_rx_mon_packet_length_set(uint32_t *msg_word,
 {
 	if (!msg_word || !tlv_filter)
 		return;
-#ifdef QCA_MONITOR_2_0_SUPPORT_WAR /* Yet to get FW support */
-	HTT_RX_MONITOR_CFG_CONFIG_LENGTH_MGMT_SET(*msg_word,
-			tlv_filter->mgmt_dma_length);
-	HTT_RX_MONITOR_CFG_CONFIG_LENGTH_CTRL_SET(*msg_word,
-			tlv_filter->ctrl_dma_length);
-	HTT_RX_MONITOR_CFG_CONFIG_LENGTH_DATA_SET(*msg_word,
-			tlv_filter->data_dma_length);
-#endif
+
+	HTT_RX_RING_SELECTION_CFG_CONFIG_LENGTH_MGMT_SET(*msg_word,
+							 tlv_filter->mgmt_dma_length);
+	HTT_RX_RING_SELECTION_CFG_CONFIG_LENGTH_CTRL_SET(*msg_word,
+							 tlv_filter->ctrl_dma_length);
+	HTT_RX_RING_SELECTION_CFG_CONFIG_LENGTH_DATA_SET(*msg_word,
+							 tlv_filter->data_dma_length);
+}
+
+void dp_rx_mon_enable_set(uint32_t *msg_word,
+			  struct htt_rx_ring_tlv_filter *tlv_filter)
+{
+	if (!msg_word || !tlv_filter)
+		return;
+
+	HTT_RX_RING_SELECTION_CFG_RX_MON_GLOBAL_EN_SET(*msg_word,
+						       tlv_filter->enable);
 }
 
 void dp_rx_mon_enable_mpdu_logging(uint32_t *msg_word,
@@ -124,19 +133,20 @@ void dp_rx_mon_enable_mpdu_logging(uint32_t *msg_word,
 	if (!msg_word || !tlv_filter)
 		return;
 
-#ifdef QCA_MONITOR_2_0_SUPPORT_WAR /* Yet to get FW support */
-	if (htt_tlv_filter->mgmt_mpdu_log)
-		HTT_RX_MONITOR_CFG_MPDU_LOGGING_SET(*msg_word, MGMT,
-						    tlv_filter->mgmt_mpdu_log);
+	if (tlv_filter->mgmt_mpdu_log) {
+		HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_MSDU_MPDU_LOGGING_SET(*msg_word, 1);
+		HTT_RX_RING_SELECTION_CFG_DMA_MPDU_MGMT_SET(*msg_word, 1);
+	}
 
-	if (htt_tlv_filter->ctrl_mpdu_log)
-		HTT_RX_MONITOR_CFG_MPDU_LOGGING_SET(*msg_word, CTRL,
-						    tlv_filter->ctrl_mpdu_log);
+	if (tlv_filter->ctrl_mpdu_log) {
+		HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_MSDU_MPDU_LOGGING_SET(*msg_word, 2);
+		HTT_RX_RING_SELECTION_CFG_DMA_MPDU_CTRL_SET(*msg_word, 1);
+	}
 
-	if (htt_tlv_filter->data_mpdu_log)
-		HTT_RX_MONITOR_CFG_MPDU_LOGGING_SET(*msg_word, DATA,
-						    tlv_filter->data_mpdu_log);
-#endif
+	if (tlv_filter->data_mpdu_log) {
+		HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_MSDU_MPDU_LOGGING_SET(*msg_word, 4);
+		HTT_RX_RING_SELECTION_CFG_DMA_MPDU_DATA_SET(*msg_word, 1);
+	}
 }
 
 void
@@ -146,21 +156,19 @@ dp_rx_mon_word_mask_subscribe(uint32_t *msg_word,
 	if (!msg_word || !tlv_filter)
 		return;
 
-#ifdef QCA_MONITOR_2_0_SUPPORT_WAR /* Yet to get FW support */
-	HTT_RX_RING_SELECTION_CFG_RX_MPDU_START_WMASK_SET(*msg_word,
-			tlv_filter->rx_mpdu_start_word_mask);
+	HTT_RX_RING_SELECTION_CFG_RX_MPDU_START_WORD_MASK_SET(*msg_word,
+			tlv_filter->rx_mpdu_start_wmask);
 
+#ifdef QCA_MONITOR_2_0_SUPPORT_WAR /* Yet to get FW support */
+	HTT_RX_RING_SELECTION_CFG_RX_MPDU_END_WORD_MASK_SET(*msg_word,
+			tlv_filter->rx_mpdu_end_wmask);
+#endif
 	msg_word++;
 	*msg_word = 0;
-	HTT_RX_RING_SELECTION_CFG_RX_MPDU_END_WMASK_SET(*msg_word,
-			tlv_filter->rx_mpdu_end_word_mask);
-	msg_word++;
-	*msg_word = 0;
-	HTT_RX_RING_SELECTION_CFG_RX_MSDU_END_WMASK_SET(*msg_word,
-			tlv_filter->rx_msdu_end_word_mask);
-	HTT_RX_RING_SELECTION_CFG_RX_PACKET_TLV_OFFSET_SET(*msg_word,
+	HTT_RX_RING_SELECTION_CFG_RX_MSDU_END_WORD_MASK_SET(*msg_word,
+			tlv_filter->rx_msdu_end_wmask);
+	HTT_RX_RING_SELECTION_CFG_ENABLE_RX_PKT_TLV_OFFSET_SET(*msg_word,
 			tlv_filter->rx_pkt_tlv_offset);
-#endif
 }
 
 static void
@@ -825,16 +833,17 @@ int htt_h2t_tx_ring_cfg(struct htt_soc *htt_soc, int pdev_id,
 	target_pdev_id =
 	dp_get_target_pdev_id_for_host_pdev_id(soc->dp_soc, pdev_id);
 
-	if (htt_ring_type == HTT_SW_TO_SW_RING ||
-	    htt_ring_type == HTT_SW_TO_HW_RING)
-		HTT_TX_MONITOR_CFG_PDEV_ID_SET(*msg_word,
-					       target_pdev_id);
+	HTT_TX_MONITOR_CFG_PDEV_ID_SET(*msg_word,
+				       target_pdev_id);
 
 	HTT_TX_MONITOR_CFG_RING_ID_SET(*msg_word, htt_ring_id);
 
 	HTT_TX_MONITOR_CFG_STATUS_TLV_SET(*msg_word,
 		!!(srng_params.flags & HAL_SRNG_MSI_SWAP));
 
+	HTT_TX_MONITOR_CFG_TX_MON_GLOBAL_EN_SET(*msg_word,
+						htt_tlv_filter->enable);
+
 	/* word 1 */
 	msg_word++;
 	*msg_word = 0;
@@ -854,11 +863,11 @@ int htt_h2t_tx_ring_cfg(struct htt_soc *htt_soc, int pdev_id,
 					 DATA, 1);
 
 	if (htt_tlv_filter->mgmt_dma_length)
-		HTT_TX_MONITOR_CFG_CONFIG_LENGTH_DATA_SET(*msg_word,
+		HTT_TX_MONITOR_CFG_CONFIG_LENGTH_MGMT_SET(*msg_word,
 							  htt_tlv_filter->mgmt_dma_length);
 
 	if (htt_tlv_filter->ctrl_dma_length)
-		HTT_TX_MONITOR_CFG_CONFIG_LENGTH_DATA_SET(*msg_word,
+		HTT_TX_MONITOR_CFG_CONFIG_LENGTH_CTRL_SET(*msg_word,
 							  htt_tlv_filter->ctrl_dma_length);
 
 	if (htt_tlv_filter->data_dma_length)
@@ -872,10 +881,46 @@ int htt_h2t_tx_ring_cfg(struct htt_soc *htt_soc, int pdev_id,
 		HTT_TX_MONITOR_CFG_PKT_TYPE_ENABLE_FLAGS_SET(*msg_word, 1);
 
 	if (htt_tlv_filter->ctrl_filter)
-		HTT_TX_MONITOR_CFG_PKT_TYPE_ENABLE_FLAGS_SET(*msg_word, 1);
+		HTT_TX_MONITOR_CFG_PKT_TYPE_ENABLE_FLAGS_SET(*msg_word, 2);
 
 	if (htt_tlv_filter->data_filter)
-		HTT_TX_MONITOR_CFG_PKT_TYPE_ENABLE_FLAGS_SET(*msg_word, 1);
+		HTT_TX_MONITOR_CFG_PKT_TYPE_ENABLE_FLAGS_SET(*msg_word, 4);
+
+	if (htt_tlv_filter->mgmt_mpdu_start)
+		HTT_TX_MONITOR_CFG_FILTER_IN_TX_MPDU_START_MGMT_SET(*msg_word, 1);
+
+	if (htt_tlv_filter->ctrl_mpdu_start)
+		HTT_TX_MONITOR_CFG_FILTER_IN_TX_MPDU_START_CTRL_SET(*msg_word, 1);
+
+	if (htt_tlv_filter->data_mpdu_start)
+		HTT_TX_MONITOR_CFG_FILTER_IN_TX_MPDU_START_DATA_SET(*msg_word, 1);
+
+	if (htt_tlv_filter->mgmt_msdu_start)
+		HTT_TX_MONITOR_CFG_FILTER_IN_TX_MSDU_START_MGMT_SET(*msg_word, 1);
+
+	if (htt_tlv_filter->ctrl_msdu_start)
+		HTT_TX_MONITOR_CFG_FILTER_IN_TX_MSDU_START_CTRL_SET(*msg_word, 1);
+
+	if (htt_tlv_filter->data_msdu_start)
+		HTT_TX_MONITOR_CFG_FILTER_IN_TX_MSDU_START_DATA_SET(*msg_word, 1);
+
+	if (htt_tlv_filter->mgmt_mpdu_end)
+		HTT_TX_MONITOR_CFG_FILTER_IN_TX_MPDU_END_MGMT_SET(*msg_word, 1);
+
+	if (htt_tlv_filter->ctrl_mpdu_end)
+		HTT_TX_MONITOR_CFG_FILTER_IN_TX_MPDU_END_CTRL_SET(*msg_word, 1);
+
+	if (htt_tlv_filter->data_mpdu_end)
+		HTT_TX_MONITOR_CFG_FILTER_IN_TX_MPDU_END_DATA_SET(*msg_word, 1);
+
+	if (htt_tlv_filter->mgmt_msdu_end)
+		HTT_TX_MONITOR_CFG_FILTER_IN_TX_MSDU_END_MGMT_SET(*msg_word, 1);
+
+	if (htt_tlv_filter->ctrl_msdu_end)
+		HTT_TX_MONITOR_CFG_FILTER_IN_TX_MSDU_END_CTRL_SET(*msg_word, 1);
+
+	if (htt_tlv_filter->data_msdu_end)
+		HTT_TX_MONITOR_CFG_FILTER_IN_TX_MSDU_END_DATA_SET(*msg_word, 1);
 
 	/* word 3 */
 	msg_word++;
@@ -1217,6 +1262,8 @@ static void dp_tx_mon_filter_show_filter(struct dp_mon_filter_be *filter)
 {
 	struct htt_tx_ring_tlv_filter *tlv_filter = &filter->tx_tlv_filter;
 
+	DP_MON_FILTER_PRINT("TX Monitor Filter configuration:");
+	DP_MON_FILTER_PRINT("Enable: %d", tlv_filter->enable);
 	DP_MON_FILTER_PRINT("mgmt_filter: %d", tlv_filter->mgmt_filter);
 	DP_MON_FILTER_PRINT("data_filter: %d", tlv_filter->data_filter);
 	DP_MON_FILTER_PRINT("ctrl_filter: %d", tlv_filter->ctrl_filter);
@@ -1825,21 +1872,6 @@ dp_rx_mon_filter_h2t_setup(struct dp_soc *soc, struct dp_pdev *pdev,
 	}
 }
 
-/**
- * dp_tx_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_tx_mon_filter_h2t_setup(struct dp_soc *soc, struct dp_pdev *pdev,
-				struct dp_mon_filter_be *filter)
-{
-	/* currently all available filter configuration enabled  */
-	dp_tx_mon_filter_show_filter(filter);
-}
-
 static QDF_STATUS
 dp_tx_mon_ht2_ring_cfg(struct dp_soc *soc,
 		       struct dp_pdev *pdev,
@@ -1878,10 +1910,40 @@ dp_tx_mon_ht2_ring_cfg(struct dp_soc *soc,
 	return status;
 }
 
+static inline
+void dp_tx_mon_filter_set_all(struct htt_tx_ring_tlv_filter *filter)
+{
+	qdf_mem_set(&filter->dtlvs,
+		    sizeof(struct dp_tx_mon_downstream_tlv_config), 0xFF);
+	qdf_mem_set(&filter->utlvs,
+		    sizeof(struct dp_tx_mon_upstream_tlv_config), 0xFF);
+	qdf_mem_set(&filter->wmask,
+		    sizeof(struct dp_tx_mon_wordmask_config), 0xFF);
+
+	filter->mgmt_filter = 0x1;
+	filter->data_filter = 0x1;
+	filter->ctrl_filter = 0x1;
+
+	filter->mgmt_mpdu_end = 1;
+	filter->mgmt_msdu_end = 1;
+	filter->mgmt_msdu_start = 1;
+	filter->mgmt_mpdu_start = 1;
+	filter->ctrl_mpdu_end = 1;
+	filter->ctrl_msdu_end = 1;
+	filter->ctrl_msdu_start = 1;
+	filter->ctrl_mpdu_start = 1;
+	filter->data_mpdu_end = 1;
+	filter->data_msdu_end = 1;
+	filter->data_msdu_start = 1;
+	filter->data_mpdu_start = 1;
+	filter->mgmt_mpdu_log = 1;
+	filter->ctrl_mpdu_log = 1;
+	filter->data_mpdu_log = 1;
+}
+
 QDF_STATUS dp_tx_mon_filter_update_2_0(struct dp_pdev *pdev)
 {
 	struct dp_soc *soc;
-	struct dp_mon_filter_be filter = {0};
 	struct dp_mon_filter_be *filter_ptr;
 	struct htt_tx_ring_tlv_filter *tx_tlv_filter;
 	enum dp_mon_filter_mode mode = DP_MON_FILTER_MONITOR_MODE;
@@ -1909,18 +1971,20 @@ QDF_STATUS dp_tx_mon_filter_update_2_0(struct dp_pdev *pdev)
 	}
 
 	if (filter_ptr->tx_valid) {
-		qdf_mem_set(&(filter), sizeof(filter), 1);
-		tx_tlv_filter = &filter.tx_tlv_filter;
+		tx_tlv_filter = &filter_ptr->tx_tlv_filter;
+		dp_tx_mon_filter_set_all(tx_tlv_filter);
 		tx_tlv_filter->mgmt_dma_length = DEFAULT_DMA_LENGTH;
 		tx_tlv_filter->ctrl_dma_length = DEFAULT_DMA_LENGTH;
 		tx_tlv_filter->data_dma_length = DEFAULT_DMA_LENGTH;
+		tx_tlv_filter->enable = 1;
 	} else {
-		qdf_mem_zero(&(filter), sizeof(filter));
+		qdf_mem_zero(filter_ptr, sizeof(struct dp_mon_filter_be));
 	}
 
-	dp_tx_mon_filter_h2t_setup(soc, pdev, &filter);
+	dp_mon_filter_show_filter_be(mode,
+				     filter_ptr);
 	dp_tx_mon_ht2_ring_cfg(soc, pdev, srng_type,
-			       &filter.tx_tlv_filter);
+			       &filter_ptr->tx_tlv_filter);
 
 	return QDF_STATUS_SUCCESS;
 }
@@ -1943,6 +2007,11 @@ QDF_STATUS dp_rx_mon_filter_update_2_0(struct dp_pdev *pdev)
 	mode = mon_pdev->current_filter_mode;
 	rx_tlv_filter = &filter.rx_tlv_filter.tlv_filter;
 	dp_rx_mon_filter_h2t_setup(soc, pdev, srng_type, &filter.rx_tlv_filter);
+	if (filter.rx_tlv_filter.valid)
+		rx_tlv_filter->enable = 1;
+	else
+		rx_tlv_filter->enable = 0;
+
 	dp_mon_ht2_rx_ring_cfg(soc, pdev, srng_type,
 			       &filter.rx_tlv_filter.tlv_filter);
 	dp_mon_filter_show_filter_be(mode,

+ 11 - 2
dp/wifi3.0/monitor/2.0/dp_mon_filter_2.0.h

@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2021, The Linux Foundation. All rights reserved.
- * Copyright (c) 2021,2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
  *
  * Permission to use, copy, modify, and/or distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
@@ -22,6 +22,15 @@
 
 #define DEFAULT_DMA_LENGTH 7
 
+/**
+ * dp_rx_mon_enable_set() - Setup rx monitor feature
+ * @msg_word: msg word
+ * @htt_tlv_filter: rx ring filter configuration
+ */
+void
+dp_rx_mon_enable_set(uint32_t *msg_word,
+		     struct htt_rx_ring_tlv_filter *tlv_filter);
+
 /**
  * dp_rx_mon_packet_length_set() - Setup rx monitor per packet type length
  * @msg_word: msg word
@@ -29,7 +38,7 @@
  */
 void
 dp_rx_mon_packet_length_set(uint32_t *msg_word,
-			    struct htt_rx_ring_tlv_filter *tlvi_filter);
+			    struct htt_rx_ring_tlv_filter *tlv_filter);
 
 /**
  * dp_rx_mon_word_mask_subscribe() - Setup rx monitor word mask subscription

+ 14 - 4
dp/wifi3.0/monitor/2.0/dp_tx_mon_2.0.c

@@ -74,7 +74,7 @@ dp_tx_mon_srng_process_2_0(struct dp_soc *soc, struct dp_intr *int_ctx,
 	}
 
 	while (qdf_likely((tx_mon_dst_ring_desc =
-		(void *)hal_srng_dst_get_next(hal_soc, mon_dst_srng))
+		(void *)hal_srng_dst_peek(hal_soc, mon_dst_srng))
 				&& quota--)) {
 		struct hal_mon_desc hal_mon_tx_desc;
 		struct dp_mon_desc *mon_desc;
@@ -82,6 +82,7 @@ dp_tx_mon_srng_process_2_0(struct dp_soc *soc, struct dp_intr *int_ctx,
 		hal_be_get_mon_dest_status(soc->hal_soc,
 					   tx_mon_dst_ring_desc,
 					   &hal_mon_tx_desc);
+
 		mon_desc = (struct dp_mon_desc *)(uintptr_t)(hal_mon_tx_desc.buf_addr);
 		qdf_assert_always(mon_desc);
 
@@ -92,23 +93,32 @@ dp_tx_mon_srng_process_2_0(struct dp_soc *soc, struct dp_intr *int_ctx,
 			mon_desc->unmapped = 1;
 		}
 
+		if (mon_desc->magic != DP_MON_DESC_MAGIC) {
+			dp_mon_err("Invalid monitor descriptor");
+			qdf_assert_always(mon_desc);
+		}
+
 		status = dp_tx_mon_process_status_tlv(soc, pdev,
 						      &hal_mon_tx_desc,
 						      mon_desc->paddr);
 		if (status != QDF_STATUS_SUCCESS) {
 			hal_txmon_status_free_buffer(pdev->soc->hal_soc,
 						     mon_desc->buf_addr);
-			qdf_frag_free(mon_desc->buf_addr);
 		}
 
+		qdf_frag_free(mon_desc->buf_addr);
 		dp_mon_add_to_free_desc_list(&desc_list, &tail, mon_desc);
+
 		work_done++;
+		hal_srng_dst_get_next(hal_soc, mon_dst_srng);
 	}
 	dp_srng_access_end(int_ctx, soc, mon_dst_srng);
 
 	if (desc_list)
-		dp_mon_add_desc_list_to_free_list(soc, &desc_list,
-						  &tail, tx_mon_desc_pool);
+		dp_mon_buffers_replenish(soc, &mon_soc_be->tx_mon_buf_ring,
+					 tx_mon_desc_pool,
+					 work_done,
+					 &desc_list, &tail);
 
 	qdf_spin_unlock_bh(&mon_pdev->mon_lock);
 	dp_mon_info("mac_id: %d, work_done:%d", mac_id, work_done);

+ 23 - 0
dp/wifi3.0/monitor/dp_mon.h

@@ -697,6 +697,8 @@ struct dp_mon_ops {
 	void (*tx_mon_desc_pool_deinit)(struct dp_pdev *pdev);
 	QDF_STATUS (*tx_mon_desc_pool_alloc)(struct dp_pdev *pdev);
 	void (*tx_mon_desc_pool_free)(struct dp_pdev *pdev);
+	void (*rx_mon_enable)(uint32_t *msg_word,
+			      struct htt_rx_ring_tlv_filter *tlv_filter);
 	void (*rx_packet_length_set)(uint32_t *msg_word,
 				     struct htt_rx_ring_tlv_filter *tlv_filter);
 	void (*rx_wmask_subscribe)(uint32_t *msg_word,
@@ -3541,6 +3543,27 @@ dp_mon_rx_packet_length_set(struct dp_soc *soc, uint32_t *msg_word,
 	monitor_ops->rx_packet_length_set(msg_word, tlv_filter);
 }
 
+static inline void
+dp_rx_mon_enable(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->rx_mon_enable) {
+		dp_mon_debug("callback not registered");
+		return;
+	}
+
+	monitor_ops->rx_mon_enable(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);

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

@@ -498,10 +498,8 @@ QDF_STATUS dp_mon_filter_update(struct dp_pdev *pdev)
 		return QDF_STATUS_E_FAILURE;
 	}
 
-#ifdef QCA_TXMON_HW_SUPPORT
 	if (mon_ops && mon_ops->tx_mon_filter_update)
 		mon_ops->tx_mon_filter_update(pdev);
-#endif
 
 	if (mon_ops && mon_ops->rx_mon_filter_update)
 		mon_ops->rx_mon_filter_update(pdev);

+ 8 - 34
hal/wifi3.0/be/hal_be_api_mon.h

@@ -52,25 +52,25 @@
 #define HAL_MON_PADDR_LO_SET(buff_addr_info, paddr_lo) \
 		((*(((unsigned int *) buff_addr_info) + \
 		(HAL_MON_BUFFER_ADDR_INFO_0_BUFFER_ADDR_31_0_OFFSET >> 2))) = \
-		(paddr_lo << HAL_MON_BUFFER_ADDR_INFO_0_BUFFER_ADDR_31_0_LSB) & \
+		((paddr_lo) << HAL_MON_BUFFER_ADDR_INFO_0_BUFFER_ADDR_31_0_LSB) & \
 		HAL_MON_BUFFER_ADDR_INFO_0_BUFFER_ADDR_31_0_MASK)
 
 #define HAL_MON_PADDR_HI_SET(buff_addr_info, paddr_hi) \
 		((*(((unsigned int *) buff_addr_info) + \
 		(HAL_MON_BUFFER_ADDR_INFO_1_BUFFER_ADDR_39_32_OFFSET >> 2))) = \
-		(paddr_hi << HAL_MON_BUFFER_ADDR_INFO_1_BUFFER_ADDR_39_32_LSB) & \
+		((paddr_hi) << HAL_MON_BUFFER_ADDR_INFO_1_BUFFER_ADDR_39_32_LSB) & \
 		HAL_MON_BUFFER_ADDR_INFO_1_BUFFER_ADDR_39_32_MASK)
 
-#define HAL_MON_VADDR_LO_SET(buff_addr_info, paddr_lo) \
+#define HAL_MON_VADDR_LO_SET(buff_addr_info, vaddr_lo) \
 		((*(((unsigned int *) buff_addr_info) + \
 		(HAL_MON_MON_INGRESS_RING_BUFFER_VIRT_ADDR_31_0_OFFSET >> 2))) = \
-		(paddr_lo << HAL_MON_MON_INGRESS_RING_BUFFER_VIRT_ADDR_31_0_LSB) & \
+		((vaddr_lo) << HAL_MON_MON_INGRESS_RING_BUFFER_VIRT_ADDR_31_0_LSB) & \
 		HAL_MON_MON_INGRESS_RING_BUFFER_VIRT_ADDR_31_0_MASK)
 
-#define HAL_MON_VADDR_HI_SET(buff_addr_info, paddr_hi) \
+#define HAL_MON_VADDR_HI_SET(buff_addr_info, vaddr_hi) \
 		((*(((unsigned int *) buff_addr_info) + \
 		(HAL_MON_MON_INGRESS_RING_BUFFER_VIRT_ADDR_63_32_OFFSET >> 2))) = \
-		(paddr_hi << HAL_MON_MON_INGRESS_RING_BUFFER_VIRT_ADDR_63_32_LSB) & \
+		((vaddr_hi) << HAL_MON_MON_INGRESS_RING_BUFFER_VIRT_ADDR_63_32_LSB) & \
 		HAL_MON_MON_INGRESS_RING_BUFFER_VIRT_ADDR_63_32_MASK)
 
 enum hal_dest_desc_end_reason {
@@ -190,33 +190,6 @@ void hal_mon_buff_addr_info_set(hal_soc_handle_t hal_soc_hdl,
 	HAL_MON_VADDR_HI_SET(mon_entry, vaddr_hi);
 }
 
-/**
- * hal_mon_buf_get() - Get monitor descriptor
- * @hal_soc_hdl: HAL Soc handle
- * @desc: HAL monitor descriptor
- *
- * Return: none
- */
-static inline
-void hal_mon_buf_get(hal_soc_handle_t hal_soc_hdl,
-		     void *dst_ring_desc,
-		     struct hal_mon_desc *mon_desc)
-{
-	struct mon_destination_ring *hal_dst_ring =
-			(struct mon_destination_ring *)dst_ring_desc;
-
-	mon_desc->buf_addr =
-		((u64)hal_dst_ring->stat_buf_virt_addr_31_0 |
-		 ((u64)hal_dst_ring->stat_buf_virt_addr_63_32 << 32));
-	mon_desc->ppdu_id = hal_dst_ring->ppdu_id;
-	mon_desc->end_offset = hal_dst_ring->end_offset;
-	mon_desc->end_reason = hal_dst_ring->end_reason;
-	mon_desc->initiator = hal_dst_ring->initiator;
-	mon_desc->ring_id = hal_dst_ring->ring_id;
-	mon_desc->empty_descriptor = hal_dst_ring->empty_descriptor;
-	mon_desc->looping_count = hal_dst_ring->looping_count;
-}
-
 /* TX monitor */
 #define TX_MON_STATUS_BUF_SIZE 2048
 
@@ -295,7 +268,8 @@ hal_txmon_status_free_buffer(hal_soc_handle_t hal_soc_hdl,
 {
 	struct hal_soc *hal_soc = (struct hal_soc *)hal_soc_hdl;
 
-	hal_soc->ops->hal_txmon_status_free_buffer(status_frag);
+	if (hal_soc->ops->hal_txmon_status_free_buffer)
+		hal_soc->ops->hal_txmon_status_free_buffer(status_frag);
 }
 #endif /* QCA_MONITOR_2_0_SUPPORT */
 #endif /* _HAL_BE_API_MON_H_ */

+ 7 - 2
hal/wifi3.0/qcn9224/hal_9224.c

@@ -2326,10 +2326,11 @@ struct hal_hw_srng_config hw_srng_table_9224[] = {
 		HWIO_WBM_R0_PPE_RELEASE_RING_BASE_MSB_RING_SIZE_BMSK >>
 		HWIO_WBM_R0_PPE_RELEASE_RING_BASE_MSB_RING_SIZE_SHFT,
 	},
+#ifdef QCA_MONITOR_2_0_SUPPORT
 	{ /* TX_MONITOR_BUF */
 		.start_ring_id = HAL_SRNG_SW2TXMON_BUF0,
 		.max_rings = 1,
-		.entry_size = sizeof(struct wbm_buffer_ring) >> 2,
+		.entry_size = sizeof(struct mon_ingress_ring) >> 2,
 		.lmac_ring = TRUE,
 		.ring_dir = HAL_SRNG_SRC_RING,
 		/* reg_start is not set because LMAC rings are not accessed
@@ -2342,7 +2343,7 @@ struct hal_hw_srng_config hw_srng_table_9224[] = {
 	{ /* TX_MONITOR_DST */
 		.start_ring_id = HAL_SRNG_WMAC1_TXMON2SW0,
 		.max_rings = 1,
-		.entry_size = sizeof(struct sw_monitor_ring) >> 2,
+		.entry_size = sizeof(struct mon_destination_ring) >> 2,
 		.lmac_ring = TRUE,
 		.ring_dir = HAL_SRNG_DST_RING,
 		/* reg_start is not set because LMAC rings are not accessed
@@ -2352,6 +2353,10 @@ struct hal_hw_srng_config hw_srng_table_9224[] = {
 		.reg_size = {},
 		.max_size = HAL_RXDMA_MAX_RING_SIZE_BE,
 	},
+#else
+	{},
+	{},
+#endif
 	{ /* SW2RXDMA */
 		.start_ring_id = HAL_SRNG_SW2RXDMA_BUF0,
 		.max_rings = 3,