Ver código fonte

qcacmn: Parse PPDU stats TLV

Parse PPDU TLVs provided by FW which are required to
capture TX data path stats

Change-Id: If91834aa94ff8893ba1f292d801f2c00ecdaea1f
CRs-Fixed: 2104488
Soumya Bhat 7 anos atrás
pai
commit
1c73aa673b
2 arquivos alterados com 82 adições e 38 exclusões
  1. 4 0
      dp/inc/cdp_txrx_cmn_struct.h
  2. 78 38
      dp/wifi3.0/dp_htt.c

+ 4 - 0
dp/inc/cdp_txrx_cmn_struct.h

@@ -1042,6 +1042,8 @@ struct cdp_pdev_stats {
  * @ba_bitmap: Block Ack bitmap
  * @start_seqa: Sequence number of first MPDU
  * @enq_bitmap: Enqueue MPDU bitmap
+ * @tx_duration: PPDU airtime
+ * @is_mcast: MCAST or UCAST
  */
 struct cdp_tx_completion_ppdu_user {
 	uint32_t completion_status:8,
@@ -1082,6 +1084,8 @@ struct cdp_tx_completion_ppdu_user {
 	uint32_t enq_bitmap[CDP_BA_256_BIT_MAP_SIZE_DWORDS];
 	uint32_t num_mpdu:9,
 		 num_msdu:16;
+	uint32_t tx_duration;
+	bool is_mcast;
 };
 
 /**

+ 78 - 38
dp/wifi3.0/dp_htt.c

@@ -57,12 +57,7 @@ do {                                                             \
 static void dp_tx_stats_update(struct dp_soc *soc, struct dp_peer *peer,
 		struct cdp_tx_completion_ppdu_user *ppdu, uint32_t ack_rssi)
 {
-	struct dp_pdev *pdev = NULL;
-
-	if (!peer)
-		return;
-
-	pdev = peer->vdev->pdev;
+	struct dp_pdev *pdev = peer->vdev->pdev;
 
 	DP_STATS_INC_PKT(peer, tx.comp_pkt,
 			(ppdu->success_msdus + ppdu->retry_msdus +
@@ -1312,7 +1307,6 @@ static uint8_t dp_get_ppdu_info_user_index(struct dp_pdev *pdev,
 	qdf_assert_always(pdev->tx_ppdu_info.last_user <= CDP_MU_MAX_USERS);
 	return pdev->tx_ppdu_info.last_user - 1;
 }
-#endif
 
 /*
  * dp_process_ppdu_stats_common_tlv: Process htt_ppdu_stats_common_tlv
@@ -1321,7 +1315,6 @@ static uint8_t dp_get_ppdu_info_user_index(struct dp_pdev *pdev,
  *
  * return:void
  */
-#ifdef FEATURE_PERPKT_INFO
 static void dp_process_ppdu_stats_common_tlv(struct dp_pdev *pdev,
 		uint32_t *tag_buf)
 {
@@ -1352,7 +1345,6 @@ static void dp_process_ppdu_stats_common_tlv(struct dp_pdev *pdev,
 	ppdu_desc->channel = HTT_PPDU_STATS_COMMON_TLV_CHAN_MHZ_GET(*tag_buf);
 	ppdu_desc->phy_mode = HTT_PPDU_STATS_COMMON_TLV_PHY_MODE_GET(*tag_buf);
 }
-#endif
 
 /*
  * dp_process_ppdu_stats_user_common_tlv: Process ppdu_stats_user_common
@@ -1360,7 +1352,6 @@ static void dp_process_ppdu_stats_common_tlv(struct dp_pdev *pdev,
  *
  * return:void
  */
-#ifdef FEATURE_PERPKT_INFO
 static void dp_process_ppdu_stats_user_common_tlv(
 		struct dp_pdev *pdev, uint32_t *tag_buf)
 {
@@ -1387,19 +1378,19 @@ static void dp_process_ppdu_stats_user_common_tlv(
 
 	tag_buf++;
 
-	if (HTT_PPDU_STATS_USER_COMMON_TLV_MCAST_GET(*tag_buf))
+	if (HTT_PPDU_STATS_USER_COMMON_TLV_MCAST_GET(*tag_buf)) {
+		ppdu_user_desc->is_mcast = true;
 		ppdu_user_desc->mpdu_tried_mcast =
 		HTT_PPDU_STATS_USER_COMMON_TLV_MPDUS_TRIED_GET(*tag_buf);
-	else
+	} else {
 		ppdu_user_desc->mpdu_tried_ucast =
 		HTT_PPDU_STATS_USER_COMMON_TLV_MPDUS_TRIED_GET(*tag_buf);
-
+}
 	ppdu_user_desc->qos_ctrl =
 		HTT_PPDU_STATS_USER_COMMON_TLV_QOS_CTRL_GET(*tag_buf);
 	ppdu_user_desc->frame_ctrl =
 		HTT_PPDU_STATS_USER_COMMON_TLV_FRAME_CTRL_GET(*tag_buf);
 }
-#endif
 
 
 /**
@@ -1409,7 +1400,6 @@ static void dp_process_ppdu_stats_user_common_tlv(
  *
  * return:void
  */
-#ifdef FEATURE_PERPKT_INFO
 static void dp_process_ppdu_stats_user_rate_tlv(struct dp_pdev *pdev,
 		uint32_t *tag_buf)
 {
@@ -1436,8 +1426,6 @@ static void dp_process_ppdu_stats_user_rate_tlv(struct dp_pdev *pdev,
 
 	ppdu_user_desc->tid =
 		HTT_PPDU_STATS_USER_RATE_TLV_TID_NUM_GET(*tag_buf);
-	ppdu_user_desc->peer_id =
-		HTT_PPDU_STATS_USER_RATE_TLV_SW_PEER_ID_GET(*tag_buf);
 
 	qdf_mem_copy(ppdu_user_desc->mac_addr, peer->mac_addr.raw,
 			DP_MAC_ADDR_LEN);
@@ -1464,17 +1452,15 @@ static void dp_process_ppdu_stats_user_rate_tlv(struct dp_pdev *pdev,
 	ppdu_user_desc->ppdu_type =
 		HTT_PPDU_STATS_USER_RATE_TLV_PPDU_TYPE_GET(*tag_buf);
 }
-#endif
 
 /*
  * dp_process_ppdu_stats_enq_mpdu_bitmap_64_tlv: Process
  * htt_ppdu_stats_enq_mpdu_bitmap_64_tlv
- * soc: DP SOC handle
+ * pdev: DP PDEV handle
  * @tag_buf: buffer containing the tlv htt_ppdu_stats_enq_mpdu_bitmap_64_tlv
  *
  * return:void
  */
-#ifdef FEATURE_PERPKT_INFO
 static void dp_process_ppdu_stats_enq_mpdu_bitmap_64_tlv(
 		struct dp_pdev *pdev, uint32_t *tag_buf)
 {
@@ -1509,7 +1495,6 @@ static void dp_process_ppdu_stats_enq_mpdu_bitmap_64_tlv(
 	qdf_mem_copy(&ppdu_user_desc->enq_bitmap, &dp_stats_buf->enq_bitmap,
 					CDP_BA_64_BIT_MAP_SIZE_DWORDS);
 }
-#endif
 
 /*
  * dp_process_ppdu_stats_enq_mpdu_bitmap_256_tlv: Process
@@ -1519,7 +1504,6 @@ static void dp_process_ppdu_stats_enq_mpdu_bitmap_64_tlv(
  *
  * return:void
  */
-#ifdef FEATURE_PERPKT_INFO
 static void dp_process_ppdu_stats_enq_mpdu_bitmap_256_tlv(
 		struct dp_pdev *pdev, uint32_t *tag_buf)
 {
@@ -1554,7 +1538,6 @@ static void dp_process_ppdu_stats_enq_mpdu_bitmap_256_tlv(
 	qdf_mem_copy(&ppdu_user_desc->enq_bitmap, &dp_stats_buf->enq_bitmap,
 					CDP_BA_256_BIT_MAP_SIZE_DWORDS);
 }
-#endif
 
 /*
  * dp_process_ppdu_stats_user_cmpltn_common_tlv: Process
@@ -1564,7 +1547,6 @@ static void dp_process_ppdu_stats_enq_mpdu_bitmap_256_tlv(
  *
  * return:void
  */
-#ifdef FEATURE_PERPKT_INFO
 static void dp_process_ppdu_stats_user_cmpltn_common_tlv(
 		struct dp_pdev *pdev, uint32_t *tag_buf)
 {
@@ -1619,17 +1601,15 @@ static void dp_process_ppdu_stats_user_cmpltn_common_tlv(
 		HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_IS_AMPDU_GET(*tag_buf);
 
 }
-#endif
 
 /*
  * dp_process_ppdu_stats_user_compltn_ba_bitmap_64_tlv: Process
  * htt_ppdu_stats_user_compltn_ba_bitmap_64_tlv
- * soc: DP SOC handle
+ * pdev: DP PDEV handle
  * @tag_buf: buffer containing the htt_ppdu_stats_user_compltn_ba_bitmap_64_tlv
  *
  * return:void
  */
-#ifdef FEATURE_PERPKT_INFO
 static void dp_process_ppdu_stats_user_compltn_ba_bitmap_64_tlv(
 		struct dp_pdev *pdev, uint32_t *tag_buf)
 {
@@ -1663,17 +1643,15 @@ static void dp_process_ppdu_stats_user_compltn_ba_bitmap_64_tlv(
 	qdf_mem_copy(&ppdu_user_desc->ba_bitmap, &dp_stats_buf->ba_bitmap,
 			CDP_BA_64_BIT_MAP_SIZE_DWORDS);
 }
-#endif
 
 /*
  * dp_process_ppdu_stats_user_compltn_ba_bitmap_256_tlv: Process
  * htt_ppdu_stats_user_compltn_ba_bitmap_256_tlv
- * soc: DP SOC handle
+ * pdev: DP PDEV handle
  * @tag_buf: buffer containing the htt_ppdu_stats_user_compltn_ba_bitmap_256_tlv
  *
  * return:void
  */
-#ifdef FEATURE_PERPKT_INFO
 static void dp_process_ppdu_stats_user_compltn_ba_bitmap_256_tlv(
 		struct dp_pdev *pdev, uint32_t *tag_buf)
 {
@@ -1707,17 +1685,15 @@ static void dp_process_ppdu_stats_user_compltn_ba_bitmap_256_tlv(
 	qdf_mem_copy(&ppdu_user_desc->ba_bitmap, &dp_stats_buf->ba_bitmap,
 			CDP_BA_256_BIT_MAP_SIZE_DWORDS);
 }
-#endif
 
 /*
  * dp_process_ppdu_stats_user_compltn_ack_ba_status_tlv: Process
  * htt_ppdu_stats_user_compltn_ack_ba_status_tlv
- * soc: DP SOC handle
+ * pdev: DP PDE handle
  * @tag_buf: buffer containing the htt_ppdu_stats_user_compltn_ack_ba_status_tlv
  *
  * return:void
  */
-#ifdef FEATURE_PERPKT_INFO
 static void dp_process_ppdu_stats_user_compltn_ack_ba_status_tlv(
 		struct dp_pdev *pdev, uint32_t *tag_buf)
 {
@@ -1751,7 +1727,61 @@ static void dp_process_ppdu_stats_user_compltn_ack_ba_status_tlv(
 	ppdu_user_desc->num_msdu =
 	HTT_PPDU_STATS_USER_CMPLTN_ACK_BA_STATUS_TLV_NUM_MSDU_GET(*tag_buf);
 }
-#endif
+
+/*
+ * dp_process_ppdu_stats_user_common_array_tlv: Process
+ * htt_ppdu_stats_user_common_array_tlv
+ * pdev: DP PDEV handle
+ * @tag_buf: buffer containing the htt_ppdu_stats_user_compltn_ack_ba_status_tlv
+ *
+ * return:void
+ */
+static void dp_process_ppdu_stats_user_common_array_tlv(struct dp_pdev *pdev,
+						uint32_t *tag_buf)
+{
+	uint32_t peer_id;
+	struct dp_peer *peer;
+	struct cdp_tx_completion_ppdu *ppdu_desc;
+	struct cdp_tx_completion_ppdu_user *ppdu_user_desc;
+	uint8_t curr_user_index = 0;
+	struct htt_tx_ppdu_stats_info *dp_stats_buf;
+
+	ppdu_desc =
+	(struct cdp_tx_completion_ppdu *)qdf_nbuf_data(pdev->tx_ppdu_info.buf);
+
+	tag_buf += 2;
+	dp_stats_buf = (struct htt_tx_ppdu_stats_info *)tag_buf;
+	tag_buf += 4;
+	peer_id =
+		HTT_PPDU_STATS_ARRAY_ITEM_TLV_PEERID_GET(*tag_buf);
+
+	peer = dp_peer_find_by_id(pdev->soc, peer_id);
+
+	if (!peer) {
+		QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
+			"Invalid peer");
+		return;
+	}
+
+	curr_user_index = dp_get_ppdu_info_user_index(pdev, peer_id);
+
+	ppdu_user_desc = &ppdu_desc->user[curr_user_index];
+
+	ppdu_user_desc->success_bytes = dp_stats_buf->tx_success_bytes;
+	ppdu_user_desc->retry_bytes = dp_stats_buf->tx_retry_bytes;
+	ppdu_user_desc->failed_bytes = dp_stats_buf->tx_failed_bytes;
+
+	tag_buf++;
+	ppdu_user_desc->success_msdus =
+		HTT_PPDU_STATS_ARRAY_ITEM_TLV_TX_SUCC_MSDUS_GET(*tag_buf);
+	ppdu_user_desc->retry_bytes =
+		HTT_PPDU_STATS_ARRAY_ITEM_TLV_TX_RETRY_MSDUS_GET(*tag_buf);
+	tag_buf++;
+	ppdu_user_desc->failed_msdus =
+		HTT_PPDU_STATS_ARRAY_ITEM_TLV_TX_FAILED_MSDUS_GET(*tag_buf);
+	ppdu_user_desc->tx_duration =
+		HTT_PPDU_STATS_ARRAY_ITEM_TLV_TX_DUR_GET(*tag_buf);
+}
 
 /**
  * dp_process_ppdu_tag(): Function to process the PPDU TLVs
@@ -1760,7 +1790,6 @@ static void dp_process_ppdu_stats_user_compltn_ack_ba_status_tlv(
  *
  * return: void
  */
-#ifdef FEATURE_PERPKT_INFO
 static void dp_process_ppdu_tag(struct dp_pdev *pdev, uint32_t *tag_buf,
 		uint32_t tlv_len)
 {
@@ -1799,13 +1828,15 @@ static void dp_process_ppdu_tag(struct dp_pdev *pdev, uint32_t *tag_buf,
 		dp_process_ppdu_stats_user_compltn_ack_ba_status_tlv(pdev,
 								tag_buf);
 		break;
+	case HTT_PPDU_STATS_USR_COMMON_ARRAY_TLV:
+		dp_process_ppdu_stats_user_common_array_tlv(pdev,
+							tag_buf);
+		break;
 	default:
 		break;
 	}
 }
-#endif
 
-#ifdef FEATURE_PERPKT_INFO
 static QDF_STATUS dp_htt_process_tlv(struct dp_pdev *pdev,
 		qdf_nbuf_t htt_t2h_msg)
 {
@@ -1849,7 +1880,7 @@ static QDF_STATUS dp_htt_process_tlv(struct dp_pdev *pdev,
 
 	return status;
 }
-#endif
+#endif /* FEATURE_PERPKT_INFO */
 
 /**
  * dp_txrx_ppdu_stats_handler() - Function to process HTT PPDU stats from FW
@@ -1890,12 +1921,16 @@ static void dp_txrx_ppdu_stats_handler(struct dp_soc *soc,
 			return;
 		}
 
+		qdf_mem_zero(qdf_nbuf_data(pdev->tx_ppdu_info.buf),
+				sizeof(struct cdp_tx_completion_ppdu));
+
 		if (qdf_nbuf_put_tail(pdev->tx_ppdu_info.buf,
 			sizeof(struct cdp_tx_completion_ppdu)) == NULL)	{
 			QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
 					"No tailroom for HTT PPDU");
 			return;
 		}
+
 	}
 
 	status = dp_htt_process_tlv(pdev, htt_t2h_msg);
@@ -1910,6 +1945,11 @@ static void dp_txrx_ppdu_stats_handler(struct dp_soc *soc,
 		for (i = 0; i < ppdu_desc->num_users; i++) {
 			peer = dp_peer_find_by_id(soc,
 					ppdu_desc->user[i].peer_id);
+			if (!peer)
+				continue;
+
+			ppdu_desc->num_mpdu += ppdu_desc->user[i].num_mpdu;
+			ppdu_desc->num_msdu += ppdu_desc->user[i].num_msdu;
 			dp_tx_stats_update(soc, peer, &ppdu_desc->user[i],
 					ppdu_desc->ack_rssi);
 		}