From e03fabab4192ca05e8b3a2a204b96b4d8e325b6f Mon Sep 17 00:00:00 2001 From: aloksing Date: Thu, 12 Jan 2023 16:18:06 +0530 Subject: [PATCH] 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 --- dp/inc/cdp_txrx_cmn_struct.h | 12 ++++ dp/inc/cdp_txrx_stats_struct.h | 24 ++++++++ dp/wifi3.0/monitor/dp_mon.c | 107 +++++++++++++++++++++++++++++++++ 3 files changed, 143 insertions(+) diff --git a/dp/inc/cdp_txrx_cmn_struct.h b/dp/inc/cdp_txrx_cmn_struct.h index 939a6c3746..7047204f04 100644 --- a/dp/inc/cdp_txrx_cmn_struct.h +++ b/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[]; }; diff --git a/dp/inc/cdp_txrx_stats_struct.h b/dp/inc/cdp_txrx_stats_struct.h index 62c770e882..d5679af347 100644 --- a/dp/inc/cdp_txrx_stats_struct.h +++ b/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 }; diff --git a/dp/wifi3.0/monitor/dp_mon.c b/dp/wifi3.0/monitor/dp_mon.c index 0b008d4a3d..f67b707543 100644 --- a/dp/wifi3.0/monitor/dp_mon.c +++ b/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;