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
|
#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;
|
||||||
}
|
}
|
||||||
|
@@ -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
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -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 */
|
||||||
|
@@ -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;
|
||||||
|
@@ -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 */
|
||||||
|
Reference in New Issue
Block a user