Prechádzať zdrojové kódy

qcacmn: Update deterministic stats per pdev

Adding tx mode count per num of users and mode count
per tx mode

CRs-Fixed: 3380939
Change-Id: I7e50ce6cfc7cfc23bde6e58b4afa478008b6af9e
aloksing 2 rokov pred
rodič
commit
e03fabab41

+ 12 - 0
dp/inc/cdp_txrx_cmn_struct.h

@@ -2318,6 +2318,12 @@ struct cdp_tx_mgmt_comp_info {
  * @htt_seq_type: Seq type
  * @txmode_type: tx mode type UL/DL
  * @txmode: tx mode
+ * @num_ul_users: Number of UL expected users
+ * @ch_access_delay: Channel access delay
+ * @backoff_ac_valid: Backoff AC valid
+ * @backoff_ac: Backoff AC
+ * @num_ul_user_resp_valid: Number of UL users response valid
+ * @num_ul_user_resp: Number of UL users response
  * @user: per-User stats (array of per-user structures)
  */
 struct cdp_tx_completion_ppdu {
@@ -2366,6 +2372,12 @@ struct cdp_tx_completion_ppdu {
 	uint8_t htt_seq_type;
 	uint8_t txmode_type;
 	uint8_t txmode;
+	uint32_t num_ul_users;
+	uint32_t ch_access_delay;
+	uint32_t backoff_ac_valid;
+	uint32_t backoff_ac;
+	uint32_t num_ul_user_resp_valid;
+	uint32_t num_ul_user_resp;
 	struct cdp_tx_completion_ppdu_user user[];
 };
 

+ 24 - 0
dp/inc/cdp_txrx_stats_struct.h

@@ -43,6 +43,7 @@
 #define TXRX_STATS_LEVEL TXRX_STATS_LEVEL_BASIC
 #endif
 
+#define CDP_MU_MAX_USERS 37
 /* 1 additional MCS is for invalid values */
 #ifdef WLAN_FEATURE_11BE
 #define MAX_MCS (16 + 1)
@@ -2959,6 +2960,28 @@ struct cdp_peer_deter_stats {
 	struct cdp_peer_tx_ul_deter ul_det[TX_MODE_UL_MAX];
 	struct cdp_peer_rx_deter rx_det;
 };
+
+/**
+ * struct cdp_pdev_deter_stats- Structure to hold pdev deterministic stats
+ * @dl_ofdma_usr: num_user counter for dl ofdma
+ * @ul_ofdma_usr: num_user counter for ul ofdma
+ * @dl_mimo_usr: num_user counter for dl mimo
+ * @ul_mimo_usr: num_user counter for ul mimo
+ * @dl_mode_cnt: DL tx mode counter
+ * @ul_mode_cnt: UL tx mode counter
+ * @ch_access_delay
+ */
+struct cdp_pdev_deter_stats {
+	uint64_t dl_ofdma_usr[CDP_MU_MAX_USERS];
+	uint64_t ul_ofdma_usr[CDP_MU_MAX_USERS];
+	uint64_t dl_mimo_usr[CDP_MU_MAX_USERS];
+	uint64_t ul_mimo_usr[CDP_MU_MAX_USERS];
+	uint64_t dl_mode_cnt[TX_MODE_DL_MAX];
+	uint64_t ul_mode_cnt[TX_MODE_UL_MAX];
+	uint32_t ch_access_delay[WME_AC_MAX];
+	uint64_t trigger_success;
+	uint64_t trigger_fail;
+};
 #endif
 
 /* struct cdp_pdev_stats - pdev stats
@@ -3112,6 +3135,7 @@ struct cdp_pdev_stats {
 	uint32_t peer_unauth_rx_pkt_drop;
 #ifdef WLAN_TELEMETRY_STATS_SUPPORT
 	struct cdp_pdev_telemetry_stats telemetry_stats;
+	struct cdp_pdev_deter_stats deter_stats;
 #endif
 };
 

+ 107 - 0
dp/wifi3.0/monitor/dp_mon.c

@@ -3065,6 +3065,79 @@ void dp_ppdu_desc_get_txmode(struct cdp_tx_completion_ppdu *ppdu)
 	}
 }
 
+/*
+ * dp_pdev_update_deter_stats() - Update pdev deterministic stats
+ * @pdev: Datapath pdev handle
+ * @ppdu: PPDU Descriptor
+ *
+ * Return: None
+ */
+static inline void
+dp_pdev_update_deter_stats(struct dp_pdev *pdev,
+			   struct cdp_tx_completion_ppdu *ppdu)
+{
+	if (!pdev || !ppdu)
+		return;
+
+	if (ppdu->frame_type != CDP_PPDU_FTYPE_DATA)
+		return;
+
+	if (ppdu->txmode_type == TX_MODE_TYPE_UNKNOWN)
+		return;
+
+	if (ppdu->backoff_ac_valid)
+		DP_STATS_UPD(pdev,
+			     deter_stats.ch_access_delay[ppdu->backoff_ac],
+			     ppdu->ch_access_delay);
+
+	if (ppdu->num_ul_user_resp_valid &&
+	    (ppdu->txmode_type == TX_MODE_TYPE_UL)) {
+		if (ppdu->num_ul_user_resp) {
+			DP_STATS_INC(pdev,
+				     deter_stats.trigger_success,
+				     1);
+		} else {
+			DP_STATS_INC(pdev,
+				     deter_stats.trigger_fail,
+				     1);
+		}
+	}
+
+	if (ppdu->txmode_type == TX_MODE_TYPE_DL) {
+		DP_STATS_INC(pdev,
+			     deter_stats.dl_mode_cnt[ppdu->txmode],
+			     1);
+		switch (ppdu->txmode) {
+		case TX_MODE_DL_OFDMA_DATA:
+			DP_STATS_INC(pdev,
+				     deter_stats.dl_ofdma_usr[ppdu->num_users],
+				     1);
+			break;
+		case TX_MODE_DL_MUMIMO_DATA:
+			DP_STATS_INC(pdev,
+				     deter_stats.dl_mimo_usr[ppdu->num_users],
+				     1);
+			break;
+		}
+	} else {
+		DP_STATS_INC(pdev,
+			     deter_stats.ul_mode_cnt[ppdu->txmode],
+			     1);
+		switch (ppdu->txmode) {
+		case TX_MODE_UL_OFDMA_BASIC_TRIGGER_DATA:
+			DP_STATS_INC(pdev,
+				     deter_stats.ul_ofdma_usr[ppdu->num_ul_users],
+				     1);
+			break;
+		case TX_MODE_UL_MUMIMO_BASIC_TRIGGER_DATA:
+			DP_STATS_INC(pdev,
+				     deter_stats.ul_mimo_usr[ppdu->num_ul_users],
+				     1);
+			break;
+		}
+	}
+}
+
 /*
  * dp_ppdu_desc_get_msduq() - Get msduq index from bitmap
  * @ppdu: PPDU Descriptor
@@ -3186,6 +3259,11 @@ dp_pdev_telemetry_stats_update(
 		struct dp_pdev *pdev,
 		struct cdp_tx_completion_ppdu_user *ppdu)
 { }
+
+static inline void
+dp_pdev_update_deter_stats(struct dp_pdev *pdev,
+			   struct cdp_tx_completion_ppdu *ppdu)
+{ }
 #endif
 
 /**
@@ -3430,7 +3508,9 @@ dp_process_ppdu_stats_common_tlv(struct dp_pdev *pdev,
 	struct dp_soc *soc = NULL;
 	struct cdp_tx_completion_ppdu *ppdu_desc = NULL;
 	uint64_t ppdu_start_timestamp;
+	uint32_t eval_start_timestamp;
 	uint32_t *start_tag_buf;
+	uint32_t *ts_tag_buf;
 
 	start_tag_buf = tag_buf;
 	ppdu_desc =
@@ -3483,6 +3563,10 @@ dp_process_ppdu_stats_common_tlv(struct dp_pdev *pdev,
 	tag_buf = start_tag_buf + HTT_GET_STATS_CMN_INDEX(FES_DUR_US);
 	ppdu_desc->tx_duration = *tag_buf;
 
+	tag_buf = start_tag_buf +
+			HTT_GET_STATS_CMN_INDEX(SCH_EVAL_START_TSTMP_L32_US);
+	eval_start_timestamp = *tag_buf;
+
 	tag_buf = start_tag_buf + HTT_GET_STATS_CMN_INDEX(START_TSTMP_L32_US);
 	ppdu_desc->ppdu_start_timestamp = *tag_buf;
 
@@ -3516,6 +3600,8 @@ dp_process_ppdu_stats_common_tlv(struct dp_pdev *pdev,
 		HTT_PPDU_STATS_COMMON_TLV_DOPPLER_INDICATION_GET(*tag_buf);
 	ppdu_desc->spatial_reuse =
 		HTT_PPDU_STATS_COMMON_TLV_SPATIAL_REUSE_GET(*tag_buf);
+	ppdu_desc->num_ul_users =
+		HTT_PPDU_STATS_COMMON_TLV_NUM_UL_EXPECTED_USERS_GET(*tag_buf);
 
 	dp_tx_capture_htt_frame_counter(pdev, frame_type);
 
@@ -3543,6 +3629,26 @@ dp_process_ppdu_stats_common_tlv(struct dp_pdev *pdev,
 	tag_buf = start_tag_buf + HTT_GET_STATS_CMN_INDEX(BSSCOLOR_OBSS_PSR);
 	ppdu_desc->bss_color =
 		HTT_PPDU_STATS_COMMON_TLV_BSS_COLOR_ID_GET(*tag_buf);
+
+	ppdu_desc->backoff_ac_valid =
+		HTT_PPDU_STATS_COMMON_TLV_BACKOFF_AC_VALID_GET(*tag_buf);
+	if (ppdu_desc->backoff_ac_valid) {
+		ppdu_desc->backoff_ac =
+			HTT_PPDU_STATS_COMMON_TLV_BACKOFF_AC_GET(*tag_buf);
+		ts_tag_buf = start_tag_buf +
+			HTT_GET_STATS_CMN_INDEX(SCH_EVAL_START_TSTMP_L32_US);
+		eval_start_timestamp = *ts_tag_buf;
+
+		ts_tag_buf = start_tag_buf +
+			HTT_GET_STATS_CMN_INDEX(START_TSTMP_L32_US);
+		ppdu_desc->ch_access_delay =
+			*ts_tag_buf - eval_start_timestamp;
+	}
+	ppdu_desc->num_ul_user_resp_valid =
+		HTT_PPDU_STATS_COMMON_TLV_NUM_UL_USER_RESPONSES_VALID_GET(*tag_buf);
+	if (ppdu_desc->num_ul_user_resp_valid)
+		ppdu_desc->num_ul_user_resp =
+			HTT_PPDU_STATS_COMMON_TLV_NUM_UL_USER_RESPONSES_GET(*tag_buf);
 }
 
 /**
@@ -4720,6 +4826,7 @@ dp_ppdu_desc_user_stats_update(struct dp_pdev *pdev,
 	qdf_assert_always(ppdu_desc->num_users <= ppdu_desc->max_users);
 
 	dp_ppdu_desc_get_txmode(ppdu_desc);
+	dp_pdev_update_deter_stats(pdev, ppdu_desc);
 
 	for (i = 0; i < num_users; i++) {
 		ppdu_desc->num_mpdu += ppdu_desc->user[i].num_mpdu;