Selaa lähdekoodia

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
Mohit Khanna 5 vuotta sitten
vanhempi
sitoutus
27f16faa4d
3 muutettua tiedostoa jossa 20 lisäystä ja 2 poistoa
  1. 11 1
      dp/wifi3.0/dp_tx.c
  2. 7 1
      dp/wifi3.0/dp_tx.h
  3. 2 0
      dp/wifi3.0/dp_types.h

+ 11 - 1
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;

+ 7 - 1
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;

+ 2 - 0
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;
 };
 
 /**