From 484198b257c09d3a8aa09c5635919b414dd341ac Mon Sep 17 00:00:00 2001 From: Harsh Kumar Bijlani Date: Tue, 12 Apr 2022 02:25:54 +0530 Subject: [PATCH] qcacmn: Add MSDU counters to account for 11BE puncturing BW stats Add MSDU counters to account for 11BE puncturing BW stats. Change-Id: I2c1d420b8d8b4533dcbf64f206783c07555cac99 CRs-Fixed: 3171770 --- dp/inc/cdp_txrx_cmn_struct.h | 4 ++++ dp/inc/cdp_txrx_stats_struct.h | 5 +++++ dp/wifi3.0/dp_internal.h | 4 ++++ dp/wifi3.0/dp_stats.c | 14 +++++++++++++- dp/wifi3.0/dp_types.h | 4 ++++ dp/wifi3.0/monitor/1.0/dp_mon_1.0.c | 17 ++++++++++++++--- dp/wifi3.0/monitor/2.0/dp_mon_2.0.c | 12 ++++++++++-- dp/wifi3.0/monitor/2.0/dp_rx_mon_2.0.c | 4 +++- dp/wifi3.0/monitor/dp_mon.c | 3 +-- 9 files changed, 58 insertions(+), 9 deletions(-) diff --git a/dp/inc/cdp_txrx_cmn_struct.h b/dp/inc/cdp_txrx_cmn_struct.h index 4eb299b88d..db2ad489e1 100644 --- a/dp/inc/cdp_txrx_cmn_struct.h +++ b/dp/inc/cdp_txrx_cmn_struct.h @@ -1862,6 +1862,8 @@ struct cdp_delayed_tx_completion_ppdu_user { * @peer_last_delayed_ba: flag to indicate peer last delayed ba * @phy_tx_time_us: Phy TX duration for the User * @mpdu_bytes: accumulated bytes per mpdu for mem limit feature + * @punc_mode: puncutured mode to indicate punctured bw + * @punc_pattern_bitmap: bitmap indicating punctured pattern */ struct cdp_tx_completion_ppdu_user { uint32_t completion_status:8, @@ -1965,6 +1967,8 @@ struct cdp_tx_completion_ppdu_user { uint16_t phy_tx_time_us; uint32_t mpdu_bytes; + uint8_t punc_mode; + uint16_t punc_pattern_bitmap; }; /** diff --git a/dp/inc/cdp_txrx_stats_struct.h b/dp/inc/cdp_txrx_stats_struct.h index dc3d5185c5..4e22e5acde 100644 --- a/dp/inc/cdp_txrx_stats_struct.h +++ b/dp/inc/cdp_txrx_stats_struct.h @@ -47,6 +47,7 @@ #ifdef WLAN_FEATURE_11BE #define MAX_MCS (16 + 1) #define MAX_MCS_11BE 16 +#define MAX_PUNCTURED_MODE 5 #else #define MAX_MCS (14 + 1) #endif @@ -1364,6 +1365,7 @@ struct protocol_trace_count { * @last_tx_ts: last timestamp in jiffies when tx comp occurred * @su_be_ppdu_cnt: SU Tx packet count * @mu_be_ppdu_cnt: MU Tx packet count + * @punc_bw[MAX_PUNCTURED_MODE]: MSDU count for punctured BW */ struct cdp_tx_stats { struct cdp_pkt_info comp_pkt; @@ -1479,6 +1481,7 @@ struct cdp_tx_stats { #ifdef WLAN_FEATURE_11BE struct cdp_pkt_type su_be_ppdu_cnt; struct cdp_pkt_type mu_be_ppdu_cnt[TXRX_TYPE_MU_MAX]; + uint32_t punc_bw[MAX_PUNCTURED_MODE]; #endif }; @@ -1567,6 +1570,7 @@ struct cdp_tx_stats { * @mpdu_retry_cnt: retries of mpdu in rx * @su_be_ppdu_cnt: SU Rx packet count for BE * @mu_be_ppdu_cnt: MU rx packet count for BE + * @punc_bw[MAX_PUNCTURED_MODE]: MSDU count for punctured BW */ struct cdp_rx_stats { struct cdp_pkt_info to_stack; @@ -1652,6 +1656,7 @@ struct cdp_rx_stats { #ifdef WLAN_FEATURE_11BE struct cdp_pkt_type su_be_ppdu_cnt; struct cdp_pkt_type mu_be_ppdu_cnt[TXRX_TYPE_MU_MAX]; + uint32_t punc_bw[MAX_PUNCTURED_MODE]; #endif }; diff --git a/dp/wifi3.0/dp_internal.h b/dp/wifi3.0/dp_internal.h index f2e6537b1b..83d57ed90d 100644 --- a/dp/wifi3.0/dp_internal.h +++ b/dp/wifi3.0/dp_internal.h @@ -1508,6 +1508,10 @@ void dp_update_vdev_stats_on_peer_unmap(struct dp_vdev *vdev, _srcobj->rx.mu_be_ppdu_cnt[mu_type].mcs_count[i]; \ } \ } \ + for (i = 0; i < MAX_PUNCTURED_MODE; i++) { \ + _tgtobj->tx.punc_bw[i] += _srcobj->tx.punc_bw[i]; \ + _tgtobj->rx.punc_bw[i] += _srcobj->rx.punc_bw[i]; \ + } \ } while (0) #else #define DP_UPDATE_11BE_STATS(_tgtobj, _srcobj) diff --git a/dp/wifi3.0/dp_stats.c b/dp/wifi3.0/dp_stats.c index cbbe798b66..18702362a4 100644 --- a/dp/wifi3.0/dp_stats.c +++ b/dp/wifi3.0/dp_stats.c @@ -5659,7 +5659,7 @@ dp_print_mu_be_ppdu_rates_info(struct cdp_pkt_type *pkt_type_array) DP_PRINT_STATS(" %s = %d", dp_mu_be_rate_string[pkt_type][mcs].mcs_type, - pkt_type_array->mcs_count[mcs]); + pkt_type_array[pkt_type].mcs_count[mcs]); } DP_PRINT_STATS("\n"); @@ -6052,6 +6052,12 @@ void dp_print_peer_txrx_stats_be(struct cdp_peer_stats *peer_stats, peer_stats->tx.bw[CMN_BW_80MHZ], peer_stats->tx.bw[CMN_BW_160MHZ], peer_stats->tx.bw[CMN_BW_320MHZ]); + DP_PRINT_STATS("Punctured BW Counts = NO_PUNC %d 20MHz %d 40MHz %d 80MHz %d 120MHz %d\n", + peer_stats->tx.punc_bw[NO_PUNCTURE], + peer_stats->tx.punc_bw[PUNCTURED_20MHZ], + peer_stats->tx.punc_bw[PUNCTURED_40MHZ], + peer_stats->tx.punc_bw[PUNCTURED_80MHZ], + peer_stats->tx.punc_bw[PUNCTURED_120MHZ]); DP_PRINT_STATS("RU Locations RU[26 52 52_26 106 106_26 242 484 484_242 996 996_484 996_484_242 2X996 2X996_484 3X996 3X996_484 4X996]:"); for (i = 0; i < RU_INDEX_MAX; i++) DP_PRINT_STATS("%s: %d", cdp_ru_string[i].ru_type, @@ -6067,6 +6073,12 @@ void dp_print_peer_txrx_stats_be(struct cdp_peer_stats *peer_stats, peer_stats->rx.bw[CMN_BW_80MHZ], peer_stats->rx.bw[CMN_BW_160MHZ], peer_stats->rx.bw[CMN_BW_320MHZ]); + DP_PRINT_STATS("Punctured BW Counts = NO_PUNC %d 20MHz %d 40MHz %d 80MHz %d 120MHz %d\n", + peer_stats->rx.punc_bw[NO_PUNCTURE], + peer_stats->rx.punc_bw[PUNCTURED_20MHZ], + peer_stats->rx.punc_bw[PUNCTURED_40MHZ], + peer_stats->rx.punc_bw[PUNCTURED_80MHZ], + peer_stats->rx.punc_bw[PUNCTURED_120MHZ]); dp_print_common_ppdu_rates_info(&peer_stats->rx.su_be_ppdu_cnt, DOT11_BE); dp_print_mu_be_ppdu_rates_info(&peer_stats->rx.mu_be_ppdu_cnt[0]); diff --git a/dp/wifi3.0/dp_types.h b/dp/wifi3.0/dp_types.h index 449b54364d..68d98c8c74 100644 --- a/dp/wifi3.0/dp_types.h +++ b/dp/wifi3.0/dp_types.h @@ -3521,6 +3521,7 @@ struct dp_peer_per_pkt_tx_stats { * @mpdu_success_with_retries: mpdu retry count in case of successful tx * @su_be_ppdu_cnt: SU Tx packet count for 11BE * @mu_be_ppdu_cnt[TXRX_TYPE_MU_MAX]: MU Tx packet count for 11BE + * @punc_bw[MAX_PUNCTURED_MODE]: MSDU count for punctured bw */ struct dp_peer_extd_tx_stats { uint32_t stbc; @@ -3569,6 +3570,7 @@ struct dp_peer_extd_tx_stats { #ifdef WLAN_FEATURE_11BE struct cdp_pkt_type su_be_ppdu_cnt; struct cdp_pkt_type mu_be_ppdu_cnt[TXRX_TYPE_MU_MAX]; + uint32_t punc_bw[MAX_PUNCTURED_MODE]; #endif }; @@ -3681,6 +3683,7 @@ struct dp_peer_per_pkt_rx_stats { * @mpdu_retry_cnt: retries of mpdu in rx * @su_be_ppdu_cnt: SU Rx packet count for BE * @mu_be_ppdu_cnt[TXRX_TYPE_MU_MAX]: MU rx packet count for BE + * @punc_bw[MAX_PUNCTURED_MODE]: MSDU count for punctured bw */ struct dp_peer_extd_rx_stats { struct cdp_pkt_type pkt_type[DOT11_MAX]; @@ -3724,6 +3727,7 @@ struct dp_peer_extd_rx_stats { #ifdef WLAN_FEATURE_11BE struct cdp_pkt_type su_be_ppdu_cnt; struct cdp_pkt_type mu_be_ppdu_cnt[TXRX_TYPE_MU_MAX]; + uint32_t punc_bw[MAX_PUNCTURED_MODE]; #endif }; diff --git a/dp/wifi3.0/monitor/1.0/dp_mon_1.0.c b/dp/wifi3.0/monitor/1.0/dp_mon_1.0.c index c4d12a3f6d..35f66c5a8e 100644 --- a/dp/wifi3.0/monitor/1.0/dp_mon_1.0.c +++ b/dp/wifi3.0/monitor/1.0/dp_mon_1.0.c @@ -942,6 +942,19 @@ static bool dp_ppdu_stats_feat_enable_check_1_0(struct dp_pdev *pdev) else return true; } + +/** + * dp_mon_tx_stats_update_1_0 - Update Tx stats from HTT PPDU completion path + * + * @monitor: Monitor peer + * @ppdu: Tx PPDU user completion info + */ +void +dp_mon_tx_stats_update_1_0(struct dp_mon_peer *mon_peer, + struct cdp_tx_completion_ppdu_user *ppdu) +{ + ppdu->punc_mode = NO_PUNCTURE; +} #endif #ifndef QCA_SUPPORT_FULL_MON @@ -1081,9 +1094,7 @@ dp_mon_register_feature_ops_1_0(struct dp_soc *soc) #else mon_ops->mon_ppdu_desc_deliver = dp_ppdu_desc_deliver_1_0; #endif -#ifdef WLAN_FEATURE_11BE - mon_ops->mon_tx_stats_update = NULL; -#endif + mon_ops->mon_tx_stats_update = dp_mon_tx_stats_update_1_0; #endif #if defined(ATH_SUPPORT_NAC_RSSI) || defined(ATH_SUPPORT_NAC) mon_ops->mon_filter_setup_smart_monitor = diff --git a/dp/wifi3.0/monitor/2.0/dp_mon_2.0.c b/dp/wifi3.0/monitor/2.0/dp_mon_2.0.c index 8eb7fac7d6..c340a0e592 100644 --- a/dp/wifi3.0/monitor/2.0/dp_mon_2.0.c +++ b/dp/wifi3.0/monitor/2.0/dp_mon_2.0.c @@ -475,12 +475,16 @@ void dp_mon_tx_stats_update_2_0(struct dp_mon_peer *mon_peer, struct cdp_tx_completion_ppdu_user *ppdu) { - uint8_t preamble; - uint8_t mcs; + uint8_t preamble, mcs, punc_mode; preamble = ppdu->preamble; mcs = ppdu->mcs; + punc_mode = dp_mon_get_puncture_type(ppdu->punc_pattern_bitmap, + ppdu->bw); + ppdu->punc_mode = punc_mode; + + DP_STATS_INC(mon_peer, tx.punc_bw[punc_mode], ppdu->num_msdu); DP_STATS_INCC(mon_peer, tx.pkt_type[preamble].mcs_count[MAX_MCS - 1], ppdu->num_msdu, @@ -525,6 +529,9 @@ dp_mon_get_puncture_type(uint16_t puncture_pattern, uint8_t bw) uint16_t mask; uint8_t punctured_bits; + if (!puncture_pattern) + return NO_PUNCTURE; + switch (bw) { case CMN_BW_80MHZ: mask = PUNCTURE_80MHZ_MASK; @@ -584,6 +591,7 @@ void dp_mon_tx_stats_update_2_0(struct dp_mon_peer *mon_peer, struct cdp_tx_completion_ppdu_user *ppdu) { + ppdu->punc_mode = NO_PUNCTURE; } enum cdp_punctured_modes diff --git a/dp/wifi3.0/monitor/2.0/dp_rx_mon_2.0.c b/dp/wifi3.0/monitor/2.0/dp_rx_mon_2.0.c index b084b794a2..5d4220100c 100644 --- a/dp/wifi3.0/monitor/2.0/dp_rx_mon_2.0.c +++ b/dp/wifi3.0/monitor/2.0/dp_rx_mon_2.0.c @@ -630,12 +630,13 @@ void dp_rx_mon_stats_update_2_0(struct dp_mon_peer *mon_peer, struct cdp_rx_indication_ppdu *ppdu, struct cdp_rx_stats_ppdu_user *ppdu_user) { - uint8_t mcs, preamble, ppdu_type; + uint8_t mcs, preamble, ppdu_type, punc_mode; uint32_t num_msdu; preamble = ppdu->u.preamble; ppdu_type = ppdu->u.ppdu_type; num_msdu = ppdu_user->num_msdu; + punc_mode = ppdu->punc_bw; if (ppdu_type == HAL_RX_TYPE_SU) mcs = ppdu->u.mcs; @@ -643,6 +644,7 @@ void dp_rx_mon_stats_update_2_0(struct dp_mon_peer *mon_peer, mcs = ppdu_user->mcs; DP_STATS_INC(mon_peer, rx.mpdu_retry_cnt, ppdu_user->mpdu_retries); + DP_STATS_INC(mon_peer, rx.punc_bw[punc_mode], num_msdu); DP_STATS_INCC(mon_peer, rx.pkt_type[preamble].mcs_count[MAX_MCS - 1], num_msdu, ((mcs >= MAX_MCS_11BE) && (preamble == DOT11_BE))); diff --git a/dp/wifi3.0/monitor/dp_mon.c b/dp/wifi3.0/monitor/dp_mon.c index 96985e7b94..fd4f7da9f0 100644 --- a/dp/wifi3.0/monitor/dp_mon.c +++ b/dp/wifi3.0/monitor/dp_mon.c @@ -2411,7 +2411,6 @@ dp_tx_rate_stats_update(struct dp_peer *peer, uint32_t rix; uint16_t ratecode = 0; struct dp_mon_peer *mon_peer = NULL; - enum cdp_punctured_modes punc_mode = NO_PUNCTURE; if (!peer || !ppdu) return; @@ -2428,7 +2427,7 @@ dp_tx_rate_stats_update(struct dp_peer *peer, ppdu->nss, ppdu->preamble, ppdu->bw, - punc_mode, + ppdu->punc_mode, &rix, &ratecode);