diff --git a/dp/cmn_dp_api/dp_ratetable.h b/dp/cmn_dp_api/dp_ratetable.h index 4c7eccd7ce..083878c8f1 100644 --- a/dp/cmn_dp_api/dp_ratetable.h +++ b/dp/cmn_dp_api/dp_ratetable.h @@ -146,7 +146,8 @@ static inline int dp_ath_rate_out(uint64_t _i) #define HE_LAST_RIX_PLUS_ONE (HE_160_RATE_TABLE_INDEX + NUM_HE_RIX_FOR_160MHZ) #ifdef WLAN_FEATURE_11BE -#define NUM_EHT_RIX_PER_BW (NUM_EHT_MCS * NUM_SPATIAL_STREAMS) +#define NUM_EHT_SPATIAL_STREAM 4 +#define NUM_EHT_RIX_PER_BW (NUM_EHT_MCS * NUM_EHT_SPATIAL_STREAM) #define EHT_20_RATE_TABLE_INDEX HE_LAST_RIX_PLUS_ONE #define EHT_40_RATE_TABLE_INDEX (EHT_20_RATE_TABLE_INDEX + NUM_EHT_RIX_PER_BW) diff --git a/dp/inc/cdp_txrx_cmn_struct.h b/dp/inc/cdp_txrx_cmn_struct.h index 3de011e0db..4203a84b8f 100644 --- a/dp/inc/cdp_txrx_cmn_struct.h +++ b/dp/inc/cdp_txrx_cmn_struct.h @@ -115,11 +115,7 @@ #define CDP_DATA_TID_MAX 8 #define CDP_DATA_NON_QOS_TID 16 -#ifdef WLAN_FEATURE_11BE -#define CDP_NUM_SA_BW 5 -#else #define CDP_NUM_SA_BW 4 -#endif #define CDP_PERCENT_MACRO 100 #define CDP_NUM_KB_IN_MB 1000 /* diff --git a/dp/wifi3.0/dp_stats.c b/dp/wifi3.0/dp_stats.c index 9e1274e55e..927ee62f26 100644 --- a/dp/wifi3.0/dp_stats.c +++ b/dp/wifi3.0/dp_stats.c @@ -97,9 +97,9 @@ static const struct cdp_rate_debug dp_ppdu_rate_string[DOT11_MAX][MAX_MCS] = { {"HE MCS 11 (1024-QAM 5/6)", MCS_VALID}, {"HE MCS 12 (4096-QAM 3/4)", MCS_VALID}, {"HE MCS 13 (4096-QAM 5/6)", MCS_VALID}, - {"INVALID ", MCS_VALID}, - {"INVALID ", MCS_VALID}, - {"INVALID ", MCS_VALID}, + {"INVALID ", MCS_INVALID}, + {"INVALID ", MCS_INVALID}, + {"INVALID ", MCS_INVALID}, }, { {"EHT MCS 0 (BPSK 1/2) ", MCS_VALID}, @@ -138,7 +138,7 @@ static const struct cdp_rate_debug dp_ppdu_rate_string[DOT11_MAX][MAX_MCS] = { {"HE MCS 11 (1024-QAM 5/6)", MCS_VALID}, {"HE MCS 12 (4096-QAM 3/4)", MCS_VALID}, {"HE MCS 13 (4096-QAM 5/6)", MCS_VALID}, - {"INVALID ", MCS_VALID}, + {"INVALID ", MCS_INVALID}, } }; #endif @@ -161,9 +161,9 @@ dp_mu_rate_string[TXRX_TYPE_MU_MAX][MAX_MCS] = { {"HE MU-MIMO MCS 11 (1024-QAM 5/6)", MCS_VALID}, {"HE MU-MIMO MCS 12 (4096-QAM 3/4)", MCS_VALID}, {"HE MU-MIMO MCS 13 (4096-QAM 5/6)", MCS_VALID}, - {"INVALID ", MCS_VALID}, - {"INVALID ", MCS_VALID}, - {"INVALID ", MCS_VALID}, + {"INVALID ", MCS_INVALID}, + {"INVALID ", MCS_INVALID}, + {"INVALID ", MCS_INVALID}, }, { {"HE OFDMA MCS 0 (BPSK 1/2) ", MCS_VALID}, @@ -180,9 +180,9 @@ dp_mu_rate_string[TXRX_TYPE_MU_MAX][MAX_MCS] = { {"HE OFDMA MCS 11 (1024-QAM 5/6)", MCS_VALID}, {"HE OFDMA MCS 12 (4096-QAM 3/4)", MCS_VALID}, {"HE OFDMA MCS 13 (4096-QAM 5/6)", MCS_VALID}, - {"INVALID ", MCS_VALID}, - {"INVALID ", MCS_VALID}, - {"INVALID ", MCS_VALID}, + {"INVALID ", MCS_INVALID}, + {"INVALID ", MCS_INVALID}, + {"INVALID ", MCS_INVALID}, } }; @@ -203,9 +203,9 @@ dp_mu_be_rate_string[TXRX_TYPE_MU_MAX][MAX_MCS] = { {"EHT MU-MIMO MCS 11 (1024-QAM 5/6)", MCS_VALID}, {"EHT MU-MIMO MCS 12 (4096-QAM 3/4)", MCS_VALID}, {"EHT MU-MIMO MCS 13 (4096-QAM 5/6)", MCS_VALID}, - {"EHT MU-MINO MCS 14 (BPSK-DCM 1/2)", MCS_VALID}, + {"EHT MU-MIMO MCS 14 (BPSK-DCM 1/2)", MCS_VALID}, {"EHT MU-MIMO MCS 15 (BPSK-DCM 1/2)", MCS_VALID}, - {"INVALID ", MCS_VALID}, + {"INVALID ", MCS_INVALID}, }, { {"EHT OFDMA MCS 0 (BPSK 1/2) ", MCS_VALID}, @@ -224,7 +224,7 @@ dp_mu_be_rate_string[TXRX_TYPE_MU_MAX][MAX_MCS] = { {"EHT OFDMA MCS 13 (4096-QAM 5/6)", MCS_VALID}, {"EHT OFDMA MCS 14 (BPSK-DCM 1/2)", MCS_VALID}, {"EHT OFDMA MCS 15 (BPSK-DCM 1/2)", MCS_VALID}, - {"INVALID ", MCS_VALID}, + {"INVALID ", MCS_INVALID}, } }; #else @@ -245,7 +245,7 @@ dp_mu_rate_string[TXRX_TYPE_MU_MAX][MAX_MCS] = { {"HE MU-MIMO MCS 11 (1024-QAM 5/6)", MCS_VALID}, {"HE MU-MIMO MCS 12 (4096-QAM 3/4)", MCS_VALID}, {"HE MU-MIMO MCS 13 (4096-QAM 5/6)", MCS_VALID}, - {"INVALID ", MCS_VALID}, + {"INVALID ", MCS_INVALID}, }, { {"HE OFDMA MCS 0 (BPSK 1/2) ", MCS_VALID}, @@ -262,7 +262,7 @@ dp_mu_rate_string[TXRX_TYPE_MU_MAX][MAX_MCS] = { {"HE OFDMA MCS 11 (1024-QAM 5/6)", MCS_VALID}, {"HE OFDMA MCS 12 (4096-QAM 3/4)", MCS_VALID}, {"HE OFDMA MCS 13 (4096-QAM 5/6)", MCS_VALID}, - {"INVALID ", MCS_VALID}, + {"INVALID ", MCS_INVALID}, } }; #endif @@ -5879,9 +5879,11 @@ void dp_print_peer_txrx_stats_be(struct cdp_peer_stats *peer_stats, if (stats_type == PEER_TX_STATS) { DP_PRINT_STATS("BW Counts = 20MHZ %d 40MHZ %d 80MHZ %d 160MHZ %d 320MHZ %d\n", - peer_stats->tx.bw[0], peer_stats->tx.bw[1], - peer_stats->tx.bw[2], peer_stats->tx.bw[3], - peer_stats->tx.bw[4]); + peer_stats->tx.bw[CMN_BW_20MHZ], + peer_stats->tx.bw[CMN_BW_40MHZ], + peer_stats->tx.bw[CMN_BW_80MHZ], + peer_stats->tx.bw[CMN_BW_160MHZ], + peer_stats->tx.bw[CMN_BW_320MHZ]); 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, @@ -5892,9 +5894,11 @@ void dp_print_peer_txrx_stats_be(struct cdp_peer_stats *peer_stats, } else { DP_PRINT_STATS("BW Counts = 20MHZ %d 40MHZ %d 80MHZ %d 160MHZ %d 320MHZ %d", - peer_stats->rx.bw[0], peer_stats->rx.bw[1], - peer_stats->rx.bw[2], peer_stats->rx.bw[3], - peer_stats->rx.bw[4]); + peer_stats->rx.bw[CMN_BW_20MHZ], + peer_stats->rx.bw[CMN_BW_40MHZ], + peer_stats->rx.bw[CMN_BW_80MHZ], + peer_stats->rx.bw[CMN_BW_160MHZ], + peer_stats->rx.bw[CMN_BW_320MHZ]); 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]); @@ -5912,8 +5916,10 @@ void dp_print_peer_txrx_stats_li(struct cdp_peer_stats *peer_stats, { if (stats_type == PEER_TX_STATS) { DP_PRINT_STATS("BW Counts = 20MHZ %d 40MHZ %d 80MHZ %d 160MHZ %d\n", - peer_stats->tx.bw[0], peer_stats->tx.bw[1], - peer_stats->tx.bw[2], peer_stats->tx.bw[3]); + peer_stats->tx.bw[CMN_BW_20MHZ], + peer_stats->tx.bw[CMN_BW_40MHZ], + peer_stats->tx.bw[CMN_BW_80MHZ], + peer_stats->tx.bw[CMN_BW_160MHZ]); DP_PRINT_STATS("RU Locations RU[26 52 106 242 484 996]:"); DP_PRINT_STATS("%s: %d", cdp_ru_string[RU_26_INDEX].ru_type, peer_stats->tx.ru_loc[RU_26_INDEX].num_msdu); @@ -5929,8 +5935,10 @@ void dp_print_peer_txrx_stats_li(struct cdp_peer_stats *peer_stats, peer_stats->tx.ru_loc[RU_996_INDEX].num_msdu); } else { DP_PRINT_STATS("BW Counts = 20MHZ %d 40MHZ %d 80MHZ %d 160MHZ %d", - peer_stats->rx.bw[0], peer_stats->rx.bw[1], - peer_stats->rx.bw[2], peer_stats->rx.bw[3]); + peer_stats->rx.bw[CMN_BW_20MHZ], + peer_stats->rx.bw[CMN_BW_40MHZ], + peer_stats->rx.bw[CMN_BW_80MHZ], + peer_stats->rx.bw[CMN_BW_160MHZ]); } } 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 216749a2e2..123a23a1b5 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 @@ -60,6 +60,64 @@ dp_mon_populate_ppdu_info_1_0(struct hal_rx_ppdu_info *hal_ppdu_info, { ppdu->punc_bw = 0; } + +/* + * is_ppdu_txrx_capture_enabled() - API to check both pktlog and debug_sniffer + * modes are enabled or not. + * @dp_pdev: dp pdev handle. + * + * Return: bool + */ +static inline bool is_ppdu_txrx_capture_enabled(struct dp_pdev *pdev) +{ + struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev; + + if (!mon_pdev->pktlog_ppdu_stats && !mon_pdev->tx_sniffer_enable && + !mon_pdev->mcopy_mode) + return true; + else + return false; +} + +/** + * dp_mon_tx_enable_enhanced_stats_1_0() - Send HTT cmd to FW to enable stats + * @pdev: Datapath pdev handle + * + * Return: none + */ +static void dp_mon_tx_enable_enhanced_stats_1_0(struct dp_pdev *pdev) +{ + struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev; + + if (is_ppdu_txrx_capture_enabled(pdev) && !mon_pdev->bpr_enable) { + dp_h2t_cfg_stats_msg_send(pdev, DP_PPDU_STATS_CFG_ENH_STATS, + pdev->pdev_id); + } else if (is_ppdu_txrx_capture_enabled(pdev) && + mon_pdev->bpr_enable) { + dp_h2t_cfg_stats_msg_send(pdev, + DP_PPDU_STATS_CFG_BPR_ENH, + pdev->pdev_id); + } +} + +/** + * dp_mon_tx_disable_enhanced_stats_1_0() - Send HTT cmd to FW to disable stats + * @pdev: Datapath pdev handle + * + * Return: none + */ +static void dp_mon_tx_disable_enhanced_stats_1_0(struct dp_pdev *pdev) +{ + struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev; + + if (is_ppdu_txrx_capture_enabled(pdev) && !mon_pdev->bpr_enable) { + dp_h2t_cfg_stats_msg_send(pdev, 0, pdev->pdev_id); + } else if (is_ppdu_txrx_capture_enabled(pdev) && mon_pdev->bpr_enable) { + dp_h2t_cfg_stats_msg_send(pdev, + DP_PPDU_STATS_CFG_BPR, + pdev->pdev_id); + } +} #endif #ifdef QCA_SUPPORT_FULL_MON @@ -811,6 +869,74 @@ dp_set_bpr_enable_1_0(struct dp_pdev *pdev, int val) } #endif +#if defined(WDI_EVENT_ENABLE) &&\ + (defined(QCA_ENHANCED_STATS_SUPPORT) || !defined(REMOVE_PKT_LOG)) +#ifndef WLAN_TX_PKT_CAPTURE_ENH +/** + * dp_ppdu_desc_notify_1_0 - Notify upper layer for PPDU indication via WDI + * + * @pdev: Datapath pdev handle + * @nbuf: Buffer to be shipped + * + * Return: void + */ +static void dp_ppdu_desc_notify_1_0(struct dp_pdev *pdev, qdf_nbuf_t nbuf) +{ + struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev; + struct cdp_tx_completion_ppdu *ppdu_desc = NULL; + + ppdu_desc = (struct cdp_tx_completion_ppdu *)qdf_nbuf_data(nbuf); + + /** + * Deliver PPDU stats only for valid (acked) data + * frames if sniffer mode is not enabled. + * If sniffer mode is enabled, PPDU stats + * for all frames including mgmt/control + * frames should be delivered to upper layer + */ + if (mon_pdev->tx_sniffer_enable || mon_pdev->mcopy_mode) { + dp_wdi_event_handler(WDI_EVENT_TX_PPDU_DESC, + pdev->soc, + nbuf, HTT_INVALID_PEER, + WDI_NO_VAL, + pdev->pdev_id); + } else { + if (ppdu_desc->num_mpdu != 0 && + ppdu_desc->num_users != 0 && + ppdu_desc->frame_ctrl & + HTT_FRAMECTRL_DATATYPE) { + dp_wdi_event_handler(WDI_EVENT_TX_PPDU_DESC, + pdev->soc, + nbuf, HTT_INVALID_PEER, + WDI_NO_VAL, + pdev->pdev_id); + } else { + qdf_nbuf_free(nbuf); + } + } +} +#endif + +/** + * dp_ppdu_stats_feat_enable_check_1_0 - Check if feature(s) is enabled to + * consume ppdu stats from FW + * + * @pdev: Datapath pdev handle + * + * Return: true if enabled, else return false + */ +static bool dp_ppdu_stats_feat_enable_check_1_0(struct dp_pdev *pdev) +{ + struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev; + + if (!mon_pdev->enhanced_stats_en && !mon_pdev->tx_sniffer_enable && + !mon_pdev->mcopy_mode && !mon_pdev->bpr_enable) + return false; + else + return true; +} +#endif + #ifndef QCA_SUPPORT_FULL_MON /** * dp_rx_mon_process () - Core brain processing for monitor mode @@ -906,6 +1032,14 @@ dp_mon_register_feature_ops_1_0(struct dp_soc *soc) #if defined(WDI_EVENT_ENABLE) &&\ (defined(QCA_ENHANCED_STATS_SUPPORT) || !defined(REMOVE_PKT_LOG)) mon_ops->mon_ppdu_stats_ind_handler = dp_ppdu_stats_ind_handler; +#ifndef WLAN_TX_PKT_CAPTURE_ENH + mon_ops->mon_ppdu_desc_deliver = dp_ppdu_desc_deliver; + mon_ops->mon_ppdu_desc_notify = dp_ppdu_desc_notify_1_0; +#else + mon_ops->mon_ppdu_desc_deliver = dp_ppdu_desc_deliver_1_0; +#endif + mon_ops->mon_ppdu_stats_feat_enable_check = + dp_ppdu_stats_feat_enable_check_1_0; #endif #ifdef WLAN_RX_PKT_CAPTURE_ENH mon_ops->mon_config_enh_rx_capture = dp_config_enh_rx_capture; @@ -934,6 +1068,10 @@ dp_mon_register_feature_ops_1_0(struct dp_soc *soc) dp_mon_filter_setup_enhanced_stats_1_0; mon_ops->mon_filter_reset_enhanced_stats = dp_mon_filter_reset_enhanced_stats_1_0; + mon_ops->mon_tx_enable_enhanced_stats = + dp_mon_tx_enable_enhanced_stats_1_0; + mon_ops->mon_tx_disable_enhanced_stats = + dp_mon_tx_disable_enhanced_stats_1_0; #ifdef WLAN_FEATURE_11BE mon_ops->mon_tx_stats_update = NULL; #endif 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 913a9164df..78cef26353 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 @@ -382,6 +382,31 @@ QDF_STATUS dp_vdev_set_monitor_mode_rings_2_0(struct dp_pdev *pdev, return QDF_STATUS_SUCCESS; } +#ifdef QCA_ENHANCED_STATS_SUPPORT +/** + * dp_mon_tx_enable_enhanced_stats_2_0() - Send HTT cmd to FW to enable stats + * @pdev: Datapath pdev handle + * + * Return: none + */ +static void dp_mon_tx_enable_enhanced_stats_2_0(struct dp_pdev *pdev) +{ + dp_h2t_cfg_stats_msg_send(pdev, DP_PPDU_STATS_CFG_ENH_STATS, + pdev->pdev_id); +} + +/** + * dp_mon_tx_disable_enhanced_stats_2_0() - Send HTT cmd to FW to disable stats + * @pdev: Datapath pdev handle + * + * Return: none + */ +static void dp_mon_tx_disable_enhanced_stats_2_0(struct dp_pdev *pdev) +{ + dp_h2t_cfg_stats_msg_send(pdev, 0, pdev->pdev_id); +} +#endif + #if defined(QCA_ENHANCED_STATS_SUPPORT) && defined(WLAN_FEATURE_11BE) void dp_mon_tx_stats_update_2_0(struct dp_mon_peer *mon_peer, @@ -396,37 +421,37 @@ dp_mon_tx_stats_update_2_0(struct dp_mon_peer *mon_peer, DP_STATS_INCC(mon_peer, tx.pkt_type[preamble].mcs_count[MAX_MCS - 1], ppdu->num_msdu, - ((mcs >= (MAX_MCS - 1)) && (preamble == DOT11_BE))); + ((mcs >= MAX_MCS_11BE) && (preamble == DOT11_BE))); DP_STATS_INCC(mon_peer, tx.pkt_type[preamble].mcs_count[mcs], ppdu->num_msdu, - ((mcs < (MAX_MCS - 1)) && (preamble == DOT11_BE))); + ((mcs < MAX_MCS_11BE) && (preamble == DOT11_BE))); DP_STATS_INCC(mon_peer, tx.su_be_ppdu_cnt.mcs_count[MAX_MCS - 1], 1, - ((mcs >= (MAX_MCS - 1)) && (preamble == DOT11_BE) && + ((mcs >= MAX_MCS_11BE) && (preamble == DOT11_BE) && (ppdu->ppdu_type == HTT_PPDU_STATS_PPDU_TYPE_SU))); DP_STATS_INCC(mon_peer, tx.su_be_ppdu_cnt.mcs_count[mcs], 1, - ((mcs < (MAX_MCS - 1)) && (preamble == DOT11_BE) && + ((mcs < MAX_MCS_11BE) && (preamble == DOT11_BE) && (ppdu->ppdu_type == HTT_PPDU_STATS_PPDU_TYPE_SU))); DP_STATS_INCC(mon_peer, tx.mu_be_ppdu_cnt[TXRX_TYPE_MU_OFDMA].mcs_count[MAX_MCS - 1], - 1, ((mcs >= (MAX_MCS - 1)) && + 1, ((mcs >= MAX_MCS_11BE) && (preamble == DOT11_BE) && (ppdu->ppdu_type == HTT_PPDU_STATS_PPDU_TYPE_MU_OFDMA))); DP_STATS_INCC(mon_peer, tx.mu_be_ppdu_cnt[TXRX_TYPE_MU_OFDMA].mcs_count[mcs], - 1, ((mcs < (MAX_MCS - 1)) && + 1, ((mcs < MAX_MCS_11BE) && (preamble == DOT11_BE) && (ppdu->ppdu_type == HTT_PPDU_STATS_PPDU_TYPE_MU_OFDMA))); DP_STATS_INCC(mon_peer, tx.mu_be_ppdu_cnt[TXRX_TYPE_MU_MIMO].mcs_count[MAX_MCS - 1], - 1, ((mcs >= (MAX_MCS - 1)) && + 1, ((mcs >= MAX_MCS_11BE) && (preamble == DOT11_BE) && (ppdu->ppdu_type == HTT_PPDU_STATS_PPDU_TYPE_MU_MIMO))); DP_STATS_INCC(mon_peer, tx.mu_be_ppdu_cnt[TXRX_TYPE_MU_MIMO].mcs_count[mcs], - 1, ((mcs < (MAX_MCS - 1)) && + 1, ((mcs < MAX_MCS_11BE) && (preamble == DOT11_BE) && (ppdu->ppdu_type == HTT_PPDU_STATS_PPDU_TYPE_MU_MIMO))); } @@ -448,6 +473,48 @@ dp_set_bpr_enable_2_0(struct dp_pdev *pdev, int val) } #endif /* QCA_SUPPORT_BPR */ +#if defined(WDI_EVENT_ENABLE) &&\ + (defined(QCA_ENHANCED_STATS_SUPPORT) || !defined(REMOVE_PKT_LOG)) +/** + * dp_ppdu_desc_notify_2_0 - Notify upper layer for PPDU indication via WDI + * + * @pdev: Datapath pdev handle + * @nbuf: Buffer to be shipped + * + * Return: void + */ +static void dp_ppdu_desc_notify_2_0(struct dp_pdev *pdev, qdf_nbuf_t nbuf) +{ + struct cdp_tx_completion_ppdu *ppdu_desc = NULL; + + ppdu_desc = (struct cdp_tx_completion_ppdu *)qdf_nbuf_data(nbuf); + + if (ppdu_desc->num_mpdu != 0 && ppdu_desc->num_users != 0 && + ppdu_desc->frame_ctrl & HTT_FRAMECTRL_DATATYPE) { + dp_wdi_event_handler(WDI_EVENT_TX_PPDU_DESC, + pdev->soc, + nbuf, HTT_INVALID_PEER, + WDI_NO_VAL, + pdev->pdev_id); + } else { + qdf_nbuf_free(nbuf); + } +} + +/** + * dp_ppdu_stats_feat_enable_check_2_0 - Check if feature(s) is enabled to + * consume ppdu stats from FW + * + * @pdev: Datapath pdev handle + * + * Return: true if enabled, else return false + */ +static bool dp_ppdu_stats_feat_enable_check_2_0(struct dp_pdev *pdev) +{ + return pdev->monitor_pdev->enhanced_stats_en; +} +#endif + static QDF_STATUS dp_mon_soc_htt_srng_setup_2_0(struct dp_soc *soc) { @@ -1045,6 +1112,10 @@ dp_mon_register_feature_ops_2_0(struct dp_soc *soc) #if defined(WDI_EVENT_ENABLE) &&\ (defined(QCA_ENHANCED_STATS_SUPPORT) || !defined(REMOVE_PKT_LOG)) mon_ops->mon_ppdu_stats_ind_handler = dp_ppdu_stats_ind_handler; + mon_ops->mon_ppdu_desc_deliver = dp_ppdu_desc_deliver; + mon_ops->mon_ppdu_desc_notify = dp_ppdu_desc_notify_2_0; + mon_ops->mon_ppdu_stats_feat_enable_check = + dp_ppdu_stats_feat_enable_check_2_0; #endif #ifdef WLAN_RX_PKT_CAPTURE_ENH mon_ops->mon_config_enh_rx_capture = NULL; @@ -1073,6 +1144,10 @@ dp_mon_register_feature_ops_2_0(struct dp_soc *soc) dp_mon_filter_setup_enhanced_stats_2_0; mon_ops->mon_filter_reset_enhanced_stats = dp_mon_filter_reset_enhanced_stats_2_0; + mon_ops->mon_tx_enable_enhanced_stats = + dp_mon_tx_enable_enhanced_stats_2_0; + mon_ops->mon_tx_disable_enhanced_stats = + dp_mon_tx_disable_enhanced_stats_2_0; mon_ops->mon_tx_stats_update = dp_mon_tx_stats_update_2_0; #endif #if defined(ATH_SUPPORT_NAC_RSSI) || defined(ATH_SUPPORT_NAC) diff --git a/dp/wifi3.0/monitor/dp_mon.c b/dp/wifi3.0/monitor/dp_mon.c index f50e0274b0..56549358ac 100644 --- a/dp/wifi3.0/monitor/dp_mon.c +++ b/dp/wifi3.0/monitor/dp_mon.c @@ -1721,25 +1721,23 @@ void dp_neighbour_peers_detach(struct dp_pdev *pdev) qdf_spinlock_destroy(&mon_pdev->neighbour_peer_mutex); } +#ifdef QCA_ENHANCED_STATS_SUPPORT /* - * is_ppdu_txrx_capture_enabled() - API to check both pktlog and debug_sniffer - * modes are enabled or not. - * @dp_pdev: dp pdev handle. + * dp_mon_tx_enable_enhanced_stats() - Enable enhanced Tx stats + * @pdev: Datapath pdev handle * - * Return: bool + * Return: void */ -static inline bool is_ppdu_txrx_capture_enabled(struct dp_pdev *pdev) +static void dp_mon_tx_enable_enhanced_stats(struct dp_pdev *pdev) { - struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev; + struct dp_soc *soc = pdev->soc; + struct dp_mon_ops *mon_ops = NULL; - if (!mon_pdev->pktlog_ppdu_stats && !mon_pdev->tx_sniffer_enable && - !mon_pdev->mcopy_mode) - return true; - else - return false; + mon_ops = dp_mon_ops_get(soc); + if (mon_ops && mon_ops->mon_tx_enable_enhanced_stats) + mon_ops->mon_tx_enable_enhanced_stats(pdev); } -#ifdef QCA_ENHANCED_STATS_SUPPORT /* * dp_enable_enhanced_stats()- API to enable enhanced statistcs * @soc_handle: DP_SOC handle @@ -1785,19 +1783,27 @@ dp_enable_enhanced_stats(struct cdp_soc_t *soc, uint8_t pdev_id) return QDF_STATUS_E_FAILURE; } - if (is_ppdu_txrx_capture_enabled(pdev) && !mon_pdev->bpr_enable) { - dp_h2t_cfg_stats_msg_send(pdev, DP_PPDU_STATS_CFG_ENH_STATS, - pdev->pdev_id); - } else if (is_ppdu_txrx_capture_enabled(pdev) && - mon_pdev->bpr_enable) { - dp_h2t_cfg_stats_msg_send(pdev, - DP_PPDU_STATS_CFG_BPR_ENH, - pdev->pdev_id); - } + dp_mon_tx_enable_enhanced_stats(pdev); return QDF_STATUS_SUCCESS; } +/* + * dp_mon_tx_disable_enhanced_stats() - Disable enhanced Tx stats + * @pdev: Datapath pdev handle + * + * Return: void + */ +static void dp_mon_tx_disable_enhanced_stats(struct dp_pdev *pdev) +{ + struct dp_soc *soc = pdev->soc; + struct dp_mon_ops *mon_ops = NULL; + + mon_ops = dp_mon_ops_get(soc); + if (mon_ops && mon_ops->mon_tx_disable_enhanced_stats) + mon_ops->mon_tx_disable_enhanced_stats(pdev); +} + /* * dp_disable_enhanced_stats()- API to disable enhanced statistcs * @@ -1828,13 +1834,7 @@ dp_disable_enhanced_stats(struct cdp_soc_t *soc, uint8_t pdev_id) if (wlan_cfg_get_txmon_hw_support(pdev->soc->wlan_cfg_ctx)) return QDF_STATUS_SUCCESS; - if (is_ppdu_txrx_capture_enabled(pdev) && !mon_pdev->bpr_enable) { - dp_h2t_cfg_stats_msg_send(pdev, 0, pdev->pdev_id); - } else if (is_ppdu_txrx_capture_enabled(pdev) && mon_pdev->bpr_enable) { - dp_h2t_cfg_stats_msg_send(pdev, - DP_PPDU_STATS_CFG_BPR, - pdev->pdev_id); - } + dp_mon_tx_disable_enhanced_stats(pdev); dp_mon_filter_reset_enhanced_stats(pdev); if (dp_mon_filter_update(pdev) != QDF_STATUS_SUCCESS) { @@ -2712,10 +2712,10 @@ dp_tx_stats_update(struct dp_pdev *pdev, struct dp_peer *peer, ((mcs < MAX_MCS_11AC) && (preamble == DOT11_AC))); DP_STATS_INCC(mon_peer, tx.pkt_type[preamble].mcs_count[MAX_MCS - 1], num_msdu, - ((mcs >= (MAX_MCS - 1)) && (preamble == DOT11_AX))); + ((mcs >= MAX_MCS_11AX) && (preamble == DOT11_AX))); DP_STATS_INCC(mon_peer, tx.pkt_type[preamble].mcs_count[mcs], num_msdu, - ((mcs < (MAX_MCS - 1)) && (preamble == DOT11_AX))); + ((mcs < MAX_MCS_11AX) && (preamble == DOT11_AX))); DP_STATS_INCC(mon_peer, tx.ampdu_cnt, num_mpdu, ppdu->is_ampdu); DP_STATS_INCC(mon_peer, tx.non_ampdu_cnt, num_mpdu, !(ppdu->is_ampdu)); DP_STATS_INCC(mon_peer, tx.pream_punct_cnt, 1, ppdu->pream_punct); @@ -3032,6 +3032,7 @@ dp_process_ppdu_stats_user_rate_tlv(struct dp_pdev *pdev, uint8_t curr_user_index = 0; struct dp_vdev *vdev; uint32_t tlv_type = HTT_STATS_TLV_TAG_GET(*tag_buf); + uint8_t bw; ppdu_desc = (struct cdp_tx_completion_ppdu *)qdf_nbuf_data(ppdu_info->nbuf); @@ -3089,8 +3090,12 @@ dp_process_ppdu_stats_user_rate_tlv(struct dp_pdev *pdev, HTT_PPDU_STATS_USER_RATE_TLV_HE_RE_GET(*tag_buf); ppdu_user_desc->txbf = HTT_PPDU_STATS_USER_RATE_TLV_TXBF_GET(*tag_buf); - ppdu_user_desc->bw = - HTT_PPDU_STATS_USER_RATE_TLV_BW_GET(*tag_buf) - 2; + bw = HTT_PPDU_STATS_USER_RATE_TLV_BW_GET(*tag_buf); + /* Align bw value as per host data structures */ + if (bw == HTT_PPDU_STATS_BANDWIDTH_320MHZ) + ppdu_user_desc->bw = bw - 3; + else + ppdu_user_desc->bw = bw - 2; ppdu_user_desc->nss = HTT_PPDU_STATS_USER_RATE_TLV_NSS_GET(*tag_buf); ppdu_desc->usr_nss_sum += ppdu_user_desc->nss; ppdu_user_desc->mcs = HTT_PPDU_STATS_USER_RATE_TLV_MCS_GET(*tag_buf); @@ -4035,17 +4040,27 @@ dp_ppdu_desc_user_stats_update(struct dp_pdev *pdev, } } -#ifndef WLAN_TX_PKT_CAPTURE_ENH - -/** - * dp_ppdu_desc_deliver(): Function to deliver Tx PPDU status descriptor - * to upper layer - * @pdev: DP pdev handle - * @ppdu_info: per PPDU TLV descriptor +#if !defined(WLAN_TX_PKT_CAPTURE_ENH) || defined(QCA_MONITOR_2_0_SUPPORT) +/* + * dp_tx_ppdu_desc_notify() - Notify to upper layer about PPDU via WDI * - * return: void + * @pdev: Datapath pdev handle + * @nbuf: Buffer to be delivered to upper layer + * + * Return: void */ -static +static void dp_tx_ppdu_desc_notify(struct dp_pdev *pdev, qdf_nbuf_t nbuf) +{ + struct dp_soc *soc = pdev->soc; + struct dp_mon_ops *mon_ops = NULL; + + mon_ops = dp_mon_ops_get(soc); + if (mon_ops && mon_ops->mon_ppdu_desc_notify) + mon_ops->mon_ppdu_desc_notify(pdev, nbuf); + else + qdf_nbuf_free(nbuf); +} + void dp_ppdu_desc_deliver(struct dp_pdev *pdev, struct ppdu_info *ppdu_info) { @@ -4118,41 +4133,39 @@ void dp_ppdu_desc_deliver(struct dp_pdev *pdev, qdf_mem_free(s_ppdu_info); - /** - * Deliver PPDU stats only for valid (acked) data - * frames if sniffer mode is not enabled. - * If sniffer mode is enabled, PPDU stats - * for all frames including mgmt/control - * frames should be delivered to upper layer - */ - if (mon_pdev->tx_sniffer_enable || mon_pdev->mcopy_mode) { - dp_wdi_event_handler(WDI_EVENT_TX_PPDU_DESC, - pdev->soc, - nbuf, HTT_INVALID_PEER, - WDI_NO_VAL, - pdev->pdev_id); - } else { - if (ppdu_desc->num_mpdu != 0 && - ppdu_desc->num_users != 0 && - ppdu_desc->frame_ctrl & - HTT_FRAMECTRL_DATATYPE) { - dp_wdi_event_handler(WDI_EVENT_TX_PPDU_DESC, - pdev->soc, - nbuf, HTT_INVALID_PEER, - WDI_NO_VAL, - pdev->pdev_id); - } else { - qdf_nbuf_free(nbuf); - } - } + dp_tx_ppdu_desc_notify(pdev, nbuf); if (matched) break; } } - #endif +/* + * dp_tx_ppdu_desc_deliver() - Deliver PPDU desc to upper layer + * + * @pdev: Datapath pdev handle + * @ppdu_info: per PPDU TLV descriptor + * + * Return: void + */ +static void dp_tx_ppdu_desc_deliver(struct dp_pdev *pdev, + struct ppdu_info *ppdu_info) +{ + struct dp_soc *soc = pdev->soc; + struct dp_mon_ops *mon_ops = NULL; + + mon_ops = dp_mon_ops_get(soc); + + if (mon_ops && mon_ops->mon_ppdu_desc_deliver) { + mon_ops->mon_ppdu_desc_deliver(pdev, ppdu_info); + } else { + qdf_nbuf_free(ppdu_info->nbuf); + ppdu_info->nbuf = NULL; + qdf_mem_free(ppdu_info); + } +} + /** * dp_get_ppdu_desc(): Function to allocate new PPDU status * desc for new ppdu id @@ -4282,7 +4295,7 @@ struct ppdu_info *dp_get_ppdu_desc(struct dp_pdev *pdev, uint32_t ppdu_id, HTT_STATS_FTYPE_SGEN_MU_BAR)) return ppdu_info; - dp_ppdu_desc_deliver(pdev, ppdu_info); + dp_tx_ppdu_desc_deliver(pdev, ppdu_info); } else { return ppdu_info; } @@ -4515,6 +4528,27 @@ static struct ppdu_info *dp_htt_process_tlv(struct dp_pdev *pdev, } #endif /* QCA_ENHANCED_STATS_SUPPORT */ +#if defined(WDI_EVENT_ENABLE) +#ifdef QCA_ENHANCED_STATS_SUPPORT +/** + * dp_tx_ppdu_stats_feat_enable_check() - Check if feature(s) is enabled to + * consume stats received from FW via HTT + * @pdev: Datapath pdev handle + * + * Return: void + */ +static bool dp_tx_ppdu_stats_feat_enable_check(struct dp_pdev *pdev) +{ + struct dp_soc *soc = pdev->soc; + struct dp_mon_ops *mon_ops = NULL; + + mon_ops = dp_mon_ops_get(soc); + if (mon_ops && mon_ops->mon_ppdu_stats_feat_enable_check) + return mon_ops->mon_ppdu_stats_feat_enable_check(pdev); + else + return false; +} + /** * dp_txrx_ppdu_stats_handler() - Function to process HTT PPDU stats from FW * @soc: DP SOC handle @@ -4523,15 +4557,13 @@ static struct ppdu_info *dp_htt_process_tlv(struct dp_pdev *pdev, * * return:void */ -#if defined(WDI_EVENT_ENABLE) -#ifdef QCA_ENHANCED_STATS_SUPPORT static bool dp_txrx_ppdu_stats_handler(struct dp_soc *soc, uint8_t pdev_id, qdf_nbuf_t htt_t2h_msg) { - struct dp_pdev *pdev = soc->pdev_list[pdev_id]; + struct dp_pdev *pdev; struct ppdu_info *ppdu_info = NULL; bool free_buf = true; - struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev; + struct dp_mon_pdev *mon_pdev; if (pdev_id >= MAX_PDEV_CNT) return true; @@ -4540,11 +4572,14 @@ static bool dp_txrx_ppdu_stats_handler(struct dp_soc *soc, if (!pdev) return true; + mon_pdev = pdev->monitor_pdev; + if (!mon_pdev) + return true; + if (wlan_cfg_get_txmon_hw_support(soc->wlan_cfg_ctx)) return free_buf; - if (!mon_pdev->enhanced_stats_en && !mon_pdev->tx_sniffer_enable && - !mon_pdev->mcopy_mode && !mon_pdev->bpr_enable) + if (!dp_tx_ppdu_stats_feat_enable_check(pdev)) return free_buf; qdf_spin_lock_bh(&mon_pdev->ppdu_stats_lock); @@ -4558,7 +4593,7 @@ static bool dp_txrx_ppdu_stats_handler(struct dp_soc *soc, } if (ppdu_info) - dp_ppdu_desc_deliver(pdev, ppdu_info); + dp_tx_ppdu_desc_deliver(pdev, ppdu_info); mon_pdev->mgmtctrl_frm_info.mgmt_buf = NULL; mon_pdev->mgmtctrl_frm_info.mgmt_buf_len = 0; @@ -5539,6 +5574,9 @@ void dp_mon_feature_ops_deregister(struct dp_soc *soc) #if defined(WDI_EVENT_ENABLE) &&\ (defined(QCA_ENHANCED_STATS_SUPPORT) || !defined(REMOVE_PKT_LOG)) mon_ops->mon_ppdu_stats_ind_handler = NULL; + mon_ops->mon_ppdu_desc_deliver = NULL; + mon_ops->mon_ppdu_desc_notify = NULL; + mon_ops->mon_ppdu_stats_feat_enable_check = NULL; #endif #ifdef WLAN_RX_PKT_CAPTURE_ENH mon_ops->mon_config_enh_rx_capture = NULL; @@ -5562,6 +5600,8 @@ void dp_mon_feature_ops_deregister(struct dp_soc *soc) #endif #ifdef QCA_ENHANCED_STATS_SUPPORT mon_ops->mon_filter_setup_enhanced_stats = NULL; + mon_ops->mon_tx_enable_enhanced_stats = NULL; + mon_ops->mon_tx_disable_enhanced_stats = NULL; #ifdef WLAN_FEATURE_11BE mon_ops->mon_tx_stats_update = NULL; #endif diff --git a/dp/wifi3.0/monitor/dp_mon.h b/dp/wifi3.0/monitor/dp_mon.h index a5970da8df..3e7cfeef11 100644 --- a/dp/wifi3.0/monitor/dp_mon.h +++ b/dp/wifi3.0/monitor/dp_mon.h @@ -510,6 +510,18 @@ dp_vdev_set_monitor_mode_rings(struct dp_pdev *pdev, bool dp_ppdu_stats_ind_handler(struct htt_soc *soc, uint32_t *msg_word, qdf_nbuf_t htt_t2h_msg); + +#if !defined(WLAN_TX_PKT_CAPTURE_ENH) || defined(QCA_MONITOR_2_0_SUPPORT) +/** + * dp_ppdu_desc_deliver(): Function to deliver Tx PPDU status descriptor + * to upper layer + * @pdev: DP pdev handle + * @ppdu_info: per PPDU TLV descriptor + * + * return: void + */ +void dp_ppdu_desc_deliver(struct dp_pdev *pdev, struct ppdu_info *ppdu_info); +#endif #endif struct dp_mon_ops { @@ -595,6 +607,10 @@ struct dp_mon_ops { bool (*mon_ppdu_stats_ind_handler)(struct htt_soc *soc, uint32_t *msg_word, qdf_nbuf_t htt_t2h_msg); + void (*mon_ppdu_desc_deliver)(struct dp_pdev *pdev, + struct ppdu_info *ppdu_info); + void (*mon_ppdu_desc_notify)(struct dp_pdev *pdev, qdf_nbuf_t nbuf); + bool (*mon_ppdu_stats_feat_enable_check)(struct dp_pdev *pdev); #endif QDF_STATUS (*mon_htt_ppdu_stats_attach)(struct dp_pdev *pdev); void (*mon_htt_ppdu_stats_detach)(struct dp_pdev *pdev); @@ -665,6 +681,8 @@ struct dp_mon_ops { void (*mon_filter_reset_enhanced_stats)(struct dp_pdev *pdev); void (*mon_tx_stats_update)(struct dp_mon_peer *mon_peer, struct cdp_tx_completion_ppdu_user *ppdu); + void (*mon_tx_enable_enhanced_stats)(struct dp_pdev *pdev); + void (*mon_tx_disable_enhanced_stats)(struct dp_pdev *pdev); #endif #ifdef QCA_MCOPY_SUPPORT void (*mon_filter_setup_mcopy_mode)(struct dp_pdev *pdev);