qcacmn: Avoid use of map and unmap API in simple path

Add qdf wrapper for dma_clean_range and avoid use of DMA
map/unmap APIs in Tx. simple fast path.
Gain of ~150 Mbps is observed while running 4 radio traffic.

Change-Id: I0e96bfee43fe810da8c861cb0f4535fb0ba7f6f7
This commit is contained in:
Neha Bisht
2022-01-04 16:23:17 +05:30
committato da Madan Koyyalamudi
parent 4654e2b73e
commit ebf445a844
4 ha cambiato i file con 82 aggiunte e 9 eliminazioni

Vedi File

@@ -1852,6 +1852,49 @@ static inline QDF_STATUS dp_tx_msdu_single_map(struct dp_vdev *vdev,
}
#endif
#if defined(QCA_DP_TX_NBUF_NO_MAP_UNMAP) && !defined(BUILD_X86)
static inline
qdf_dma_addr_t dp_tx_nbuf_map(struct dp_vdev *vdev,
struct dp_tx_desc_s *tx_desc,
qdf_nbuf_t nbuf)
{
qdf_nbuf_dma_clean_range((void *)nbuf->data,
(void *)(nbuf->data + nbuf->len));
return (qdf_dma_addr_t)qdf_mem_virt_to_phys(nbuf->data);
}
static inline
void dp_tx_nbuf_unmap(struct dp_soc *soc,
struct dp_tx_desc_s *desc)
{
}
#else
static inline
qdf_dma_addr_t dp_tx_nbuf_map(struct dp_vdev *vdev,
struct dp_tx_desc_s *tx_desc,
qdf_nbuf_t nbuf)
{
QDF_STATUS ret = QDF_STATUS_E_FAILURE;
ret = dp_tx_msdu_single_map(vdev, tx_desc, nbuf);
if (qdf_unlikely(QDF_IS_STATUS_ERROR(ret)))
return 0;
return qdf_nbuf_mapped_paddr_get(nbuf);
}
static inline
void dp_tx_nbuf_unmap(struct dp_soc *soc,
struct dp_tx_desc_s *desc)
{
qdf_nbuf_unmap_nbytes_single_paddr(soc->osdev,
desc->nbuf,
desc->dma_addr,
QDF_DMA_TO_DEVICE,
desc->length);
}
#endif
#ifdef MESH_MODE_SUPPORT
/**
* dp_tx_update_mesh_flags() - Update descriptor flags for mesh VAP
@@ -2006,6 +2049,7 @@ dp_tx_send_msdu_single(struct dp_vdev *vdev, qdf_nbuf_t nbuf,
enum cdp_tx_sw_drop drop_code = TX_MAX_DROP;
uint8_t tid = msdu_info->tid;
struct cdp_tid_tx_stats *tid_stats = NULL;
qdf_dma_addr_t paddr;
/* Setup Tx descriptor for an MSDU, and MSDU extension descriptor */
tx_desc = dp_tx_prepare_desc_single(vdev, nbuf, tx_q->desc_pool_id,
@@ -2038,8 +2082,8 @@ dp_tx_send_msdu_single(struct dp_vdev *vdev, qdf_nbuf_t nbuf,
dp_tx_update_mesh_flags(soc, vdev, tx_desc);
if (qdf_unlikely(QDF_STATUS_SUCCESS !=
dp_tx_msdu_single_map(vdev, tx_desc, nbuf))) {
paddr = dp_tx_nbuf_map(vdev, tx_desc, nbuf);
if (!paddr) {
/* Handle failure */
dp_err("qdf_nbuf_map failed");
DP_STATS_INC(vdev, tx_i.dropped.dma_error, 1);
@@ -2047,7 +2091,7 @@ dp_tx_send_msdu_single(struct dp_vdev *vdev, qdf_nbuf_t nbuf,
goto release_desc;
}
tx_desc->dma_addr = qdf_nbuf_mapped_paddr_get(tx_desc->nbuf);
tx_desc->dma_addr = paddr;
dp_tx_desc_history_add(soc, tx_desc->dma_addr, nbuf,
tx_desc->id, DP_TX_DESC_MAP);
dp_tx_update_mcast_param(peer_id, &htt_tcl_metadata, vdev, msdu_info);
@@ -4512,11 +4556,7 @@ dp_tx_comp_process_desc_list(struct dp_soc *soc,
*/
dp_tx_desc_history_add(soc, desc->dma_addr, desc->nbuf,
desc->id, DP_TX_COMP_UNMAP);
qdf_nbuf_unmap_nbytes_single_paddr(soc->osdev,
desc->nbuf,
desc->dma_addr,
QDF_DMA_TO_DEVICE,
desc->length);
dp_tx_nbuf_unmap(soc, desc);
qdf_nbuf_free(desc->nbuf);
dp_tx_desc_free(soc, desc, desc->pool_id);
desc = next;