diff --git a/dp/wifi3.0/dp_tx.c b/dp/wifi3.0/dp_tx.c index a572253303..2676e85ae3 100644 --- a/dp/wifi3.0/dp_tx.c +++ b/dp/wifi3.0/dp_tx.c @@ -102,6 +102,36 @@ dp_update_tx_desc_stats(struct dp_pdev *pdev) } #endif /* CONFIG_WLAN_SYSFS_MEM_STATS */ +#if defined(WLAN_TX_PKT_CAPTURE_ENH) || defined(FEATURE_PERPKT_INFO) +static inline +void dp_tx_enh_unmap(struct dp_soc *soc, struct dp_tx_desc_s *desc) +{ + qdf_nbuf_unmap_nbytes_single(soc->osdev, desc->nbuf, + QDF_DMA_TO_DEVICE, + desc->nbuf->len); + desc->flags |= DP_TX_DESC_FLAG_UNMAP_DONE; +} + +static inline void dp_tx_unmap(struct dp_soc *soc, struct dp_tx_desc_s *desc) +{ + if (qdf_likely(!(desc->flags & DP_TX_DESC_FLAG_UNMAP_DONE))) + qdf_nbuf_unmap_nbytes_single(soc->osdev, desc->nbuf, + QDF_DMA_TO_DEVICE, + desc->nbuf->len); +} +#else +static inline +void dp_tx_enh_unmap(struct dp_soc *soc, struct dp_tx_desc_s *desc) +{ +} + +static inline void dp_tx_unmap(struct dp_soc *soc, struct dp_tx_desc_s *desc) +{ + qdf_nbuf_unmap_nbytes_single(soc->osdev, desc->nbuf, + QDF_DMA_TO_DEVICE, desc->nbuf->len); +} +#endif + #ifdef QCA_TX_LIMIT_CHECK /** * dp_tx_limit_check - Check if allocated tx descriptors reached @@ -2118,8 +2148,7 @@ static inline void dp_tx_comp_free_buf(struct dp_soc *soc, if ((desc->flags & DP_TX_DESC_FLAG_ME) && qdf_nbuf_is_cloned(nbuf)) goto nbuf_free; - qdf_nbuf_unmap_nbytes_single(soc->osdev, nbuf, - QDF_DMA_TO_DEVICE, nbuf->len); + dp_tx_unmap(soc, desc); if (desc->flags & DP_TX_DESC_FLAG_MESH_MODE) return dp_mesh_tx_comp_free_buff(soc, desc); @@ -3914,6 +3943,8 @@ dp_tx_comp_process_desc(struct dp_soc *soc, dp_send_completion_to_pkt_capture(soc, desc, ts); if (!(desc->msdu_ext_desc)) { + dp_tx_enh_unmap(soc, desc); + if (QDF_STATUS_SUCCESS == dp_tx_add_to_comp_queue(soc, desc, ts, peer)) { return; @@ -3925,9 +3956,6 @@ dp_tx_comp_process_desc(struct dp_soc *soc, peer, ts, desc->nbuf, time_latency)) { - qdf_nbuf_unmap_nbytes_single(soc->osdev, desc->nbuf, - QDF_DMA_TO_DEVICE, - desc->nbuf->len); dp_send_completion_to_stack(soc, desc->pdev, ts->peer_id, diff --git a/dp/wifi3.0/dp_tx.h b/dp/wifi3.0/dp_tx.h index e49e98036d..b40b720c4b 100644 --- a/dp/wifi3.0/dp_tx.h +++ b/dp/wifi3.0/dp_tx.h @@ -45,6 +45,7 @@ #define DP_TX_DESC_FLAG_TDLS_FRAME 0x100 #define DP_TX_DESC_FLAG_ALLOCATED 0x200 #define DP_TX_DESC_FLAG_MESH_MODE 0x400 +#define DP_TX_DESC_FLAG_UNMAP_DONE 0x800 #define DP_TX_EXT_DESC_FLAG_METADATA_VALID 0x1