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
This commit is contained in:
chenguo 2018-02-01 21:28:35 +08:00 • committed by snandini
commit ec03bb838b

View file

@ -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,