diff --git a/dp/wifi3.0/dp_tx.c b/dp/wifi3.0/dp_tx.c index 51a13721e0..54b0e2800c 100644 --- a/dp/wifi3.0/dp_tx.c +++ b/dp/wifi3.0/dp_tx.c @@ -310,9 +310,9 @@ struct dp_tx_desc_s *dp_tx_prepare_desc_single(struct dp_vdev *vdev, tx_desc->vdev = vdev; tx_desc->msdu_ext_desc = NULL; - if (qdf_nbuf_map_nbytes_single(soc->osdev, nbuf, - QDF_DMA_TO_DEVICE, qdf_nbuf_len(nbuf) - != QDF_STATUS_SUCCESS)) { + if (qdf_unlikely(QDF_STATUS_SUCCESS != + qdf_nbuf_map_nbytes_single(soc->osdev, nbuf, + QDF_DMA_TO_DEVICE, qdf_nbuf_len(nbuf)))) { /* Handle failure */ QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, "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->next; /* 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; 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], - 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. @@ -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 * @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 */ hal_tx_set_dscp_tid_map(soc->hal_soc, default_dscp_tid_map, HAL_TX_DSCP_TID_MAP_TABLE_DEFAULT); diff --git a/dp/wifi3.0/dp_tx.h b/dp/wifi3.0/dp_tx.h index 50dd7676e8..ad6b8ad8ad 100644 --- a/dp/wifi3.0/dp_tx.h +++ b/dp/wifi3.0/dp_tx.h @@ -178,10 +178,6 @@ static inline void dp_tx_comp_process_exception(struct dp_tx_desc_s *tx_desc) { 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) { return QDF_STATUS_SUCCESS; diff --git a/hal/wifi3.0/hal_tx.h b/hal/wifi3.0/hal_tx.h index 2ba908d281..23d2a59024 100644 --- a/hal/wifi3.0/hal_tx.h +++ b/hal/wifi3.0/hal_tx.h @@ -23,6 +23,9 @@ Include files ---------------------------------------------------------------------------*/ #include "hal_api.h" +#ifdef CONFIG_WIN +#include "wcss_version.h" +#endif /*--------------------------------------------------------------------------- Preprocessor definitions and constants @@ -48,6 +51,19 @@ do { \ ((value << (block ## _ ## field ## _LSB)) & \ (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_BYTES (NUM_OF_DWORDS_TCL_DATA_CMD * 4) #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; } +/** + * 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_desc: hardware descriptor pointer