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:

committed by
Madan Koyyalamudi

parent
2c6112bf44
commit
ba55e0f2a8
@@ -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");
|
||||
tlv_log->tlv_logging_enable = 1;
|
||||
*tlv_logger = 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;
|
||||
return QDF_STATUS_E_NOMEM;
|
||||
}
|
||||
|
||||
tlv_log->tlv_logging_enable = 1;
|
||||
|
||||
mon_pdev_be->rx_tlv_log = tlv_log;
|
||||
*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;
|
||||
}
|
||||
|
@@ -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
|
||||
};
|
||||
|
||||
|
@@ -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 */
|
||||
|
@@ -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;
|
||||
|
@@ -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 */
|
||||
|
Reference in New Issue
Block a user