From 27f16faa4dc53cf617c3c1d957df25862bd1db1d Mon Sep 17 00:00:00 2001 From: Mohit Khanna Date: Thu, 16 Jul 2020 16:09:36 -0700 Subject: [PATCH] qcacmn: Exclude HTT metadata length when not in use during TX Currently, when an extension descriptor is used during TX datapath, we use HTT metadata length + msdu extension descriptor length, even we do not fill HTT meta data. This is inefficient and hardware will end up doing DMA of extra HTT metadata, even when not needed. Include length of metadata in TCLdata command only if HTT metadata is filled in. Change-Id: Idd1b053c1c6bd8b39880efe5743980667454df0d CRs-Fixed: 2738733 --- dp/wifi3.0/dp_tx.c | 12 +++++++++++- dp/wifi3.0/dp_tx.h | 8 +++++++- dp/wifi3.0/dp_types.h | 2 ++ 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/dp/wifi3.0/dp_tx.c b/dp/wifi3.0/dp_tx.c index 8696e0254a..ea804795d2 100644 --- a/dp/wifi3.0/dp_tx.c +++ b/dp/wifi3.0/dp_tx.c @@ -680,6 +680,10 @@ static QDF_STATUS dp_tx_prepare_tso(struct dp_vdev *vdev, } #endif +QDF_COMPILE_TIME_ASSERT(dp_tx_htt_metadata_len_check, + (DP_TX_MSDU_INFO_META_DATA_DWORDS * 4 >= + sizeof(struct htt_tx_msdu_desc_ext2_t))); + /** * dp_tx_prepare_ext_desc() - Allocate and prepare MSDU extension descriptor * @vdev: DP Vdev handle @@ -713,6 +717,7 @@ struct dp_tx_ext_desc_elem_s *dp_tx_prepare_ext_desc(struct dp_vdev *vdev, &msdu_info->meta_data[0], sizeof(struct htt_tx_msdu_desc_ext2_t)); qdf_atomic_inc(&soc->num_tx_exception); + msdu_ext_desc->flags |= DP_TX_EXT_DESC_FLAG_METADATA_VALID; } switch (msdu_info->frm_type) { @@ -1173,9 +1178,14 @@ static QDF_STATUS dp_tx_hw_enqueue(struct dp_soc *soc, struct dp_vdev *vdev, hal_tx_desc_cached = (void *) cached_desc; if (tx_desc->flags & DP_TX_DESC_FLAG_FRAG) { - tx_desc->length = HAL_TX_EXT_DESC_WITH_META_DATA; type = HAL_TX_BUF_TYPE_EXT_DESC; tx_desc->dma_addr = tx_desc->msdu_ext_desc->paddr; + + if (tx_desc->msdu_ext_desc->flags & + DP_TX_EXT_DESC_FLAG_METADATA_VALID) + tx_desc->length = HAL_TX_EXT_DESC_WITH_META_DATA; + else + tx_desc->length = HAL_TX_EXTENSION_DESC_LEN_BYTES; } else { tx_desc->length = qdf_nbuf_len(tx_desc->nbuf) - tx_desc->pkt_offset; diff --git a/dp/wifi3.0/dp_tx.h b/dp/wifi3.0/dp_tx.h index 6544259093..16d9a2f7a9 100644 --- a/dp/wifi3.0/dp_tx.h +++ b/dp/wifi3.0/dp_tx.h @@ -36,6 +36,8 @@ #define DP_TX_DESC_FLAG_TDLS_FRAME 0x100 #define DP_TX_DESC_FLAG_ALLOCATED 0x200 +#define DP_TX_EXT_DESC_FLAG_METADATA_VALID 0x1 + #define DP_TX_FREE_SINGLE_BUF(soc, buf) \ do { \ qdf_nbuf_unmap(soc->osdev, buf, QDF_DMA_TO_DEVICE); \ @@ -58,6 +60,10 @@ do { \ #endif /* TX_PER_VDEV_DESC_POOL */ #endif /* TX_PER_PDEV_DESC_POOL */ #define DP_TX_QUEUE_MASK 0x3 + +/* number of dwords for htt_tx_msdu_desc_ext2_t */ +#define DP_TX_MSDU_INFO_META_DATA_DWORDS 7 + /** * struct dp_tx_frag_info_s * @vaddr: hlos vritual address for buffer @@ -148,7 +154,7 @@ struct dp_tx_msdu_info_s { struct qdf_tso_info_t tso_info; struct dp_tx_sg_info_s sg_info; } u; - uint32_t meta_data[7]; + uint32_t meta_data[DP_TX_MSDU_INFO_META_DATA_DWORDS]; uint8_t exception_fw; uint16_t ppdu_cookie; uint8_t is_tx_sniffer; diff --git a/dp/wifi3.0/dp_types.h b/dp/wifi3.0/dp_types.h index e50db67c63..b2f624b6e9 100644 --- a/dp/wifi3.0/dp_types.h +++ b/dp/wifi3.0/dp_types.h @@ -386,11 +386,13 @@ struct rx_desc_pool { * @next: next extension descriptor pointer * @vaddr: hlos virtual address pointer * @paddr: physical address pointer for descriptor + * @flags: mark features for extension descriptor */ struct dp_tx_ext_desc_elem_s { struct dp_tx_ext_desc_elem_s *next; void *vaddr; qdf_dma_addr_t paddr; + uint16_t flags; }; /**