Переглянути джерело

qcacmn: Initialize ppdu info flex mem pool during pdev attach

To avoid memory fragmentation during wifi down/up,
initialize ppdu info flex mem pool during pdev attach
instead of pdev init.

CRs-Fixed: 3235962
Change-Id: I7970ab056e600ccfe28ae1ccdc50a66d5ae0ade8
Amir Patel 3 роки тому
батько
коміт
e7422a7db6

+ 34 - 2
dp/wifi3.0/monitor/2.0/dp_mon_2.0.c

@@ -44,6 +44,38 @@
 
 #if !defined(DISABLE_MON_CONFIG)
 
+/**
+ * dp_mon_ppdu_info_pool_init_2_0 () - PPDU info pool init
+ *
+ * @pdev: DP pdev handle
+ *
+ * Return: QDF_STATUS
+ */
+QDF_STATUS dp_mon_ppdu_info_pool_init_2_0(struct dp_pdev *pdev)
+{
+	struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
+
+	dp_rx_mon_ppdu_info_pool_init(mon_pdev);
+
+	return QDF_STATUS_SUCCESS;
+}
+
+/**
+ * dp_mon_ppdu_info_pool_deinit_2_0 () - PPDU info pool deinit
+ *
+ * @pdev: DP pdev handle
+ *
+ * Return: void
+ */
+void dp_mon_ppdu_info_pool_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);
+
+	dp_rx_mon_ppdu_info_pool_deinit(mon_pdev_be);
+}
+
 /**
  * dp_mon_pdev_ext_init_2_0() - Init pdev ext param
  *
@@ -70,7 +102,6 @@ QDF_STATUS dp_mon_pdev_ext_init_2_0(struct dp_pdev *pdev)
 	TAILQ_INIT(&mon_pdev_be->rx_mon_queue);
 
 	qdf_spinlock_create(&mon_pdev_be->rx_mon_wq_lock);
-	dp_rx_mon_ppdu_info_pool_init(mon_pdev);
 
 	return QDF_STATUS_SUCCESS;
 
@@ -100,7 +131,6 @@ QDF_STATUS dp_mon_pdev_ext_deinit_2_0(struct dp_pdev *pdev)
 	qdf_disable_work(&mon_pdev_be->rx_mon_work);
 	mon_pdev_be->rx_mon_workqueue = NULL;
 	dp_rx_mon_drain_wq(pdev);
-	dp_rx_mon_ppdu_info_pool_deinit(mon_pdev_be);
 	qdf_spinlock_destroy(&mon_pdev_be->rx_mon_wq_lock);
 
 	return QDF_STATUS_SUCCESS;
@@ -1624,6 +1654,8 @@ struct dp_mon_ops monitor_ops_2_0 = {
 	.mon_lite_mon_dealloc = dp_lite_mon_dealloc,
 	.mon_lite_mon_vdev_delete = dp_lite_mon_vdev_delete,
 	.mon_lite_mon_disable_rx = dp_lite_mon_disable_rx,
+	.rx_mon_ppdu_info_pool_init = dp_mon_ppdu_info_pool_init_2_0,
+	.rx_mon_ppdu_info_pool_deinit = dp_mon_ppdu_info_pool_deinit_2_0,
 };
 
 struct cdp_mon_ops dp_ops_mon_2_0 = {

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

@@ -4941,6 +4941,9 @@ QDF_STATUS dp_mon_pdev_attach(struct dp_pdev *pdev)
 		}
 	}
 
+	if (mon_ops->rx_mon_ppdu_info_pool_init)
+		mon_ops->rx_mon_ppdu_info_pool_init(pdev);
+
 	pdev->monitor_pdev = mon_pdev;
 	dp_mon_pdev_per_target_config(pdev);
 
@@ -4980,6 +4983,8 @@ QDF_STATUS dp_mon_pdev_detach(struct dp_pdev *pdev)
 		return QDF_STATUS_E_FAILURE;
 	}
 
+	if (mon_ops->rx_mon_ppdu_info_pool_deinit)
+		mon_ops->rx_mon_ppdu_info_pool_deinit(pdev);
 	if (mon_ops->rx_mon_desc_pool_free)
 		mon_ops->rx_mon_desc_pool_free(pdev);
 	if (mon_ops->mon_rings_free)

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

@@ -786,6 +786,8 @@ struct dp_mon_ops {
 	/* Print advanced monitor stats */
 	void (*mon_rx_print_advanced_stats)
 		(struct dp_soc *soc, struct dp_pdev *pdev);
+	QDF_STATUS (*rx_mon_ppdu_info_pool_init)(struct dp_pdev *pdev);
+	void (*rx_mon_ppdu_info_pool_deinit)(struct dp_pdev *pdev);
 };
 
 /**