Преглед на файлове

qcacmn: Add workqueue infrastructure for Rx monitor processing

Add workqueue infrastructure for Rx monitor processing

CRs-Fixed: 3074291
Change-Id: I9b898c0101bf3e294e06cd2d491a0eecb47ec765
Amir Patel преди 3 години
родител
ревизия
f78b0ccc9c

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

@@ -31,6 +31,66 @@
 #include <htt_ppdu_stats.h>
 
 #if !defined(DISABLE_MON_CONFIG)
+
+/**
+ * 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);
+
+	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_create_work(0, &mon_pdev_be->rx_mon_work,
+			dp_rx_mon_process_ppdu, pdev);
+	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_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);
+	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.
@@ -1255,6 +1315,8 @@ struct dp_mon_ops monitor_ops_2_0 = {
 	.mon_tx_ppdu_stats_detach = NULL,
 	.mon_peer_tx_capture_filter_check = NULL,
 #endif
+	.mon_pdev_ext_init = dp_mon_pdev_ext_init_2_0,
+	.mon_pdev_ext_deinit = dp_mon_pdev_ext_deinit_2_0,
 };
 
 struct cdp_mon_ops dp_ops_mon_2_0 = {

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

@@ -30,6 +30,7 @@
 #define DP_MON_RING_FILL_LEVEL_DEFAULT 2048
 #define DP_MON_DATA_BUFFER_SIZE     2048
 #define DP_MON_DESC_MAGIC 0xdeadabcd
+#define DP_MON_MAX_STATUS_BUF 32
 
 /**
  * struct dp_mon_filter_be - Monitor TLV filter
@@ -101,6 +102,12 @@ struct dp_mon_desc_pool {
  * @filter_be: filters sent to fw
  * @tx_capture: pointer to tx capture function
  * @tx_stats: tx monitor drop stats
+ * @rx_mon_wq_lock: Rx mon workqueue lock
+ * @rx_mon_workqueue: Rx mon workqueue
+ * @rx_mon_work: Rx mon work
+ * @rx_mon_queue: RxMON queue
+ * @rx_mon_queue_depth: RxMON queue depth
+ * @status: reaped status buffer per ppdu
  */
 struct dp_mon_pdev_be {
 	struct dp_mon_pdev mon_pdev;
@@ -109,6 +116,13 @@ struct dp_mon_pdev_be {
 	struct dp_pdev_tx_capture_be tx_capture_be;
 #endif
 	struct dp_tx_monitor_drop_stats tx_stats;
+	qdf_spinlock_t rx_mon_wq_lock;
+	qdf_workqueue_t *rx_mon_workqueue;
+	qdf_work_t rx_mon_work;
+
+	TAILQ_HEAD(, hal_rx_ppdu_info) rx_mon_queue;
+	uint16_t rx_mon_queue_depth;
+	struct dp_mon_desc *status[DP_MON_MAX_STATUS_BUF];
 };
 
 /**

+ 4 - 0
dp/wifi3.0/monitor/2.0/dp_rx_mon_2.0.c

@@ -29,6 +29,10 @@
 #include <dp_be.h>
 #include <hal_be_api_mon.h>
 
+void dp_rx_mon_process_ppdu(void *context)
+{
+}
+
 static inline uint32_t
 dp_rx_mon_srng_process_2_0(struct dp_soc *soc, struct dp_intr *int_ctx,
 			   uint32_t mac_id, uint32_t quota)

+ 10 - 0
dp/wifi3.0/monitor/2.0/dp_rx_mon_2.0.h

@@ -150,6 +150,13 @@ QDF_STATUS dp_rx_process_pktlog_be(struct dp_soc *soc, struct dp_pdev *pdev,
 uint32_t
 dp_rx_mon_process_2_0(struct dp_soc *soc, struct dp_intr *int_ctx,
 		      uint32_t mac_id, uint32_t quota);
+
+/**
+ * dp_rx_mon_process_ppdu () - RxMON Workqueue processing API
+ *
+ * @context: workqueue context
+ */
+void dp_rx_mon_process_ppdu(void *context);
 #else
 static uint32_t
 dp_rx_mon_process_2_0(struct dp_soc *soc, struct dp_intr *int_ctx,
@@ -158,5 +165,8 @@ dp_rx_mon_process_2_0(struct dp_soc *soc, struct dp_intr *int_ctx,
 	return 0;
 }
 
+static inline void dp_rx_mon_process_ppdu(void *context)
+{
+}
 #endif /* DISABLE_MON_CONFIG */
 #endif /* _DP_RX_MON_2_0_H_ */

+ 5 - 0
dp/wifi3.0/monitor/dp_mon.c

@@ -5003,6 +5003,11 @@ QDF_STATUS dp_mon_pdev_init(struct dp_pdev *pdev)
 
 	/* attach monitor function */
 	dp_monitor_tx_ppdu_stats_attach(pdev);
+
+	/* mon pdev extended init */
+	if (mon_ops->mon_pdev_ext_init)
+		mon_ops->mon_pdev_ext_init(pdev);
+
 	mon_pdev->is_dp_mon_pdev_initialized = true;
 
 	return QDF_STATUS_SUCCESS;

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

@@ -763,6 +763,8 @@ struct dp_mon_ops {
 	void (*mon_filter_reset_undecoded_metadata_capture)
 	    (struct dp_pdev *pdev);
 #endif
+	QDF_STATUS (*mon_pdev_ext_init)(struct dp_pdev *pdev);
+	QDF_STATUS (*mon_pdev_ext_deinit)(struct dp_pdev *pdev);
 };
 
 struct dp_mon_soc {