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:
Vijay Pamidipati
2016-12-20 11:44:38 +05:30
committed by qcabuildsw
父節點 c6bb1bd75a
當前提交 5bcfa31ec4
共有 3 個文件被更改,包括 143 次插入10 次删除

查看文件

@@ -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