Explorar o código

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
Pamidipati, Vijay %!s(int64=8) %!d(string=hai) anos
pai
achega
110bf96741
Modificáronse 2 ficheiros con 7 adicións e 10 borrados
  1. 6 9
      dp/wifi3.0/dp_tx.c
  2. 1 1
      dp/wifi3.0/dp_tx.h

+ 6 - 9
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");
 

+ 1 - 1
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)