From 110bf967415d6b329b661c3ce95fee9c30907c59 Mon Sep 17 00:00:00 2001 From: "Pamidipati, Vijay" Date: Fri, 24 Mar 2017 21:38:20 +0530 Subject: [PATCH] qcacmn: Fix size mismatch between dma_map and dma_unmap in Tx path Change calls to qdf_dma_map_nbytes_single to qdf_dma_map to match with qdf_dma_unmap used in tx completion path. Also fix the dma_addr value that is passed to Tx HW; we were incorrectly subracting pkt_offset instead of just subtracting alignment bytes from dma_addr Change-Id: I2d6f32bd44e02824a1a788e3624dcb3680f1b242 CRs-Fixed: 2004658 --- dp/wifi3.0/dp_tx.c | 15 ++++++--------- dp/wifi3.0/dp_tx.h | 2 +- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/dp/wifi3.0/dp_tx.c b/dp/wifi3.0/dp_tx.c index 4ceda856ca6e..11eb3d6d3dd0 100644 --- a/dp/wifi3.0/dp_tx.c +++ b/dp/wifi3.0/dp_tx.c @@ -556,9 +556,8 @@ static qdf_nbuf_t dp_tx_prepare_raw(struct dp_vdev *vdev, qdf_nbuf_t nbuf, struct dp_tx_sg_info_s *sg_info = &msdu_info->u.sg_info; - if (QDF_STATUS_SUCCESS != qdf_nbuf_map_nbytes_single(vdev->osdev, nbuf, - QDF_DMA_TO_DEVICE, - qdf_nbuf_len(nbuf))) { + if (QDF_STATUS_SUCCESS != qdf_nbuf_map(vdev->osdev, nbuf, + QDF_DMA_TO_DEVICE)) { qdf_print("dma map error\n"); qdf_nbuf_free(nbuf); return NULL; @@ -618,7 +617,7 @@ static QDF_STATUS dp_tx_hw_enqueue(struct dp_soc *soc, struct dp_vdev *vdev, qdf_mem_zero_outline(hal_tx_desc_cached, HAL_TX_DESC_LEN_BYTES); if (tx_desc->flags & DP_TX_DESC_FLAG_FRAG) { - length = HAL_TX_EXTENSION_DESC_LEN_BYTES; + length = HAL_TX_EXT_DESC_WITH_META_DATA; type = HAL_TX_BUF_TYPE_EXT_DESC; dma_addr = tx_desc->msdu_ext_desc->paddr; } else { @@ -634,8 +633,7 @@ static QDF_STATUS dp_tx_hw_enqueue(struct dp_soc *soc, struct dp_vdev *vdev, * Alignment padding is already accounted in pkt_offset * */ - dma_addr = (qdf_nbuf_mapped_paddr_get(tx_desc->nbuf) - - tx_desc->pkt_offset); + dma_addr = (qdf_nbuf_mapped_paddr_get(tx_desc->nbuf) & ~0x7); } @@ -1045,9 +1043,8 @@ static qdf_nbuf_t dp_tx_prepare_sg(struct dp_vdev *vdev, qdf_nbuf_t nbuf, sg_info = &msdu_info->u.sg_info; nr_frags = qdf_nbuf_get_nr_frags(nbuf); - if (QDF_STATUS_SUCCESS != qdf_nbuf_map_nbytes_single(vdev->osdev, nbuf, - QDF_DMA_TO_DEVICE, - qdf_nbuf_headlen(nbuf))) { + if (QDF_STATUS_SUCCESS != qdf_nbuf_map(vdev->osdev, nbuf, + QDF_DMA_TO_DEVICE)) { QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, "dma map error\n"); diff --git a/dp/wifi3.0/dp_tx.h b/dp/wifi3.0/dp_tx.h index 5d643a66e86f..fef5686da6c2 100644 --- a/dp/wifi3.0/dp_tx.h +++ b/dp/wifi3.0/dp_tx.h @@ -35,7 +35,7 @@ #define DP_TX_FREE_SINGLE_BUF(soc, buf) \ do { \ - qdf_nbuf_unmap(soc->osdev, buf, QDF_DMA_FROM_DEVICE); \ + qdf_nbuf_unmap(soc->osdev, buf, QDF_DMA_TO_DEVICE); \ qdf_nbuf_free(buf); \ } while (0)