Parcourir la source

qcacmn: Add support for missing Node statistics

Add support for following node statistics for Lithium DP
1) Number of Tx unicast MSDUs and bytes
2) Last Tx and Rx rate
3) Excessive retries per AC

Change-Id: If533df25e5299bf399bed85ace99763aab74134e
Pranita Solanke il y a 7 ans
Parent
commit
a12b4b305c

+ 11 - 1
dp/inc/cdp_txrx_cmn_struct.h

@@ -767,6 +767,8 @@ struct cdp_tx_stats {
 	uint32_t non_amsdu_cnt;
 	/* Number of MSDUs part of AMSDU*/
 	uint32_t amsdu_cnt;
+	/* Tx Rate */
+	uint32_t tx_rate;
 
 	/* RSSI of last packet */
 	uint32_t last_ack_rssi;
@@ -783,6 +785,9 @@ struct cdp_tx_stats {
 	/* Packet Count for different bandwidths */
 	uint32_t bw[MAX_BW];
 
+	/* Excess Retry Count */
+	uint32_t excess_retries[WME_AC_MAX];
+
 	/* Wireless Multimedia type Count */
 	uint32_t wme_ac_type[WME_AC_MAX];
 
@@ -860,6 +865,8 @@ struct cdp_rx_stats {
 	uint32_t bar_recv_cnt;
 	/* RSSI of received signal */
 	uint32_t rssi;
+	/*Rx rate */
+	uint32_t rx_rate;
 };
 
 /* Tx ingress Stats */
@@ -1074,8 +1081,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
+ * @tx_rate: Transmission Rate
  */
 struct cdp_tx_completion_ppdu_user {
 	uint32_t completion_status:8,
@@ -1119,6 +1126,7 @@ struct cdp_tx_completion_ppdu_user {
 	uint32_t tx_duration;
 	uint16_t ru_tones;
 	bool is_mcast;
+	uint32_t tx_rate;
 };
 
 /**
@@ -1131,6 +1139,7 @@ struct cdp_tx_completion_ppdu_user {
  * @num_msdu: Number of MSDUs in PPDU
  * @channel: Channel informartion
  * @ack_rssi: RSSI value of last ack packet (units=dB above noise floor)
+ * @tx_duration: PPDU airtime
  * @ppdu_start_timestamp: TSF at PPDU start
  * @ppdu_end_timestamp: TSF at PPDU end
  * @ack_timestamp: TSF at the reception of ACK
@@ -1146,6 +1155,7 @@ struct cdp_tx_completion_ppdu {
 	uint16_t channel;
 	uint16_t phy_mode;
 	uint32_t ack_rssi;
+	uint32_t tx_duration;
 	uint32_t ppdu_start_timestamp;
 	uint32_t ppdu_end_timestamp;
 	uint32_t ack_timestamp;

+ 82 - 21
dp/wifi3.0/dp_htt.c

@@ -74,16 +74,28 @@ static void dp_tx_stats_update(struct dp_soc *soc, struct dp_peer *peer,
 		return;
 
 	DP_STATS_INC_PKT(peer, tx.comp_pkt,
-			num_msdu, ppdu->success_bytes);
+			num_msdu, (ppdu->success_bytes +
+				ppdu->retry_bytes + ppdu->failed_bytes));
 	DP_STATS_INC(peer, tx.tx_failed, ppdu->failed_msdus);
-	DP_STATS_INC(peer, tx.sgi_count[ppdu->gi], 1);
-	DP_STATS_INC(peer, tx.bw[ppdu->bw], 1);
+	DP_STATS_UPD(peer, tx.tx_rate, ppdu->tx_rate);
+	DP_STATS_INC(peer, tx.sgi_count[ppdu->gi], num_msdu);
+	DP_STATS_INC(peer, tx.bw[ppdu->bw], num_msdu);
 	DP_STATS_UPD(peer, tx.last_ack_rssi, ack_rssi);
-	DP_STATS_INC(peer, tx.wme_ac_type[TID_TO_WME_AC(ppdu->tid)], 1);
-	DP_STATS_INC(peer, tx.stbc, ppdu->stbc);
-	DP_STATS_INC(peer, tx.ldpc, ppdu->ldpc);
+	DP_STATS_INC(peer, tx.wme_ac_type[TID_TO_WME_AC(ppdu->tid)], num_msdu);
+	DP_STATS_INCC(peer, tx.stbc, num_msdu, ppdu->stbc);
+	DP_STATS_INCC(peer, tx.ldpc, num_msdu, ppdu->ldpc);
 	DP_STATS_INC_PKT(peer, tx.tx_success, ppdu->success_msdus,
 			ppdu->success_bytes);
+	if (ppdu->is_mcast) {
+		DP_STATS_INC_PKT(peer, tx.mcast, num_msdu, (ppdu->success_bytes
+					+ ppdu->retry_bytes +
+					ppdu->failed_bytes));
+	} else {
+		DP_STATS_INC_PKT(peer, tx.ucast, num_msdu, (ppdu->success_bytes
+					+ ppdu->retry_bytes +
+					ppdu->failed_bytes));
+	}
+
 	DP_STATS_INC(peer, tx.retries,
 			(ppdu->long_retries + ppdu->short_retries));
 	DP_STATS_INCC(peer,
@@ -1381,9 +1393,13 @@ static void dp_process_ppdu_stats_common_tlv(struct dp_pdev *pdev,
 	else
 		ppdu_desc->frame_type = CDP_PPDU_FTYPE_CTRL;
 
-	ppdu_desc->ppdu_start_timestamp = dp_stats_buf->ppdu_start_tstmp_us;
-	ppdu_desc->ppdu_end_timestamp = dp_stats_buf->ppdu_sch_end_tstmp_us;
-	tag_buf += 6;
+	tag_buf += 2;
+	ppdu_desc->tx_duration = *tag_buf;
+	tag_buf += 3;
+	ppdu_desc->ppdu_start_timestamp = *tag_buf;
+	ppdu_desc->ppdu_end_timestamp = 0; /*TODO: value to be provided by FW */
+	tag_buf++;
+
 	freq = HTT_PPDU_STATS_COMMON_TLV_CHAN_MHZ_GET(*tag_buf);
 	if (freq != ppdu_desc->channel) {
 		soc = pdev->soc;
@@ -1392,6 +1408,7 @@ static void dp_process_ppdu_stats_common_tlv(struct dp_pdev *pdev,
 			pdev->operating_channel =
 		soc->cdp_soc.ol_ops->freq_to_channel(pdev->osif_pdev, freq);
 	}
+
 	ppdu_desc->phy_mode = HTT_PPDU_STATS_COMMON_TLV_PHY_MODE_GET(*tag_buf);
 }
 
@@ -1493,6 +1510,7 @@ static void dp_process_ppdu_stats_user_rate_tlv(struct dp_pdev *pdev,
 		HTT_PPDU_STATS_USER_RATE_TLV_PPDU_TYPE_GET(*tag_buf);
 
 	tag_buf++;
+	ppdu_user_desc->tx_rate = *tag_buf;
 
 	ppdu_user_desc->ltf_size =
 		HTT_PPDU_STATS_USER_RATE_TLV_LTF_SIZE_GET(*tag_buf);
@@ -1656,6 +1674,8 @@ static void dp_process_ppdu_stats_user_cmpltn_common_tlv(
 
 	ppdu_user_desc->short_retries =
 	HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_SHORT_RETRY_GET(*tag_buf);
+	ppdu_user_desc->retry_msdus =
+		ppdu_user_desc->long_retries + ppdu_user_desc->short_retries;
 
 	ppdu_user_desc->is_ampdu =
 		HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_IS_AMPDU_GET(*tag_buf);
@@ -1786,6 +1806,12 @@ 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);
+
+	ppdu_user_desc->success_msdus = ppdu_user_desc->num_msdu;
+
+	tag_buf += 2;
+	ppdu_user_desc->success_bytes = *tag_buf;
+
 }
 
 /*
@@ -1809,9 +1835,9 @@ static void dp_process_ppdu_stats_user_common_array_tlv(struct dp_pdev *pdev,
 	ppdu_desc =
 	(struct cdp_tx_completion_ppdu *)qdf_nbuf_data(pdev->tx_ppdu_info.buf);
 
-	tag_buf += 2;
+	tag_buf++;
 	dp_stats_buf = (struct htt_tx_ppdu_stats_info *)tag_buf;
-	tag_buf += 4;
+	tag_buf += 3;
 	peer_id =
 		HTT_PPDU_STATS_ARRAY_ITEM_TLV_PEERID_GET(*tag_buf);
 
@@ -1827,11 +1853,11 @@ static void dp_process_ppdu_stats_user_common_array_tlv(struct dp_pdev *pdev,
 
 	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 =
@@ -1839,8 +1865,45 @@ static void dp_process_ppdu_stats_user_common_array_tlv(struct dp_pdev *pdev,
 	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_stats_flush_tlv: Process
+ * htt_ppdu_stats_flush_tlv
+ * @pdev: DP PDEV handle
+ * @tag_buf: buffer containing the htt_ppdu_stats_flush_tlv
+ *
+ * return:void
+ */
+static void dp_process_ppdu_stats_user_compltn_flush_tlv(struct dp_pdev *pdev,
+						uint32_t *tag_buf)
+{
+	uint32_t peer_id;
+	uint32_t drop_reason;
+	uint8_t tid;
+	uint32_t num_msdu;
+	struct dp_peer *peer;
+
+	tag_buf++;
+	drop_reason = *tag_buf;
+
+	tag_buf++;
+	num_msdu = HTT_PPDU_STATS_FLUSH_TLV_NUM_MSDU_GET(*tag_buf);
+
+	tag_buf++;
+	peer_id =
+		HTT_PPDU_STATS_FLUSH_TLV_SW_PEER_ID_GET(*tag_buf);
+
+	peer = dp_peer_find_by_id(pdev->soc, peer_id);
+	if (!peer)
+		return;
+
+	tid = HTT_PPDU_STATS_FLUSH_TLV_TID_NUM_GET(*tag_buf);
+
+	if (drop_reason == HTT_FLUSH_EXCESS_RETRIES) {
+		DP_STATS_INC(peer, tx.excess_retries[TID_TO_WME_AC(tid)],
+					num_msdu);
+	}
 }
 
 /*
@@ -1890,7 +1953,6 @@ static void dp_process_ppdu_tag(struct dp_pdev *pdev, uint32_t *tag_buf,
 		uint32_t tlv_len)
 {
 	uint32_t tlv_type = HTT_STATS_TLV_TAG_GET(*tag_buf);
-
 	switch (tlv_type) {
 	case HTT_PPDU_STATS_COMMON_TLV:
 		dp_process_ppdu_stats_common_tlv(pdev, tag_buf);
@@ -1928,6 +1990,10 @@ static void dp_process_ppdu_tag(struct dp_pdev *pdev, uint32_t *tag_buf,
 		dp_process_ppdu_stats_user_common_array_tlv(pdev,
 							tag_buf);
 		break;
+	case HTT_PPDU_STATS_USR_COMPLTN_FLUSH_TLV:
+		dp_process_ppdu_stats_user_compltn_flush_tlv(pdev,
+								tag_buf);
+		break;
 	case HTT_PPDU_STATS_TX_MGMTCTRL_PAYLOAD_TLV:
 		dp_process_ppdu_stats_tx_mgmtctrl_payload_tlv(pdev,
 							tag_buf, tlv_len);
@@ -1955,16 +2021,11 @@ static QDF_STATUS dp_htt_process_tlv(struct dp_pdev *pdev,
 	ppdu_id = HTT_T2H_PPDU_STATS_PPDU_ID_GET(*msg_word);
 
 	msg_word = msg_word + 3;
-
 	while (length > 0) {
 		tlv_buf = (uint8_t *)msg_word;
 		tlv_type = HTT_STATS_TLV_TAG_GET(*msg_word);
 		tlv_length = HTT_STATS_TLV_LENGTH_GET(*msg_word);
 
-		QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_DEBUG,
-				"HTT PPDU Tag %d, Length %d", tlv_type,
-				tlv_length);
-
 		if (tlv_length == 0)
 			break;
 
@@ -1974,10 +2035,10 @@ static QDF_STATUS dp_htt_process_tlv(struct dp_pdev *pdev,
 		tlv_length += HTT_TLV_HDR_LEN;
 		dp_process_ppdu_tag(pdev, msg_word, tlv_length);
 
+
 		msg_word = (uint32_t *)((uint8_t *)tlv_buf + tlv_length);
 		length -= (tlv_length);
 	}
-
 	return status;
 }
 #endif /* FEATURE_PERPKT_INFO */

+ 0 - 1
dp/wifi3.0/dp_rx_mon_dest.c

@@ -341,7 +341,6 @@ qdf_nbuf_t dp_rx_mon_restitch_mpdu_from_msdus(struct dp_soc *soc,
 	/* The nbuf has been pulled just beyond the status and points to the
 	   * payload
 	*/
-
 	msdu_orig = head_msdu;
 
 	rx_desc = qdf_nbuf_data(msdu_orig);

+ 8 - 7
dp/wifi3.0/dp_rx_mon_status.c

@@ -123,28 +123,29 @@ static void dp_rx_stats_update(struct dp_soc *soc, struct dp_peer *peer,
 	if (soc->process_rx_status)
 		return;
 	DP_STATS_UPD(peer, rx.rssi, ppdu->rssi);
-	DP_STATS_INC(peer, rx.sgi_count[ppdu->u.gi], 1);
+	DP_STATS_INC(peer, rx.sgi_count[ppdu->u.gi], num_msdu);
 	DP_STATS_INC(peer, rx.bw[ppdu->u.bw], num_msdu);
-	DP_STATS_INCC(peer, rx.ampdu_cnt, 1, ppdu->is_ampdu);
-	DP_STATS_INCC(peer, rx.non_ampdu_cnt, 1, !(ppdu->is_ampdu));
+	DP_STATS_INCC(peer, rx.ampdu_cnt, num_msdu, ppdu->is_ampdu);
+	DP_STATS_INCC(peer, rx.non_ampdu_cnt, num_msdu, !(ppdu->is_ampdu));
+	DP_STATS_UPD(peer, rx.rx_rate, mcs);
 	DP_STATS_INCC(peer,
 			rx.pkt_type[preamble].mcs_count[MAX_MCS], num_msdu,
 			((mcs >= MAX_MCS_11A) && (preamble == DOT11_A)));
 	DP_STATS_INCC(peer,
 			rx.pkt_type[preamble].mcs_count[mcs], num_msdu,
-			((mcs < MAX_MCS_11A) &&	(preamble == DOT11_A)));
+			((mcs < MAX_MCS_11A) && (preamble == DOT11_A)));
 	DP_STATS_INCC(peer,
 			rx.pkt_type[preamble].mcs_count[MAX_MCS], num_msdu,
 			((mcs >= MAX_MCS_11B) && (preamble == DOT11_B)));
 	DP_STATS_INCC(peer,
 			rx.pkt_type[preamble].mcs_count[mcs], num_msdu,
-			((mcs < MAX_MCS_11B) &&	(preamble == DOT11_B)));
+			((mcs < MAX_MCS_11B) && (preamble == DOT11_B)));
 	DP_STATS_INCC(peer,
 			rx.pkt_type[preamble].mcs_count[MAX_MCS], num_msdu,
 			((mcs >= MAX_MCS_11A) && (preamble == DOT11_N)));
 	DP_STATS_INCC(peer,
 			rx.pkt_type[preamble].mcs_count[mcs], num_msdu,
-			((mcs < MAX_MCS_11A) &&	(preamble == DOT11_N)));
+			((mcs < MAX_MCS_11A) && (preamble == DOT11_N)));
 	DP_STATS_INCC(peer,
 			rx.pkt_type[preamble].mcs_count[MAX_MCS], num_msdu,
 			((mcs >= MAX_MCS_11AC) && (preamble == DOT11_AC)));
@@ -157,7 +158,7 @@ static void dp_rx_stats_update(struct dp_soc *soc, struct dp_peer *peer,
 	DP_STATS_INCC(peer,
 			rx.pkt_type[preamble].mcs_count[mcs], num_msdu,
 			((mcs < (MAX_MCS - 1)) && (preamble == DOT11_AX)));
-	DP_STATS_INC(peer, rx.wme_ac_type[TID_TO_WME_AC(ppdu->tid)], 1);
+	DP_STATS_INC(peer, rx.wme_ac_type[TID_TO_WME_AC(ppdu->tid)], num_msdu);
 
 	if (soc->cdp_soc.ol_ops->update_dp_stats) {
 		soc->cdp_soc.ol_ops->update_dp_stats(pdev->osif_pdev,

+ 2 - 5
dp/wifi3.0/dp_tx.c

@@ -2329,10 +2329,7 @@ static void dp_tx_comp_process_desc(struct dp_soc *soc,
 		peer = dp_peer_find_by_id(soc, ts.peer_id);
 		length = qdf_nbuf_len(desc->nbuf);
 
-		/* Process Tx status in descriptor */
-		if (soc->process_tx_status ||
-				(desc->vdev && desc->vdev->mesh_vdev))
-			dp_tx_comp_process_tx_status(desc, length);
+		dp_tx_comp_process_tx_status(desc, length);
 
 		dp_tx_comp_free_buf(soc, desc);
 
@@ -2464,7 +2461,7 @@ uint32_t dp_tx_comp_handler(struct dp_soc *soc, void *hal_srng, uint32_t quota)
 
 			/* Collect hw completion contents */
 			hal_tx_comp_desc_sync(tx_comp_hal_desc,
-					&tx_desc->comp, soc->process_tx_status);
+					&tx_desc->comp, 1);
 
 		}
 

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

@@ -49,6 +49,7 @@
 #include "hal_rx.h"
 
 #define MAX_BW 4
+#define MAX_RETRIES 4
 #define MAX_RECEPTION_TYPES 4
 #define REPT_MU_MIMO 1
 #define REPT_MU_OFDMA_MIMO 3