From ec03bb838b117fd8e6ba5a3b0f7304c6a985bd47 Mon Sep 17 00:00:00 2001 From: chenguo Date: Thu, 1 Feb 2018 21:28:35 +0800 Subject: [PATCH] qcacmn: Fix double unmap issue in RX defrag path If a RX packet takes below procedure, there is a double unmap: replenish -> rx_frag -> reo_reinject -> rx_process Fix it by mapping it again before reinjection. CRs-Fixed: 2181134 Change-Id: I69ca74e4aad57c854f301e492fe55012ee7290a3 --- dp/wifi3.0/dp_rx_defrag.c | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/dp/wifi3.0/dp_rx_defrag.c b/dp/wifi3.0/dp_rx_defrag.c index 90c007ba11a3..52b5a3df3d85 100644 --- a/dp/wifi3.0/dp_rx_defrag.c +++ b/dp/wifi3.0/dp_rx_defrag.c @@ -889,6 +889,7 @@ static void dp_rx_defrag_nwifi_to_8023(qdf_nbuf_t nbuf) qdf_dma_addr_t paddr; uint32_t nbuf_len, seq_no, dst_ind; uint32_t *mpdu_wrd; + uint32_t ret, cookie; void *dst_ring_desc = peer->rx_tid[tid].dst_ring_desc; @@ -936,6 +937,32 @@ static void dp_rx_defrag_nwifi_to_8023(qdf_nbuf_t nbuf) hal_rx_msdu_start_msdu_len_set( qdf_nbuf_data(head), nbuf_len); + cookie = HAL_RX_BUF_COOKIE_GET(msdu0); + + /* map the nbuf before reinject it into HW */ + ret = qdf_nbuf_map_single(soc->osdev, head, + QDF_DMA_BIDIRECTIONAL); + + if (qdf_unlikely(ret == QDF_STATUS_E_FAILURE)) { + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, + "%s: nbuf map failed !\n", __func__); + qdf_nbuf_free(head); + return QDF_STATUS_E_FAILURE; + } + + paddr = qdf_nbuf_get_frag_paddr(head, 0); + + ret = check_x86_paddr(soc, &head, &paddr, pdev); + + if (ret == QDF_STATUS_E_FAILURE) { + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, + "%s: x86 check failed !\n", __func__); + return QDF_STATUS_E_FAILURE; + } + + hal_rxdma_buff_addr_info_set(msdu0, paddr, cookie, + HAL_RX_BUF_RBM_SW3_BM); + /* Lets fill entrance ring now !!! */ if (qdf_unlikely(hal_srng_access_start(soc->hal_soc, hal_srng))) { QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,