浏览代码

qca-wifi: Drop ppdu descriptor in pending ppdu queue and other fix

a. ppdu desc in pending ppdu queue is dropped on queue length exceeds
threshold which is 32.
b. configuring ring map for soc only once.

Change-Id: I7398a478ce9e4d974d9ecc2a06d30821f151a1b5
nobelj 5 年之前
父节点
当前提交
9bd45e8e5b
共有 2 个文件被更改,包括 54 次插入3 次删除
  1. 53 3
      dp/wifi3.0/dp_tx_capture.c
  2. 1 0
      dp/wifi3.0/dp_tx_capture.h

+ 53 - 3
dp/wifi3.0/dp_tx_capture.c

@@ -221,6 +221,8 @@ void dp_print_pdev_tx_capture_stats(struct dp_pdev *pdev)
 	ptr_tx_cap = &(pdev->tx_capture);
 
 	DP_PRINT_STATS("tx capture stats:");
+	DP_PRINT_STATS(" pending ppdu dropped: %u",
+		       ptr_tx_cap->pend_ppdu_dropped);
 	DP_PRINT_STATS(" mgmt control enqueue stats:");
 	for (i = 0; i < TXCAP_MAX_TYPE; i++) {
 		for (j = 0; j < TXCAP_MAX_SUBTYPE; j++) {
@@ -657,6 +659,7 @@ 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;
@@ -698,6 +701,7 @@ 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,
@@ -1087,6 +1091,33 @@ static void  dp_iterate_free_peer_msdu_q(void *pdev_hdl)
 	qdf_spin_unlock_bh(&soc->peer_ref_mutex);
 }
 
+/*
+ * dp_soc_check_enh_tx_capture() - API to get tx capture set in any pdev
+ * @soc_handle: DP_SOC handle
+ *
+ * return: true
+ */
+uint8_t
+dp_soc_is_tx_capture_set_in_pdev(struct dp_soc *soc)
+{
+	struct dp_pdev *pdev;
+	uint8_t pdev_tx_capture = 0;
+	uint8_t i;
+
+	for (i = 0; i < MAX_PDEV_CNT; i++) {
+		pdev = soc->pdev_list[i];
+		if (!pdev) {
+			continue;
+		}
+		if (!pdev->tx_capture_enabled)
+			continue;
+
+		pdev_tx_capture++;
+	}
+
+	return pdev_tx_capture;
+}
+
 /*
  * dp_enh_tx_capture_disable()- API to disable enhanced tx capture
  * @pdev_handle: DP_PDEV handle
@@ -1098,10 +1129,13 @@ dp_enh_tx_capture_disable(struct dp_pdev *pdev)
 {
 	int i, j;
 
-	dp_soc_set_txrx_ring_map(pdev->soc);
+	if (!dp_soc_is_tx_capture_set_in_pdev(pdev->soc))
+		dp_soc_set_txrx_ring_map(pdev->soc);
+
 	dp_h2t_cfg_stats_msg_send(pdev,
 				  DP_PPDU_STATS_CFG_ENH_STATS,
 				  pdev->pdev_id);
+
 	dp_iterate_free_peer_msdu_q(pdev);
 	for (i = 0; i < TXCAP_MAX_TYPE; i++) {
 		for (j = 0; j < TXCAP_MAX_SUBTYPE; j++) {
@@ -1160,7 +1194,9 @@ dp_config_enh_tx_capture(struct dp_pdev *pdev, uint8_t val)
 
 	if (pdev->tx_capture_enabled == CDP_TX_ENH_CAPTURE_ENABLE_ALL_PEERS ||
 	    pdev->tx_capture_enabled == CDP_TX_ENH_CAPTURE_ENDIS_PER_PEER) {
-		dp_soc_set_txrx_ring_map_single(pdev->soc);
+		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,
@@ -3204,6 +3240,7 @@ dp_check_ppdu_and_deliver(struct dp_pdev *pdev,
 	uint32_t ppdu_id;
 	uint32_t desc_cnt;
 	qdf_nbuf_t tmp_nbuf;
+	struct cdp_tx_completion_ppdu *tmp_ppdu_desc;
 	struct dp_tx_tid *tx_tid  = NULL;
 	int i;
 
@@ -3441,8 +3478,21 @@ dp_check_ppdu_and_deliver(struct dp_pdev *pdev,
 			QDF_TRACE(QDF_MODULE_ID_TX_CAPTURE,
 				  QDF_TRACE_LEVEL_FATAL,
 				  "pending ppdus (%d, %d) : %d\n",
-				  cur_ppdu_desc->user[0].peer_id,
+				  peer_id,
 				  tx_tid->tid, pending_ppdus);
+			tmp_nbuf =
+				qdf_nbuf_queue_remove(&tx_tid->pending_ppdu_q);
+			if (qdf_unlikely(!tmp_nbuf)) {
+				qdf_assert_always(0);
+				return;
+			}
+
+			tmp_ppdu_desc = (struct cdp_tx_completion_ppdu *)
+				qdf_nbuf_data(tmp_nbuf);
+			dp_send_data_to_stack(pdev, tmp_ppdu_desc);
+			dp_ppdu_queue_free(tmp_ppdu_desc);
+			qdf_nbuf_free(tmp_nbuf);
+			pdev->tx_capture.pend_ppdu_dropped++;
 		}
 	}
 }

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

@@ -66,6 +66,7 @@ struct dp_pdev_tx_capture {
 	uint32_t last_msdu_id;
 	qdf_event_t miss_ppdu_event;
 	uint32_t ppdu_dropped;
+	uint32_t pend_ppdu_dropped;
 	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];