Эх сурвалжийг харах

qcacmn: handle IPA buffer smmu map/unmap correctly

Handle ipa buffer smmu map/unmap with below changes,
(1) Do IPA smmu unmap for RX buffer received from REO
exception/WBM RX release/REO DST/RXDMA DST ring.
(2) Align IPA smmu map length to qdf_nbuf_map_nytes_single()
with fixed length.

Change-Id: I1ed46b31ed31f5b7e4e2484d519bc85d35ce1e69
CRs-Fixed: 2728644
Jinwei Chen 5 жил өмнө
parent
commit
f3bffbfdd2

+ 16 - 6
dp/wifi3.0/dp_ipa.c

@@ -93,13 +93,14 @@ static void dp_ipa_reo_remap_history_add(uint32_t ix0_val, uint32_t ix2_val,
 
 
 static QDF_STATUS __dp_ipa_handle_buf_smmu_mapping(struct dp_soc *soc,
 static QDF_STATUS __dp_ipa_handle_buf_smmu_mapping(struct dp_soc *soc,
 						   qdf_nbuf_t nbuf,
 						   qdf_nbuf_t nbuf,
+						   uint32_t size,
 						   bool create)
 						   bool create)
 {
 {
 	qdf_mem_info_t mem_map_table = {0};
 	qdf_mem_info_t mem_map_table = {0};
 
 
 	qdf_update_mem_map_table(soc->osdev, &mem_map_table,
 	qdf_update_mem_map_table(soc->osdev, &mem_map_table,
 				 qdf_nbuf_get_frag_paddr(nbuf, 0),
 				 qdf_nbuf_get_frag_paddr(nbuf, 0),
-				 skb_end_pointer(nbuf) - nbuf->data);
+				 size);
 
 
 	if (create)
 	if (create)
 		qdf_ipa_wdi_create_smmu_mapping(1, &mem_map_table);
 		qdf_ipa_wdi_create_smmu_mapping(1, &mem_map_table);
@@ -111,6 +112,7 @@ static QDF_STATUS __dp_ipa_handle_buf_smmu_mapping(struct dp_soc *soc,
 
 
 QDF_STATUS dp_ipa_handle_rx_buf_smmu_mapping(struct dp_soc *soc,
 QDF_STATUS dp_ipa_handle_rx_buf_smmu_mapping(struct dp_soc *soc,
 					     qdf_nbuf_t nbuf,
 					     qdf_nbuf_t nbuf,
+					     uint32_t size,
 					     bool create)
 					     bool create)
 {
 {
 	struct dp_pdev *pdev;
 	struct dp_pdev *pdev;
@@ -129,7 +131,7 @@ QDF_STATUS dp_ipa_handle_rx_buf_smmu_mapping(struct dp_soc *soc,
 	if (!qdf_atomic_read(&soc->ipa_pipes_enabled))
 	if (!qdf_atomic_read(&soc->ipa_pipes_enabled))
 		return QDF_STATUS_SUCCESS;
 		return QDF_STATUS_SUCCESS;
 
 
-	return __dp_ipa_handle_buf_smmu_mapping(soc, nbuf, create);
+	return __dp_ipa_handle_buf_smmu_mapping(soc, nbuf, size, create);
 }
 }
 
 
 #ifdef RX_DESC_MULTI_PAGE_ALLOC
 #ifdef RX_DESC_MULTI_PAGE_ALLOC
@@ -165,7 +167,8 @@ static QDF_STATUS dp_ipa_handle_rx_buf_pool_smmu_mapping(struct dp_soc *soc,
 			continue;
 			continue;
 		nbuf = rx_desc->nbuf;
 		nbuf = rx_desc->nbuf;
 
 
-		__dp_ipa_handle_buf_smmu_mapping(soc, nbuf, create);
+		__dp_ipa_handle_buf_smmu_mapping(soc, nbuf,
+						 rx_pool->buf_size, create);
 	}
 	}
 	qdf_spin_unlock_bh(&rx_pool->lock);
 	qdf_spin_unlock_bh(&rx_pool->lock);
 
 
@@ -195,7 +198,8 @@ static QDF_STATUS dp_ipa_handle_rx_buf_pool_smmu_mapping(struct dp_soc *soc,
 
 
 		nbuf = rx_pool->array[i].rx_desc.nbuf;
 		nbuf = rx_pool->array[i].rx_desc.nbuf;
 
 
-		__dp_ipa_handle_buf_smmu_mapping(soc, nbuf, create);
+		__dp_ipa_handle_buf_smmu_mapping(soc, nbuf,
+						 rx_pool->buf_size, create);
 	}
 	}
 	qdf_spin_unlock_bh(&rx_pool->lock);
 	qdf_spin_unlock_bh(&rx_pool->lock);
 
 
@@ -225,7 +229,10 @@ static void dp_tx_ipa_uc_detach(struct dp_soc *soc, struct dp_pdev *pdev)
 			continue;
 			continue;
 
 
 		if (qdf_mem_smmu_s1_enabled(soc->osdev))
 		if (qdf_mem_smmu_s1_enabled(soc->osdev))
-			__dp_ipa_handle_buf_smmu_mapping(soc, nbuf, false);
+			__dp_ipa_handle_buf_smmu_mapping(
+					soc, nbuf,
+					skb_end_pointer(nbuf) - nbuf->data,
+					false);
 
 
 		qdf_nbuf_unmap_single(soc->osdev, nbuf, QDF_DMA_BIDIRECTIONAL);
 		qdf_nbuf_unmap_single(soc->osdev, nbuf, QDF_DMA_BIDIRECTIONAL);
 		qdf_nbuf_free(nbuf);
 		qdf_nbuf_free(nbuf);
@@ -372,7 +379,10 @@ static int dp_tx_ipa_uc_attach(struct dp_soc *soc, struct dp_pdev *pdev)
 			= (void *)nbuf;
 			= (void *)nbuf;
 
 
 		if (qdf_mem_smmu_s1_enabled(soc->osdev))
 		if (qdf_mem_smmu_s1_enabled(soc->osdev))
-			__dp_ipa_handle_buf_smmu_mapping(soc, nbuf, true);
+			__dp_ipa_handle_buf_smmu_mapping(
+					soc, nbuf,
+					skb_end_pointer(nbuf) - nbuf->data,
+					true);
 	}
 	}
 
 
 	hal_srng_access_end_unlocked(soc->hal_soc,
 	hal_srng_access_end_unlocked(soc->hal_soc,

+ 2 - 0
dp/wifi3.0/dp_ipa.h

@@ -239,6 +239,7 @@ int dp_ipa_ring_resource_setup(struct dp_soc *soc,
 		struct dp_pdev *pdev);
 		struct dp_pdev *pdev);
 QDF_STATUS dp_ipa_handle_rx_buf_smmu_mapping(struct dp_soc *soc,
 QDF_STATUS dp_ipa_handle_rx_buf_smmu_mapping(struct dp_soc *soc,
 					     qdf_nbuf_t nbuf,
 					     qdf_nbuf_t nbuf,
+					     uint32_t size,
 					     bool create);
 					     bool create);
 
 
 bool dp_reo_remap_config(struct dp_soc *soc, uint32_t *remap1,
 bool dp_reo_remap_config(struct dp_soc *soc, uint32_t *remap1,
@@ -266,6 +267,7 @@ static inline int dp_ipa_ring_resource_setup(struct dp_soc *soc,
 
 
 static inline QDF_STATUS dp_ipa_handle_rx_buf_smmu_mapping(struct dp_soc *soc,
 static inline QDF_STATUS dp_ipa_handle_rx_buf_smmu_mapping(struct dp_soc *soc,
 							   qdf_nbuf_t nbuf,
 							   qdf_nbuf_t nbuf,
+							   uint32_t size,
 							   bool create)
 							   bool create)
 {
 {
 	return QDF_STATUS_SUCCESS;
 	return QDF_STATUS_SUCCESS;

+ 14 - 2
dp/wifi3.0/dp_rx.c

@@ -261,7 +261,8 @@ QDF_STATUS __dp_rx_buffers_replenish(struct dp_soc *dp_soc, uint32_t mac_id,
 
 
 		paddr = qdf_nbuf_get_frag_paddr(rx_netbuf, 0);
 		paddr = qdf_nbuf_get_frag_paddr(rx_netbuf, 0);
 
 
-		dp_ipa_handle_rx_buf_smmu_mapping(dp_soc, rx_netbuf, true);
+		dp_ipa_handle_rx_buf_smmu_mapping(dp_soc, rx_netbuf,
+						  buf_size, true);
 		/*
 		/*
 		 * check if the physical address of nbuf->data is
 		 * check if the physical address of nbuf->data is
 		 * less then 0x50000000 then free the nbuf and try
 		 * less then 0x50000000 then free the nbuf and try
@@ -2076,6 +2077,11 @@ more_data:
 		if (QDF_IS_STATUS_ERROR(status)) {
 		if (QDF_IS_STATUS_ERROR(status)) {
 			if (qdf_unlikely(rx_desc && rx_desc->nbuf)) {
 			if (qdf_unlikely(rx_desc && rx_desc->nbuf)) {
 				qdf_assert_always(rx_desc->unmapped);
 				qdf_assert_always(rx_desc->unmapped);
+				dp_ipa_handle_rx_buf_smmu_mapping(
+							soc,
+							rx_desc->nbuf,
+							RX_DATA_BUFFER_SIZE,
+							false);
 				qdf_nbuf_unmap_nbytes_single(
 				qdf_nbuf_unmap_nbytes_single(
 							soc->osdev,
 							soc->osdev,
 							rx_desc->nbuf,
 							rx_desc->nbuf,
@@ -2218,6 +2224,9 @@ more_data:
 		 * in case double skb unmap happened.
 		 * in case double skb unmap happened.
 		 */
 		 */
 		rx_desc_pool = &soc->rx_desc_buf[rx_desc->pool_id];
 		rx_desc_pool = &soc->rx_desc_buf[rx_desc->pool_id];
+		dp_ipa_handle_rx_buf_smmu_mapping(soc, rx_desc->nbuf,
+						  rx_desc_pool->buf_size,
+						  false);
 		qdf_nbuf_unmap_nbytes_single(soc->osdev, rx_desc->nbuf,
 		qdf_nbuf_unmap_nbytes_single(soc->osdev, rx_desc->nbuf,
 					     QDF_DMA_FROM_DEVICE,
 					     QDF_DMA_FROM_DEVICE,
 					     rx_desc_pool->buf_size);
 					     rx_desc_pool->buf_size);
@@ -2792,7 +2801,10 @@ dp_pdev_rx_buffers_attach(struct dp_soc *dp_soc, uint32_t mac_id,
 						     desc_list->rx_desc.cookie,
 						     desc_list->rx_desc.cookie,
 						     rx_desc_pool->owner);
 						     rx_desc_pool->owner);
 
 
-			dp_ipa_handle_rx_buf_smmu_mapping(dp_soc, nbuf, true);
+			dp_ipa_handle_rx_buf_smmu_mapping(
+						dp_soc, nbuf,
+						rx_desc_pool->buf_size,
+						true);
 
 
 			desc_list = next;
 			desc_list = next;
 		}
 		}

+ 10 - 4
dp/wifi3.0/dp_rx_defrag.c

@@ -1093,10 +1093,12 @@ static QDF_STATUS dp_rx_defrag_reo_reinject(struct dp_peer *peer,
 			qdf_nbuf_data(head), nbuf_len);
 			qdf_nbuf_data(head), nbuf_len);
 
 
 	cookie = HAL_RX_BUF_COOKIE_GET(msdu0);
 	cookie = HAL_RX_BUF_COOKIE_GET(msdu0);
+	rx_desc_pool = &soc->rx_desc_buf[pdev->lmac_id];
 
 
 	/* map the nbuf before reinject it into HW */
 	/* map the nbuf before reinject it into HW */
-	ret = qdf_nbuf_map_single(soc->osdev, head,
-				  QDF_DMA_FROM_DEVICE);
+	ret = qdf_nbuf_map_nbytes_single(soc->osdev, head,
+					 QDF_DMA_FROM_DEVICE,
+					 rx_desc_pool->buf_size);
 	if (qdf_unlikely(ret == QDF_STATUS_E_FAILURE)) {
 	if (qdf_unlikely(ret == QDF_STATUS_E_FAILURE)) {
 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
 				"%s: nbuf map failed !", __func__);
 				"%s: nbuf map failed !", __func__);
@@ -1110,10 +1112,11 @@ static QDF_STATUS dp_rx_defrag_reo_reinject(struct dp_peer *peer,
 	 */
 	 */
 	rx_desc->unmapped = 0;
 	rx_desc->unmapped = 0;
 
 
-	dp_ipa_handle_rx_buf_smmu_mapping(soc, head, true);
+	dp_ipa_handle_rx_buf_smmu_mapping(soc, head,
+					  rx_desc_pool->buf_size,
+					  true);
 
 
 	paddr = qdf_nbuf_get_frag_paddr(head, 0);
 	paddr = qdf_nbuf_get_frag_paddr(head, 0);
-	rx_desc_pool = &soc->rx_desc_buf[pdev->lmac_id];
 
 
 	ret = check_x86_paddr(soc, &head, &paddr, rx_desc_pool);
 	ret = check_x86_paddr(soc, &head, &paddr, rx_desc_pool);
 
 
@@ -1732,6 +1735,9 @@ uint32_t dp_rx_frag_handle(struct dp_soc *soc, hal_ring_desc_t ring_desc,
 	msdu = rx_desc->nbuf;
 	msdu = rx_desc->nbuf;
 
 
 	rx_desc_pool = &soc->rx_desc_buf[rx_desc->pool_id];
 	rx_desc_pool = &soc->rx_desc_buf[rx_desc->pool_id];
+	dp_ipa_handle_rx_buf_smmu_mapping(soc, rx_desc->nbuf,
+					  rx_desc_pool->buf_size,
+					  false);
 	qdf_nbuf_unmap_nbytes_single(soc->osdev, rx_desc->nbuf,
 	qdf_nbuf_unmap_nbytes_single(soc->osdev, rx_desc->nbuf,
 				     QDF_DMA_FROM_DEVICE,
 				     QDF_DMA_FROM_DEVICE,
 				     rx_desc_pool->buf_size);
 				     rx_desc_pool->buf_size);

+ 12 - 7
dp/wifi3.0/dp_rx_desc.c

@@ -172,8 +172,10 @@ static QDF_STATUS __dp_rx_desc_nbuf_free(struct dp_soc *soc,
 		if (rx_desc->in_use) {
 		if (rx_desc->in_use) {
 			nbuf = rx_desc->nbuf;
 			nbuf = rx_desc->nbuf;
 			if (!rx_desc->unmapped) {
 			if (!rx_desc->unmapped) {
-				dp_ipa_handle_rx_buf_smmu_mapping(soc, nbuf,
-								  false);
+				dp_ipa_handle_rx_buf_smmu_mapping(
+							soc, nbuf,
+							rx_desc_pool->buf_size,
+							false);
 				qdf_nbuf_unmap_nbytes_single(
 				qdf_nbuf_unmap_nbytes_single(
 							soc->osdev,
 							soc->osdev,
 							rx_desc->nbuf,
 							rx_desc->nbuf,
@@ -326,8 +328,10 @@ void dp_rx_desc_nbuf_and_pool_free(struct dp_soc *soc, uint32_t pool_id,
 			nbuf = rx_desc_pool->array[i].rx_desc.nbuf;
 			nbuf = rx_desc_pool->array[i].rx_desc.nbuf;
 
 
 			if (!(rx_desc_pool->array[i].rx_desc.unmapped)) {
 			if (!(rx_desc_pool->array[i].rx_desc.unmapped)) {
-				dp_ipa_handle_rx_buf_smmu_mapping(soc, nbuf,
-								  false);
+				dp_ipa_handle_rx_buf_smmu_mapping(
+							soc, nbuf,
+							rx_desc_pool->buf_size,
+							false);
 				qdf_nbuf_unmap_nbytes_single(
 				qdf_nbuf_unmap_nbytes_single(
 							soc->osdev, nbuf,
 							soc->osdev, nbuf,
 							QDF_DMA_FROM_DEVICE,
 							QDF_DMA_FROM_DEVICE,
@@ -354,9 +358,10 @@ void dp_rx_desc_nbuf_free(struct dp_soc *soc,
 			nbuf = rx_desc_pool->array[i].rx_desc.nbuf;
 			nbuf = rx_desc_pool->array[i].rx_desc.nbuf;
 
 
 			if (!(rx_desc_pool->array[i].rx_desc.unmapped)) {
 			if (!(rx_desc_pool->array[i].rx_desc.unmapped)) {
-				dp_ipa_handle_rx_buf_smmu_mapping(soc, nbuf,
-								  false);
-
+				dp_ipa_handle_rx_buf_smmu_mapping(
+						soc, nbuf,
+						rx_desc_pool->buf_size,
+						false);
 				qdf_nbuf_unmap_nbytes_single(
 				qdf_nbuf_unmap_nbytes_single(
 							soc->osdev, nbuf,
 							soc->osdev, nbuf,
 							QDF_DMA_FROM_DEVICE,
 							QDF_DMA_FROM_DEVICE,

+ 26 - 2
dp/wifi3.0/dp_rx_err.c

@@ -25,6 +25,7 @@
 #include "qdf_trace.h"
 #include "qdf_trace.h"
 #include "qdf_nbuf.h"
 #include "qdf_nbuf.h"
 #include "dp_rx_defrag.h"
 #include "dp_rx_defrag.h"
+#include "dp_ipa.h"
 #ifdef FEATURE_WDS
 #ifdef FEATURE_WDS
 #include "dp_txrx_wds.h"
 #include "dp_txrx_wds.h"
 #endif
 #endif
@@ -301,6 +302,9 @@ dp_rx_msdus_drop(struct dp_soc *soc, hal_ring_desc_t ring_desc,
 		}
 		}
 
 
 		rx_desc_pool = &soc->rx_desc_buf[rx_desc->pool_id];
 		rx_desc_pool = &soc->rx_desc_buf[rx_desc->pool_id];
+		dp_ipa_handle_rx_buf_smmu_mapping(soc, rx_desc->nbuf,
+						  rx_desc_pool->buf_size,
+						  false);
 		qdf_nbuf_unmap_nbytes_single(soc->osdev, rx_desc->nbuf,
 		qdf_nbuf_unmap_nbytes_single(soc->osdev, rx_desc->nbuf,
 					     QDF_DMA_FROM_DEVICE,
 					     QDF_DMA_FROM_DEVICE,
 					     rx_desc_pool->buf_size);
 					     rx_desc_pool->buf_size);
@@ -492,6 +496,9 @@ more_msdu_link_desc:
 
 
 		nbuf = rx_desc->nbuf;
 		nbuf = rx_desc->nbuf;
 		rx_desc_pool = &soc->rx_desc_buf[rx_desc->pool_id];
 		rx_desc_pool = &soc->rx_desc_buf[rx_desc->pool_id];
+		dp_ipa_handle_rx_buf_smmu_mapping(soc, nbuf,
+						  rx_desc_pool->buf_size,
+						  false);
 		qdf_nbuf_unmap_nbytes_single(soc->osdev, nbuf,
 		qdf_nbuf_unmap_nbytes_single(soc->osdev, nbuf,
 					     QDF_DMA_FROM_DEVICE,
 					     QDF_DMA_FROM_DEVICE,
 					     rx_desc_pool->buf_size);
 					     rx_desc_pool->buf_size);
@@ -1822,6 +1829,9 @@ dp_rx_wbm_err_process(struct dp_intr *int_ctx, struct dp_soc *soc,
 
 
 		nbuf = rx_desc->nbuf;
 		nbuf = rx_desc->nbuf;
 		rx_desc_pool = &soc->rx_desc_buf[rx_desc->pool_id];
 		rx_desc_pool = &soc->rx_desc_buf[rx_desc->pool_id];
+		dp_ipa_handle_rx_buf_smmu_mapping(soc, nbuf,
+						  rx_desc_pool->buf_size,
+						  false);
 		qdf_nbuf_unmap_nbytes_single(soc->osdev, nbuf,
 		qdf_nbuf_unmap_nbytes_single(soc->osdev, nbuf,
 					     QDF_DMA_FROM_DEVICE,
 					     QDF_DMA_FROM_DEVICE,
 					     rx_desc_pool->buf_size);
 					     rx_desc_pool->buf_size);
@@ -2129,6 +2139,7 @@ dp_rx_err_mpdu_pop(struct dp_soc *soc, uint32_t mac_id,
 	struct dp_pdev *pdev = dp_get_pdev_for_lmac_id(soc, mac_id);
 	struct dp_pdev *pdev = dp_get_pdev_for_lmac_id(soc, mac_id);
 	uint32_t rx_link_buf_info[HAL_RX_BUFFINFO_NUM_DWORDS];
 	uint32_t rx_link_buf_info[HAL_RX_BUFFINFO_NUM_DWORDS];
 	hal_rxdma_desc_t ring_desc;
 	hal_rxdma_desc_t ring_desc;
+	struct rx_desc_pool *rx_desc_pool;
 
 
 	if (!pdev) {
 	if (!pdev) {
 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG,
 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG,
@@ -2199,8 +2210,17 @@ dp_rx_err_mpdu_pop(struct dp_soc *soc, uint32_t mac_id,
 						continue;
 						continue;
 					}
 					}
 
 
-					qdf_nbuf_unmap_single(soc->osdev, msdu,
-						QDF_DMA_FROM_DEVICE);
+					rx_desc_pool = &soc->
+						rx_desc_buf[rx_desc->pool_id];
+					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;
 
 
 					QDF_TRACE(QDF_MODULE_ID_DP,
 					QDF_TRACE(QDF_MODULE_ID_DP,
 						QDF_TRACE_LEVEL_DEBUG,
 						QDF_TRACE_LEVEL_DEBUG,
@@ -2427,6 +2447,10 @@ dp_handle_wbm_internal_error(struct dp_soc *soc, void *hal_desc,
 
 
 		if (rx_desc && rx_desc->nbuf) {
 		if (rx_desc && rx_desc->nbuf) {
 			rx_desc_pool = &soc->rx_desc_buf[rx_desc->pool_id];
 			rx_desc_pool = &soc->rx_desc_buf[rx_desc->pool_id];
+			dp_ipa_handle_rx_buf_smmu_mapping(
+						soc, rx_desc->nbuf,
+						rx_desc_pool->buf_size,
+						false);
 			qdf_nbuf_unmap_nbytes_single(soc->osdev, rx_desc->nbuf,
 			qdf_nbuf_unmap_nbytes_single(soc->osdev, rx_desc->nbuf,
 						     QDF_DMA_FROM_DEVICE,
 						     QDF_DMA_FROM_DEVICE,
 						     rx_desc_pool->buf_size);
 						     rx_desc_pool->buf_size);