diff --git a/dp/wifi3.0/dp_rx_mon_status.c b/dp/wifi3.0/dp_rx_mon_status.c index b201c52a14..9d1859615e 100644 --- a/dp/wifi3.0/dp_rx_mon_status.c +++ b/dp/wifi3.0/dp_rx_mon_status.c @@ -686,6 +686,99 @@ dp_rx_process_peer_based_pktlog(struct dp_soc *soc, } } +#if defined(HTT_UL_OFDMA_USER_INFO_V0_W0_VALID_M) +static inline void +dp_rx_ul_ofdma_ru_size_to_width( + uint32_t ru_size, + uint32_t *ru_width) +{ + uint32_t width; + + width = 0; + switch (ru_size) { + case HTT_UL_OFDMA_V0_RU_SIZE_RU_26: + width = 1; + break; + case HTT_UL_OFDMA_V0_RU_SIZE_RU_52: + width = 2; + break; + case HTT_UL_OFDMA_V0_RU_SIZE_RU_106: + width = 4; + break; + case HTT_UL_OFDMA_V0_RU_SIZE_RU_242: + width = 9; + break; + case HTT_UL_OFDMA_V0_RU_SIZE_RU_484: + width = 18; + break; + case HTT_UL_OFDMA_V0_RU_SIZE_RU_996: + width = 37; + break; + case HTT_UL_OFDMA_V0_RU_SIZE_RU_996x2: + width = 74; + break; + default: + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, + "RU size to width convert err"); + break; + } + *ru_width = width; +} + +static inline void +dp_rx_mon_handle_ofdma_info(struct hal_rx_ppdu_info *ppdu_info) +{ + struct mon_rx_user_status *mon_rx_user_status; + uint32_t num_users; + uint32_t i; + uint32_t ul_ofdma_user_v0_word0; + uint32_t ul_ofdma_user_v0_word1; + uint32_t ru_width; + + if (ppdu_info->rx_status.reception_type != HAL_RX_TYPE_MU_OFDMA) + return; + + num_users = ppdu_info->com_info.num_users; + if (num_users > HAL_MAX_UL_MU_USERS) + num_users = HAL_MAX_UL_MU_USERS; + for (i = 0; i < num_users; i++) { + mon_rx_user_status = &ppdu_info->rx_user_status[i]; + ul_ofdma_user_v0_word0 = + mon_rx_user_status->ul_ofdma_user_v0_word0; + ul_ofdma_user_v0_word1 = + mon_rx_user_status->ul_ofdma_user_v0_word1; + + if (HTT_UL_OFDMA_USER_INFO_V0_W0_VALID_GET( + ul_ofdma_user_v0_word0) && + !HTT_UL_OFDMA_USER_INFO_V0_W0_VER_GET( + ul_ofdma_user_v0_word0)) { + mon_rx_user_status->mcs = + HTT_UL_OFDMA_USER_INFO_V0_W1_MCS_GET( + ul_ofdma_user_v0_word1); + mon_rx_user_status->nss = + HTT_UL_OFDMA_USER_INFO_V0_W1_NSS_GET( + ul_ofdma_user_v0_word1); + + mon_rx_user_status->ofdma_info_valid = 1; + mon_rx_user_status->dl_ofdma_ru_start_index = + HTT_UL_OFDMA_USER_INFO_V0_W1_RU_START_GET( + ul_ofdma_user_v0_word1); + + dp_rx_ul_ofdma_ru_size_to_width( + HTT_UL_OFDMA_USER_INFO_V0_W1_RU_SIZE_GET( + ul_ofdma_user_v0_word1), + &ru_width); + mon_rx_user_status->dl_ofdma_ru_width = ru_width; + } + } +} +#else +static inline void +dp_rx_mon_handle_ofdma_info(struct hal_rx_ppdu_info *ppdu_info) +{ +} +#endif + /** * dp_rx_mon_status_process_tlv() - Process status TLV in status * buffer on Rx status Queue posted by status SRNG processing. @@ -796,6 +889,7 @@ dp_rx_mon_status_process_tlv(struct dp_soc *soc, uint32_t mac_id, dp_rx_mon_deliver_non_std(soc, mac_id); } else if (tlv_status == HAL_TLV_STATUS_PPDU_DONE) { rx_mon_stats->status_ppdu_done++; + dp_rx_mon_handle_ofdma_info(ppdu_info); if (pdev->enhanced_stats_en || pdev->mcopy_mode || pdev->neighbour_peers_added) dp_rx_handle_ppdu_stats(soc, pdev, ppdu_info); diff --git a/hal/wifi3.0/hal_api_mon.h b/hal/wifi3.0/hal_api_mon.h index 2cb8a4c11b..79506305af 100644 --- a/hal/wifi3.0/hal_api_mon.h +++ b/hal/wifi3.0/hal_api_mon.h @@ -424,6 +424,7 @@ struct hal_rx_ppdu_common_info { uint64_t mpdu_fcs_ok_bitmap; uint32_t last_ppdu_id; uint32_t mpdu_cnt; + uint8_t num_users; }; /** diff --git a/hal/wifi3.0/hal_generic_api.h b/hal/wifi3.0/hal_generic_api.h index b522c3eca7..a2317151b1 100644 --- a/hal/wifi3.0/hal_generic_api.h +++ b/hal/wifi3.0/hal_generic_api.h @@ -245,22 +245,23 @@ hal_rx_handle_other_tlvs(uint32_t tlv_tag, void *rx_tlv, } #endif /* QCA_WIFI_QCA6290_11AX_MU_UL && QCA_WIFI_QCA6290_11AX */ -#if defined(RX_PPDU_END_USER_STATS_1_OFDMA_INFO_VALID_OFFSET) +#if defined(RX_PPDU_END_USER_STATS_1_OFDMA_INFO_VALID_OFFSET) && \ +defined(RX_PPDU_END_USER_STATS_22_SW_RESPONSE_REFERENCE_PTR_EXT_OFFSET) + static inline void hal_rx_handle_ofdma_info( void *rx_tlv, struct mon_rx_user_status *mon_rx_user_status) { - mon_rx_user_status->ofdma_info_valid = - HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_1, - OFDMA_INFO_VALID); - mon_rx_user_status->dl_ofdma_ru_start_index = - HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_1, - DL_OFDMA_RU_START_INDEX); - mon_rx_user_status->dl_ofdma_ru_width = - HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_2, - DL_OFDMA_RU_WIDTH); + mon_rx_user_status->ul_ofdma_user_v0_word0 = + HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_11, + SW_RESPONSE_REFERENCE_PTR); + + mon_rx_user_status->ul_ofdma_user_v0_word1 = + HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_22, + SW_RESPONSE_REFERENCE_PTR_EXT); } + #else static inline void hal_rx_handle_ofdma_info(void *rx_tlv, @@ -474,14 +475,9 @@ hal_rx_status_get_tlv_info_generic(void *rx_tlv_hdr, void *ppduinfo, mon_rx_user_status = &ppdu_info->rx_user_status[user_id]; - mon_rx_user_status->mcs = - HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_1, - MCS); - mon_rx_user_status->nss = - HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_1, - NSS); - hal_rx_handle_ofdma_info(rx_tlv, mon_rx_user_status); + + ppdu_info->com_info.num_users++; } ppdu_info->com_info.mpdu_cnt_fcs_ok = @@ -1176,11 +1172,15 @@ hal_rx_status_get_tlv_info_generic(void *rx_tlv_hdr, void *ppduinfo, RECEPTION_TYPE); switch (reception_type) { case QDF_RECEPTION_TYPE_ULOFMDA: + ppdu_info->rx_status.reception_type = + HAL_RX_TYPE_MU_OFDMA; ppdu_info->rx_status.ulofdma_flag = 1; ppdu_info->rx_status.he_data1 = QDF_MON_STATUS_HE_TRIG_FORMAT_TYPE; break; case QDF_RECEPTION_TYPE_ULMIMO: + ppdu_info->rx_status.reception_type = + HAL_RX_TYPE_MU_MIMO; ppdu_info->rx_status.he_data1 = QDF_MON_STATUS_HE_MU_FORMAT_TYPE; break; diff --git a/qdf/inc/qdf_nbuf.h b/qdf/inc/qdf_nbuf.h index 44fd7a268d..c10e7d0d1a 100644 --- a/qdf/inc/qdf_nbuf.h +++ b/qdf/inc/qdf_nbuf.h @@ -335,6 +335,8 @@ struct mon_rx_user_status { ofdma_info_valid:1, dl_ofdma_ru_start_index:7, dl_ofdma_ru_width:7; + uint32_t ul_ofdma_user_v0_word0; + uint32_t ul_ofdma_user_v0_word1; }; /**