瀏覽代碼

Merge "qca-wifi: tx capture modify config lock with user mode flag"

Linux Build Service Account 5 年之前
父節點
當前提交
3a90a2e495
共有 2 個文件被更改,包括 62 次插入56 次删除
  1. 61 54
      dp/wifi3.0/dp_tx_capture.c
  2. 1 2
      dp/wifi3.0/dp_tx_capture.h

+ 61 - 54
dp/wifi3.0/dp_tx_capture.c

@@ -932,7 +932,9 @@ void dp_tx_ppdu_stats_attach(struct dp_pdev *pdev)
 	struct dp_pdev_tx_capture *tx_capture;
 	int i, j;
 
-	pdev->tx_capture.tx_cap_mode_flag = true;
+	qdf_atomic_init(&pdev->tx_capture.tx_cap_usr_mode);
+	qdf_atomic_set(&pdev->tx_capture.tx_cap_usr_mode, 0);
+
 	tx_capture = &pdev->tx_capture;
 	/* Work queue setup for HTT stats and tx capture handling */
 	qdf_create_work(0, &pdev->tx_capture.ppdu_stats_work,
@@ -943,7 +945,6 @@ void dp_tx_ppdu_stats_attach(struct dp_pdev *pdev)
 	STAILQ_INIT(&pdev->tx_capture.ppdu_stats_queue);
 	STAILQ_INIT(&pdev->tx_capture.ppdu_stats_defer_queue);
 	qdf_spinlock_create(&pdev->tx_capture.ppdu_stats_lock);
-	qdf_spinlock_create(&pdev->tx_capture.config_lock);
 	pdev->tx_capture.ppdu_stats_queue_depth = 0;
 	pdev->tx_capture.ppdu_stats_next_sched = 0;
 	pdev->tx_capture.ppdu_stats_defer_queue_depth = 0;
@@ -985,7 +986,6 @@ void dp_tx_ppdu_stats_detach(struct dp_pdev *pdev)
 	qdf_flush_workqueue(0, pdev->tx_capture.ppdu_stats_workqueue);
 	qdf_destroy_workqueue(0, pdev->tx_capture.ppdu_stats_workqueue);
 
-	qdf_spinlock_destroy(&pdev->tx_capture.config_lock);
 	qdf_spinlock_destroy(&pdev->tx_capture.ppdu_stats_lock);
 
 	STAILQ_FOREACH_SAFE(ppdu_info,
@@ -1444,7 +1444,6 @@ dp_soc_is_tx_capture_set_in_pdev(struct dp_soc *soc)
 /*
  * dp_enh_tx_capture_disable()- API to disable enhanced tx capture
  * @pdev_handle: DP_PDEV handle
- *
  * Return: void
  */
 void
@@ -1476,10 +1475,51 @@ dp_enh_tx_capture_disable(struct dp_pdev *pdev)
 		}
 	}
 	dp_peer_tx_cap_del_all_filter(pdev);
-	pdev->tx_capture.tx_cap_mode_flag = true;
+
+	pdev->tx_capture_enabled = CDP_TX_ENH_CAPTURE_DISABLED;
 	QDF_TRACE(QDF_MODULE_ID_TX_CAPTURE, QDF_TRACE_LEVEL_INFO_LOW,
-		  "Mode change request done cur mode - %d\n",
-		  pdev->tx_capture_enabled);
+		  "Mode change request done cur mode - %d user_mode - %d\n",
+		  pdev->tx_capture_enabled, CDP_TX_ENH_CAPTURE_DISABLED);
+}
+
+/*
+ * dp_enh_tx_capture_enable()- API to disable enhanced tx capture
+ * @pdev_handle: DP_PDEV handle
+ * @user_mode: user mode
+ *
+ * Return: void
+ */
+void
+dp_enh_tx_capture_enable(struct dp_pdev *pdev, uint8_t user_mode)
+{
+	if (dp_soc_is_tx_capture_set_in_pdev(pdev->soc) == 1)
+		dp_soc_set_txrx_ring_map_single(pdev->soc);
+
+	if (!pdev->pktlog_ppdu_stats)
+		dp_h2t_cfg_stats_msg_send(pdev,
+					  DP_PPDU_STATS_CFG_SNIFFER,
+					  pdev->pdev_id);
+	pdev->tx_capture_enabled = user_mode;
+	QDF_TRACE(QDF_MODULE_ID_TX_CAPTURE, QDF_TRACE_LEVEL_INFO_LOW,
+		  "Mode change request done cur mode - %d user_mode - %d\n",
+		  pdev->tx_capture_enabled, user_mode);
+}
+
+/*
+ * dp_enh_tx_cap_mode_change()- API to enable/disable enhanced tx capture
+ * @pdev_handle: DP_PDEV handle
+ * @user_mode: user provided value
+ *
+ * Return: void
+ */
+static void
+dp_enh_tx_cap_mode_change(struct dp_pdev *pdev, uint8_t user_mode)
+{
+	if (user_mode == CDP_TX_ENH_CAPTURE_DISABLED) {
+		dp_enh_tx_capture_disable(pdev);
+	} else {
+		dp_enh_tx_capture_enable(pdev, user_mode);
+	}
 }
 
 /*
@@ -1492,44 +1532,10 @@ dp_enh_tx_capture_disable(struct dp_pdev *pdev)
 QDF_STATUS
 dp_config_enh_tx_capture(struct dp_pdev *pdev, uint8_t val)
 {
-	qdf_spin_lock(&pdev->tx_capture.config_lock);
-	if (pdev->tx_capture.tx_cap_mode_flag) {
-		pdev->tx_capture.tx_cap_mode_flag = false;
-		pdev->tx_capture_enabled = val;
-		QDF_TRACE(QDF_MODULE_ID_TX_CAPTURE, QDF_TRACE_LEVEL_INFO_LOW,
-			  "Mode change requested - %d\n",
-			  pdev->tx_capture_enabled);
-	} else if (!pdev->tx_capture.tx_cap_mode_flag &&
-		   !val && !!pdev->tx_capture_enabled) {
-		/* here the val is always 0 which is disable */
-		pdev->tx_capture_enabled = val;
-		pdev->tx_capture.tx_cap_mode_flag = false;
-		QDF_TRACE(QDF_MODULE_ID_TX_CAPTURE, QDF_TRACE_LEVEL_INFO_LOW,
-			  "Mode change requested - %d\n",
-			  pdev->tx_capture_enabled);
-	} else {
-		QDF_TRACE(QDF_MODULE_ID_TX_CAPTURE, QDF_TRACE_LEVEL_INFO_LOW,
-			  "Mode change request pending prev mode - %d\n",
-			  pdev->tx_capture_enabled);
-		qdf_spin_unlock(&pdev->tx_capture.config_lock);
-		return QDF_STATUS_E_BUSY;
-	}
-
-	if (pdev->tx_capture_enabled == CDP_TX_ENH_CAPTURE_ENABLE_ALL_PEERS ||
-	    pdev->tx_capture_enabled == CDP_TX_ENH_CAPTURE_ENDIS_PER_PEER) {
-		if (dp_soc_is_tx_capture_set_in_pdev(pdev->soc) == 1)
-			dp_soc_set_txrx_ring_map_single(pdev->soc);
-
-		if (!pdev->pktlog_ppdu_stats)
-			dp_h2t_cfg_stats_msg_send(pdev,
-						  DP_PPDU_STATS_CFG_SNIFFER,
-						  pdev->pdev_id);
-		pdev->tx_capture.tx_cap_mode_flag = true;
-		QDF_TRACE(QDF_MODULE_ID_TX_CAPTURE, QDF_TRACE_LEVEL_INFO_LOW,
-			  "Mode change request done cur mode - %d\n",
-			  pdev->tx_capture_enabled);
-	}
-	qdf_spin_unlock(&pdev->tx_capture.config_lock);
+	qdf_atomic_set(&pdev->tx_capture.tx_cap_usr_mode, val);
+	QDF_TRACE(QDF_MODULE_ID_TX_CAPTURE, QDF_TRACE_LEVEL_INFO_LOW,
+		  "User mode change requested - %d\n",
+		  qdf_atomic_read(&pdev->tx_capture.tx_cap_usr_mode));
 
 	return QDF_STATUS_SUCCESS;
 }
@@ -4821,6 +4827,7 @@ void dp_tx_ppdu_stats_process(void *context)
 	qdf_nbuf_t nbuf_ppdu;
 	struct dp_pdev_tx_capture *ptr_tx_cap = &pdev->tx_capture;
 	size_t nbuf_list_sz;
+	uint8_t user_mode;
 
 	STAILQ_INIT(&sched_ppdu_queue);
 	/* Move the PPDU entries to defer list */
@@ -4883,7 +4890,6 @@ void dp_tx_ppdu_stats_process(void *context)
 			continue;
 		}
 
-		qdf_spin_lock(&ptr_tx_cap->config_lock);
 		ppdu_desc_cnt = 0;
 		STAILQ_FOREACH_SAFE(sched_ppdu_info,
 				    &sched_ppdu_queue,
@@ -4908,9 +4914,6 @@ void dp_tx_ppdu_stats_process(void *context)
 			    CDP_TX_ENH_CAPTURE_DISABLED) {
 				struct cdp_tx_completion_ppdu *ppdu_desc;
 
-				if (!pdev->tx_capture.tx_cap_mode_flag)
-					dp_enh_tx_capture_disable(pdev);
-
 				ppdu_desc = (struct cdp_tx_completion_ppdu *)
 					qdf_nbuf_data(nbuf_ppdu);
 				/**
@@ -4982,13 +4985,17 @@ void dp_tx_ppdu_stats_process(void *context)
 			}
 		}
 
-		qdf_spin_unlock(&ptr_tx_cap->config_lock);
 		qdf_mem_free(nbuf_ppdu_list);
 
-		qdf_spin_lock(&pdev->tx_capture.config_lock);
-		if (!pdev->tx_capture.tx_cap_mode_flag)
-			dp_enh_tx_capture_disable(pdev);
-		qdf_spin_unlock(&pdev->tx_capture.config_lock);
+		/* get user mode */
+		user_mode = qdf_atomic_read(&pdev->tx_capture.tx_cap_usr_mode);
+		/*
+		 * invoke mode change if user mode value is
+		 * different from driver mode value,
+		 * this was done to reduce config lock
+		 */
+		if (user_mode != pdev->tx_capture_enabled)
+			dp_enh_tx_cap_mode_change(pdev, user_mode);
 	}
 }
 

+ 1 - 2
dp/wifi3.0/dp_tx_capture.h

@@ -107,11 +107,10 @@ struct dp_pdev_tx_capture {
 	qdf_nbuf_queue_t ctl_mgmt_q[TXCAP_MAX_TYPE][TXCAP_MAX_SUBTYPE];
 	qdf_nbuf_queue_t retries_ctl_mgmt_q[TXCAP_MAX_TYPE][TXCAP_MAX_SUBTYPE];
 	qdf_spinlock_t ctl_mgmt_lock[TXCAP_MAX_TYPE][TXCAP_MAX_SUBTYPE];
-	qdf_spinlock_t config_lock;
 	uint32_t htt_frame_type[TX_CAP_HTT_MAX_FTYPE];
 	struct cdp_tx_completion_ppdu dummy_ppdu_desc;
 	struct dp_peer_mgmt_list *ptr_peer_mgmt_list;
-	bool tx_cap_mode_flag;
+	qdf_atomic_t tx_cap_usr_mode;
 };
 
 /* Tx TID */