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 f0711f9386..deeb497a85 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 @@ -1072,32 +1072,37 @@ static void dp_mon_register_intr_ops_2_0(struct dp_soc *soc) } #ifdef MONITOR_TLV_RECORDING_ENABLE -/* - * dp_mon_pdev_tlv_logger_init() - initializes struct dp_mon_tlv_logger - * - * @pdev: pointer to dp_pdev +/** + * dp_mon_pdev_initialize_tlv_logger() - initialize dp_mon_tlv_logger for + * Rx and Tx * + * @tlv_logger : double pointer to dp_mon_tlv_logger + * @direction: Rx/Tx * Return: QDF_STATUS */ -static -QDF_STATUS dp_mon_pdev_tlv_logger_init(struct dp_pdev *pdev) +static QDF_STATUS +dp_mon_pdev_initialize_tlv_logger(struct dp_mon_tlv_logger **tlv_logger, + uint8_t direction) { - struct dp_mon_pdev *mon_pdev = NULL; - struct dp_mon_pdev_be *mon_pdev_be = NULL; struct dp_mon_tlv_logger *tlv_log = NULL; - if (!pdev) - return QDF_STATUS_E_INVAL; - - mon_pdev = pdev->monitor_pdev; - if (!mon_pdev) - return QDF_STATUS_E_INVAL; - - mon_pdev_be = dp_get_be_mon_pdev_from_dp_mon_pdev(mon_pdev); - tlv_log = qdf_mem_malloc(sizeof(struct dp_mon_tlv_logger)); if (!tlv_log) { - qdf_err("Memory allocation failed"); + dp_mon_err("Memory allocation failed"); + return QDF_STATUS_E_NOMEM; + } + + if (direction == MONITOR_TLV_RECORDING_RX) + tlv_log->buff = qdf_mem_malloc(MAX_TLV_LOGGING_SIZE * + sizeof(struct dp_mon_tlv_info)); + else if (direction == MONITOR_TLV_RECORDING_TX) + tlv_log->buff = qdf_mem_malloc(MAX_TLV_LOGGING_SIZE * + sizeof(struct dp_tx_mon_tlv_info)); + + if (!tlv_log->buff) { + dp_mon_err("Memory allocation failed"); + qdf_mem_free(tlv_log); + tlv_log = NULL; return QDF_STATUS_E_NOMEM; } @@ -1110,18 +1115,71 @@ QDF_STATUS dp_mon_pdev_tlv_logger_init(struct dp_pdev *pdev) tlv_log->max_mpdu_idx = MAX_PPDU_START_TLV_NUM + MAX_MPDU_TLV_NUM - 1; tlv_log->max_ppdu_end_idx = MAX_TLVS_PER_PPDU - 1; - tlv_log->buff = qdf_mem_malloc(MAX_TLV_LOGGING_SIZE * - sizeof(struct dp_mon_tlv_info)); - if (!tlv_log->buff) { - qdf_err("Memory allocation failed"); - qdf_mem_free(tlv_log); - tlv_log = NULL; - return QDF_STATUS_E_NOMEM; - } - tlv_log->tlv_logging_enable = 1; + *tlv_logger = tlv_log; - mon_pdev_be->rx_tlv_log = tlv_log; + return QDF_STATUS_SUCCESS; +} + +/* + * dp_mon_pdev_tlv_logger_init() - initializes struct dp_mon_tlv_logger + * + * @pdev: pointer to dp_pdev + * + * Return: QDF_STATUS + */ +static +QDF_STATUS dp_mon_pdev_tlv_logger_init(struct dp_pdev *pdev) +{ + struct dp_mon_pdev *mon_pdev = NULL; + struct dp_mon_pdev_be *mon_pdev_be = NULL; + struct dp_soc *soc = NULL; + + if (!pdev) + return QDF_STATUS_E_INVAL; + + soc = pdev->soc; + mon_pdev = pdev->monitor_pdev; + if (!mon_pdev) + return QDF_STATUS_E_INVAL; + + mon_pdev_be = dp_get_be_mon_pdev_from_dp_mon_pdev(mon_pdev); + + if (dp_mon_pdev_initialize_tlv_logger(&mon_pdev_be->rx_tlv_log, + MONITOR_TLV_RECORDING_RX)) + return QDF_STATUS_E_FAILURE; + + if (dp_mon_pdev_initialize_tlv_logger(&mon_pdev_be->tx_tlv_log, + MONITOR_TLV_RECORDING_TX)) + return QDF_STATUS_E_FAILURE; + + return QDF_STATUS_SUCCESS; +} + +/** + * dp_mon_pdev_deinitialize_tlv_logger() - deinitialize dp_mon_tlv_logger for + * Rx and Tx + * + * @tlv_logger : double pointer to dp_mon_tlv_logger + * + * Return: QDF_STATUS + */ +static QDF_STATUS +dp_mon_pdev_deinitialize_tlv_logger(struct dp_mon_tlv_logger **tlv_logger) +{ + struct dp_mon_tlv_logger *tlv_log = *tlv_logger; + + if (!tlv_log) + return QDF_STATUS_SUCCESS; + if (!(tlv_log->buff)) + return QDF_STATUS_E_INVAL; + + tlv_log->tlv_logging_enable = 0; + qdf_mem_free(tlv_log->buff); + tlv_log->buff = NULL; + qdf_mem_free(tlv_log); + tlv_log = NULL; + *tlv_logger = NULL; return QDF_STATUS_SUCCESS; } @@ -1138,7 +1196,6 @@ QDF_STATUS dp_mon_pdev_tlv_logger_deinit(struct dp_pdev *pdev) { struct dp_mon_pdev *mon_pdev = NULL; struct dp_mon_pdev_be *mon_pdev_be = NULL; - struct dp_mon_tlv_logger *tlv_log = NULL; if (!pdev) return QDF_STATUS_E_INVAL; @@ -1149,15 +1206,10 @@ QDF_STATUS dp_mon_pdev_tlv_logger_deinit(struct dp_pdev *pdev) mon_pdev_be = dp_get_be_mon_pdev_from_dp_mon_pdev(mon_pdev); - tlv_log = mon_pdev_be->rx_tlv_log; - if (!tlv_log || !(tlv_log->buff)) - return QDF_STATUS_E_INVAL; - - tlv_log->tlv_logging_enable = 0; - qdf_mem_free(tlv_log->buff); - tlv_log->buff = NULL; - qdf_mem_free(tlv_log); - tlv_log = NULL; + if (dp_mon_pdev_deinitialize_tlv_logger(&mon_pdev_be->rx_tlv_log)) + return QDF_STATUS_E_FAILURE; + if (dp_mon_pdev_deinitialize_tlv_logger(&mon_pdev_be->tx_tlv_log)) + return QDF_STATUS_E_FAILURE; return QDF_STATUS_SUCCESS; } diff --git a/dp/wifi3.0/monitor/2.0/dp_mon_2.0.h b/dp/wifi3.0/monitor/2.0/dp_mon_2.0.h index 9d7cb5f46d..2fbc4de473 100644 --- a/dp/wifi3.0/monitor/2.0/dp_mon_2.0.h +++ b/dp/wifi3.0/monitor/2.0/dp_mon_2.0.h @@ -39,6 +39,10 @@ #define DP_MON_MIN_FRAGS_FOR_RESTITCH 2 #ifdef MONITOR_TLV_RECORDING_ENABLE +#define MONITOR_TLV_RECORDING_RX 1 +#define MONITOR_TLV_RECORDING_TX 2 +#define MONITOR_TLV_RECORDING_RXTX 3 + #define MAX_TLV_LOGGING_SIZE 1024 #define MAX_PPDU_START_TLV_NUM 38 @@ -73,6 +77,22 @@ struct dp_mon_tlv_info { } data; }; +/* + * struct dp_tx_mon_tlv_info - recorded information of each Tx TLV + * @tlv_tag: tlv tag + * @data: union of struct of fields to be recorded for each TLV + * + * Tag and its corresponding important fields are stored in this struct + */ + +struct dp_tx_mon_tlv_info { + uint32_t tlv_tag:10; + union { + /*struct of Tx TLVs to be added here*/ + uint32_t data:22; + } data; +}; + /** * struct dp_mon_tlv_logger - contains indexes and other data of the buffer * @buff: buffer in which TLVs are stored @@ -247,6 +267,7 @@ struct dp_mon_pdev_be { uint32_t total_free_elem; #ifdef MONITOR_TLV_RECORDING_ENABLE struct dp_mon_tlv_logger *rx_tlv_log; + struct dp_mon_tlv_logger *tx_tlv_log; #endif }; diff --git a/dp/wifi3.0/monitor/2.0/dp_tx_mon_status_2.0.c b/dp/wifi3.0/monitor/2.0/dp_tx_mon_status_2.0.c index 24ccf0569e..83f6827672 100644 --- a/dp/wifi3.0/monitor/2.0/dp_tx_mon_status_2.0.c +++ b/dp/wifi3.0/monitor/2.0/dp_tx_mon_status_2.0.c @@ -1407,6 +1407,179 @@ dp_tx_mon_update_ppdu_info_status(struct dp_pdev *pdev, return status; } +#ifdef MONITOR_TLV_RECORDING_ENABLE +/** + * dp_tx_mon_record_index_update() - update the indexes of dp_mon_tlv_logger + * to store next Tx TLV + * + * @mon_pdev_be: pointer to dp_mon_pdev_be + * + * Return: void + */ +void dp_tx_mon_record_index_update(struct dp_mon_pdev_be *mon_pdev_be) +{ + struct dp_mon_tlv_logger *tlv_log = NULL; + struct dp_tx_mon_tlv_info *tlv_info = NULL; + + tlv_log = mon_pdev_be->tx_tlv_log; + tlv_info = (struct dp_tx_mon_tlv_info *)tlv_log->buff; + + (tlv_log->curr_ppdu_pos + 1 == MAX_NUM_PPDU_RECORD) ? + tlv_log->curr_ppdu_pos = 0 : + tlv_log->curr_ppdu_pos++; + + tlv_log->wrap_flag = 0; + tlv_log->ppdu_start_idx = tlv_log->curr_ppdu_pos * + MAX_TLVS_PER_PPDU; + tlv_log->mpdu_idx = tlv_log->ppdu_start_idx + + MAX_PPDU_START_TLV_NUM; + tlv_log->ppdu_end_idx = tlv_log->mpdu_idx + MAX_MPDU_TLV_NUM; + tlv_log->max_ppdu_start_idx = tlv_log->ppdu_start_idx + + MAX_PPDU_START_TLV_NUM - 1; + tlv_log->max_mpdu_idx = tlv_log->mpdu_idx + + MAX_MPDU_TLV_NUM - 1; + tlv_log->max_ppdu_end_idx = tlv_log->ppdu_end_idx + + MAX_PPDU_END_TLV_NUM - 1; +} + +/** + * dp_tx_mon_record_tlv() - Store the contents of the tlv in buffer + * + * @mon_pdev_be: pointer to dp_mon_pdev_be + * @data_ppdu_info: pointer to HAL Tx data ppdu info + * @proto_ppdu_info: pointer to HAL Tx proto ppdu info + * + * Return: void + */ +void dp_tx_mon_record_tlv(struct dp_mon_pdev_be *mon_pdev_be, + struct hal_tx_ppdu_info *data_ppdu_info, + struct hal_tx_ppdu_info *proto_ppdu_info) +{ + struct hal_tx_ppdu_info *ppdu_info = NULL; + struct dp_tx_mon_tlv_info *tlv_info = NULL; + struct dp_mon_tlv_logger *tlv_log = NULL; + uint16_t *ppdu_start_idx = NULL; + uint16_t *mpdu_idx = NULL; + uint16_t *ppdu_end_idx = NULL; + uint32_t tlv_tag; + + if (!mon_pdev_be || !(mon_pdev_be->tx_tlv_log)) + return; + + tlv_log = mon_pdev_be->tx_tlv_log; + if (!tlv_log->tlv_logging_enable || !(tlv_log->buff)) + return; + + tlv_info = (struct dp_tx_mon_tlv_info *)tlv_log->buff; + ppdu_start_idx = &tlv_log->ppdu_start_idx; + mpdu_idx = &tlv_log->mpdu_idx; + ppdu_end_idx = &tlv_log->ppdu_end_idx; + + ppdu_info = (data_ppdu_info->tx_tlv_info.is_data_ppdu_info) ? + data_ppdu_info : proto_ppdu_info; + tlv_tag = ppdu_info->tx_tlv_info.tlv_tag; + + if (ppdu_info->tx_tlv_info.tlv_category == CATEGORY_PPDU_START) { + tlv_info[*ppdu_start_idx].tlv_tag = tlv_tag; + switch (tlv_tag) { + case WIFITX_FES_SETUP_E: + case WIFITXPCU_BUFFER_STATUS_E: + case WIFIPCU_PPDU_SETUP_INIT_E: + case WIFISCH_CRITICAL_TLV_REFERENCE_E: + case WIFITX_PEER_ENTRY_E: + case WIFITX_RAW_OR_NATIVE_FRAME_SETUP_E: + case WIFITX_QUEUE_EXTENSION_E: + case WIFITX_FES_SETUP_COMPLETE_E: + case WIFIFW2SW_MON_E: + case WIFISCHEDULER_END_E: + case WIFITQM_MPDU_GLOBAL_START_E: + ; + } + if (*ppdu_start_idx < tlv_log->max_ppdu_start_idx) + (*ppdu_start_idx)++; + } else if (ppdu_info->tx_tlv_info.tlv_category == CATEGORY_MPDU) { + tlv_info[*mpdu_idx].tlv_tag = tlv_tag; + switch (tlv_tag) { + case WIFITX_MPDU_START_E: + case WIFITX_MSDU_START_E: + case WIFITX_DATA_E: + case WIFITX_MSDU_END_E: + case WIFITX_MPDU_END_E: + ; + } + if (*mpdu_idx < tlv_log->max_mpdu_idx) { + (*mpdu_idx)++; + } else { + *mpdu_idx = *mpdu_idx - MAX_MPDU_TLV_NUM + 1; + tlv_log->wrap_flag ^= 1; + } + } else if (ppdu_info->tx_tlv_info.tlv_category == CATEGORY_PPDU_END) { + tlv_info[*ppdu_end_idx].tlv_tag = tlv_tag; + switch (tlv_tag) { + case WIFITX_LAST_MPDU_FETCHED_E: + case WIFITX_LAST_MPDU_END_E: + case WIFIPDG_TX_REQ_E: + case WIFITX_FES_STATUS_START_PPDU_E: + case WIFIPHYTX_PPDU_HEADER_INFO_REQUEST_E: + case WIFIMACTX_L_SIG_A_E: + case WIFITXPCU_PREAMBLE_DONE_E: + case WIFIMACTX_USER_DESC_COMMON_E: + case WIFIMACTX_SERVICE_E: + case WIFITXDMA_STOP_REQUEST_E: + case WIFITXPCU_USER_BUFFER_STATUS_E: + case WIFITX_FES_STATUS_USER_PPDU_E: + case WIFITX_MPDU_COUNT_TRANSFER_END_E: + case WIFIRX_START_PARAM_E: + case WIFITX_FES_STATUS_ACK_OR_BA_E: + case WIFITX_FES_STATUS_USER_RESPONSE_E: + case WIFITX_FES_STATUS_END_E: + case WIFITX_FES_STATUS_PROT_E: + case WIFIMACTX_PHY_DESC_E: + case WIFIMACTX_HE_SIG_A_SU_E: + ; + } + if (*ppdu_end_idx < tlv_log->max_ppdu_end_idx) + (*ppdu_end_idx)++; + } +} + +/** + * dp_tx_mon_record_clear_buffer() - Clear the buffer to record next PPDU + * + * @mon_pdev_be : pointer to dp_mon_pdev_be + * + * Return + */ +void dp_tx_mon_record_clear_buffer(struct dp_mon_pdev_be *mon_pdev_be) +{ + struct dp_mon_tlv_logger *tlv_log = NULL; + struct dp_tx_mon_tlv_info *tlv_info = NULL; + + tlv_log = mon_pdev_be->tx_tlv_log; + tlv_info = (struct dp_tx_mon_tlv_info *)tlv_log->buff; + qdf_mem_zero(&tlv_info[tlv_log->ppdu_start_idx], + MAX_TLVS_PER_PPDU * + sizeof(struct dp_tx_mon_tlv_info)); +} +#else + +static +void dp_tx_mon_record_index_update(struct dp_mon_pdev_be *mon_pdev_be) +{ +} + +static +void dp_tx_mon_record_tlv(struct dp_mon_pdev_be *mon_pdev_be, + struct hal_tx_ppdu_info *data_ppdu_info, + struct hal_tx_ppdu_info *proto_ppdu_info) +{ +} + +static +void dp_tx_mon_record_clear_buffer(struct dp_mon_pdev_be *mon_pdev_be) +{ +} +#endif /** * dp_tx_mon_process_tlv_2_0() - API to parse PPDU worth information * @pdev: DP_PDEV handle @@ -1501,6 +1674,8 @@ dp_tx_mon_process_tlv_2_0(struct dp_pdev *pdev, tx_tlv = status_frag; tx_tlv_start = tx_tlv; + + dp_tx_mon_record_clear_buffer(mon_pdev_be); /* * parse each status buffer and populate the information to * dp_tx_ppdu_info @@ -1514,6 +1689,10 @@ dp_tx_mon_process_tlv_2_0(struct dp_pdev *pdev, tx_status_prot, tx_tlv, status_frag); + dp_tx_mon_record_tlv(mon_pdev_be, + &tx_data_ppdu_info->hal_txmon, + &tx_prot_ppdu_info->hal_txmon); + status = dp_tx_mon_update_ppdu_info_status( pdev, @@ -1540,6 +1719,8 @@ dp_tx_mon_process_tlv_2_0(struct dp_pdev *pdev, tx_mon_be->frag_q_vec[cur_frag_q_idx].frag_buf = NULL; tx_mon_be->frag_q_vec[cur_frag_q_idx].end_offset = 0; cur_frag_q_idx = ++tx_mon_be->cur_frag_q_idx; + + dp_tx_mon_record_index_update(mon_pdev_be); } /* clear the unreleased frag array */ diff --git a/hal/wifi3.0/be/hal_be_api_mon.h b/hal/wifi3.0/be/hal_be_api_mon.h index 5889c08518..b5975c795c 100644 --- a/hal/wifi3.0/be/hal_be_api_mon.h +++ b/hal/wifi3.0/be/hal_be_api_mon.h @@ -1152,6 +1152,9 @@ struct hal_phy_rx_ht_sig_tlv_record { fes_coding:1, cbw:1; }; + +/* Tx TLVs - structs of Tx TLV with fields to be added here*/ + /* * enum hal_ppdu_tlv_category - Categories of TLV * @PPDU_START: PPDU start level TLV @@ -1246,6 +1249,14 @@ struct hal_txmon_usr_desc_common { #define TXMON_STATUS_INFO(hal_tx_status_info, field) \ hal_tx_status_info->field +#ifdef MONITOR_TLV_RECORDING_ENABLE +struct hal_tx_tlv_info { + uint32_t tlv_tag; + uint8_t tlv_category; + uint8_t is_data_ppdu_info; +}; +#endif + /** * struct hal_tx_status_info - status info that wasn't populated in rx_status * @reception_type: su or uplink mu reception type @@ -1330,6 +1341,7 @@ struct hal_tx_status_info { * @cur_usr_idx: Current user index of the PPDU * @reserved: for future purpose * @prot_tlv_status: protection tlv status + * @tx_tlv_info: store tx tlv info for recording * @packet_info: packet information * @rx_status: monitor mode rx status information * @rx_user_status: monitor mode rx user status information @@ -1344,6 +1356,9 @@ struct hal_tx_ppdu_info { uint32_t prot_tlv_status; +#ifdef MONITOR_TLV_RECORDING_ENABLE + struct hal_tx_tlv_info tx_tlv_info; +#endif /* placeholder to hold packet buffer info */ struct hal_mon_packet_info packet_info; struct mon_rx_status rx_status; diff --git a/hal/wifi3.0/be/hal_be_generic_api.h b/hal/wifi3.0/be/hal_be_generic_api.h index d5e8b4a87c..47fcbaaa57 100644 --- a/hal/wifi3.0/be/hal_be_generic_api.h +++ b/hal/wifi3.0/be/hal_be_generic_api.h @@ -1384,6 +1384,18 @@ hal_txmon_status_get_num_users_generic_be(void *tx_tlv_hdr, uint8_t *num_users) return tlv_status; } +#ifdef MONITOR_TLV_RECORDING_ENABLE +static inline void +hal_tx_tlv_record_set_data_ppdu_info(struct hal_tx_ppdu_info *ppdu_info) +{ + ppdu_info->tx_tlv_info.is_data_ppdu_info = 1; +} +#else +static inline void +hal_tx_tlv_record_set_data_ppdu_info(struct hal_tx_ppdu_info *ppdu_info) +{ +} +#endif /** * hal_txmon_get_word_mask_generic_be() - api to get word mask for tx monitor * @wmask: pointer to hal_txmon_word_mask_config_t @@ -1438,6 +1450,7 @@ hal_tx_get_ppdu_info(void *data_info, void *prot_info, uint32_t tlv_tag) case WIFISCHEDULER_END_E:/* DOWNSTREAM */ case WIFITX_FES_STATUS_START_PPDU_E:/* UPSTREAM */ { + hal_tx_tlv_record_set_data_ppdu_info(data_info); return data_info; } } @@ -1455,9 +1468,71 @@ hal_tx_get_ppdu_info(void *data_info, void *prot_info, uint32_t tlv_tag) return prot_info; } + hal_tx_tlv_record_set_data_ppdu_info(data_info); return data_info; } +#ifdef MONITOR_TLV_RECORDING_ENABLE +static inline void +hal_tx_record_tlv_info(struct hal_tx_ppdu_info *ppdu_info, + uint32_t tlv_tag) +{ + ppdu_info->tx_tlv_info.tlv_tag = tlv_tag; + switch (tlv_tag) { + case WIFITX_FES_SETUP_E: + case WIFITXPCU_BUFFER_STATUS_E: + case WIFIPCU_PPDU_SETUP_INIT_E: + case WIFISCH_CRITICAL_TLV_REFERENCE_E: + case WIFITX_PEER_ENTRY_E: + case WIFITX_RAW_OR_NATIVE_FRAME_SETUP_E: + case WIFITX_QUEUE_EXTENSION_E: + case WIFITX_FES_SETUP_COMPLETE_E: + case WIFIFW2SW_MON_E: + case WIFISCHEDULER_END_E: + case WIFITQM_MPDU_GLOBAL_START_E: + ppdu_info->tx_tlv_info.tlv_category = CATEGORY_PPDU_START; + break; + + case WIFITX_MPDU_START_E: + case WIFITX_MSDU_START_E: + case WIFITX_DATA_E: + case WIFITX_MSDU_END_E: + case WIFITX_MPDU_END_E: + ppdu_info->tx_tlv_info.tlv_category = CATEGORY_MPDU; + break; + + case WIFITX_LAST_MPDU_FETCHED_E: + case WIFITX_LAST_MPDU_END_E: + case WIFIPDG_TX_REQ_E: + case WIFITX_FES_STATUS_START_PPDU_E: + case WIFIPHYTX_PPDU_HEADER_INFO_REQUEST_E: + case WIFIMACTX_L_SIG_A_E: + case WIFITXPCU_PREAMBLE_DONE_E: + case WIFIMACTX_USER_DESC_COMMON_E: + case WIFIMACTX_SERVICE_E: + case WIFITXDMA_STOP_REQUEST_E: + case WIFITXPCU_USER_BUFFER_STATUS_E: + case WIFITX_FES_STATUS_USER_PPDU_E: + case WIFITX_MPDU_COUNT_TRANSFER_END_E: + case WIFIRX_START_PARAM_E: + case WIFITX_FES_STATUS_ACK_OR_BA_E: + case WIFITX_FES_STATUS_USER_RESPONSE_E: + case WIFITX_FES_STATUS_END_E: + case WIFITX_FES_STATUS_PROT_E: + case WIFIMACTX_PHY_DESC_E: + case WIFIMACTX_HE_SIG_A_SU_E: + ppdu_info->tx_tlv_info.tlv_category = CATEGORY_PPDU_END; + break; + } +} +#else +static inline void +hal_tx_record_tlv_info(struct hal_tx_ppdu_info *ppdu_info, + uint32_t tlv_tag) +{ +} +#endif + /** * hal_txmon_status_parse_tlv_generic_be() - api to parse status tlv. * @data_ppdu_info: hal_txmon data ppdu info @@ -1497,6 +1572,7 @@ hal_txmon_status_parse_tlv_generic_be(void *data_ppdu_info, prot_status_info); user_id = (tlv_user_id > ppdu_info->num_users ? 0 : tlv_user_id); + hal_tx_record_tlv_info(ppdu_info, tlv_tag); switch (tlv_tag) { /* start of initiator FES window */