Browse Source

qcacmn: Rx and Tx peer statistics update

 * Update the pkt_type counters correctly within the array bound
 * Add support for NSS counters on Tx side
 * Update ampdu flag in PPDU struct
 * Add support for ampdu flag in hal_ppdu struct

Change-Id: I79ea52727124ea4be4d82912cb2513ea58e2af10
Pranita Solanke 7 years ago
parent
commit
ed0aba69a9

+ 5 - 0
dp/inc/cdp_txrx_cmn_struct.h

@@ -836,6 +836,9 @@ struct cdp_tx_stats {
 	/* SGI count */
 	uint32_t sgi_count[MAX_GI];
 
+	/* Packet count for different num_spatial_stream values */
+	uint32_t nss[SS_COUNT];
+
 	/* Packet Count for different bandwidths */
 	uint32_t bw[MAX_BW];
 
@@ -935,6 +938,8 @@ struct cdp_tx_ingress_stats {
 	struct cdp_pkt_info inspect_pkts;
 	/*NAWDS  Multicast Packet Count */
 	struct cdp_pkt_info nawds_mcast;
+	/* Number of broadcast packets */
+	struct cdp_pkt_info bcast;
 
 	struct {
 		/* Total Raw packets */

+ 6 - 5
dp/wifi3.0/dp_htt.c

@@ -80,6 +80,7 @@ static void dp_tx_stats_update(struct dp_soc *soc, struct dp_peer *peer,
 	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_INC(peer, tx.nss[ppdu->nss], 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)], num_msdu);
 	DP_STATS_INCC(peer, tx.stbc, num_msdu, ppdu->stbc);
@@ -101,31 +102,31 @@ static void dp_tx_stats_update(struct dp_soc *soc, struct dp_peer *peer,
 	DP_STATS_INC(peer, tx.retries,
 			(ppdu->long_retries + ppdu->short_retries));
 	DP_STATS_INCC(peer,
-			tx.pkt_type[preamble].mcs_count[MAX_MCS], num_msdu,
+			tx.pkt_type[preamble].mcs_count[MAX_MCS-1], num_msdu,
 			((mcs >= MAX_MCS_11A) && (preamble == DOT11_A)));
 	DP_STATS_INCC(peer,
 			tx.pkt_type[preamble].mcs_count[mcs], num_msdu,
 			((mcs < MAX_MCS_11A) && (preamble == DOT11_A)));
 	DP_STATS_INCC(peer,
-			tx.pkt_type[preamble].mcs_count[MAX_MCS], num_msdu,
+			tx.pkt_type[preamble].mcs_count[MAX_MCS-1], num_msdu,
 			((mcs >= MAX_MCS_11B) && (preamble == DOT11_B)));
 	DP_STATS_INCC(peer,
 			tx.pkt_type[preamble].mcs_count[mcs], num_msdu,
 			((mcs < (MAX_MCS_11B)) && (preamble == DOT11_B)));
 	DP_STATS_INCC(peer,
-			tx.pkt_type[preamble].mcs_count[MAX_MCS], num_msdu,
+			tx.pkt_type[preamble].mcs_count[MAX_MCS-1], num_msdu,
 			((mcs >= MAX_MCS_11A) && (preamble == DOT11_N)));
 	DP_STATS_INCC(peer,
 			tx.pkt_type[preamble].mcs_count[mcs], num_msdu,
 			((mcs < MAX_MCS_11A) && (preamble == DOT11_N)));
 	DP_STATS_INCC(peer,
-			tx.pkt_type[preamble].mcs_count[MAX_MCS], num_msdu,
+			tx.pkt_type[preamble].mcs_count[MAX_MCS-1], num_msdu,
 			((mcs >= MAX_MCS_11AC) && (preamble == DOT11_AC)));
 	DP_STATS_INCC(peer,
 			tx.pkt_type[preamble].mcs_count[mcs], num_msdu,
 			((mcs < MAX_MCS_11AC) && (preamble == DOT11_AC)));
 	DP_STATS_INCC(peer,
-			tx.pkt_type[preamble].mcs_count[MAX_MCS], num_msdu,
+			tx.pkt_type[preamble].mcs_count[MAX_MCS-1], num_msdu,
 			((mcs >= (MAX_MCS - 1)) && (preamble == DOT11_AX)));
 	DP_STATS_INCC(peer,
 			tx.pkt_type[preamble].mcs_count[mcs], num_msdu,

+ 8 - 0
dp/wifi3.0/dp_main.c

@@ -4828,6 +4828,14 @@ static inline void dp_print_peer_stats(struct dp_peer *peer)
 			peer->stats.tx.bw[2], peer->stats.tx.bw[3],
 			peer->stats.tx.bw[4], peer->stats.tx.bw[5]);
 
+	index = 0;
+	for (i = 0; i < SS_COUNT; i++) {
+		index += qdf_snprint(&nss[index], DP_NSS_LENGTH - index,
+				" %d", peer->stats.tx.nss[i]);
+	}
+	DP_PRINT_STATS("NSS(1-8) = %s",
+			nss);
+
 	DP_PRINT_STATS("Aggregation:");
 	DP_PRINT_STATS("	Number of Msdu's Part of Amsdu = %d",
 			peer->stats.tx.amsdu_cnt);

+ 12 - 10
dp/wifi3.0/dp_rx.c

@@ -1193,14 +1193,16 @@ dp_rx_process(struct dp_intr *int_ctx, void *hal_ring, uint32_t quota)
 		DP_STATS_INC_PKT(peer, rx.rcvd_reo[ring_id], 1,
 				qdf_nbuf_len(rx_desc->nbuf));
 
-		ampdu_flag = (mpdu_desc_info.mpdu_flags &
-				HAL_MPDU_F_AMPDU_FLAG);
+		if (soc->process_rx_status) {
+			ampdu_flag = (mpdu_desc_info.mpdu_flags &
+					HAL_MPDU_F_AMPDU_FLAG);
 
-		DP_STATS_INCC(peer, rx.ampdu_cnt, 1, ampdu_flag);
-		DP_STATS_INCC(peer, rx.non_ampdu_cnt, 1, !(ampdu_flag));
+			DP_STATS_INCC(peer, rx.ampdu_cnt, 1, ampdu_flag);
+			DP_STATS_INCC(peer, rx.non_ampdu_cnt, 1, !(ampdu_flag));
+		}
 
 		amsdu_flag = ((msdu_desc_info.msdu_flags &
-				HAL_MSDU_F_FIRST_MSDU_IN_MPDU) &&
+					HAL_MSDU_F_FIRST_MSDU_IN_MPDU) &&
 				(msdu_desc_info.msdu_flags &
 					HAL_MSDU_F_LAST_MSDU_IN_MPDU));
 
@@ -1410,7 +1412,7 @@ done:
 			DP_STATS_INC(peer, rx.bw[bw], 1);
 			DP_STATS_INC(peer, rx.sgi_count[sgi], 1);
 			DP_STATS_INCC(peer, rx.pkt_type[pkt_type].
-					mcs_count[MAX_MCS], 1,
+					mcs_count[MAX_MCS - 1], 1,
 					((mcs >= MAX_MCS_11A) &&
 					 (pkt_type == DOT11_A)));
 			DP_STATS_INCC(peer, rx.pkt_type[pkt_type].
@@ -1418,7 +1420,7 @@ done:
 					((mcs < MAX_MCS_11A) &&
 					 (pkt_type == DOT11_A)));
 			DP_STATS_INCC(peer, rx.pkt_type[pkt_type].
-					mcs_count[MAX_MCS], 1,
+					mcs_count[MAX_MCS - 1], 1,
 					((mcs >= MAX_MCS_11B) &&
 					 (pkt_type == DOT11_B)));
 			DP_STATS_INCC(peer, rx.pkt_type[pkt_type].
@@ -1426,7 +1428,7 @@ done:
 					((mcs < MAX_MCS_11B) &&
 					 (pkt_type == DOT11_B)));
 			DP_STATS_INCC(peer, rx.pkt_type[pkt_type].
-					mcs_count[MAX_MCS], 1,
+					mcs_count[MAX_MCS - 1], 1,
 					((mcs >= MAX_MCS_11A) &&
 					 (pkt_type == DOT11_N)));
 			DP_STATS_INCC(peer, rx.pkt_type[pkt_type].
@@ -1434,7 +1436,7 @@ done:
 					((mcs < MAX_MCS_11A) &&
 					 (pkt_type == DOT11_N)));
 			DP_STATS_INCC(peer, rx.pkt_type[pkt_type].
-					mcs_count[MAX_MCS], 1,
+					mcs_count[MAX_MCS - 1], 1,
 					((mcs >= MAX_MCS_11AC) &&
 					 (pkt_type == DOT11_AC)));
 			DP_STATS_INCC(peer, rx.pkt_type[pkt_type].
@@ -1442,7 +1444,7 @@ done:
 					((mcs < MAX_MCS_11AC) &&
 					 (pkt_type == DOT11_AC)));
 			DP_STATS_INCC(peer, rx.pkt_type[pkt_type].
-					mcs_count[MAX_MCS], 1,
+					mcs_count[MAX_MCS - 1], 1,
 					((mcs >= (MAX_MCS - 1)) &&
 					 (pkt_type == DOT11_AX)));
 			DP_STATS_INCC(peer, rx.pkt_type[pkt_type].

+ 18 - 6
dp/wifi3.0/dp_rx_mon_status.c

@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2017-2018 The Linux Foundation. All rights reserved.
  *
  * Permission to use, copy, modify, and/or distribute this software for
  * any purpose with or without fee is hereby granted, provided that the
@@ -86,6 +86,11 @@ dp_rx_populate_cdp_indication_ppdu(struct dp_soc *soc,
 	cdp_rx_ppdu->num_msdu = (cdp_rx_ppdu->tcp_msdu_count +
 			cdp_rx_ppdu->udp_msdu_count +
 			cdp_rx_ppdu->other_msdu_count);
+
+	if (ppdu_info->com_info.mpdu_cnt_fcs_ok > 1)
+		cdp_rx_ppdu->is_ampdu = 1;
+	else
+		cdp_rx_ppdu->is_ampdu = 0;
 }
 #else
 static inline void
@@ -124,37 +129,44 @@ static void dp_rx_stats_update(struct dp_soc *soc, struct dp_peer *peer,
 		return;
 
 	DP_STATS_UPD(peer, rx.rssi, ppdu->rssi);
+
+	if ((preamble == DOT11_A) || (preamble == DOT11_B))
+		ppdu->u.nss = 1;
+
+	if (ppdu->u.nss)
+		DP_STATS_INC(peer, rx.nss[ppdu->u.nss - 1], num_msdu);
+
 	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, 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,
+			rx.pkt_type[preamble].mcs_count[MAX_MCS - 1], 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)));
 	DP_STATS_INCC(peer,
-			rx.pkt_type[preamble].mcs_count[MAX_MCS], num_msdu,
+			rx.pkt_type[preamble].mcs_count[MAX_MCS - 1], 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)));
 	DP_STATS_INCC(peer,
-			rx.pkt_type[preamble].mcs_count[MAX_MCS], num_msdu,
+			rx.pkt_type[preamble].mcs_count[MAX_MCS - 1], 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)));
 	DP_STATS_INCC(peer,
-			rx.pkt_type[preamble].mcs_count[MAX_MCS], num_msdu,
+			rx.pkt_type[preamble].mcs_count[MAX_MCS - 1], num_msdu,
 			((mcs >= MAX_MCS_11AC) && (preamble == DOT11_AC)));
 	DP_STATS_INCC(peer,
 			rx.pkt_type[preamble].mcs_count[mcs], num_msdu,
 			((mcs < MAX_MCS_11AC) && (preamble == DOT11_AC)));
 	DP_STATS_INCC(peer,
-			rx.pkt_type[preamble].mcs_count[MAX_MCS], num_msdu,
+			rx.pkt_type[preamble].mcs_count[MAX_MCS - 1], num_msdu,
 			((mcs >= (MAX_MCS - 1)) && (preamble == DOT11_AX)));
 	DP_STATS_INCC(peer,
 			rx.pkt_type[preamble].mcs_count[mcs], num_msdu,

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

@@ -2353,23 +2353,23 @@ static void dp_tx_update_peer_stats(struct dp_peer *peer,
 	if (!(soc->process_tx_status))
 		return;
 
-	DP_STATS_INCC(peer, tx.pkt_type[pkt_type].mcs_count[MAX_MCS], 1,
+	DP_STATS_INCC(peer, tx.pkt_type[pkt_type].mcs_count[MAX_MCS - 1], 1,
 			((mcs >= MAX_MCS_11A) && (pkt_type == DOT11_A)));
 	DP_STATS_INCC(peer, tx.pkt_type[pkt_type].mcs_count[mcs], 1,
 			((mcs < (MAX_MCS_11A)) && (pkt_type == DOT11_A)));
-	DP_STATS_INCC(peer, tx.pkt_type[pkt_type].mcs_count[MAX_MCS], 1,
+	DP_STATS_INCC(peer, tx.pkt_type[pkt_type].mcs_count[MAX_MCS - 1], 1,
 			((mcs >= MAX_MCS_11B) && (pkt_type == DOT11_B)));
 	DP_STATS_INCC(peer, tx.pkt_type[pkt_type].mcs_count[mcs], 1,
 			((mcs < MAX_MCS_11B) && (pkt_type == DOT11_B)));
-	DP_STATS_INCC(peer, tx.pkt_type[pkt_type].mcs_count[MAX_MCS], 1,
+	DP_STATS_INCC(peer, tx.pkt_type[pkt_type].mcs_count[MAX_MCS - 1], 1,
 			((mcs >= MAX_MCS_11A) && (pkt_type == DOT11_N)));
 	DP_STATS_INCC(peer, tx.pkt_type[pkt_type].mcs_count[mcs], 1,
 			((mcs < MAX_MCS_11A) && (pkt_type == DOT11_N)));
-	DP_STATS_INCC(peer, tx.pkt_type[pkt_type].mcs_count[MAX_MCS], 1,
+	DP_STATS_INCC(peer, tx.pkt_type[pkt_type].mcs_count[MAX_MCS - 1], 1,
 			((mcs >= MAX_MCS_11AC) && (pkt_type == DOT11_AC)));
 	DP_STATS_INCC(peer, tx.pkt_type[pkt_type].mcs_count[mcs], 1,
 			((mcs < MAX_MCS_11AC) && (pkt_type == DOT11_AC)));
-	DP_STATS_INCC(peer, tx.pkt_type[pkt_type].mcs_count[MAX_MCS], 1,
+	DP_STATS_INCC(peer, tx.pkt_type[pkt_type].mcs_count[MAX_MCS - 1], 1,
 			((mcs >= (MAX_MCS - 1)) && (pkt_type == DOT11_AX)));
 	DP_STATS_INCC(peer, tx.pkt_type[pkt_type].mcs_count[mcs], 1,
 			((mcs < (MAX_MCS - 1)) && (pkt_type == DOT11_AX)));

+ 14 - 1
hal/wifi3.0/hal_api_mon.h

@@ -428,6 +428,8 @@ struct hal_rx_ppdu_common_info {
 	uint32_t ppdu_id;
 	uint32_t last_ppdu_id;
 	uint32_t ppdu_timestamp;
+	uint32_t mpdu_cnt_fcs_ok;
+	uint32_t mpdu_cnt_fcs_err;
 };
 
 struct hal_rx_ppdu_info {
@@ -523,6 +525,9 @@ hal_rx_status_get_tlv_info(void *rx_tlv, struct hal_rx_ppdu_info *ppdu_info)
 		ppdu_info->rx_status.ast_index =
 				HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_4,
 						AST_INDEX);
+		ppdu_info->rx_status.mcs =
+			 HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_1, MCS);
+
 		tid = HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_12,
 				RECEIVED_QOS_DATA_TID_BITMAP);
 		ppdu_info->rx_status.tid = qdf_find_first_bit(&tid, sizeof(tid)*8);
@@ -536,13 +541,21 @@ hal_rx_status_get_tlv_info(void *rx_tlv, struct hal_rx_ppdu_info *ppdu_info)
 						UDP_MSDU_COUNT);
 		ppdu_info->rx_status.other_msdu_count =
 			HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_10,
-						OTHER_MSDU_COUNT);
+					OTHER_MSDU_COUNT);
+		ppdu_info->rx_status.nss =
+			HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_1, NSS);
 		ppdu_info->rx_status.first_data_seq_ctrl =
 			HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_3,
 					DATA_SEQUENCE_CONTROL_INFO_VALID);
 		ppdu_info->rx_status.preamble_type =
 			HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_3,
 						HT_CONTROL_FIELD_PKT_TYPE);
+		ppdu_info->com_info.mpdu_cnt_fcs_ok =
+			HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_3,
+					MPDU_CNT_FCS_OK);
+		ppdu_info->com_info.mpdu_cnt_fcs_err =
+			HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_2,
+					MPDU_CNT_FCS_ERR);
 		break;
 	}