diff --git a/dp/inc/cdp_txrx_mon_struct.h b/dp/inc/cdp_txrx_mon_struct.h index 2692e27fee..6b697ebcb6 100644 --- a/dp/inc/cdp_txrx_mon_struct.h +++ b/dp/inc/cdp_txrx_mon_struct.h @@ -71,10 +71,10 @@ enum cdp_lite_mon_direction { CDP_LITE_MON_DIRECTION_TX = 2, }; #endif - /* MU max user to sniff */ #define CDP_MU_SNIF_USER_MAX 4 - +/* EHT max type and compression mode */ +#define CDP_EHT_TYPE_MODE_MAX 3 /* Same as MAX_20MHZ_SEGMENTS */ #define CDP_MAX_20MHZ_SEGS 16 /* Same as MAX_ANTENNA_EIGHT */ @@ -376,6 +376,7 @@ enum cdp_mon_phyrx_abort_reason_code { * @status_ppdu_end_mis: status ring missing end TLV count on PPDU * @mpdu_cnt_fcs_ok: MPDU ok count per pkt and reception type DL-UL and user * @mpdu_cnt_fcs_err: MPDU err count per pkt and reception type DL-UL and user + * @ppdu_eht_type_mode: PPDU count per type compression mode and DL-UL * @end_user_stats_cnt: PPDU end user TLV count * @start_user_info_cnt: PPDU start user info TLV count * @status_ppdu_done: status ring PPDU done TLV count @@ -426,6 +427,7 @@ struct cdp_pdev_mon_stats { [CDP_MU_TYPE_MAX][CDP_MU_SNIF_USER_MAX]; uint32_t mpdu_cnt_fcs_err[CDP_PKT_TYPE_MAX][CDP_RX_TYPE_MAX] [CDP_MU_TYPE_MAX][CDP_MU_SNIF_USER_MAX]; + uint32_t ppdu_eht_type_mode[CDP_EHT_TYPE_MODE_MAX][CDP_MU_TYPE_MAX]; uint32_t end_user_stats_cnt; uint32_t start_user_info_cnt; uint32_t status_ppdu_done; 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 7b39662824..d049c99c86 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 @@ -1579,6 +1579,33 @@ dp_rx_mu_stats_update( += rx_user_status->mpdu_cnt_fcs_err; } +static inline void +dp_rx_he_ppdu_stats_update( + struct cdp_pdev_mon_stats *stats, + struct hal_rx_u_sig_info *u_sig +) +{ + stats->ppdu_eht_type_mode[u_sig->ppdu_type_comp_mode][u_sig->ul_dl]++; +} + +static inline void +dp_rx_he_ppdu_stats(struct dp_pdev *pdev, struct hal_rx_ppdu_info *ppdu_info) +{ + struct dp_mon_pdev *mon_pdev; + struct cdp_pdev_mon_stats *rx_mon_stats; + + mon_pdev = pdev->monitor_pdev; + rx_mon_stats = &mon_pdev->rx_mon_stats; + + if (ppdu_info->u_sig_info.ppdu_type_comp_mode < CDP_EHT_TYPE_MODE_MAX && + ppdu_info->u_sig_info.ul_dl < CDP_MU_TYPE_MAX) + dp_rx_he_ppdu_stats_update( + rx_mon_stats, + &ppdu_info->u_sig_info); + else + qdf_assert(0); +} + static inline void dp_rx_mu_stats(struct dp_pdev *pdev, struct hal_rx_ppdu_info *ppdu_info) { @@ -1608,6 +1635,9 @@ dp_rx_mu_stats(struct dp_pdev *pdev, struct hal_rx_ppdu_info *ppdu_info) dp_rx_mu_stats_update(ppdu_info, rx_mon_stats, preamble_type, reception_type, mu_dl_ul, i); } + + if (rx_status->eht_flags) + dp_rx_he_ppdu_stats(pdev, ppdu_info); } static inline uint32_t diff --git a/dp/wifi3.0/monitor/dp_mon.c b/dp/wifi3.0/monitor/dp_mon.c index 8e885ee251..69413cf91b 100644 --- a/dp/wifi3.0/monitor/dp_mon.c +++ b/dp/wifi3.0/monitor/dp_mon.c @@ -926,6 +926,49 @@ dp_print_pdev_mpdu_pkt_type(struct cdp_pdev_mon_stats *rx_mon_sts) dp_print_pdev_mpdu_rx_type(rx_mon_sts, pkt_t); } +static inline void +print_ppdu_eht_type_mode( + struct cdp_pdev_mon_stats *rx_mon_stats, + uint32_t ppdu_type_mode, + uint32_t dl_ul) +{ + DP_PRINT_STATS("type_mode=%d, dl_ul=%d, cnt=%d", + ppdu_type_mode, + dl_ul, + rx_mon_stats->ppdu_eht_type_mode[ppdu_type_mode][dl_ul]); +} + +static inline void +print_ppdu_eth_type_mode_dl_ul( + struct cdp_pdev_mon_stats *rx_mon_stats, + uint32_t ppdu_type_mode +) +{ + uint32_t dl_ul; + + for (dl_ul = 0; dl_ul < CDP_MU_TYPE_MAX; dl_ul++) { + if (rx_mon_stats->ppdu_eht_type_mode[ppdu_type_mode][dl_ul]) + print_ppdu_eht_type_mode(rx_mon_stats, + ppdu_type_mode, dl_ul); + } +} + +static inline void +dp_print_pdev_eht_ppdu_cnt(struct dp_pdev *pdev) +{ + struct cdp_pdev_mon_stats *rx_mon_stats; + struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev; + uint32_t ppdu_type_mode; + + rx_mon_stats = &mon_pdev->rx_mon_stats; + DP_PRINT_STATS("Monitor EHT PPDU Count"); + for (ppdu_type_mode = 0; ppdu_type_mode < CDP_EHT_TYPE_MODE_MAX; + ppdu_type_mode++) { + print_ppdu_eth_type_mode_dl_ul(rx_mon_stats, + ppdu_type_mode); + } +} + static inline void dp_print_pdev_mpdu_stats(struct dp_pdev *pdev) { @@ -1033,6 +1076,7 @@ dp_print_pdev_rx_mon_stats(struct dp_pdev *pdev) dp_mon_rx_print_advanced_stats(pdev->soc, pdev); dp_print_pdev_mpdu_stats(pdev); + dp_print_pdev_eht_ppdu_cnt(pdev); } diff --git a/hal/wifi3.0/be/hal_be_api_mon.h b/hal/wifi3.0/be/hal_be_api_mon.h index 7559bed715..96e5225ba9 100644 --- a/hal/wifi3.0/be/hal_be_api_mon.h +++ b/hal/wifi3.0/be/hal_be_api_mon.h @@ -1389,8 +1389,8 @@ static inline bool hal_rx_is_non_ofdma(struct hal_soc *hal_soc, static inline bool hal_rx_is_mu_mimo_user(struct hal_soc *hal_soc, struct hal_rx_ppdu_info *ppdu_info) { - if (ppdu_info->u_sig_info.ppdu_type_comp_mode == 0 && - ppdu_info->u_sig_info.ul_dl == 2) + if (ppdu_info->u_sig_info.ppdu_type_comp_mode == 2 && + ppdu_info->u_sig_info.ul_dl == 0) return true; return false;