Browse Source

qcacmn: Fix rx buffer IPA map/unmap for exception cases

IPA unmapping is skipped for WBM internal error case,
do IPA unmapping for rx buffer received in WBM error case.

While reinjecting RX buffer back to REO, software rx desc
unmapped field is not set in sequence which may lead to
map without unmap error in IPA module. So reset the unmapped
filed after IPA mapping is complete.

Change-Id: I42c1eaa1620f975d47ce2938c95b6b89dbbd3eca
CRs-Fixed: 2952671
Karthik Kantamneni 4 years ago
parent
commit
bbd65e7a59
2 changed files with 20 additions and 6 deletions
  1. 4 4
      dp/wifi3.0/dp_rx_defrag.c
  2. 16 2
      dp/wifi3.0/dp_rx_err.c

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

@@ -1328,6 +1328,10 @@ static QDF_STATUS dp_rx_defrag_reo_reinject(struct dp_peer *peer,
 		return QDF_STATUS_E_FAILURE;
 		return QDF_STATUS_E_FAILURE;
 	}
 	}
 
 
+	dp_ipa_handle_rx_buf_smmu_mapping(soc, head,
+					  rx_desc_pool->buf_size,
+					  true);
+
 	/*
 	/*
 	 * As part of rx frag handler bufffer was unmapped and rx desc
 	 * As part of rx frag handler bufffer was unmapped and rx desc
 	 * unmapped is set to 1. So again for defrag reinject frame reset
 	 * unmapped is set to 1. So again for defrag reinject frame reset
@@ -1335,10 +1339,6 @@ 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,
-					  rx_desc_pool->buf_size,
-					  true);
-
 	paddr = qdf_nbuf_get_frag_paddr(head, 0);
 	paddr = qdf_nbuf_get_frag_paddr(head, 0);
 
 
 	ret = dp_check_paddr(soc, &head, &paddr, rx_desc_pool);
 	ret = dp_check_paddr(soc, &head, &paddr, rx_desc_pool);

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

@@ -2654,6 +2654,7 @@ dp_wbm_int_err_mpdu_pop(struct dp_soc *soc, uint32_t mac_id,
 	struct hal_buf_info buf_info;
 	struct hal_buf_info buf_info;
 	uint32_t rx_bufs_used = 0, msdu_cnt, i;
 	uint32_t rx_bufs_used = 0, msdu_cnt, i;
 	uint32_t rx_link_buf_info[HAL_RX_BUFFINFO_NUM_DWORDS];
 	uint32_t rx_link_buf_info[HAL_RX_BUFFINFO_NUM_DWORDS];
+	struct rx_desc_pool *rx_desc_pool;
 
 
 	msdu = 0;
 	msdu = 0;
 
 
@@ -2681,10 +2682,23 @@ dp_wbm_int_err_mpdu_pop(struct dp_soc *soc, uint32_t mac_id,
 							soc,
 							soc,
 							msdu_list.sw_cookie[i]);
 							msdu_list.sw_cookie[i]);
 				qdf_assert_always(rx_desc);
 				qdf_assert_always(rx_desc);
+				rx_desc_pool =
+					&soc->rx_desc_buf[rx_desc->pool_id];
 				msdu = rx_desc->nbuf;
 				msdu = rx_desc->nbuf;
 
 
-				qdf_nbuf_unmap_single(soc->osdev, msdu,
-						      QDF_DMA_FROM_DEVICE);
+				dp_ipa_rx_buf_smmu_mapping_lock(soc);
+				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;
+				dp_ipa_rx_buf_smmu_mapping_unlock(soc);
 
 
 				dp_rx_buffer_pool_nbuf_free(soc, msdu,
 				dp_rx_buffer_pool_nbuf_free(soc, msdu,
 							    rx_desc->pool_id);
 							    rx_desc->pool_id);