Просмотр исходного кода

qcacmn: Rearrange the functions to appropriate files

Rearrange the functions to appropriate files based on TX and RX 2.0.

Change-Id: Ie8e562a7aecdc91257210b55a323dfe47e67878c
CRs-Fixed: 3427296
Srinivas Girigowda 2 лет назад
Родитель
Сommit
ce736a1d8d

+ 0 - 4
dp/wifi3.0/dp_rx.h

@@ -57,10 +57,6 @@
 #endif
 
 #define RX_BUFFER_RESERVATION   0
-#ifdef BE_PKTLOG_SUPPORT
-#define BUFFER_RESIDUE 1
-#define RX_MON_MIN_HEAD_ROOM   64
-#endif
 
 #define DP_DEFAULT_NOISEFLOOR	(-96)
 

+ 284 - 532
dp/wifi3.0/monitor/2.0/dp_mon_2.0.c

@@ -34,126 +34,6 @@
 #endif
 
 #if !defined(DISABLE_MON_CONFIG)
-
-QDF_STATUS dp_rx_mon_ppdu_info_cache_create(struct dp_pdev *pdev)
-{
-	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);
-	uint16_t obj;
-	struct hal_rx_ppdu_info *ppdu_info = NULL;
-
-	mon_pdev_be->ppdu_info_cache =
-		qdf_kmem_cache_create("rx_mon_ppdu_info_cache",
-				      sizeof(struct hal_rx_ppdu_info));
-
-	if (!mon_pdev_be->ppdu_info_cache) {
-		dp_mon_err("cache creation failed pdev :%px", pdev);
-		return QDF_STATUS_E_NOMEM;
-	}
-
-	TAILQ_INIT(&mon_pdev_be->rx_mon_free_queue);
-	for (obj = 0; obj < DP_RX_MON_WQ_THRESHOLD; obj++) {
-		ppdu_info =  (struct hal_rx_ppdu_info *)qdf_kmem_cache_alloc(mon_pdev_be->ppdu_info_cache);
-
-		if (ppdu_info) {
-			TAILQ_INSERT_TAIL(&mon_pdev_be->rx_mon_free_queue,
-					  ppdu_info,
-					  ppdu_free_list_elem);
-			mon_pdev_be->total_free_elem++;
-		}
-	}
-	qdf_spinlock_create(&mon_pdev_be->ppdu_info_lock);
-
-	return QDF_STATUS_SUCCESS;
-}
-
-void dp_rx_mon_ppdu_info_cache_destroy(struct dp_pdev *pdev)
-{
-	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);
-	struct hal_rx_ppdu_info *ppdu_info = NULL, *temp_ppdu_info = NULL;
-
-	qdf_spin_lock(&mon_pdev_be->ppdu_info_lock);
-	TAILQ_FOREACH_SAFE(ppdu_info,
-			   &mon_pdev_be->rx_mon_free_queue,
-			   ppdu_free_list_elem,
-			   temp_ppdu_info) {
-		TAILQ_REMOVE(&mon_pdev_be->rx_mon_free_queue,
-			     ppdu_info, ppdu_free_list_elem);
-		if (ppdu_info) {
-			mon_pdev_be->total_free_elem--;
-			qdf_kmem_cache_free(mon_pdev_be->ppdu_info_cache,
-					    ppdu_info);
-		}
-	}
-	qdf_spin_unlock(&mon_pdev_be->ppdu_info_lock);
-	dp_mon_debug(" total free element: %d", mon_pdev_be->total_free_elem);
-	qdf_kmem_cache_destroy(mon_pdev_be->ppdu_info_cache);
-}
-
-/**
- * dp_mon_pdev_ext_init_2_0() - Init pdev ext param
- *
- * @pdev: DP pdev handle
- *
- * Return:  QDF_STATUS_SUCCESS: Success
- *          QDF_STATUS_E_FAILURE: failure
- */
-QDF_STATUS dp_mon_pdev_ext_init_2_0(struct dp_pdev *pdev)
-{
-	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);
-
-	qdf_create_work(0, &mon_pdev_be->rx_mon_work,
-			dp_rx_mon_process_ppdu, pdev);
-	mon_pdev_be->rx_mon_workqueue =
-		qdf_alloc_unbound_workqueue("rx_mon_work_queue");
-
-	if (!mon_pdev_be->rx_mon_workqueue) {
-		dp_mon_err("failed to create rxmon wq mon_pdev: %pK", mon_pdev);
-		goto fail;
-	}
-	TAILQ_INIT(&mon_pdev_be->rx_mon_queue);
-
-	qdf_spinlock_create(&mon_pdev_be->rx_mon_wq_lock);
-
-	return QDF_STATUS_SUCCESS;
-
-fail:
-	return QDF_STATUS_E_FAILURE;
-}
-
-/**
- * dp_mon_pdev_ext_deinit_2_0() - denit pdev ext param
- *
- * @pdev: DP pdev handle
- *
- * Return: QDF_STATUS_SUCCESS
- */
-QDF_STATUS dp_mon_pdev_ext_deinit_2_0(struct dp_pdev *pdev)
-{
-	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 (!mon_pdev_be->rx_mon_workqueue)
-		return QDF_STATUS_E_FAILURE;
-
-	qdf_err(" total free element: %d", mon_pdev_be->total_free_elem);
-	qdf_flush_workqueue(0, mon_pdev_be->rx_mon_workqueue);
-	qdf_destroy_workqueue(0, mon_pdev_be->rx_mon_workqueue);
-	qdf_flush_work(&mon_pdev_be->rx_mon_work);
-	qdf_disable_work(&mon_pdev_be->rx_mon_work);
-	dp_rx_mon_drain_wq(pdev);
-	mon_pdev_be->rx_mon_workqueue = NULL;
-	qdf_spinlock_destroy(&mon_pdev_be->rx_mon_wq_lock);
-
-	return QDF_STATUS_SUCCESS;
-}
-
 /*
  * dp_mon_add_desc_list_to_free_list() - append unused desc_list back to
  *					freelist.
@@ -220,32 +100,6 @@ dp_mon_get_free_desc_list(struct dp_soc *soc,
 	return count;
 }
 
-void dp_mon_pool_frag_unmap_and_free(struct dp_soc *soc,
-				     struct dp_mon_desc_pool *mon_desc_pool)
-{
-	int desc_id;
-	qdf_frag_t vaddr;
-	qdf_dma_addr_t paddr;
-
-	qdf_spin_lock_bh(&mon_desc_pool->lock);
-	for (desc_id = 0; desc_id < mon_desc_pool->pool_size; desc_id++) {
-		if (mon_desc_pool->array[desc_id].mon_desc.in_use) {
-			vaddr = mon_desc_pool->array[desc_id].mon_desc.buf_addr;
-			paddr = mon_desc_pool->array[desc_id].mon_desc.paddr;
-
-			if (!(mon_desc_pool->array[desc_id].mon_desc.unmapped)) {
-				qdf_mem_unmap_page(soc->osdev, paddr,
-						   mon_desc_pool->buf_size,
-						   QDF_DMA_FROM_DEVICE);
-				mon_desc_pool->array[desc_id].mon_desc.unmapped = 1;
-				mon_desc_pool->array[desc_id].mon_desc.cookie = desc_id;
-			}
-			qdf_frag_free(vaddr);
-		}
-	}
-	qdf_spin_unlock_bh(&mon_desc_pool->lock);
-}
-
 static inline QDF_STATUS
 dp_mon_frag_alloc_and_map(struct dp_soc *dp_soc,
 			  struct dp_mon_desc *mon_desc,
@@ -276,123 +130,6 @@ dp_mon_frag_alloc_and_map(struct dp_soc *dp_soc,
 	return QDF_STATUS_SUCCESS;
 }
 
-QDF_STATUS
-dp_mon_buffers_replenish(struct dp_soc *dp_soc,
-			 struct dp_srng *dp_mon_srng,
-			 struct dp_mon_desc_pool *mon_desc_pool,
-			 uint32_t num_req_buffers,
-			 union dp_mon_desc_list_elem_t **desc_list,
-			 union dp_mon_desc_list_elem_t **tail,
-			 uint32_t *replenish_cnt_ref)
-{
-	uint32_t num_alloc_desc;
-	uint32_t num_entries_avail;
-	uint32_t count = 0;
-	int sync_hw_ptr = 1;
-	struct dp_mon_desc mon_desc = {0};
-	void *mon_ring_entry;
-	union dp_mon_desc_list_elem_t *next;
-	void *mon_srng;
-	QDF_STATUS ret = QDF_STATUS_E_FAILURE;
-	struct dp_mon_soc *mon_soc = dp_soc->monitor_soc;
-
-	if (!num_req_buffers) {
-		dp_mon_debug("%pK: Received request for 0 buffers replenish",
-			     dp_soc);
-		ret = QDF_STATUS_E_INVAL;
-		goto free_desc;
-	}
-
-	mon_srng = dp_mon_srng->hal_srng;
-
-	hal_srng_access_start(dp_soc->hal_soc, mon_srng);
-
-	num_entries_avail = hal_srng_src_num_avail(dp_soc->hal_soc,
-						   mon_srng, sync_hw_ptr);
-
-	if (!num_entries_avail) {
-		hal_srng_access_end(dp_soc->hal_soc, mon_srng);
-		goto free_desc;
-	}
-	if (num_entries_avail < num_req_buffers) {
-		num_req_buffers = num_entries_avail;
-	}
-
-	/*
-	 * if desc_list is NULL, allocate the descs from freelist
-	 */
-	if (!(*desc_list)) {
-		num_alloc_desc = dp_mon_get_free_desc_list(dp_soc,
-							   mon_desc_pool,
-							   num_req_buffers,
-							   desc_list,
-							   tail);
-
-		if (!num_alloc_desc) {
-			dp_mon_debug("%pK: no free rx_descs in freelist", dp_soc);
-			hal_srng_access_end(dp_soc->hal_soc, mon_srng);
-			return QDF_STATUS_E_NOMEM;
-		}
-
-		dp_mon_info("%pK: %d rx desc allocated",
-			    dp_soc, num_alloc_desc);
-
-		num_req_buffers = num_alloc_desc;
-	}
-
-	while (count <= num_req_buffers - 1) {
-		ret = dp_mon_frag_alloc_and_map(dp_soc,
-						&mon_desc,
-						mon_desc_pool);
-
-		if (qdf_unlikely(QDF_IS_STATUS_ERROR(ret))) {
-			if (qdf_unlikely(ret  == QDF_STATUS_E_FAULT))
-				continue;
-			break;
-		}
-
-		count++;
-		next = (*desc_list)->next;
-		mon_ring_entry = hal_srng_src_get_next(
-						dp_soc->hal_soc,
-						mon_srng);
-
-		if (!mon_ring_entry)
-			break;
-
-		qdf_assert_always((*desc_list)->mon_desc.in_use == 0);
-
-		(*desc_list)->mon_desc.in_use = 1;
-		(*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;
-
-		mon_soc->stats.frag_alloc++;
-		hal_mon_buff_addr_info_set(dp_soc->hal_soc,
-					   mon_ring_entry,
-					   &((*desc_list)->mon_desc),
-					   mon_desc.paddr);
-
-		*desc_list = next;
-	}
-
-	hal_srng_access_end(dp_soc->hal_soc, mon_srng);
-	if (replenish_cnt_ref)
-		*replenish_cnt_ref += count;
-
-free_desc:
-	/*
-	 * add any available free desc back to the free list
-	 */
-	if (*desc_list) {
-		dp_mon_add_desc_list_to_free_list(dp_soc, desc_list, tail,
-						  mon_desc_pool);
-	}
-
-	return ret;
-}
-
 QDF_STATUS
 dp_mon_desc_pool_init(struct dp_mon_desc_pool *mon_desc_pool,
 		      uint32_t pool_size)
@@ -441,16 +178,6 @@ void dp_mon_desc_pool_free(struct dp_mon_desc_pool *mon_desc_pool)
 	qdf_mem_free(mon_desc_pool->array);
 }
 
-QDF_STATUS dp_mon_desc_pool_alloc(uint32_t pool_size,
-				  struct dp_mon_desc_pool *mon_desc_pool)
-{
-	mon_desc_pool->pool_size = pool_size - 1;
-	mon_desc_pool->array = qdf_mem_malloc((mon_desc_pool->pool_size) *
-				     sizeof(union dp_mon_desc_list_elem_t));
-
-	return QDF_STATUS_SUCCESS;
-}
-
 QDF_STATUS dp_vdev_set_monitor_mode_buf_rings_rx_2_0(struct dp_pdev *pdev)
 {
 	int rx_mon_max_entries;
@@ -495,53 +222,6 @@ QDF_STATUS dp_vdev_set_monitor_mode_buf_rings_rx_2_0(struct dp_pdev *pdev)
 	return QDF_STATUS_SUCCESS;
 }
 
-QDF_STATUS dp_vdev_set_monitor_mode_buf_rings_tx_2_0(struct dp_pdev *pdev,
-						     uint16_t num_of_buffers)
-{
-	int tx_mon_max_entries;
-	struct wlan_cfg_dp_soc_ctxt *soc_cfg_ctx;
-	struct dp_soc *soc = pdev->soc;
-	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);
-	QDF_STATUS status;
-
-	if (!mon_soc_be) {
-		dp_mon_err("DP MON SOC is NULL");
-		return QDF_STATUS_E_FAILURE;
-	}
-
-	soc_cfg_ctx = soc->wlan_cfg_ctx;
-	tx_mon_max_entries =
-		wlan_cfg_get_dp_soc_tx_mon_buf_ring_size(soc_cfg_ctx);
-
-	hal_set_low_threshold(mon_soc_be->tx_mon_buf_ring.hal_srng,
-			      tx_mon_max_entries >> 2);
-	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_mon_err("Failed to send htt srng setup message for Tx mon buf ring");
-		return status;
-	}
-
-	if (mon_soc_be->tx_mon_ring_fill_level < num_of_buffers) {
-		if (dp_tx_mon_buffers_alloc(soc,
-					    (num_of_buffers -
-					     mon_soc_be->tx_mon_ring_fill_level))) {
-			dp_mon_err("%pK: Tx mon buffers allocation failed",
-				   soc);
-			return QDF_STATUS_E_FAILURE;
-		}
-		mon_soc_be->tx_mon_ring_fill_level +=
-					(num_of_buffers -
-					mon_soc_be->tx_mon_ring_fill_level);
-	}
-
-	return QDF_STATUS_SUCCESS;
-}
-
 static
 QDF_STATUS dp_vdev_set_monitor_mode_buf_rings_2_0(struct dp_pdev *pdev)
 {
@@ -839,39 +519,6 @@ QDF_STATUS dp_mon_pdev_htt_srng_setup_2_0(struct dp_soc *soc,
 	return status;
 }
 
-QDF_STATUS dp_tx_mon_refill_buf_ring_2_0(struct dp_intr *int_ctx)
-{
-	struct dp_soc *soc  = int_ctx->soc;
-	struct dp_mon_soc *mon_soc = soc->monitor_soc;
-	union dp_mon_desc_list_elem_t *desc_list = NULL;
-	union dp_mon_desc_list_elem_t *tail = NULL;
-	struct dp_srng *tx_mon_buf_ring;
-	struct dp_intr_stats *intr_stats = &int_ctx->intr_stats;
-	struct dp_mon_soc_be *mon_soc_be = dp_get_be_mon_soc_from_dp_mon_soc(mon_soc);
-	uint32_t num_entries_avail;
-	int sync_hw_ptr = 1;
-	void *hal_srng;
-
-	tx_mon_buf_ring = &mon_soc_be->tx_mon_buf_ring;
-	hal_srng = tx_mon_buf_ring->hal_srng;
-
-	intr_stats->num_host2txmon_ring__masks++;
-	mon_soc_be->tx_low_thresh_intrs++;
-	hal_srng_access_start(soc->hal_soc, hal_srng);
-	num_entries_avail = hal_srng_src_num_avail(soc->hal_soc,
-						   hal_srng,
-						   sync_hw_ptr);
-	hal_srng_access_end(soc->hal_soc, hal_srng);
-
-	if (num_entries_avail)
-		dp_mon_buffers_replenish(soc, tx_mon_buf_ring,
-					 &mon_soc_be->tx_desc_mon,
-					 num_entries_avail, &desc_list, &tail,
-					 NULL);
-
-	return QDF_STATUS_SUCCESS;
-}
-
 QDF_STATUS dp_rx_mon_refill_buf_ring_2_0(struct dp_intr *int_ctx)
 {
 	struct dp_soc *soc  = int_ctx->soc;
@@ -954,55 +601,6 @@ static void dp_mon_soc_deinit_2_0(struct dp_soc *soc)
 	mon_soc_be->is_dp_mon_soc_initialized = false;
 }
 
-static
-QDF_STATUS dp_rx_mon_soc_init_2_0(struct dp_soc *soc)
-{
-	if (dp_srng_init(soc, &soc->rxdma_mon_buf_ring[0],
-			 RXDMA_MONITOR_BUF, 0, 0)) {
-		dp_mon_err("%pK: " RNG_ERR "rx_mon_buf_ring", soc);
-		goto fail;
-	}
-
-	if (dp_rx_mon_buf_desc_pool_init(soc)) {
-		dp_mon_err("%pK: " RNG_ERR "rx mon desc pool init", soc);
-		goto fail;
-	}
-
-	/* monitor buffers for src */
-	if (dp_rx_mon_buffers_alloc(soc, DP_MON_RING_FILL_LEVEL_DEFAULT)) {
-		dp_mon_err("%pK: Rx mon buffers allocation failed", soc);
-		goto fail;
-	}
-
-	return QDF_STATUS_SUCCESS;
-fail:
-	return QDF_STATUS_E_FAILURE;
-}
-
-static
-QDF_STATUS dp_tx_mon_soc_init_2_0(struct dp_soc *soc)
-{
-	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);
-
-	if (dp_srng_init(soc, &mon_soc_be->tx_mon_buf_ring,
-			 TX_MONITOR_BUF, 0, 0)) {
-		dp_mon_err("%pK: " RNG_ERR "tx_mon_buf_ring", soc);
-		goto fail;
-	}
-
-	if (dp_tx_mon_buf_desc_pool_init(soc)) {
-		dp_mon_err("%pK: " RNG_ERR "tx mon desc pool init", soc);
-		goto fail;
-	}
-
-	return QDF_STATUS_SUCCESS;
-fail:
-	return QDF_STATUS_E_FAILURE;
-}
-
-static
 QDF_STATUS dp_mon_soc_init_2_0(struct dp_soc *soc)
 {
 	struct dp_mon_soc *mon_soc = soc->monitor_soc;
@@ -1083,208 +681,384 @@ fail:
 }
 
 static
+void dp_mon_pdev_free_2_0(struct dp_pdev *pdev)
+{
+}
+
+static
+QDF_STATUS dp_mon_pdev_alloc_2_0(struct dp_pdev *pdev)
+{
+	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 (!mon_pdev_be) {
+		dp_mon_err("DP MON PDEV is NULL");
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	return QDF_STATUS_SUCCESS;
+}
+
+#else
+static inline
+QDF_STATUS dp_mon_htt_srng_setup_2_0(struct dp_soc *soc,
+				     struct dp_pdev *pdev,
+				     int mac_id,
+				     int mac_for_pdev)
+{
+	return QDF_STATUS_SUCCESS;
+}
+
+static uint32_t
+dp_tx_mon_process_2_0(struct dp_soc *soc, struct dp_intr *int_ctx,
+		      uint32_t mac_id, uint32_t quota)
+{
+	return 0;
+}
+
+static inline
+QDF_STATUS dp_mon_soc_attach_2_0(struct dp_soc *soc)
+{
+	return status;
+}
+
+static inline
+QDF_STATUS dp_mon_soc_detach_2_0(struct dp_soc *soc)
+{
+	return status;
+}
+
+static inline
+void dp_pdev_mon_rings_deinit_2_0(struct dp_pdev *pdev)
+{
+}
+
+static inline
+QDF_STATUS dp_pdev_mon_rings_init_2_0(struct dp_soc *soc, struct dp_pdev *pdev)
+{
+	return QDF_STATUS_SUCCESS;
+}
+
+static inline
+void dp_pdev_mon_rings_free_2_0(struct dp_pdev *pdev)
+{
+}
+
+static inline
+QDF_STATUS dp_pdev_mon_rings_alloc_2_0(struct dp_soc *soc, struct dp_pdev *pdev)
+{
+	return QDF_STATUS_SUCCESS;
+}
+
+static inline
+void dp_mon_pdev_free_2_0(struct dp_pdev *pdev)
+{
+}
+
+static inline
+QDF_STATUS dp_mon_pdev_alloc_2_0(struct dp_pdev *pdev)
+{
+	return QDF_STATUS_SUCCESS;
+}
+
+static inline
+void dp_vdev_set_monitor_mode_buf_rings_2_0(struct dp_pdev *pdev)
+{
+}
+
+static inline
+QDF_STATUS dp_vdev_set_monitor_mode_rings_2_0(struct dp_pdev *pdev,
+					      uint8_t delayed_replenish)
+{
+	return QDF_STATUS_SUCCESS;
+}
+#endif
+
 void dp_pdev_mon_rings_deinit_2_0(struct dp_pdev *pdev)
 {
 	int mac_id = 0;
 	struct dp_soc *soc = pdev->soc;
-	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);
 
 	for (mac_id = 0; mac_id < DP_NUM_MACS_PER_PDEV; mac_id++) {
 		int lmac_id = dp_get_lmac_id_for_pdev_id(soc, mac_id,
 							 pdev->pdev_id);
 
-		dp_srng_deinit(soc, &soc->rxdma_mon_dst_ring[lmac_id],
-			       RXDMA_MONITOR_DST, pdev->pdev_id);
-		dp_srng_deinit(soc, &mon_soc_be->tx_mon_dst_ring[lmac_id],
-			       TX_MONITOR_DST, pdev->pdev_id);
+		dp_rx_mon_pdev_rings_deinit_2_0(pdev, lmac_id);
+		dp_tx_mon_pdev_rings_deinit_2_0(pdev, lmac_id);
 	}
 }
 
-static
 QDF_STATUS dp_pdev_mon_rings_init_2_0(struct dp_pdev *pdev)
 {
 	struct dp_soc *soc = pdev->soc;
 	int mac_id = 0;
-	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);
+	QDF_STATUS status = QDF_STATUS_SUCCESS;
 
 	for (mac_id = 0; mac_id < DP_NUM_MACS_PER_PDEV; mac_id++) {
 		int lmac_id = dp_get_lmac_id_for_pdev_id(soc, mac_id,
 							 pdev->pdev_id);
 
-		if (dp_srng_init(soc, &soc->rxdma_mon_dst_ring[lmac_id],
-				 RXDMA_MONITOR_DST, pdev->pdev_id, lmac_id)) {
+		status = dp_rx_mon_pdev_rings_init_2_0(pdev, lmac_id);
+		if (QDF_IS_STATUS_ERROR(status)) {
 			dp_mon_err("%pK: " RNG_ERR "rxdma_mon_dst_ring", soc);
 			goto fail;
 		}
 
-		if (dp_srng_init(soc, &mon_soc_be->tx_mon_dst_ring[lmac_id],
-				 TX_MONITOR_DST, pdev->pdev_id, lmac_id)) {
+		status = dp_tx_mon_pdev_rings_init_2_0(pdev, lmac_id);
+		if (QDF_IS_STATUS_ERROR(status)) {
 			dp_mon_err("%pK: " RNG_ERR "tx_mon_dst_ring", soc);
 			goto fail;
 		}
 	}
-	return QDF_STATUS_SUCCESS;
+	return status;
 
 fail:
 	dp_pdev_mon_rings_deinit_2_0(pdev);
-	return QDF_STATUS_E_NOMEM;
+	return status;
 }
 
-static
 void dp_pdev_mon_rings_free_2_0(struct dp_pdev *pdev)
 {
 	int mac_id = 0;
 	struct dp_soc *soc = pdev->soc;
-	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);
 
 	for (mac_id = 0; mac_id < DP_NUM_MACS_PER_PDEV; mac_id++) {
 		int lmac_id = dp_get_lmac_id_for_pdev_id(soc, mac_id,
 							 pdev->pdev_id);
 
-		dp_srng_free(soc, &soc->rxdma_mon_dst_ring[lmac_id]);
-		dp_srng_free(soc, &mon_soc_be->tx_mon_dst_ring[lmac_id]);
+		dp_rx_mon_pdev_rings_free_2_0(pdev, lmac_id);
+		dp_tx_mon_pdev_rings_free_2_0(pdev, lmac_id);
 	}
 }
 
-static
 QDF_STATUS dp_pdev_mon_rings_alloc_2_0(struct dp_pdev *pdev)
 {
 	struct dp_soc *soc = pdev->soc;
-	int mac_id = 0;
-	int entries;
-	struct wlan_cfg_dp_pdev_ctxt *pdev_cfg_ctx;
-	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);
-
-	pdev_cfg_ctx = pdev->wlan_cfg_ctx;
+	int mac_id = 0;
+	QDF_STATUS status = QDF_STATUS_SUCCESS;
 
 	for (mac_id = 0; mac_id < DP_NUM_MACS_PER_PDEV; mac_id++) {
 		int lmac_id =
 		dp_get_lmac_id_for_pdev_id(soc, mac_id, pdev->pdev_id);
 
-		entries = wlan_cfg_get_dma_rx_mon_dest_ring_size(pdev_cfg_ctx);
-		if (dp_srng_alloc(soc, &soc->rxdma_mon_dst_ring[lmac_id],
-				  RXDMA_MONITOR_DST, entries, 0)) {
+		status = dp_rx_mon_pdev_rings_alloc_2_0(pdev, lmac_id);
+		if (QDF_IS_STATUS_ERROR(status)) {
 			dp_err("%pK: " RNG_ERR "rxdma_mon_dst_ring", pdev);
 			goto fail;
 		}
 
-		entries = wlan_cfg_get_dma_tx_mon_dest_ring_size(pdev_cfg_ctx);
-		if (dp_srng_alloc(soc, &mon_soc_be->tx_mon_dst_ring[lmac_id],
-				  TX_MONITOR_DST, entries, 0)) {
+		status = dp_tx_mon_pdev_rings_alloc_2_0(pdev, lmac_id);
+		if (QDF_IS_STATUS_ERROR(status)) {
 			dp_err("%pK: " RNG_ERR "tx_mon_dst_ring", pdev);
 			goto fail;
 		}
 	}
-	return QDF_STATUS_SUCCESS;
+	return status;
 
 fail:
 	dp_pdev_mon_rings_free_2_0(pdev);
-	return QDF_STATUS_E_NOMEM;
+	return status;
 }
 
-static
-void dp_mon_pdev_free_2_0(struct dp_pdev *pdev)
+void dp_mon_pool_frag_unmap_and_free(struct dp_soc *soc,
+				     struct dp_mon_desc_pool *mon_desc_pool)
 {
+	int desc_id;
+	qdf_frag_t vaddr;
+	qdf_dma_addr_t paddr;
+
+	qdf_spin_lock_bh(&mon_desc_pool->lock);
+	for (desc_id = 0; desc_id < mon_desc_pool->pool_size; desc_id++) {
+		if (mon_desc_pool->array[desc_id].mon_desc.in_use) {
+			vaddr = mon_desc_pool->array[desc_id].mon_desc.buf_addr;
+			paddr = mon_desc_pool->array[desc_id].mon_desc.paddr;
+
+			if (!(mon_desc_pool->array[desc_id].mon_desc.unmapped)) {
+				qdf_mem_unmap_page(soc->osdev, paddr,
+						   mon_desc_pool->buf_size,
+						   QDF_DMA_FROM_DEVICE);
+				mon_desc_pool->array[desc_id].mon_desc.unmapped = 1;
+				mon_desc_pool->array[desc_id].mon_desc.cookie = desc_id;
+			}
+			qdf_frag_free(vaddr);
+		}
+	}
+	qdf_spin_unlock_bh(&mon_desc_pool->lock);
 }
 
-static
-QDF_STATUS dp_mon_pdev_alloc_2_0(struct dp_pdev *pdev)
+QDF_STATUS
+dp_mon_buffers_replenish(struct dp_soc *dp_soc,
+			 struct dp_srng *dp_mon_srng,
+			 struct dp_mon_desc_pool *mon_desc_pool,
+			 uint32_t num_req_buffers,
+			 union dp_mon_desc_list_elem_t **desc_list,
+			 union dp_mon_desc_list_elem_t **tail,
+			 uint32_t *replenish_cnt_ref)
 {
-	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);
+	uint32_t num_alloc_desc;
+	uint32_t num_entries_avail;
+	uint32_t count = 0;
+	int sync_hw_ptr = 1;
+	struct dp_mon_desc mon_desc = {0};
+	void *mon_ring_entry;
+	union dp_mon_desc_list_elem_t *next;
+	void *mon_srng;
+	QDF_STATUS ret = QDF_STATUS_E_FAILURE;
+	struct dp_mon_soc *mon_soc = dp_soc->monitor_soc;
 
-	if (!mon_pdev_be) {
-		dp_mon_err("DP MON PDEV is NULL");
-		return QDF_STATUS_E_FAILURE;
+	if (!num_req_buffers) {
+		dp_mon_debug("%pK: Received request for 0 buffers replenish",
+			     dp_soc);
+		ret = QDF_STATUS_E_INVAL;
+		goto free_desc;
 	}
 
-	return QDF_STATUS_SUCCESS;
-}
+	mon_srng = dp_mon_srng->hal_srng;
 
-#else
-static inline
-QDF_STATUS dp_mon_htt_srng_setup_2_0(struct dp_soc *soc,
-				     struct dp_pdev *pdev,
-				     int mac_id,
-				     int mac_for_pdev)
-{
-	return QDF_STATUS_SUCCESS;
-}
+	hal_srng_access_start(dp_soc->hal_soc, mon_srng);
 
-static uint32_t
-dp_tx_mon_process_2_0(struct dp_soc *soc, struct dp_intr *int_ctx,
-		      uint32_t mac_id, uint32_t quota)
-{
-	return 0;
-}
+	num_entries_avail = hal_srng_src_num_avail(dp_soc->hal_soc,
+						   mon_srng, sync_hw_ptr);
 
-static void
-dp_tx_mon_print_ring_stat_2_0(struct dp_pdev *pdev)
-{
-}
+	if (!num_entries_avail) {
+		hal_srng_access_end(dp_soc->hal_soc, mon_srng);
+		goto free_desc;
+	}
+	if (num_entries_avail < num_req_buffers)
+		num_req_buffers = num_entries_avail;
 
-static inline
-QDF_STATUS dp_mon_soc_attach_2_0(struct dp_soc *soc)
-{
-	return status;
-}
+	/*
+	 * if desc_list is NULL, allocate the descs from freelist
+	 */
+	if (!(*desc_list)) {
+		num_alloc_desc = dp_mon_get_free_desc_list(dp_soc,
+							   mon_desc_pool,
+							   num_req_buffers,
+							   desc_list,
+							   tail);
 
-static inline
-QDF_STATUS dp_mon_soc_detach_2_0(struct dp_soc *soc)
-{
-	return status;
-}
+		if (!num_alloc_desc) {
+			dp_mon_debug("%pK: no free rx_descs in freelist", dp_soc);
+			hal_srng_access_end(dp_soc->hal_soc, mon_srng);
+			return QDF_STATUS_E_NOMEM;
+		}
 
-static inline
-void dp_pdev_mon_rings_deinit_2_0(struct dp_pdev *pdev)
-{
-}
+		dp_mon_info("%pK: %d rx desc allocated",
+			    dp_soc, num_alloc_desc);
 
-static inline
-QDF_STATUS dp_pdev_mon_rings_init_2_0(struct dp_soc *soc, struct dp_pdev *pdev)
-{
-	return QDF_STATUS_SUCCESS;
-}
+		num_req_buffers = num_alloc_desc;
+	}
 
-static inline
-void dp_pdev_mon_rings_free_2_0(struct dp_pdev *pdev)
-{
-}
+	while (count <= num_req_buffers - 1) {
+		ret = dp_mon_frag_alloc_and_map(dp_soc,
+						&mon_desc,
+						mon_desc_pool);
 
-static inline
-QDF_STATUS dp_pdev_mon_rings_alloc_2_0(struct dp_soc *soc, struct dp_pdev *pdev)
-{
-	return QDF_STATUS_SUCCESS;
-}
+		if (qdf_unlikely(QDF_IS_STATUS_ERROR(ret))) {
+			if (qdf_unlikely(ret  == QDF_STATUS_E_FAULT))
+				continue;
+			break;
+		}
 
-static inline
-void dp_mon_pdev_free_2_0(struct dp_pdev *pdev)
-{
+		count++;
+		next = (*desc_list)->next;
+		mon_ring_entry = hal_srng_src_get_next(
+						dp_soc->hal_soc,
+						mon_srng);
+
+		if (!mon_ring_entry)
+			break;
+
+		qdf_assert_always((*desc_list)->mon_desc.in_use == 0);
+
+		(*desc_list)->mon_desc.in_use = 1;
+		(*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;
+
+		mon_soc->stats.frag_alloc++;
+		hal_mon_buff_addr_info_set(dp_soc->hal_soc,
+					   mon_ring_entry,
+					   &((*desc_list)->mon_desc),
+					   mon_desc.paddr);
+
+		*desc_list = next;
+	}
+
+	hal_srng_access_end(dp_soc->hal_soc, mon_srng);
+	if (replenish_cnt_ref)
+		*replenish_cnt_ref += count;
+
+free_desc:
+	/*
+	 * add any available free desc back to the free list
+	 */
+	if (*desc_list) {
+		dp_mon_add_desc_list_to_free_list(dp_soc, desc_list, tail,
+						  mon_desc_pool);
+	}
+
+	return ret;
 }
 
-static inline
-QDF_STATUS dp_mon_pdev_alloc_2_0(struct dp_pdev *pdev)
+QDF_STATUS dp_mon_desc_pool_alloc(uint32_t pool_size,
+				  struct dp_mon_desc_pool *mon_desc_pool)
 {
+	mon_desc_pool->pool_size = pool_size - 1;
+	mon_desc_pool->array = qdf_mem_malloc((mon_desc_pool->pool_size) *
+				     sizeof(union dp_mon_desc_list_elem_t));
+
 	return QDF_STATUS_SUCCESS;
 }
 
-static inline
-void dp_vdev_set_monitor_mode_buf_rings_2_0(struct dp_pdev *pdev)
+QDF_STATUS dp_vdev_set_monitor_mode_buf_rings_tx_2_0(struct dp_pdev *pdev,
+						     uint16_t num_of_buffers)
 {
-}
+	int tx_mon_max_entries;
+	struct wlan_cfg_dp_soc_ctxt *soc_cfg_ctx;
+	struct dp_soc *soc = pdev->soc;
+	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);
+	QDF_STATUS status;
+
+	if (!mon_soc_be) {
+		dp_mon_err("DP MON SOC is NULL");
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	soc_cfg_ctx = soc->wlan_cfg_ctx;
+	tx_mon_max_entries =
+		wlan_cfg_get_dp_soc_tx_mon_buf_ring_size(soc_cfg_ctx);
+
+	hal_set_low_threshold(mon_soc_be->tx_mon_buf_ring.hal_srng,
+			      tx_mon_max_entries >> 2);
+	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_mon_err("Failed to send htt srng setup message for Tx mon buf ring");
+		return status;
+	}
+
+	if (mon_soc_be->tx_mon_ring_fill_level < num_of_buffers) {
+		if (dp_tx_mon_buffers_alloc(soc,
+					    (num_of_buffers -
+					     mon_soc_be->tx_mon_ring_fill_level))) {
+			dp_mon_err("%pK: Tx mon buffers allocation failed",
+				   soc);
+			return QDF_STATUS_E_FAILURE;
+		}
+		mon_soc_be->tx_mon_ring_fill_level +=
+					(num_of_buffers -
+					mon_soc_be->tx_mon_ring_fill_level);
+	}
 
-static inline
-QDF_STATUS dp_vdev_set_monitor_mode_rings_2_0(struct dp_pdev *pdev,
-					      uint8_t delayed_replenish)
-{
 	return QDF_STATUS_SUCCESS;
 }
-#endif
 
 #if defined(WDI_EVENT_ENABLE) &&\
 	(defined(QCA_ENHANCED_STATS_SUPPORT) || !defined(REMOVE_PKT_LOG))
@@ -1747,28 +1521,6 @@ void dp_mon_cdp_ops_register_2_0(struct cdp_ops *ops)
 }
 #endif
 
-#if defined(WLAN_SUPPORT_RX_PROTOCOL_TYPE_TAG) &&\
-	defined(WLAN_SUPPORT_RX_TAG_STATISTICS)
-/** dp_mon_rx_update_rx_protocol_tag_stats() - Update mon protocols's
- *					      statistics
- * @pdev: pdev handle
- * @protocol_index: Protocol index for which the stats should be incremented
- * @ring_index: REO ring number from which this tag was received.
- *
- * Return: void
- */
-void dp_mon_rx_update_rx_protocol_tag_stats(struct dp_pdev *pdev,
-					    uint16_t protocol_index)
-{
-	pdev->mon_proto_tag_stats[protocol_index].tag_ctr++;
-}
-#else
-void dp_mon_rx_update_rx_protocol_tag_stats(struct dp_pdev *pdev,
-					    uint16_t protocol_index)
-{
-}
-#endif
-
 #ifdef QCA_ENHANCED_STATS_SUPPORT
 static void
 dp_enable_enhanced_stats_for_each_pdev(struct dp_soc *soc, void *arg,

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

@@ -490,21 +490,6 @@ dp_rx_mon_add_frag_to_skb(struct hal_rx_ppdu_info *ppdu_info,
 	}
 }
 
-#if defined(WLAN_SUPPORT_RX_PROTOCOL_TYPE_TAG) ||\
-	defined(WLAN_SUPPORT_RX_FLOW_TAG)
-/**
- * dp_mon_rx_update_rx_protocol_tag_stats() - Update mon protocols's
- *					      statistics from given protocol
- *					      type
- * @pdev: pdev handle
- * @protocol_index: Protocol index for which the stats should be incremented
- *
- * Return: void
- */
-void dp_mon_rx_update_rx_protocol_tag_stats(struct dp_pdev *pdev,
-					    uint16_t protocol_index);
-#endif /* WLAN_SUPPORT_RX_PROTOCOL_TYPE_TAG */
-
 #if !defined(DISABLE_MON_CONFIG) && (defined(WLAN_PKT_CAPTURE_TX_2_0) || \
 	defined(WLAN_PKT_CAPTURE_RX_2_0))
 /**

+ 10 - 14
dp/wifi3.0/monitor/2.0/dp_mon_filter_2.0.c

@@ -119,16 +119,6 @@ fail:
 	return QDF_STATUS_E_FAILURE;
 }
 
-void dp_rx_mon_hdr_length_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_HDR_LEN_SET(*msg_word,
-						 tlv_filter->rx_hdr_length);
-}
-
 void dp_rx_mon_packet_length_set(uint32_t *msg_word,
 				 struct htt_rx_ring_tlv_filter *tlv_filter)
 {
@@ -1013,6 +1003,7 @@ dp_htt_h2t_send_complete_free_netbuf(
  * @htt_tlv_filter:	Rx SRNG TLV and filter setting
  * Return: 0 on success; error code on failure
  */
+static
 int htt_h2t_tx_ring_cfg(struct htt_soc *htt_soc, int pdev_id,
 			hal_ring_handle_t hal_ring_hdl,
 			int hal_ring_type, int ring_buf_size,
@@ -1390,7 +1381,7 @@ dp_mon_filter_reset_undecoded_metadata_capture_2_0(struct dp_pdev *pdev)
 }
 #endif
 
-void dp_tx_mon_filter_set_downstream_tlvs(struct htt_tx_ring_tlv_filter *filter)
+static void dp_tx_mon_filter_set_downstream_tlvs(struct htt_tx_ring_tlv_filter *filter)
 {
 	filter->dtlvs.tx_fes_setup = 1;
 	filter->dtlvs.pcu_ppdu_setup_init = 1;
@@ -1399,7 +1390,8 @@ void dp_tx_mon_filter_set_downstream_tlvs(struct htt_tx_ring_tlv_filter *filter)
 	filter->dtlvs.fw2s_mon = 1;
 }
 
-void dp_tx_mon_filter_set_upstream_tlvs(struct htt_tx_ring_tlv_filter *filter)
+static void
+dp_tx_mon_filter_set_upstream_tlvs(struct htt_tx_ring_tlv_filter *filter)
 {
 	filter->utlvs.tx_fes_status_end = 1;
 	filter->utlvs.rx_response_required_info = 1;
@@ -1434,8 +1426,9 @@ void dp_tx_mon_filter_set_upstream_tlvs(struct htt_tx_ring_tlv_filter *filter)
 	filter->utlvs.eht_sig_usr_ofdma = 1;
 }
 
-void dp_tx_mon_filter_set_all(struct dp_mon_pdev_be *mon_pdev_be,
-			      struct htt_tx_ring_tlv_filter *filter)
+static void
+dp_tx_mon_filter_set_all(struct dp_mon_pdev_be *mon_pdev_be,
+			 struct htt_tx_ring_tlv_filter *filter)
 {
 	qdf_mem_zero(&filter->dtlvs,
 		     sizeof(filter->dtlvs));
@@ -1472,6 +1465,7 @@ void dp_tx_mon_filter_set_all(struct dp_mon_pdev_be *mon_pdev_be,
 	filter->data_dma_length = mon_pdev_be->tx_mon_filter_length;
 }
 
+static
 void dp_tx_mon_filter_set_word_mask(struct dp_pdev *pdev,
 				    struct htt_tx_ring_tlv_filter *filter)
 {
@@ -2297,6 +2291,7 @@ void dp_mon_filter_reset_rx_pktlog_cbf_2_0(struct dp_pdev *pdev)
 	mon_pdev_be->filter_be[mode][srng_type] = filter;
 }
 
+#ifdef BE_PKTLOG_SUPPORT
 void dp_mon_filter_setup_pktlog_hybrid_2_0(struct dp_pdev *pdev)
 {
 	struct dp_mon_filter_be filter = {0};
@@ -2389,6 +2384,7 @@ void dp_mon_filter_reset_pktlog_hybrid_2_0(struct dp_pdev *pdev)
 
 	mon_pdev_be->filter_be[mode][srng_type] = filter;
 }
+#endif
 #endif /* WDI_EVENT_ENABLE */
 
 /**

+ 0 - 21
dp/wifi3.0/monitor/2.0/dp_mon_filter_2.0.h

@@ -25,18 +25,6 @@
 #define DMA_LENGTH_128B 2
 #define DMA_LENGTH_256B 4
 
-/* rx hdr tlv dma lengths */
-enum dp_rx_hdr_dma_length {
-	/* default dma length(128B) */
-	DEFAULT_RX_HDR_DMA_LENGTH = 0,
-	/* dma length 64 bytes */
-	RX_HDR_DMA_LENGTH_64B = 1,
-	/* dma length 128 bytes */
-	RX_HDR_DMA_LENGTH_128B = 2,
-	/* dma length 256 bytes */
-	RX_HDR_DMA_LENGTH_256B = 3,
-};
-
 /* fwd declarations */
 struct dp_mon_pdev_be;
 
@@ -49,15 +37,6 @@ void
 dp_rx_mon_enable_set(uint32_t *msg_word,
 		     struct htt_rx_ring_tlv_filter *tlv_filter);
 
-/**
- * dp_rx_mon_hdr_length_set() - Setup rx monitor hdr tlv length
- * @msg_word: msg word
- * @tlv_filter: rx ring filter configuration
- */
-void
-dp_rx_mon_hdr_length_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

+ 272 - 83
dp/wifi3.0/monitor/2.0/dp_rx_mon_2.0.c

@@ -40,9 +40,21 @@
 #define F_MASK 0xFFFF
 #define TEST_MASK 0xCBF
 
-#if defined(WLAN_SUPPORT_RX_PROTOCOL_TYPE_TAG) ||\
-	    defined(WLAN_SUPPORT_RX_FLOW_TAG)
-
+#if defined(WLAN_SUPPORT_RX_PROTOCOL_TYPE_TAG) &&\
+	defined(WLAN_SUPPORT_RX_TAG_STATISTICS)
+/** dp_mon_rx_update_rx_protocol_tag_stats() - Update mon protocols's
+ *					      statistics
+ * @pdev: pdev handle
+ * @protocol_index: Protocol index for which the stats should be incremented
+ * @ring_index: REO ring number from which this tag was received.
+ *
+ * Return: void
+ */
+static void dp_mon_rx_update_rx_protocol_tag_stats(struct dp_pdev *pdev,
+						   uint16_t protocol_index)
+{
+	pdev->mon_proto_tag_stats[protocol_index].tag_ctr++;
+}
 #ifdef QCA_TEST_MON_PF_TAGS_STATS
 
 static
@@ -57,7 +69,6 @@ static
 void dp_rx_mon_print_tag_buf(uint8_t *buf, uint16_t room)
 {
 }
-
 #endif
 
 /**
@@ -168,22 +179,6 @@ dp_rx_mon_nbuf_add_rx_frag(qdf_nbuf_t nbuf, qdf_frag_t *frag,
 	return QDF_STATUS_E_FAILURE;
 }
 
-/**
- * dp_mon_free_parent_nbuf() - Free parent SKB
- *
- * @mon_pdev: monitor pdev
- * @nbuf: SKB to be freed
- *
- * Return: void
- */
-void
-dp_mon_free_parent_nbuf(struct dp_mon_pdev *mon_pdev,
-			qdf_nbuf_t nbuf)
-{
-	mon_pdev->rx_mon_stats.parent_buf_free++;
-	qdf_nbuf_free(nbuf);
-}
-
 void
 dp_rx_mon_shift_pf_tag_in_headroom(qdf_nbuf_t nbuf, struct dp_soc *soc,
 				   struct hal_rx_ppdu_info *ppdu_info)
@@ -340,19 +335,49 @@ dp_rx_mon_pf_tag_to_buf_headroom_2_0(void *nbuf,
 }
 
 #else
+static inline void
+dp_mon_rx_update_rx_protocol_tag_stats(struct dp_pdev *pdev,
+				       uint16_t protocol_index)
+{
+}
 
-static
-void dp_rx_mon_set_zero(qdf_nbuf_t nbuf)
+static inline void
+dp_rx_mon_update_drop_cnt(struct dp_mon_pdev *mon_pdev,
+			  struct hal_mon_desc *hal_mon_rx_desc)
 {
 }
 
-static
+static inline void dp_rx_mon_set_zero(qdf_nbuf_t nbuf)
+{
+}
+
+static inline QDF_STATUS
+dp_rx_mon_nbuf_add_rx_frag(qdf_nbuf_t nbuf, qdf_frag_t *frag,
+			   uint16_t frag_len, uint16_t offset,
+			   uint16_t buf_size, bool frag_ref)
+{
+	return QDF_STATUS_SUCCESS;
+}
+
+static inline struct hal_rx_ppdu_info*
+dp_rx_mon_get_ppdu_info(struct dp_mon_pdev *mon_pdev)
+{
+	return NULL;
+}
+
+static inline void
+__dp_rx_mon_free_ppdu_info(struct dp_mon_pdev *mon_pdev,
+			   struct hal_rx_ppdu_info *ppdu_info)
+{
+}
+
+static inline
 void dp_rx_mon_shift_pf_tag_in_headroom(qdf_nbuf_t nbuf, struct dp_soc *soc,
 					struct hal_rx_ppdu_info *ppdu_info)
 {
 }
 
-static
+static inline
 void dp_rx_mon_pf_tag_to_buf_headroom_2_0(void *nbuf,
 					  struct hal_rx_ppdu_info *ppdu_info,
 					  struct dp_pdev *pdev,
@@ -590,6 +615,21 @@ dp_mon_record_clear_buffer(struct dp_mon_pdev_be *mon_pdev_be) {
 
 #endif
 
+/**
+ * dp_mon_free_parent_nbuf() - Free parent SKB
+ *
+ * @mon_pdev: monitor pdev
+ * @nbuf: SKB to be freed
+ *
+ * Return: void
+ */
+void dp_mon_free_parent_nbuf(struct dp_mon_pdev *mon_pdev,
+			     qdf_nbuf_t nbuf)
+{
+	mon_pdev->rx_mon_stats.parent_buf_free++;
+	qdf_nbuf_free(nbuf);
+}
+
 /**
  * dp_rx_mon_free_mpdu_queue() - Free MPDU queue
  * @mon_pdev: monitor pdev
@@ -1397,6 +1437,8 @@ static void dp_rx_mon_append_nbuf(qdf_nbuf_t nbuf, qdf_nbuf_t tmp_nbuf)
 			qdf_nbuf_set_next(last_nbuf, tmp_nbuf);
 	}
 }
+
+static
 uint8_t dp_rx_mon_process_tlv_status(struct dp_pdev *pdev,
 				     struct hal_rx_ppdu_info *ppdu_info,
 				     void *status_frag,
@@ -2206,87 +2248,123 @@ dp_rx_mon_process_2_0(struct dp_soc *soc, struct dp_intr *int_ctx,
 	return work_done;
 }
 
-void
-dp_rx_mon_buf_desc_pool_deinit(struct dp_soc *soc)
+QDF_STATUS dp_rx_mon_ppdu_info_cache_create(struct dp_pdev *pdev)
 {
-	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);
+	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);
+	uint16_t obj;
+	struct hal_rx_ppdu_info *ppdu_info = NULL;
 
-	/* Drain page frag cachce before pool deinit */
-	qdf_frag_cache_drain(&mon_soc_be->rx_desc_mon.pf_cache);
-	dp_mon_desc_pool_deinit(&mon_soc_be->rx_desc_mon);
-}
+	mon_pdev_be->ppdu_info_cache =
+		qdf_kmem_cache_create("rx_mon_ppdu_info_cache",
+				      sizeof(struct hal_rx_ppdu_info));
 
-QDF_STATUS
-dp_rx_mon_buf_desc_pool_init(struct dp_soc *soc)
-{
-	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);
-	uint32_t num_entries;
+	if (!mon_pdev_be->ppdu_info_cache) {
+		dp_mon_err("cache creation failed pdev :%px", pdev);
+		return QDF_STATUS_E_NOMEM;
+	}
 
-	num_entries =
-		wlan_cfg_get_dp_soc_rx_mon_buf_ring_size(soc->wlan_cfg_ctx);
-	return dp_mon_desc_pool_init(&mon_soc_be->rx_desc_mon, num_entries);
-}
+	TAILQ_INIT(&mon_pdev_be->rx_mon_free_queue);
+	for (obj = 0; obj < DP_RX_MON_WQ_THRESHOLD; obj++) {
+		ppdu_info =  (struct hal_rx_ppdu_info *)qdf_kmem_cache_alloc(mon_pdev_be->ppdu_info_cache);
 
-void dp_rx_mon_buf_desc_pool_free(struct dp_soc *soc)
-{
-	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);
+		if (ppdu_info) {
+			TAILQ_INSERT_TAIL(&mon_pdev_be->rx_mon_free_queue,
+					  ppdu_info,
+					  ppdu_free_list_elem);
+			mon_pdev_be->total_free_elem++;
+		}
+	}
+	qdf_spinlock_create(&mon_pdev_be->ppdu_info_lock);
 
-	if (mon_soc)
-		dp_mon_desc_pool_free(&mon_soc_be->rx_desc_mon);
+	return QDF_STATUS_SUCCESS;
 }
 
-QDF_STATUS
-dp_rx_mon_buf_desc_pool_alloc(struct dp_soc *soc)
+void dp_rx_mon_ppdu_info_cache_destroy(struct dp_pdev *pdev)
 {
-	struct dp_mon_desc_pool *rx_mon_desc_pool;
-	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);
-	int entries;
-	struct wlan_cfg_dp_soc_ctxt *soc_cfg_ctx;
+	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);
+	struct hal_rx_ppdu_info *ppdu_info = NULL, *temp_ppdu_info = NULL;
 
-	soc_cfg_ctx = soc->wlan_cfg_ctx;
+	qdf_spin_lock(&mon_pdev_be->ppdu_info_lock);
+	TAILQ_FOREACH_SAFE(ppdu_info,
+			   &mon_pdev_be->rx_mon_free_queue,
+			   ppdu_free_list_elem,
+			   temp_ppdu_info) {
+		TAILQ_REMOVE(&mon_pdev_be->rx_mon_free_queue,
+			     ppdu_info, ppdu_free_list_elem);
+		if (ppdu_info) {
+			mon_pdev_be->total_free_elem--;
+			qdf_kmem_cache_free(mon_pdev_be->ppdu_info_cache,
+					    ppdu_info);
+		}
+	}
+	qdf_spin_unlock(&mon_pdev_be->ppdu_info_lock);
+	dp_mon_debug(" total free element: %d", mon_pdev_be->total_free_elem);
+	qdf_kmem_cache_destroy(mon_pdev_be->ppdu_info_cache);
+}
 
-	entries = wlan_cfg_get_dp_soc_rx_mon_buf_ring_size(soc_cfg_ctx);
+/**
+ * dp_mon_pdev_ext_init_2_0() - Init pdev ext param
+ *
+ * @pdev: DP pdev handle
+ *
+ * Return:  QDF_STATUS_SUCCESS: Success
+ *          QDF_STATUS_E_FAILURE: failure
+ */
+QDF_STATUS dp_mon_pdev_ext_init_2_0(struct dp_pdev *pdev)
+{
+	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);
 
-	rx_mon_desc_pool = &mon_soc_be->rx_desc_mon;
+	qdf_create_work(0, &mon_pdev_be->rx_mon_work,
+			dp_rx_mon_process_ppdu, pdev);
+	mon_pdev_be->rx_mon_workqueue =
+		qdf_alloc_unbound_workqueue("rx_mon_work_queue");
 
-	qdf_print("%s:%d rx mon buf desc pool entries: %d", __func__, __LINE__, entries);
-	return dp_mon_desc_pool_alloc(entries, rx_mon_desc_pool);
-}
+	if (!mon_pdev_be->rx_mon_workqueue) {
+		dp_mon_err("failed to create rxmon wq mon_pdev: %pK", mon_pdev);
+		goto fail;
+	}
+	TAILQ_INIT(&mon_pdev_be->rx_mon_queue);
 
-void
-dp_rx_mon_buffers_free(struct dp_soc *soc)
-{
-	struct dp_mon_desc_pool *rx_mon_desc_pool;
-	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);
+	qdf_spinlock_create(&mon_pdev_be->rx_mon_wq_lock);
 
-	rx_mon_desc_pool = &mon_soc_be->rx_desc_mon;
+	return QDF_STATUS_SUCCESS;
 
-	dp_mon_pool_frag_unmap_and_free(soc, rx_mon_desc_pool);
+fail:
+	return QDF_STATUS_E_FAILURE;
 }
 
-QDF_STATUS
-dp_rx_mon_buffers_alloc(struct dp_soc *soc, uint32_t size)
+/**
+ * dp_mon_pdev_ext_deinit_2_0() - denit pdev ext param
+ *
+ * @pdev: DP pdev handle
+ *
+ * Return: QDF_STATUS_SUCCESS
+ */
+QDF_STATUS dp_mon_pdev_ext_deinit_2_0(struct dp_pdev *pdev)
 {
-	struct dp_srng *mon_buf_ring;
-	struct dp_mon_desc_pool *rx_mon_desc_pool;
-	union dp_mon_desc_list_elem_t *desc_list = NULL;
-	union dp_mon_desc_list_elem_t *tail = NULL;
-	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);
+	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);
 
-	mon_buf_ring = &soc->rxdma_mon_buf_ring[0];
+	if (!mon_pdev_be->rx_mon_workqueue)
+		return QDF_STATUS_E_FAILURE;
 
-	rx_mon_desc_pool = &mon_soc_be->rx_desc_mon;
+	qdf_err(" total free element: %d", mon_pdev_be->total_free_elem);
+	qdf_flush_workqueue(0, mon_pdev_be->rx_mon_workqueue);
+	qdf_destroy_workqueue(0, mon_pdev_be->rx_mon_workqueue);
+	qdf_flush_work(&mon_pdev_be->rx_mon_work);
+	qdf_disable_work(&mon_pdev_be->rx_mon_work);
+	dp_rx_mon_drain_wq(pdev);
+	mon_pdev_be->rx_mon_workqueue = NULL;
+	qdf_spinlock_destroy(&mon_pdev_be->rx_mon_wq_lock);
 
-	return dp_mon_buffers_replenish(soc, mon_buf_ring,
-					rx_mon_desc_pool,
-					size,
-					&desc_list, &tail, NULL);
+	return QDF_STATUS_SUCCESS;
 }
 
 #ifdef QCA_ENHANCED_STATS_SUPPORT
@@ -2449,3 +2527,114 @@ void dp_mon_rx_print_advanced_stats_2_0(struct dp_soc *soc,
 		       mon_pdev->rx_mon_stats.tlv_drop_cnt);
 }
 #endif
+
+#ifdef WLAN_PKT_CAPTURE_RX_2_0
+void
+dp_rx_mon_buf_desc_pool_deinit(struct dp_soc *soc)
+{
+	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);
+
+	/* Drain page frag cachce before pool deinit */
+	qdf_frag_cache_drain(&mon_soc_be->rx_desc_mon.pf_cache);
+	dp_mon_desc_pool_deinit(&mon_soc_be->rx_desc_mon);
+}
+
+QDF_STATUS
+dp_rx_mon_buf_desc_pool_init(struct dp_soc *soc)
+{
+	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);
+	uint32_t num_entries;
+
+	num_entries =
+		wlan_cfg_get_dp_soc_rx_mon_buf_ring_size(soc->wlan_cfg_ctx);
+	return dp_mon_desc_pool_init(&mon_soc_be->rx_desc_mon, num_entries);
+}
+
+void dp_rx_mon_buf_desc_pool_free(struct dp_soc *soc)
+{
+	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);
+
+	if (mon_soc)
+		dp_mon_desc_pool_free(&mon_soc_be->rx_desc_mon);
+}
+
+QDF_STATUS
+dp_rx_mon_buf_desc_pool_alloc(struct dp_soc *soc)
+{
+	struct dp_srng *mon_buf_ring;
+	struct dp_mon_desc_pool *rx_mon_desc_pool;
+	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);
+	int entries;
+	struct wlan_cfg_dp_soc_ctxt *soc_cfg_ctx;
+
+	soc_cfg_ctx = soc->wlan_cfg_ctx;
+
+	entries = wlan_cfg_get_dp_soc_rx_mon_buf_ring_size(soc_cfg_ctx);
+	mon_buf_ring = &soc->rxdma_mon_buf_ring[0];
+
+	rx_mon_desc_pool = &mon_soc_be->rx_desc_mon;
+
+	qdf_print("%s:%d rx mon buf desc pool entries: %d", __func__, __LINE__, entries);
+	return dp_mon_desc_pool_alloc(entries, rx_mon_desc_pool);
+}
+
+void
+dp_rx_mon_buffers_free(struct dp_soc *soc)
+{
+	struct dp_mon_desc_pool *rx_mon_desc_pool;
+	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);
+
+	rx_mon_desc_pool = &mon_soc_be->rx_desc_mon;
+
+	dp_mon_pool_frag_unmap_and_free(soc, rx_mon_desc_pool);
+}
+
+QDF_STATUS
+dp_rx_mon_buffers_alloc(struct dp_soc *soc, uint32_t size)
+{
+	struct dp_srng *mon_buf_ring;
+	struct dp_mon_desc_pool *rx_mon_desc_pool;
+	union dp_mon_desc_list_elem_t *desc_list = NULL;
+	union dp_mon_desc_list_elem_t *tail = NULL;
+	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);
+
+	mon_buf_ring = &soc->rxdma_mon_buf_ring[0];
+
+	rx_mon_desc_pool = &mon_soc_be->rx_desc_mon;
+
+	return dp_mon_buffers_replenish(soc, mon_buf_ring,
+					rx_mon_desc_pool,
+					size,
+					&desc_list, &tail, NULL);
+}
+
+QDF_STATUS dp_rx_mon_soc_init_2_0(struct dp_soc *soc)
+{
+	if (dp_srng_init(soc, &soc->rxdma_mon_buf_ring[0],
+			 RXDMA_MONITOR_BUF, 0, 0)) {
+		dp_mon_err("%pK: " RNG_ERR "rx_mon_buf_ring", soc);
+		goto fail;
+	}
+
+	if (dp_rx_mon_buf_desc_pool_init(soc)) {
+		dp_mon_err("%pK: " RNG_ERR "rx mon desc pool init", soc);
+		goto fail;
+	}
+
+	/* monitor buffers for src */
+	if (dp_rx_mon_buffers_alloc(soc, DP_MON_RING_FILL_LEVEL_DEFAULT)) {
+		dp_mon_err("%pK: Rx mon buffers allocation failed", soc);
+		goto fail;
+	}
+
+	return QDF_STATUS_SUCCESS;
+fail:
+	return QDF_STATUS_E_FAILURE;
+}
+#endif

+ 110 - 16
dp/wifi3.0/monitor/2.0/dp_rx_mon_2.0.h

@@ -50,6 +50,16 @@
 			    + (DP_RX_MON_TLV_TOTAL_LEN))
 
 #define DP_RX_MON_WQ_THRESHOLD 128
+
+#ifdef WLAN_PKT_CAPTURE_RX_2_0
+QDF_STATUS dp_mon_pdev_ext_init_2_0(struct dp_pdev *pdev);
+QDF_STATUS dp_mon_pdev_ext_deinit_2_0(struct dp_pdev *pdev);
+QDF_STATUS dp_rx_mon_ppdu_info_cache_create(struct dp_pdev *pdev);
+void dp_rx_mon_ppdu_info_cache_destroy(struct dp_pdev *pdev);
+QDF_STATUS dp_rx_mon_pdev_rings_init_2_0(struct dp_pdev *pdev, int lmac_id);
+void dp_rx_mon_pdev_rings_deinit_2_0(struct dp_pdev *pdev, int lmac_id);
+QDF_STATUS dp_rx_mon_soc_init_2_0(struct dp_soc *soc);
+
 /*
  * dp_rx_mon_buffers_alloc() - allocate rx monitor buffers
  * @soc: DP soc handle
@@ -154,7 +164,95 @@ QDF_STATUS dp_rx_process_pktlog_be(struct dp_soc *soc, struct dp_pdev *pdev,
 				   struct hal_rx_ppdu_info *ppdu_info,
 				   void *status_frag, uint32_t end_offset);
 
-#if !defined(DISABLE_MON_CONFIG)
+#else
+static inline QDF_STATUS dp_mon_pdev_ext_init_2_0(struct dp_pdev *pdev)
+{
+	return QDF_STATUS_SUCCESS;
+}
+
+static inline QDF_STATUS dp_mon_pdev_ext_deinit_2_0(struct dp_pdev *pdev)
+{
+	return QDF_STATUS_SUCCESS;
+}
+
+static inline QDF_STATUS dp_rx_mon_ppdu_info_cache_create(struct dp_pdev *pdev)
+{
+	return QDF_STATUS_SUCCESS;
+}
+
+static inline void dp_rx_mon_ppdu_info_cache_destroy(struct dp_pdev *pdev)
+{
+}
+
+static inline QDF_STATUS
+dp_rx_mon_buffers_alloc(struct dp_soc *soc, uint32_t size)
+{
+	return QDF_STATUS_SUCCESS;
+}
+
+static inline
+QDF_STATUS dp_rx_mon_soc_init_2_0(struct dp_soc *soc)
+{
+	return QDF_STATUS_SUCCESS;
+}
+
+static inline void
+dp_rx_mon_buffers_free(struct dp_soc *soc)
+
+{
+}
+
+static inline void
+dp_rx_mon_buf_desc_pool_deinit(struct dp_soc *soc)
+{
+}
+
+static inline QDF_STATUS
+dp_rx_mon_buf_desc_pool_init(struct dp_soc *soc)
+{
+	return QDF_STATUS_SUCCESS;
+}
+
+static inline void dp_rx_mon_buf_desc_pool_free(struct dp_soc *soc)
+{
+}
+
+static inline QDF_STATUS
+dp_rx_mon_buf_desc_pool_alloc(struct dp_soc *soc)
+{
+	return QDF_STATUS_SUCCESS;
+}
+
+static inline
+void dp_rx_mon_stats_update_2_0(struct dp_mon_peer *mon_peer,
+				struct cdp_rx_indication_ppdu *ppdu,
+				struct cdp_rx_stats_ppdu_user *ppdu_user)
+{
+}
+
+static inline void
+dp_rx_mon_populate_ppdu_usr_info_2_0(struct mon_rx_user_status *rx_user_status,
+				     struct cdp_rx_stats_ppdu_user *ppdu_user)
+{
+}
+
+static inline void
+dp_rx_mon_populate_ppdu_info_2_0(struct hal_rx_ppdu_info *hal_ppdu_info,
+				 struct cdp_rx_indication_ppdu *ppdu)
+{
+}
+
+static inline
+QDF_STATUS dp_rx_process_pktlog_be(struct dp_soc *soc, struct dp_pdev *pdev,
+				   struct hal_rx_ppdu_info *ppdu_info,
+				   void *status_frag, uint32_t end_offset)
+{
+	return QDF_STATUS_SUCCESS;
+}
+
+#endif
+
+#if !defined(DISABLE_MON_CONFIG) && defined(WLAN_PKT_CAPTURE_RX_2_0)
 /*
  * dp_rx_mon_process_2_0() - Process Rx monitor interrupt
  *
@@ -174,7 +272,7 @@ dp_rx_mon_process_2_0(struct dp_soc *soc, struct dp_intr *int_ctx,
  */
 void dp_rx_mon_process_ppdu(void *context);
 #else
-static uint32_t
+static inline uint32_t
 dp_rx_mon_process_2_0(struct dp_soc *soc, struct dp_intr *int_ctx,
 		      uint32_t mac_id, uint32_t quota)
 {
@@ -217,22 +315,10 @@ void dp_rx_mon_drain_wq(struct dp_pdev *pdev);
  *
  * Return: void
  */
-void
-dp_mon_free_parent_nbuf(struct dp_mon_pdev *mon_pdev,
+void dp_mon_free_parent_nbuf(struct dp_mon_pdev *mon_pdev,
 			qdf_nbuf_t nbuf);
-#if !defined(WLAN_SUPPORT_RX_PROTOCOL_TYPE_TAG) &&\
-	!defined(WLAN_SUPPORT_RX_FLOW_TAG)
-void
-dp_rx_mon_pf_tag_to_buf_headroom_2_0(void *nbuf,
-				     struct hal_rx_ppdu_info *ppdu_info,
-				     struct dp_pdev *pdev, struct dp_soc *soc)
-{
-}
 
-void dp_rx_mon_shift_pf_tag_in_headroom(qdf_nbuf_t nbuf, struct dp_soc *soc)
-{
-}
-#endif /* WLAN_SUPPORT_RX_PROTOCOL_TYPE_TAG */
+#ifdef QCA_ENHANCED_STATS_SUPPORT
 /**
  * dp_mon_rx_print_advanced_stats_2_0() - print advanced monitor statistics
  *
@@ -243,4 +329,12 @@ void dp_rx_mon_shift_pf_tag_in_headroom(qdf_nbuf_t nbuf, struct dp_soc *soc)
  */
 void dp_mon_rx_print_advanced_stats_2_0(struct dp_soc *soc,
 					struct dp_pdev *pdev);
+#else
+static inline
+void dp_mon_rx_print_advanced_stats_2_0(struct dp_soc *soc,
+					struct dp_pdev *pdev)
+{
+}
+#endif
+
 #endif /* _DP_RX_MON_2_0_H_ */

+ 6 - 1
dp/wifi3.0/monitor/2.0/dp_rx_mon_status_2.0.c

@@ -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-2023 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
@@ -26,6 +26,11 @@
 #include <dp_rx.h>
 #include <dp_rx_mon.h>
 
+#ifdef BE_PKTLOG_SUPPORT
+#define BUFFER_RESIDUE 1
+#define RX_MON_MIN_HEAD_ROOM   64
+#endif
+
 QDF_STATUS
 dp_rx_process_pktlog_be(struct dp_soc *soc, struct dp_pdev *pdev,
 			struct hal_rx_ppdu_info *ppdu_info,

+ 22 - 0
dp/wifi3.0/monitor/2.0/dp_tx_mon_2.0.c

@@ -356,6 +356,28 @@ void dp_tx_mon_buf_desc_pool_free(struct dp_soc *soc)
 		dp_mon_desc_pool_free(&mon_soc_be->tx_desc_mon);
 }
 
+QDF_STATUS dp_tx_mon_soc_init_2_0(struct dp_soc *soc)
+{
+	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);
+
+	if (dp_srng_init(soc, &mon_soc_be->tx_mon_buf_ring,
+			 TX_MONITOR_BUF, 0, 0)) {
+		dp_mon_err("%pK: " RNG_ERR "tx_mon_buf_ring", soc);
+		goto fail;
+	}
+
+	if (dp_tx_mon_buf_desc_pool_init(soc)) {
+		dp_mon_err("%pK: " RNG_ERR "tx mon desc pool init", soc);
+		goto fail;
+	}
+
+	return QDF_STATUS_SUCCESS;
+fail:
+	return QDF_STATUS_E_FAILURE;
+}
+
 QDF_STATUS
 dp_tx_mon_buf_desc_pool_alloc(struct dp_soc *soc)
 {

+ 21 - 0
dp/wifi3.0/monitor/2.0/dp_tx_mon_2.0.h

@@ -116,6 +116,8 @@ dp_tx_mon_status_free_packet_buf(struct dp_pdev *pdev,
 				 uint32_t end_offset,
 				 struct dp_tx_mon_desc_list *mon_desc_list_ref);
 
+#if defined(WLAN_TX_PKT_CAPTURE_ENH_BE) && defined(WLAN_PKT_CAPTURE_TX_2_0) && \
+	defined(BE_PKTLOG_SUPPORT)
 /**
  * dp_tx_process_pktlog_be() - process pktlog
  * @soc: dp soc handle
@@ -131,6 +133,15 @@ dp_tx_mon_status_free_packet_buf(struct dp_pdev *pdev,
 QDF_STATUS
 dp_tx_process_pktlog_be(struct dp_soc *soc, struct dp_pdev *pdev,
 			void *status_frag, uint32_t end_offset);
+#else
+static inline QDF_STATUS
+dp_tx_process_pktlog_be(struct dp_soc *soc, struct dp_pdev *pdev,
+			void *status_frag, uint32_t end_offset)
+{
+	return QDF_STATUS_SUCCESS;
+}
+#endif
+
 /**
  * dp_tx_mon_process_status_tlv() - API to processed TLV
  * invoked from interrupt handler
@@ -750,4 +761,14 @@ QDF_STATUS dp_peer_set_tx_capture_enabled_2_0(struct dp_pdev *pdev_handle,
 QDF_STATUS dp_config_enh_tx_core_monitor_2_0(struct dp_pdev *pdev, uint8_t val);
 #endif
 
+#ifdef WLAN_PKT_CAPTURE_TX_2_0
+QDF_STATUS dp_tx_mon_soc_init_2_0(struct dp_soc *soc);
+#else
+static inline
+QDF_STATUS dp_tx_mon_soc_init_2_0(struct dp_soc *soc)
+{
+	return QDF_STATUS_SUCCESS;
+}
+#endif
+
 #endif /* _DP_TX_MON_2_0_H_ */

+ 39 - 35
dp/wifi3.0/monitor/2.0/dp_tx_mon_status_2.0.c

@@ -1404,40 +1404,6 @@ dp_tx_mon_update_ppdu_info_status(struct dp_pdev *pdev,
 	return status;
 }
 
-QDF_STATUS
-dp_tx_process_pktlog_be(struct dp_soc *soc, struct dp_pdev *pdev,
-			qdf_frag_t status_frag, uint32_t end_offset)
-{
-	struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
-	qdf_nbuf_t nbuf = NULL;
-	enum WDI_EVENT pktlog_mode = WDI_NO_VAL;
-	int frag_bytes;
-
-	if (!mon_pdev->pktlog_hybrid_mode)
-		return QDF_STATUS_E_INVAL;
-
-	nbuf = qdf_nbuf_alloc(soc->osdev, MAX_DUMMY_FRM_BODY, 0, 4, FALSE);
-	if (!nbuf)
-		return QDF_STATUS_E_NOMEM;
-
-	qdf_nbuf_add_rx_frag(status_frag, nbuf, 0,
-			     (end_offset + 1),
-			     0, true);
-
-	if (mon_pdev->pktlog_hybrid_mode)
-		pktlog_mode = WDI_EVENT_HYBRID_TX;
-
-	frag_bytes = qdf_nbuf_get_frag_len(nbuf, 0);
-	if (pktlog_mode != WDI_NO_VAL) {
-		dp_wdi_event_handler(pktlog_mode, soc,
-				     nbuf, HTT_INVALID_PEER,
-				     WDI_NO_VAL, pdev->pdev_id);
-	}
-	qdf_nbuf_free(nbuf);
-
-	return QDF_STATUS_SUCCESS;
-}
-
 /**
  * dp_tx_mon_process_tlv_2_0() - API to parse PPDU worth information
  * @pdev: DP_PDEV handle
@@ -1445,7 +1411,7 @@ dp_tx_process_pktlog_be(struct dp_soc *soc, struct dp_pdev *pdev,
  *
  * Return: status
  */
-QDF_STATUS
+static QDF_STATUS
 dp_tx_mon_process_tlv_2_0(struct dp_pdev *pdev,
 			  struct dp_tx_mon_desc_list *mon_desc_list_ref)
 {
@@ -1821,3 +1787,41 @@ void dp_tx_mon_update_end_reason(struct dp_mon_pdev *mon_pdev,
 {
 }
 #endif
+
+#if defined(WLAN_TX_PKT_CAPTURE_ENH_BE) && defined(WLAN_PKT_CAPTURE_TX_2_0) && \
+	defined(BE_PKTLOG_SUPPORT)
+QDF_STATUS
+dp_tx_process_pktlog_be(struct dp_soc *soc, struct dp_pdev *pdev,
+			qdf_frag_t status_frag, uint32_t end_offset)
+{
+	struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
+	qdf_nbuf_t nbuf = NULL;
+	enum WDI_EVENT pktlog_mode = WDI_NO_VAL;
+	int frag_bytes;
+
+	if (!mon_pdev->pktlog_hybrid_mode)
+		return QDF_STATUS_E_INVAL;
+
+	nbuf = qdf_nbuf_alloc(soc->osdev, MAX_DUMMY_FRM_BODY, 0, 4, FALSE);
+	if (!nbuf)
+		return QDF_STATUS_E_NOMEM;
+
+	qdf_nbuf_add_rx_frag(status_frag, nbuf, 0,
+			     (end_offset + 1),
+			     0, true);
+
+	if (mon_pdev->pktlog_hybrid_mode)
+		pktlog_mode = WDI_EVENT_HYBRID_TX;
+
+	frag_bytes = qdf_nbuf_get_frag_len(nbuf, 0);
+	if (pktlog_mode != WDI_NO_VAL) {
+		dp_wdi_event_handler(pktlog_mode, soc,
+				     nbuf, HTT_INVALID_PEER,
+				     WDI_NO_VAL, pdev->pdev_id);
+	}
+	qdf_nbuf_free(nbuf);
+
+	return QDF_STATUS_SUCCESS;
+}
+#endif
+

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

@@ -78,6 +78,20 @@ struct dp_peer_tx_capture {
 };
 #endif
 
+/**
+ * struct ieee80211_ctlframe_addr2 - control frame addr
+ * @i_fc: frame control
+ * @i_aidordur: aid or duration
+ * @i_addr1: address 1
+ * @i_addr2: address 2
+ */
+struct ieee80211_ctlframe_addr2 {
+	uint8_t i_fc[2];
+	uint8_t i_aidordur[2];
+	uint8_t i_addr1[QDF_NET_MAC_ADDR_MAX_LEN];
+	uint8_t i_addr2[QDF_NET_MAC_ADDR_MAX_LEN];
+} __packed;
+
 #ifndef WLAN_TX_PKT_CAPTURE_ENH
 static inline void
 dp_process_ppdu_stats_update_failed_bitmap(struct dp_pdev *pdev,

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

@@ -496,6 +496,24 @@ void dp_mon_filter_reset_mon_mode(struct dp_pdev *pdev)
 		mon_ops->mon_filter_reset_rx_mon_mode(pdev);
 }
 
+#if defined(WLAN_PKT_CAPTURE_RX_2_0) || defined(CONFIG_WORD_BASED_TLV) || \
+	defined(WLAN_FEATURE_LOCAL_PKT_CAPTURE)
+void dp_rx_mon_hdr_length_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_HDR_LEN_SET(*msg_word,
+						 tlv_filter->rx_hdr_length);
+}
+#else
+void dp_rx_mon_hdr_length_set(uint32_t *msg_word,
+			      struct htt_rx_ring_tlv_filter *tlv_filter)
+{
+}
+#endif
+
 #ifdef WDI_EVENT_ENABLE
 void dp_mon_filter_setup_rx_pkt_log_full(struct dp_pdev *pdev)
 {

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

@@ -96,6 +96,18 @@ struct dp_mon_filter {
 	struct htt_rx_ring_tlv_filter tlv_filter;
 };
 
+/* rx hdr tlv dma lengths */
+enum dp_rx_hdr_dma_length {
+	/* default dma length(128B) */
+	DEFAULT_RX_HDR_DMA_LENGTH = 0,
+	/* dma length 64 bytes */
+	RX_HDR_DMA_LENGTH_64B = 1,
+	/* dma length 128 bytes */
+	RX_HDR_DMA_LENGTH_128B = 2,
+	/* dma length 256 bytes */
+	RX_HDR_DMA_LENGTH_256B = 3,
+};
+
 /*
  * NB: intentionally not using kernel-doc comment because the kernel-doc
  *     script does not handle the complex conditional compilation