diff --git a/dp/inc/cdp_txrx_mon_struct.h b/dp/inc/cdp_txrx_mon_struct.h index 2f10036b02..2692e27fee 100644 --- a/dp/inc/cdp_txrx_mon_struct.h +++ b/dp/inc/cdp_txrx_mon_struct.h @@ -71,6 +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 + /* Same as MAX_20MHZ_SEGMENTS */ #define CDP_MAX_20MHZ_SEGS 16 /* Same as MAX_ANTENNA_EIGHT */ @@ -130,6 +134,9 @@ enum { CDP_PKT_TYPE_HT, CDP_PKT_TYPE_VHT, CDP_PKT_TYPE_HE, + CDP_PKT_TYPE_EHT, + CDP_PKT_TYPE_NO_SUP, + CDP_PKT_TYPE_MAX, }; enum { @@ -144,6 +151,13 @@ enum { CDP_RX_TYPE_MU_MIMO, CDP_RX_TYPE_MU_OFDMA, CDP_RX_TYPE_MU_OFDMA_MIMO, + CDP_RX_TYPE_MAX, +}; + +enum { + CDP_MU_TYPE_DL = 0, + CDP_MU_TYPE_UL, + CDP_MU_TYPE_MAX, }; /* @@ -360,6 +374,10 @@ enum cdp_mon_phyrx_abort_reason_code { * @status_ppdu_compl: status ring matching start and end count on PPDU * @status_ppdu_start_mis: status ring missing start TLV count on PPDU * @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 + * @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 * @dest_ppdu_done: destination ring PPDU count * @dest_mpdu_done: destination ring MPDU count @@ -404,6 +422,12 @@ struct cdp_pdev_mon_stats { uint32_t status_ppdu_start_mis; uint32_t status_ppdu_end_mis; #endif + uint32_t mpdu_cnt_fcs_ok[CDP_PKT_TYPE_MAX][CDP_RX_TYPE_MAX] + [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 end_user_stats_cnt; + uint32_t start_user_info_cnt; uint32_t status_ppdu_done; uint32_t dest_ppdu_done; uint32_t dest_mpdu_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 beb00d7403..7b39662824 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 @@ -1520,6 +1520,96 @@ void dp_rx_mon_update_peer_id(struct dp_pdev *pdev, } #endif +/* + * HAL_RX_PKT_TYPE_11A 0 -> CDP_PKT_TYPE_OFDM + * HAL_RX_PKT_TYPE_11B 1 -> CDP_PKT_TYPE_CCK + * HAL_RX_PKT_TYPE_11N 2 -> CDP_PKT_TYPE_HT + * HAL_RX_PKT_TYPE_11AC 3 -> CDP_PKT_TYPE_VHT + * HAL_RX_PKT_TYPE_11AX 4 -> CDP_PKT_TYPE_HE + * HAL_RX_PKT_TYPE_11BE 6 -> CDP_PKT_TYPE_EHT + */ + +static uint32_t const cdp_preamble_type_map[] = { + CDP_PKT_TYPE_OFDM, + CDP_PKT_TYPE_CCK, + CDP_PKT_TYPE_HT, + CDP_PKT_TYPE_VHT, + CDP_PKT_TYPE_HE, + CDP_PKT_TYPE_NO_SUP, +#ifdef WLAN_FEATURE_11BE + CDP_PKT_TYPE_EHT, +#endif + CDP_PKT_TYPE_MAX, +}; + +/* + * HAL_RX_RECEPTION_TYPE_SU -> CDP_RX_TYPE_SU + * HAL_RX_RECEPTION_TYPE_MU_MIMO -> CDP_RX_TYPE_MU_MIMO + * HAL_RX_RECEPTION_TYPE_OFDMA -> CDP_RX_TYPE_MU_OFDMA + * HAL_RX_RECEPTION_TYPE_MU_OFDMA -> CDP_RX_TYPE_MU_OFDMA_MIMO + */ +static uint32_t const cdp_reception_type_map[] = { + CDP_RX_TYPE_SU, + CDP_RX_TYPE_MU_MIMO, + CDP_RX_TYPE_MU_OFDMA, + CDP_RX_TYPE_MU_OFDMA_MIMO, +}; + +static uint32_t const cdp_mu_dl_up_map[] = { + CDP_MU_TYPE_DL, + CDP_MU_TYPE_UL, +}; + +static inline void +dp_rx_mu_stats_update( + struct hal_rx_ppdu_info *ppdu_info, + struct cdp_pdev_mon_stats *rx_mon_sts, + uint32_t preamble_type, + uint32_t recept_type, + uint32_t mu_dl_ul, + uint32_t i +) +{ + struct mon_rx_user_status *rx_user_status; + + rx_user_status = &ppdu_info->rx_user_status[i]; + rx_mon_sts->mpdu_cnt_fcs_ok[preamble_type][recept_type][mu_dl_ul][i] + += rx_user_status->mpdu_cnt_fcs_ok; + rx_mon_sts->mpdu_cnt_fcs_err[preamble_type][recept_type][mu_dl_ul][i] + += rx_user_status->mpdu_cnt_fcs_err; +} + +static inline void +dp_rx_mu_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; + struct mon_rx_status *rx_status; + uint32_t preamble_type, reception_type, mu_dl_ul, num_users, i; + + mon_pdev = pdev->monitor_pdev; + rx_mon_stats = &mon_pdev->rx_mon_stats; + rx_status = &ppdu_info->rx_status; + + num_users = ppdu_info->com_info.num_users; + + if (rx_status->preamble_type < CDP_PKT_TYPE_MAX) + preamble_type = cdp_preamble_type_map[rx_status->preamble_type]; + else + preamble_type = CDP_PKT_TYPE_NO_SUP; + + reception_type = cdp_reception_type_map[rx_status->reception_type]; + mu_dl_ul = cdp_mu_dl_up_map[rx_status->mu_dl_ul]; + + for (i = 0; i < num_users; i++) { + if (i >= CDP_MU_SNIF_USER_MAX) + return; + + dp_rx_mu_stats_update(ppdu_info, rx_mon_stats, preamble_type, + reception_type, mu_dl_ul, i); + } +} + static inline uint32_t dp_rx_mon_srng_process_2_0(struct dp_soc *soc, struct dp_intr *int_ctx, uint32_t mac_id, uint32_t quota) @@ -1639,8 +1729,18 @@ dp_rx_mon_srng_process_2_0(struct dp_soc *soc, struct dp_intr *int_ctx, ppdu_info = dp_rx_mon_process_status_tlv(pdev); - if (ppdu_info) + if (ppdu_info) { + mon_pdev->rx_mon_stats.start_user_info_cnt += + ppdu_info->start_user_info_cnt; + ppdu_info->start_user_info_cnt = 0; + + mon_pdev->rx_mon_stats.end_user_stats_cnt += + ppdu_info->end_user_stats_cnt; + ppdu_info->end_user_stats_cnt = 0; + dp_rx_mon_update_peer_id(pdev, ppdu_info); + dp_rx_mu_stats(pdev, ppdu_info); + } /* Call enhanced stats update API */ if (mon_pdev->enhanced_stats_en && ppdu_info) diff --git a/dp/wifi3.0/monitor/dp_mon.c b/dp/wifi3.0/monitor/dp_mon.c index 230ab4dc39..d9fb86b885 100644 --- a/dp/wifi3.0/monitor/dp_mon.c +++ b/dp/wifi3.0/monitor/dp_mon.c @@ -819,6 +819,124 @@ dp_pdev_get_undecoded_capture_stats(struct dp_mon_pdev *mon_pdev, } #endif +static const char * +dp_preamble_type_str[] = { + "preamble OFDMA ", + "preamble CCK ", + "preamble HT ", + "preamble VHT ", + "preamble HE ", + "preamble EHT ", + "preamble NO SUPPORT", +}; + +static const char * +dp_reception_type_str[] = { + "reception su ", + "reception mu_mimo ", + "reception ofdma ", + "reception ofdma mimo", +}; + +static const char * +dp_mu_dl_ul_str[] = { + "MU DL", + "MU UL", +}; + +static inline void +dp_print_pdev_mpdu_fcs_ok_cnt(struct cdp_pdev_mon_stats *rx_mon_sts, + uint32_t pkt_t, uint32_t rx_t, + uint32_t dl_ul, uint32_t user) +{ + DP_PRINT_STATS("%s, %s, %s, user=%d, mpdu_fcs_ok=%d", + dp_preamble_type_str[pkt_t], + dp_reception_type_str[rx_t], + dp_mu_dl_ul_str[dl_ul], + user, + rx_mon_sts->mpdu_cnt_fcs_ok[pkt_t][rx_t][dl_ul][user]); +} + +static inline void +dp_print_pdev_mpdu_fcs_err_cnt(struct cdp_pdev_mon_stats *rx_mon_sts, + uint32_t pkt_t, uint32_t rx_t, + uint32_t dl_ul, uint32_t user) +{ + DP_PRINT_STATS("%s, %s, %s, user=%d, mpdu_fcs_err=%d", + dp_preamble_type_str[pkt_t], + dp_reception_type_str[rx_t], + dp_mu_dl_ul_str[dl_ul], + user, + rx_mon_sts->mpdu_cnt_fcs_err[pkt_t][rx_t][dl_ul][user]); +} + +static inline void +dp_print_pdev_mpdu_cnt(struct cdp_pdev_mon_stats *rx_mon_sts, + uint32_t pkt_t, uint32_t rx_t, + uint32_t dl_ul, uint32_t user) +{ + if (rx_mon_sts->mpdu_cnt_fcs_ok[pkt_t][rx_t][dl_ul][user]) + dp_print_pdev_mpdu_fcs_ok_cnt(rx_mon_sts, pkt_t, rx_t, + dl_ul, user); + + if (rx_mon_sts->mpdu_cnt_fcs_err[pkt_t][rx_t][dl_ul][user]) + dp_print_pdev_mpdu_fcs_err_cnt(rx_mon_sts, pkt_t, rx_t, + dl_ul, user); +} + +static inline void +dp_print_pdev_mpdu_user(struct cdp_pdev_mon_stats *rx_mon_sts, + uint32_t pkt_t, uint32_t rx_t, + uint32_t dl_ul) +{ + uint32_t user; + + for (user = 0; user < CDP_MU_SNIF_USER_MAX; user++) + dp_print_pdev_mpdu_cnt(rx_mon_sts, pkt_t, rx_t, + dl_ul, user); +} + +static inline void +dp_print_pdev_mpdu_dl_ul(struct cdp_pdev_mon_stats *rx_mon_sts, + uint32_t pkt_t, uint32_t rx_t) +{ + uint32_t dl_ul; + + for (dl_ul = CDP_MU_TYPE_DL; dl_ul < CDP_MU_TYPE_MAX; dl_ul++) + dp_print_pdev_mpdu_user(rx_mon_sts, pkt_t, rx_t, + dl_ul); +} + +static inline void +dp_print_pdev_mpdu_rx_type(struct cdp_pdev_mon_stats *rx_mon_sts, + uint32_t pkt_t) +{ + uint32_t rx_t; + + for (rx_t = CDP_RX_TYPE_SU; rx_t < CDP_RX_TYPE_MAX; rx_t++) + dp_print_pdev_mpdu_dl_ul(rx_mon_sts, pkt_t, rx_t); +} + +static inline void +dp_print_pdev_mpdu_pkt_type(struct cdp_pdev_mon_stats *rx_mon_sts) +{ + uint32_t pkt_t; + + for (pkt_t = CDP_PKT_TYPE_OFDM; pkt_t < CDP_PKT_TYPE_MAX; pkt_t++) + dp_print_pdev_mpdu_rx_type(rx_mon_sts, pkt_t); +} + +static inline void +dp_print_pdev_mpdu_stats(struct dp_pdev *pdev) +{ + struct cdp_pdev_mon_stats *rx_mon_stats; + struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev; + + rx_mon_stats = &mon_pdev->rx_mon_stats; + DP_PRINT_STATS("Monitor MPDU Count"); + dp_print_pdev_mpdu_pkt_type(rx_mon_stats); +} + void dp_print_pdev_rx_mon_stats(struct dp_pdev *pdev) { @@ -842,6 +960,12 @@ dp_print_pdev_rx_mon_stats(struct dp_pdev *pdev) rx_mon_stats->status_ppdu_start_mis); DP_PRINT_STATS("status_ppdu_end_mis_cnt = %d", rx_mon_stats->status_ppdu_end_mis); + + DP_PRINT_STATS("start_user_info_cnt = %d", + rx_mon_stats->start_user_info_cnt); + DP_PRINT_STATS("end_user_stats_cnt = %d", + rx_mon_stats->end_user_stats_cnt); + DP_PRINT_STATS("status_ppdu_done_cnt = %d", rx_mon_stats->status_ppdu_done); DP_PRINT_STATS("dest_ppdu_done_cnt = %d", @@ -907,6 +1031,9 @@ dp_print_pdev_rx_mon_stats(struct dp_pdev *pdev) dp_pdev_get_undecoded_capture_stats(mon_pdev, rx_mon_stats); dp_mon_rx_print_advanced_stats(pdev->soc, pdev); + + dp_print_pdev_mpdu_stats(pdev); + } #ifdef QCA_SUPPORT_BPR diff --git a/hal/wifi3.0/be/hal_be_api_mon.h b/hal/wifi3.0/be/hal_be_api_mon.h index 7281774eff..7559bed715 100644 --- a/hal/wifi3.0/be/hal_be_api_mon.h +++ b/hal/wifi3.0/be/hal_be_api_mon.h @@ -1682,18 +1682,31 @@ hal_rx_parse_receive_user_info(struct hal_soc *hal_soc, uint8_t *tlv, ppdu_info->rx_status.reception_type = HAL_RX_TYPE_SU; break; case HAL_RECEPTION_TYPE_DL_MU_MIMO: + ppdu_info->rx_status.mu_dl_ul = HAL_RX_TYPE_DL; + ppdu_info->rx_status.reception_type = HAL_RX_TYPE_MU_MIMO; + break; case HAL_RECEPTION_TYPE_UL_MU_MIMO: + ppdu_info->rx_status.mu_dl_ul = HAL_RX_TYPE_UL; ppdu_info->rx_status.reception_type = HAL_RX_TYPE_MU_MIMO; break; case HAL_RECEPTION_TYPE_DL_MU_OFMA: + ppdu_info->rx_status.mu_dl_ul = HAL_RX_TYPE_DL; + ppdu_info->rx_status.reception_type = HAL_RX_TYPE_MU_OFDMA; + break; case HAL_RECEPTION_TYPE_UL_MU_OFDMA: + ppdu_info->rx_status.mu_dl_ul = HAL_RX_TYPE_UL; ppdu_info->rx_status.reception_type = HAL_RX_TYPE_MU_OFDMA; break; case HAL_RECEPTION_TYPE_DL_MU_OFDMA_MIMO: + ppdu_info->rx_status.mu_dl_ul = HAL_RX_TYPE_DL; + ppdu_info->rx_status.reception_type = HAL_RX_TYPE_MU_OFDMA_MIMO; case HAL_RECEPTION_TYPE_UL_MU_OFDMA_MIMO: + ppdu_info->rx_status.mu_dl_ul = HAL_RX_TYPE_UL; ppdu_info->rx_status.reception_type = HAL_RX_TYPE_MU_OFDMA_MIMO; } + ppdu_info->start_user_info_cnt++; + ppdu_info->rx_status.is_stbc = rx_usr_info->stbc; ppdu_info->rx_status.ldpc = rx_usr_info->ldpc; ppdu_info->rx_status.dcm = rx_usr_info->sta_dcm; @@ -2067,6 +2080,9 @@ hal_rx_status_get_tlv_info_generic_be(void *rx_tlv_hdr, void *ppduinfo, ppdu_info->rx_status.preamble_type = HAL_RX_GET_64(rx_tlv, RX_PPDU_END_USER_STATS, HT_CONTROL_FIELD_PKT_TYPE); + + ppdu_info->end_user_stats_cnt++; + switch (ppdu_info->rx_status.preamble_type) { case HAL_RX_PKT_TYPE_11N: ppdu_info->rx_status.ht_flags = 1; diff --git a/hal/wifi3.0/hal_api_mon.h b/hal/wifi3.0/hal_api_mon.h index 200a1e69fb..ff63f47a39 100644 --- a/hal/wifi3.0/hal_api_mon.h +++ b/hal/wifi3.0/hal_api_mon.h @@ -603,6 +603,11 @@ enum { HAL_RX_TYPE_MU_OFDMA_MIMO, }; +enum { + HAL_RX_TYPE_DL, + HAL_RX_TYPE_UL, +}; + /* * enum * @HAL_RECEPTION_TYPE_SU: Basic SU reception @@ -1294,6 +1299,10 @@ struct hal_rx_ppdu_info { uint8_t rx_hdr_rcvd[HAL_MAX_UL_MU_USERS]; /* Per user BAR and NDPA bit flag */ struct hal_rx_user_ctrl_frm_info ctrl_frm_info[HAL_MAX_UL_MU_USERS]; + /* PPDU end user stats count */ + uint8_t end_user_stats_cnt; + /* PPDU start user info count */ + uint8_t start_user_info_cnt; }; static inline uint32_t diff --git a/qdf/inc/qdf_nbuf.h b/qdf/inc/qdf_nbuf.h index 8916f8d4e9..225960813e 100644 --- a/qdf/inc/qdf_nbuf.h +++ b/qdf/inc/qdf_nbuf.h @@ -291,6 +291,7 @@ typedef __qdf_nbuf_queue_t qdf_nbuf_queue_t; * @reception_type: PPDU reception type * @ltf_size: ltf size * @tx_status: packet tx status + * @mu_dl_ul: MU down or up link, 0 downlink, 1 uplink * @rx_antenna: rx antenna * @vht_flag_values6: VHT flag value6 * @he_mu_other_flags: HE MU other flag @@ -407,7 +408,8 @@ struct mon_rx_status { add_rtap_ext2 : 1, reception_type : 4, ltf_size : 2, - tx_status : 4; + tx_status : 4, + mu_dl_ul : 1; uint32_t rx_antenna : 24; uint16_t vht_flag_values6; uint16_t he_mu_other_flags;