Эх сурвалжийг харах

qcacmn: Add sw desc pool support for BE monitor

Add APIs to allocate, free, init and deinit
sw descriptor pool for rx and tx monitor.

Change-Id: I03287cf3c590ace91825f16a7b0c5752c04fc8ed
CRs-Fixed: 3010468
Naga 3 жил өмнө
parent
commit
9d6b212c7a

+ 51 - 0
dp/wifi3.0/monitor/2.0/dp_mon_2.0.c

@@ -38,6 +38,57 @@ extern void dp_srng_deinit(struct dp_soc *soc, struct dp_srng *srng,
 			   int ring_type, int ring_num);
 
 #if !defined(DISABLE_MON_CONFIG)
+QDF_STATUS dp_mon_desc_pool_init(struct dp_mon_desc_pool *mon_desc_pool)
+{
+	int desc_id;
+	/* Initialize monitor desc lock */
+	qdf_spinlock_create(&mon_desc_pool->lock);
+
+	qdf_spin_lock_bh(&mon_desc_pool->lock);
+
+	/* link SW descs into a freelist */
+	mon_desc_pool->freelist = &mon_desc_pool->array[0];
+	qdf_mem_zero(mon_desc_pool->freelist, mon_desc_pool->pool_size);
+
+	for (desc_id = 0; desc_id <= mon_desc_pool->pool_size - 1; desc_id++) {
+		if (desc_id == mon_desc_pool->pool_size - 1)
+			mon_desc_pool->array[desc_id].next = NULL;
+		else
+			mon_desc_pool->array[desc_id].next =
+				&mon_desc_pool->array[desc_id + 1];
+		mon_desc_pool->array[desc_id].mon_desc.in_use = 0;
+		mon_desc_pool->array[desc_id].mon_desc.cookie = desc_id;
+	}
+	qdf_spin_unlock_bh(&mon_desc_pool->lock);
+	return QDF_STATUS_SUCCESS;
+}
+
+void dp_mon_desc_pool_deinit(struct dp_mon_desc_pool *mon_desc_pool)
+{
+	qdf_spin_lock_bh(&mon_desc_pool->lock);
+
+	mon_desc_pool->freelist = NULL;
+	mon_desc_pool->pool_size = 0;
+
+	qdf_spin_unlock_bh(&mon_desc_pool->lock);
+	qdf_spinlock_destroy(&mon_desc_pool->lock);
+}
+
+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;
+	mon_desc_pool->array = qdf_mem_malloc(pool_size *
+				     sizeof(union dp_mon_desc_list_elem_t));
+
+	return QDF_STATUS_SUCCESS;
+}
+
 static
 void dp_vdev_set_monitor_mode_buf_rings_2_0(struct dp_pdev *pdev)
 {

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

@@ -21,6 +21,8 @@
 #include <qdf_lock.h>
 #include <dp_types.h>
 
+#define DP_MON_RING_FILL_LEVEL_DEFAULT 2048
+
 /**
  * struct dp_mon_desc
  *
@@ -103,4 +105,40 @@ struct dp_mon_soc_be {
 };
 #endif
 
+/**
+ * dp_mon_desc_pool_init() - Monitor descriptor pool init
+ * @mon_desc_pool: mon desc pool
+ *
+ * Return: non-zero for failure, zero for success
+ */
+QDF_STATUS dp_mon_desc_pool_init(struct dp_mon_desc_pool *mon_desc_pool);
+
+/*
+ * dp_mon_desc_pool_deinit()- monitor descriptor pool deinit
+ * @mon_desc_pool: mon desc pool
+ *
+ * Return: None
+ *
+ */
+void dp_mon_desc_pool_deinit(struct dp_mon_desc_pool *mon_desc_pool);
+
+/*
+ * dp_mon_desc_pool_free()- monitor descriptor pool free
+ * @mon_desc_pool: mon desc pool
+ *
+ * Return: None
+ *
+ */
+void dp_mon_desc_pool_free(struct dp_mon_desc_pool *mon_desc_pool);
+
+/**
+ * dp_mon_desc_pool_alloc() - Monitor descriptor pool alloc
+ * @mon_desc_pool: mon desc pool
+ * @pool_size: Pool size
+ *
+ * Return: non-zero for failure, zero for success
+ */
+QDF_STATUS dp_mon_desc_pool_alloc(uint32_t pool_size,
+				  struct dp_mon_desc_pool *mon_desc_pool);
+
 #endif /* _DP_MON_2_0_H_ */

+ 36 - 15
dp/wifi3.0/monitor/2.0/dp_rx_mon_2.0.c

@@ -23,38 +23,59 @@
 #include <dp_rx_mon.h>
 #include <dp_rx_mon_2.0.h>
 #include <dp_mon_2.0.h>
-#include <dp_mon_filter_2.0.h>
-
-#include "htt_ppdu_stats.h"
-#include "dp_cal_client_api.h"
-#if defined(DP_CON_MON)
-#ifndef REMOVE_PKT_LOG
-#include <pktlog_ac_api.h>
-#include <pktlog_ac.h>
-#endif
-#endif
-#ifdef FEATURE_PERPKT_INFO
-#include "dp_ratetable.h"
-#endif
 
 void
 dp_rx_mon_buf_desc_pool_deinit(struct dp_soc *soc)
 {
+	struct dp_soc_be *be_soc = dp_get_be_soc_from_dp_soc(soc);
+	struct dp_mon_soc_be *mon_soc = be_soc->monitor_soc_be;
+
+	dp_mon_desc_pool_deinit(&mon_soc->rx_desc_mon);
 }
 
-void
+QDF_STATUS
 dp_rx_mon_buf_desc_pool_init(struct dp_soc *soc)
 {
+	struct dp_soc_be *be_soc = dp_get_be_soc_from_dp_soc(soc);
+	struct dp_mon_soc_be *mon_soc = be_soc->monitor_soc_be;
+	QDF_STATUS status;
+
+	status = dp_mon_desc_pool_init(&mon_soc->rx_desc_mon);
+	if (status != QDF_STATUS_SUCCESS) {
+		dp_mon_err("Failed to init rx monior descriptor pool");
+		mon_soc->rx_mon_ring_fill_level = 0;
+	} else {
+		mon_soc->rx_mon_ring_fill_level =
+					DP_MON_RING_FILL_LEVEL_DEFAULT;
+	}
+
+	return status;
 }
 
 void dp_rx_mon_buf_desc_pool_free(struct dp_soc *soc)
 {
+	struct dp_soc_be *be_soc = dp_get_be_soc_from_dp_soc(soc);
+	struct dp_mon_soc_be *mon_soc = be_soc->monitor_soc_be;
+
+	if (mon_soc)
+		dp_mon_desc_pool_free(&mon_soc->rx_desc_mon);
 }
 
 QDF_STATUS
 dp_rx_mon_buf_desc_pool_alloc(struct dp_soc *soc)
 {
-	return QDF_STATUS_SUCCESS;
+	struct dp_srng *mon_buf_ring;
+	struct dp_mon_desc_pool *rx_mon_desc_pool;
+	struct wlan_cfg_dp_soc_crxt *soc_cfg_ctx = soc->wlan_cfg_ctx;
+	struct dp_soc_be *be_soc = dp_get_be_soc_from_dp_soc(soc);
+	struct dp_mon_soc_be *mon_soc = be_soc->monitor_soc_be;
+
+	mon_buf_ring = &soc->rxdma_mon_buf_ring[0];
+
+	rx_mon_desc_pool = &mon_soc->rx_desc_mon;
+
+	return dp_mon_desc_pool_alloc(mon_soc->rx_mon_ring_fill_level,
+				      rx_mon_desc_pool);
 }
 
 void

+ 3 - 1
dp/wifi3.0/monitor/2.0/dp_rx_mon_2.0.h

@@ -47,8 +47,10 @@ dp_rx_mon_buf_desc_pool_deinit(struct dp_soc *soc);
  * dp_rx_mon_desc_pool_deinit() - deinit rx monitor descriptor pool
  * @soc: dp soc handle
  *
+ * Return: QDF_STATUS_SUCCESS: Success
+ *         QDF_STATUS_E_FAILURE: Error
  */
-void
+QDF_STATUS
 dp_rx_mon_buf_desc_pool_init(struct dp_soc *soc);
 
 /*

+ 36 - 3
dp/wifi3.0/monitor/2.0/dp_tx_mon_2.0.c

@@ -15,7 +15,7 @@
  */
 
 #include <dp_types.h>
-#include "dp_rx.h"
+#include "dp_tx.h"
 #include "dp_peer.h"
 #include <dp_htt.h>
 #include <dp_mon_filter.h>
@@ -26,21 +26,54 @@
 void
 dp_tx_mon_buf_desc_pool_deinit(struct dp_soc *soc)
 {
+	struct dp_soc_be *be_soc = dp_get_be_soc_from_dp_soc(soc);
+	struct dp_mon_soc_be *mon_soc = be_soc->monitor_soc_be;
+
+	dp_mon_desc_pool_deinit(&mon_soc->tx_desc_mon);
 }
 
-void
+QDF_STATUS
 dp_tx_mon_buf_desc_pool_init(struct dp_soc *soc)
 {
+	struct dp_soc_be *be_soc = dp_get_be_soc_from_dp_soc(soc);
+	struct dp_mon_soc_be *mon_soc = be_soc->monitor_soc_be;
+	QDF_STATUS status;
+
+	status = dp_mon_desc_pool_init(&mon_soc->tx_desc_mon);
+	if (status != QDF_STATUS_SUCCESS) {
+		dp_mon_err("Failed to init tx monior descriptor pool");
+		mon_soc->tx_mon_ring_fill_level = 0;
+	} else {
+		mon_soc->tx_mon_ring_fill_level = DP_MON_RING_FILL_LEVEL_DEFAULT;
+	}
+
+	return status;
 }
 
 void dp_tx_mon_buf_desc_pool_free(struct dp_soc *soc)
 {
+	struct dp_soc_be *be_soc = dp_get_be_soc_from_dp_soc(soc);
+	struct dp_mon_soc_be *mon_soc = be_soc->monitor_soc_be;
+
+	if (mon_soc)
+		dp_mon_desc_pool_free(&mon_soc->tx_desc_mon);
 }
 
 QDF_STATUS
 dp_tx_mon_buf_desc_pool_alloc(struct dp_soc *soc)
 {
-	return QDF_STATUS_SUCCESS;
+	struct dp_srng *mon_buf_ring;
+	struct dp_mon_desc_pool *tx_mon_desc_pool;
+	struct wlan_cfg_dp_soc_ctxt *soc_cfg_ctx = soc->wlan_cfg_ctx;
+	struct dp_soc_be *be_soc = dp_get_be_soc_from_dp_soc(soc);
+	struct dp_mon_soc_be *mon_soc = be_soc->monitor_soc_be;
+
+	mon_buf_ring = &mon_soc->tx_mon_buf_ring;
+
+	tx_mon_desc_pool = &mon_soc->tx_desc_mon;
+
+	return dp_mon_desc_pool_alloc(mon_soc->tx_mon_ring_fill_level,
+				      tx_mon_desc_pool);
 }
 
 void

+ 3 - 1
dp/wifi3.0/monitor/2.0/dp_tx_mon_2.0.h

@@ -47,8 +47,10 @@ dp_tx_mon_buf_desc_pool_deinit(struct dp_soc *soc);
  * dp_tx_mon_desc_pool_deinit() - deinit tx monitor descriptor pool
  * @soc: dp soc handle
  *
+ * Return: QDF_STATUS_SUCCESS: Success
+ *         QDF_STATUS_E_FAILURE: Error
  */
-void
+QDF_STATUS
 dp_tx_mon_buf_desc_pool_init(struct dp_soc *soc);
 
 /*