diff --git a/dp/wifi3.0/dp_tx.c b/dp/wifi3.0/dp_tx.c index 8696e0254a55..ea804795d251 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 654425909371..16d9a2f7a93d 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 e50db67c6351..b2f624b6e93a 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; }; /**