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
This commit is contained in:
Mohit Khanna
2020-07-16 16:09:36 -07:00
committed by snandini
parent 8461a8d5cd
commit 27f16faa4d
3 changed files with 20 additions and 2 deletions

View File

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

View File

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

View File

@@ -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;
};
/**