qcacmn: Add Tx TLV Recording support

Add Tx TLV recording support for monitor 2.0
Also add support to control Rx and Tx TLV
recording

Change-Id: I27a0d2c9ea8bdfacd46e6b7188b45b08ed47bbcd
CRs-Fixed: 3422787
This commit is contained in:
Aniruddha Mishra
2023-02-22 19:39:15 +05:30
committed by Madan Koyyalamudi
parent 2c6112bf44
commit ba55e0f2a8
5 changed files with 383 additions and 38 deletions

View File

@@ -1072,32 +1072,37 @@ static void dp_mon_register_intr_ops_2_0(struct dp_soc *soc)
} }
#ifdef MONITOR_TLV_RECORDING_ENABLE #ifdef MONITOR_TLV_RECORDING_ENABLE
/* /**
* dp_mon_pdev_tlv_logger_init() - initializes struct dp_mon_tlv_logger * dp_mon_pdev_initialize_tlv_logger() - initialize dp_mon_tlv_logger for
* * Rx and Tx
* @pdev: pointer to dp_pdev
* *
* @tlv_logger : double pointer to dp_mon_tlv_logger
* @direction: Rx/Tx
* Return: QDF_STATUS * Return: QDF_STATUS
*/ */
static static QDF_STATUS
QDF_STATUS dp_mon_pdev_tlv_logger_init(struct dp_pdev *pdev) 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; 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)); tlv_log = qdf_mem_malloc(sizeof(struct dp_mon_tlv_logger));
if (!tlv_log) { 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; 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_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->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_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; 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 *mon_pdev = NULL;
struct dp_mon_pdev_be *mon_pdev_be = NULL; struct dp_mon_pdev_be *mon_pdev_be = NULL;
struct dp_mon_tlv_logger *tlv_log = NULL;
if (!pdev) if (!pdev)
return QDF_STATUS_E_INVAL; 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); mon_pdev_be = dp_get_be_mon_pdev_from_dp_mon_pdev(mon_pdev);
tlv_log = mon_pdev_be->rx_tlv_log; if (dp_mon_pdev_deinitialize_tlv_logger(&mon_pdev_be->rx_tlv_log))
if (!tlv_log || !(tlv_log->buff)) return QDF_STATUS_E_FAILURE;
return QDF_STATUS_E_INVAL; if (dp_mon_pdev_deinitialize_tlv_logger(&mon_pdev_be->tx_tlv_log))
return QDF_STATUS_E_FAILURE;
tlv_log->tlv_logging_enable = 0;
qdf_mem_free(tlv_log->buff);
tlv_log->buff = NULL;
qdf_mem_free(tlv_log);
tlv_log = NULL;
return QDF_STATUS_SUCCESS; return QDF_STATUS_SUCCESS;
} }

View File

@@ -39,6 +39,10 @@
#define DP_MON_MIN_FRAGS_FOR_RESTITCH 2 #define DP_MON_MIN_FRAGS_FOR_RESTITCH 2
#ifdef MONITOR_TLV_RECORDING_ENABLE #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_TLV_LOGGING_SIZE 1024
#define MAX_PPDU_START_TLV_NUM 38 #define MAX_PPDU_START_TLV_NUM 38
@@ -73,6 +77,22 @@ struct dp_mon_tlv_info {
} data; } 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 * struct dp_mon_tlv_logger - contains indexes and other data of the buffer
* @buff: buffer in which TLVs are stored * @buff: buffer in which TLVs are stored
@@ -247,6 +267,7 @@ struct dp_mon_pdev_be {
uint32_t total_free_elem; uint32_t total_free_elem;
#ifdef MONITOR_TLV_RECORDING_ENABLE #ifdef MONITOR_TLV_RECORDING_ENABLE
struct dp_mon_tlv_logger *rx_tlv_log; struct dp_mon_tlv_logger *rx_tlv_log;
struct dp_mon_tlv_logger *tx_tlv_log;
#endif #endif
}; };

View File

@@ -1407,6 +1407,179 @@ dp_tx_mon_update_ppdu_info_status(struct dp_pdev *pdev,
return status; 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 * dp_tx_mon_process_tlv_2_0() - API to parse PPDU worth information
* @pdev: DP_PDEV handle * @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 = status_frag;
tx_tlv_start = tx_tlv; tx_tlv_start = tx_tlv;
dp_tx_mon_record_clear_buffer(mon_pdev_be);
/* /*
* parse each status buffer and populate the information to * parse each status buffer and populate the information to
* dp_tx_ppdu_info * dp_tx_ppdu_info
@@ -1514,6 +1689,10 @@ dp_tx_mon_process_tlv_2_0(struct dp_pdev *pdev,
tx_status_prot, tx_status_prot,
tx_tlv, status_frag); 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 = status =
dp_tx_mon_update_ppdu_info_status( dp_tx_mon_update_ppdu_info_status(
pdev, 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].frag_buf = NULL;
tx_mon_be->frag_q_vec[cur_frag_q_idx].end_offset = 0; tx_mon_be->frag_q_vec[cur_frag_q_idx].end_offset = 0;
cur_frag_q_idx = ++tx_mon_be->cur_frag_q_idx; 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 */ /* clear the unreleased frag array */

View File

@@ -1152,6 +1152,9 @@ struct hal_phy_rx_ht_sig_tlv_record {
fes_coding:1, fes_coding:1,
cbw:1; cbw:1;
}; };
/* Tx TLVs - structs of Tx TLV with fields to be added here*/
/* /*
* enum hal_ppdu_tlv_category - Categories of TLV * enum hal_ppdu_tlv_category - Categories of TLV
* @PPDU_START: PPDU start level 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) \ #define TXMON_STATUS_INFO(hal_tx_status_info, field) \
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 * struct hal_tx_status_info - status info that wasn't populated in rx_status
* @reception_type: su or uplink mu reception type * @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 * @cur_usr_idx: Current user index of the PPDU
* @reserved: for future purpose * @reserved: for future purpose
* @prot_tlv_status: protection tlv status * @prot_tlv_status: protection tlv status
* @tx_tlv_info: store tx tlv info for recording
* @packet_info: packet information * @packet_info: packet information
* @rx_status: monitor mode rx status information * @rx_status: monitor mode rx status information
* @rx_user_status: monitor mode rx user 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; 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 */ /* placeholder to hold packet buffer info */
struct hal_mon_packet_info packet_info; struct hal_mon_packet_info packet_info;
struct mon_rx_status rx_status; struct mon_rx_status rx_status;

View File

@@ -1384,6 +1384,18 @@ hal_txmon_status_get_num_users_generic_be(void *tx_tlv_hdr, uint8_t *num_users)
return tlv_status; 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 * hal_txmon_get_word_mask_generic_be() - api to get word mask for tx monitor
* @wmask: pointer to hal_txmon_word_mask_config_t * @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 WIFISCHEDULER_END_E:/* DOWNSTREAM */
case WIFITX_FES_STATUS_START_PPDU_E:/* UPSTREAM */ case WIFITX_FES_STATUS_START_PPDU_E:/* UPSTREAM */
{ {
hal_tx_tlv_record_set_data_ppdu_info(data_info);
return 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; return prot_info;
} }
hal_tx_tlv_record_set_data_ppdu_info(data_info);
return 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. * hal_txmon_status_parse_tlv_generic_be() - api to parse status tlv.
* @data_ppdu_info: hal_txmon data ppdu info * @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); prot_status_info);
user_id = (tlv_user_id > ppdu_info->num_users ? 0 : tlv_user_id); 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) { switch (tlv_tag) {
/* start of initiator FES window */ /* start of initiator FES window */