qcacmn: Add support to process Tx completion status from WBM descriptor
Add HAL API to parse Tx completion statistics from WBM descriptor and populate HAL Structure and a DP API to print the statistics per packet CRs-Fixed: 1088985 Change-Id: Ic6e918aabdbd7743d8f640e0451070dc229c6f0d
This commit is contained in:

committed by
qcabuildsw

parent
c6bb1bd75a
commit
5bcfa31ec4
@@ -310,9 +310,9 @@ struct dp_tx_desc_s *dp_tx_prepare_desc_single(struct dp_vdev *vdev,
|
|||||||
tx_desc->vdev = vdev;
|
tx_desc->vdev = vdev;
|
||||||
tx_desc->msdu_ext_desc = NULL;
|
tx_desc->msdu_ext_desc = NULL;
|
||||||
|
|
||||||
if (qdf_nbuf_map_nbytes_single(soc->osdev, nbuf,
|
if (qdf_unlikely(QDF_STATUS_SUCCESS !=
|
||||||
QDF_DMA_TO_DEVICE, qdf_nbuf_len(nbuf)
|
qdf_nbuf_map_nbytes_single(soc->osdev, nbuf,
|
||||||
!= QDF_STATUS_SUCCESS)) {
|
QDF_DMA_TO_DEVICE, qdf_nbuf_len(nbuf)))) {
|
||||||
/* Handle failure */
|
/* Handle failure */
|
||||||
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
|
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
|
||||||
"qdf_nbuf_map_nbytes_single failed\n");
|
"qdf_nbuf_map_nbytes_single failed\n");
|
||||||
@@ -716,7 +716,7 @@ qdf_nbuf_t dp_tx_send_msdu_multiple(struct dp_vdev *vdev, qdf_nbuf_t nbuf,
|
|||||||
msdu_info->u.tso_info.curr_seg =
|
msdu_info->u.tso_info.curr_seg =
|
||||||
msdu_info->u.tso_info.curr_seg->next;
|
msdu_info->u.tso_info.curr_seg->next;
|
||||||
/* Check with MCL if this is needed */
|
/* Check with MCL if this is needed */
|
||||||
/* nbuf = msdu_info->u.tso_info.curr_seg->nbuf; */
|
/* nbuf = msdu_info->u.tso_info.curr_seg->nbuf; */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -829,9 +829,9 @@ qdf_nbuf_t dp_tx_send(void *vap_dev, qdf_nbuf_t nbuf)
|
|||||||
struct dp_vdev *vdev = (struct dp_vdev *) vap_dev;
|
struct dp_vdev *vdev = (struct dp_vdev *) vap_dev;
|
||||||
|
|
||||||
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG,
|
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG,
|
||||||
"Entering %s , skb %0x:%0x:%0x:%0x:%0x:%0x\n",
|
"%s , skb %0x:%0x:%0x:%0x:%0x:%0x\n",
|
||||||
__func__, nbuf->data[0], nbuf->data[1], nbuf->data[2],
|
__func__, nbuf->data[0], nbuf->data[1], nbuf->data[2],
|
||||||
nbuf->data[1], nbuf->data[2], nbuf->data[3]);
|
nbuf->data[3], nbuf->data[4], nbuf->data[5]);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Get HW Queue to use for this frame.
|
* Get HW Queue to use for this frame.
|
||||||
@@ -1049,6 +1049,48 @@ void dp_tx_process_htt_completion(struct dp_tx_desc_s *tx_desc, uint8_t *status)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* dp_tx_comp_process_tx_status() - Parse and Dump Tx completion status info
|
||||||
|
* @tx_desc: software descriptor head pointer
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Return: none
|
||||||
|
*/
|
||||||
|
static inline void dp_tx_comp_process_tx_status(struct dp_tx_desc_s *tx_desc)
|
||||||
|
{
|
||||||
|
struct hal_tx_completion_status ts;
|
||||||
|
qdf_mem_zero(&ts, sizeof(struct hal_tx_completion_status));
|
||||||
|
hal_tx_comp_get_status(&tx_desc->comp, &ts);
|
||||||
|
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG,
|
||||||
|
"--------------------\n"
|
||||||
|
"Tx Completion Stats:\n"
|
||||||
|
"--------------------\n"
|
||||||
|
"ack_frame_rssi = %d\n"
|
||||||
|
"first_msdu = %d\n"
|
||||||
|
"last_msdu = %d\n"
|
||||||
|
"msdu_part_of_amsdu = %d\n"
|
||||||
|
"bw = %d\n"
|
||||||
|
"pkt_type = %d\n"
|
||||||
|
"stbc = %d\n"
|
||||||
|
"ldpc = %d\n"
|
||||||
|
"sgi = %d\n"
|
||||||
|
"mcs = %d\n"
|
||||||
|
"ofdma = %d\n"
|
||||||
|
"tones_in_ru = %d\n"
|
||||||
|
"tsf = %d\n"
|
||||||
|
"ppdu_id = %d\n"
|
||||||
|
"transmit_cnt = %d\n"
|
||||||
|
"tid = %d\n"
|
||||||
|
"peer_id = %d\n",
|
||||||
|
ts.ack_frame_rssi, ts.first_msdu, ts.last_msdu,
|
||||||
|
ts.msdu_part_of_amsdu, ts.bw, ts.pkt_type,
|
||||||
|
ts.stbc, ts.ldpc, ts.sgi,
|
||||||
|
ts.mcs, ts.ofdma, ts.tones_in_ru,
|
||||||
|
ts.tsf, ts.ppdu_id, ts.transmit_cnt, ts.tid,
|
||||||
|
ts.peer_id);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* dp_tx_comp_process_desc() - Tx complete software descriptor handler
|
* dp_tx_comp_process_desc() - Tx complete software descriptor handler
|
||||||
* @soc: core txrx main context
|
* @soc: core txrx main context
|
||||||
@@ -1455,6 +1497,12 @@ QDF_STATUS dp_tx_soc_attach(struct dp_soc *soc)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Keep the processing of completion stats disabled by default.
|
||||||
|
* todo - Add a runtime config option to enable this.
|
||||||
|
*/
|
||||||
|
soc->process_tx_status = 0;
|
||||||
|
|
||||||
/* Initialize Default DSCP-TID mapping table in TCL */
|
/* Initialize Default DSCP-TID mapping table in TCL */
|
||||||
hal_tx_set_dscp_tid_map(soc->hal_soc, default_dscp_tid_map,
|
hal_tx_set_dscp_tid_map(soc->hal_soc, default_dscp_tid_map,
|
||||||
HAL_TX_DSCP_TID_MAP_TABLE_DEFAULT);
|
HAL_TX_DSCP_TID_MAP_TABLE_DEFAULT);
|
||||||
|
@@ -178,10 +178,6 @@ static inline void dp_tx_comp_process_exception(struct dp_tx_desc_s *tx_desc)
|
|||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
static inline void dp_tx_comp_process_tx_status(struct dp_tx_desc_s *tx_desc)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
static inline QDF_STATUS dp_tx_flow_control(struct dp_vdev *vdev)
|
static inline QDF_STATUS dp_tx_flow_control(struct dp_vdev *vdev)
|
||||||
{
|
{
|
||||||
return QDF_STATUS_SUCCESS;
|
return QDF_STATUS_SUCCESS;
|
||||||
|
@@ -23,6 +23,9 @@
|
|||||||
Include files
|
Include files
|
||||||
---------------------------------------------------------------------------*/
|
---------------------------------------------------------------------------*/
|
||||||
#include "hal_api.h"
|
#include "hal_api.h"
|
||||||
|
#ifdef CONFIG_WIN
|
||||||
|
#include "wcss_version.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------
|
/*---------------------------------------------------------------------------
|
||||||
Preprocessor definitions and constants
|
Preprocessor definitions and constants
|
||||||
@@ -48,6 +51,19 @@ do { \
|
|||||||
((value << (block ## _ ## field ## _LSB)) & \
|
((value << (block ## _ ## field ## _LSB)) & \
|
||||||
(block ## _ ## field ## _MASK))
|
(block ## _ ## field ## _MASK))
|
||||||
|
|
||||||
|
#define HAL_TX_MS(block, field, value) \
|
||||||
|
(((value) & (block ## _ ## field ## _MASK)) >> \
|
||||||
|
(block ## _ ## field ## _LSB))
|
||||||
|
|
||||||
|
#define HAL_TX_DESC_GET(desc, block, field) \
|
||||||
|
HAL_TX_MS(block, field, HAL_SET_FLD(desc, block, field))
|
||||||
|
|
||||||
|
#define HAL_TX_DESC_SUBBLOCK_GET(desc, block, sub, field) \
|
||||||
|
HAL_TX_MS(sub, field, HAL_SET_FLD(desc, block, sub))
|
||||||
|
|
||||||
|
#define HAL_TX_BUF_TYPE_BUFFER 0
|
||||||
|
#define HAL_TX_BUF_TYPE_EXT_DESC 1
|
||||||
|
|
||||||
#define HAL_TX_DESC_LEN_DWORDS (NUM_OF_DWORDS_TCL_DATA_CMD)
|
#define HAL_TX_DESC_LEN_DWORDS (NUM_OF_DWORDS_TCL_DATA_CMD)
|
||||||
#define HAL_TX_DESC_LEN_BYTES (NUM_OF_DWORDS_TCL_DATA_CMD * 4)
|
#define HAL_TX_DESC_LEN_BYTES (NUM_OF_DWORDS_TCL_DATA_CMD * 4)
|
||||||
#define HAL_TX_EXTENSION_DESC_LEN_DWORDS (NUM_OF_DWORDS_TX_MSDU_EXTENSION)
|
#define HAL_TX_EXTENSION_DESC_LEN_DWORDS (NUM_OF_DWORDS_TX_MSDU_EXTENSION)
|
||||||
@@ -800,6 +816,79 @@ static inline uint8_t hal_tx_comp_get_release_reason(void *hal_desc)
|
|||||||
WBM_RELEASE_RING_2_TQM_RELEASE_REASON_LSB;
|
WBM_RELEASE_RING_2_TQM_RELEASE_REASON_LSB;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* hal_tx_comp_get_status() - TQM Release reason
|
||||||
|
* @hal_desc: completion ring Tx status
|
||||||
|
*
|
||||||
|
* This function will parse the WBM completion descriptor and populate in
|
||||||
|
* HAL structure
|
||||||
|
*
|
||||||
|
* Return: none
|
||||||
|
*/
|
||||||
|
#if defined(WCSS_VERSION) && (WCSS_VERSION > 81)
|
||||||
|
static inline void hal_tx_comp_get_status(void *desc,
|
||||||
|
struct hal_tx_completion_status *ts)
|
||||||
|
{
|
||||||
|
|
||||||
|
uint8_t rate_stats_valid = 0;
|
||||||
|
uint32_t rate_stats = 0;
|
||||||
|
|
||||||
|
ts->ppdu_id = HAL_TX_DESC_GET(desc, WBM_RELEASE_RING_3,
|
||||||
|
TQM_STATUS_NUMBER);
|
||||||
|
ts->ack_frame_rssi = HAL_TX_DESC_GET(desc, WBM_RELEASE_RING_4,
|
||||||
|
ACK_FRAME_RSSI);
|
||||||
|
ts->first_msdu = HAL_TX_DESC_GET(desc, WBM_RELEASE_RING_4, FIRST_MSDU);
|
||||||
|
ts->last_msdu = HAL_TX_DESC_GET(desc, WBM_RELEASE_RING_4, LAST_MSDU);
|
||||||
|
ts->msdu_part_of_amsdu = HAL_TX_DESC_GET(desc, WBM_RELEASE_RING_4,
|
||||||
|
MSDU_PART_OF_AMSDU);
|
||||||
|
|
||||||
|
ts->peer_id = HAL_TX_DESC_GET(desc, WBM_RELEASE_RING_7, SW_PEER_ID);
|
||||||
|
ts->tid = HAL_TX_DESC_GET(desc, WBM_RELEASE_RING_7, TID);
|
||||||
|
|
||||||
|
rate_stats = HAL_TX_DESC_GET(desc, WBM_RELEASE_RING_6,
|
||||||
|
TX_RATE_STATS_INFO_TX_RATE_STATS);
|
||||||
|
|
||||||
|
rate_stats_valid = HAL_TX_MS(TX_RATE_STATS_INFO_0,
|
||||||
|
TX_RATE_STATS_INFO_VALID, rate_stats);
|
||||||
|
|
||||||
|
if (rate_stats_valid) {
|
||||||
|
ts->bw = HAL_TX_MS(TX_RATE_STATS_INFO_0, TRANSMIT_BW,
|
||||||
|
rate_stats);
|
||||||
|
ts->pkt_type = HAL_TX_MS(TX_RATE_STATS_INFO_0,
|
||||||
|
TRANSMIT_PKT_TYPE, rate_stats);
|
||||||
|
ts->stbc = HAL_TX_MS(TX_RATE_STATS_INFO_0,
|
||||||
|
TRANSMIT_STBC, rate_stats);
|
||||||
|
ts->ldpc = HAL_TX_MS(TX_RATE_STATS_INFO_0, TRANSMIT_LDPC,
|
||||||
|
rate_stats);
|
||||||
|
ts->sgi = HAL_TX_MS(TX_RATE_STATS_INFO_0, TRANSMIT_SGI,
|
||||||
|
rate_stats);
|
||||||
|
ts->mcs = HAL_TX_MS(TX_RATE_STATS_INFO_0, TRANSMIT_MCS,
|
||||||
|
rate_stats);
|
||||||
|
ts->ofdma = HAL_TX_MS(TX_RATE_STATS_INFO_0, OFDMA_TRANSMISSION,
|
||||||
|
rate_stats);
|
||||||
|
ts->tones_in_ru = HAL_TX_MS(TX_RATE_STATS_INFO_0, TONES_IN_RU,
|
||||||
|
rate_stats);
|
||||||
|
}
|
||||||
|
|
||||||
|
ts->tsf = HAL_TX_DESC_GET(desc, WBM_RELEASE_RING_6,
|
||||||
|
TX_RATE_STATS_INFO_TX_RATE_STATS);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
static inline void hal_tx_comp_get_status(void *desc,
|
||||||
|
struct hal_tx_completion_status *ts)
|
||||||
|
{
|
||||||
|
|
||||||
|
ts->ppdu_id = HAL_TX_DESC_GET(desc, WBM_RELEASE_RING_3,
|
||||||
|
TQM_STATUS_NUMBER);
|
||||||
|
ts->ack_frame_rssi = HAL_TX_DESC_GET(desc, WBM_RELEASE_RING_4,
|
||||||
|
ACK_FRAME_RSSI);
|
||||||
|
ts->first_msdu = HAL_TX_DESC_GET(desc, WBM_RELEASE_RING_4, FIRST_MSDU);
|
||||||
|
ts->last_msdu = HAL_TX_DESC_GET(desc, WBM_RELEASE_RING_4, LAST_MSDU);
|
||||||
|
ts->msdu_part_of_amsdu = HAL_TX_DESC_GET(desc, WBM_RELEASE_RING_4,
|
||||||
|
MSDU_PART_OF_AMSDU);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* hal_tx_comp_desc_sync() - collect hardware descriptor contents
|
* hal_tx_comp_desc_sync() - collect hardware descriptor contents
|
||||||
* @hal_desc: hardware descriptor pointer
|
* @hal_desc: hardware descriptor pointer
|
||||||
|
Reference in New Issue
Block a user