From 4b6600e69b91f665ca4029f4d0d94c35819022de Mon Sep 17 00:00:00 2001 From: Karthik Kantamneni Date: Thu, 20 May 2021 10:41:46 +0530 Subject: [PATCH] qcacmn: Fix rx buffer IPA map/unmap for exception cases IPA unmapping is skipped for WBM internal error case, do IPA unmapping for rx buffer received in WBM error case. While reinjecting RX buffer back to REO, software rx desc unmapped field is not set in sequence which may lead to map without unmap error in IPA module. So reset the unmapped filed after IPA mapping is complete. Change-Id: I42c1eaa1620f975d47ce2938c95b6b89dbbd3eca CRs-Fixed: 2952671 --- dp/wifi3.0/dp_rx_defrag.c | 8 ++++---- dp/wifi3.0/dp_rx_err.c | 18 ++++++++++++++++-- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/dp/wifi3.0/dp_rx_defrag.c b/dp/wifi3.0/dp_rx_defrag.c index da7d3bf3155d..0b9552554ef8 100644 --- a/dp/wifi3.0/dp_rx_defrag.c +++ b/dp/wifi3.0/dp_rx_defrag.c @@ -1332,6 +1332,10 @@ static QDF_STATUS dp_rx_defrag_reo_reinject(struct dp_peer *peer, return QDF_STATUS_E_FAILURE; } + dp_ipa_handle_rx_buf_smmu_mapping(soc, head, + rx_desc_pool->buf_size, + true); + /* * As part of rx frag handler bufffer was unmapped and rx desc * unmapped is set to 1. So again for defrag reinject frame reset @@ -1339,10 +1343,6 @@ static QDF_STATUS dp_rx_defrag_reo_reinject(struct dp_peer *peer, */ rx_desc->unmapped = 0; - dp_ipa_handle_rx_buf_smmu_mapping(soc, head, - rx_desc_pool->buf_size, - true); - paddr = qdf_nbuf_get_frag_paddr(head, 0); ret = check_x86_paddr(soc, &head, &paddr, rx_desc_pool); diff --git a/dp/wifi3.0/dp_rx_err.c b/dp/wifi3.0/dp_rx_err.c index 0f95f6a27060..421a30a94346 100644 --- a/dp/wifi3.0/dp_rx_err.c +++ b/dp/wifi3.0/dp_rx_err.c @@ -2652,6 +2652,7 @@ dp_wbm_int_err_mpdu_pop(struct dp_soc *soc, uint32_t mac_id, struct hal_buf_info buf_info; uint32_t rx_bufs_used = 0, msdu_cnt, i; uint32_t rx_link_buf_info[HAL_RX_BUFFINFO_NUM_DWORDS]; + struct rx_desc_pool *rx_desc_pool; msdu = 0; @@ -2679,10 +2680,23 @@ dp_wbm_int_err_mpdu_pop(struct dp_soc *soc, uint32_t mac_id, soc, msdu_list.sw_cookie[i]); qdf_assert_always(rx_desc); + rx_desc_pool = + &soc->rx_desc_buf[rx_desc->pool_id]; msdu = rx_desc->nbuf; - qdf_nbuf_unmap_single(soc->osdev, msdu, - QDF_DMA_FROM_DEVICE); + dp_ipa_rx_buf_smmu_mapping_lock(soc); + dp_ipa_handle_rx_buf_smmu_mapping( + soc, msdu, + rx_desc_pool->buf_size, + false); + + qdf_nbuf_unmap_nbytes_single( + soc->osdev, + msdu, + QDF_DMA_FROM_DEVICE, + rx_desc_pool->buf_size); + rx_desc->unmapped = 1; + dp_ipa_rx_buf_smmu_mapping_unlock(soc); dp_rx_buffer_pool_nbuf_free(soc, msdu, rx_desc->pool_id);