瀏覽代碼

qcacmn: Split dp_srng_setup and dp_srng_cleanup APIs

Split dp_srng_setup into dp_srng_alloc and dp_srng_init
likewise split dp_srng_cleanup into dp_srng_deinit and
dp_srng_free
This split is made because dp_pdev_init is introduced
as part of this FR and these APIs will be called from
dp_pdev_init/dp_pdev_deinit or dp_pdev_attach/dp_pdev_
detach accordingly to maintain the symmetry to DP init
and deinit path

Change-Id: I421fbd5bce074af6f75c147742f44e03568e6403
CRs-Fixed: 2663595
phadiman 5 年之前
父節點
當前提交
730a5bdaa8
共有 2 個文件被更改,包括 208 次插入124 次删除
  1. 194 124
      dp/wifi3.0/dp_main.c
  2. 14 0
      dp/wifi3.0/dp_types.h

+ 194 - 124
dp/wifi3.0/dp_main.c

@@ -1346,74 +1346,62 @@ dp_srng_configure_interrupt_thresholds(struct dp_soc *soc,
 }
 #endif
 
-/**
- * dp_srng_setup() - Internal function to setup SRNG rings used by data path
- * @soc: datapath soc handle
- * @srng: srng handle
- * @ring_type: ring that needs to be configured
- * @mac_id: mac number
- * @num_entries: Total number of entries for a given ring
+/*
+ * dp_srng_free() - Free SRNG memory
+ * @soc  : Data path soc handle
+ * @srng : SRNG pointer
  *
- * Return: non-zero - failure/zero - success
+ * return: None
  */
-static int dp_srng_setup(struct dp_soc *soc, struct dp_srng *srng,
-			 int ring_type, int ring_num, int mac_id,
-			 uint32_t num_entries, bool cached)
-{
-	hal_soc_handle_t hal_soc = soc->hal_soc;
-	uint32_t entry_size = hal_srng_get_entrysize(hal_soc, ring_type);
-	/* TODO: See if we should get align size from hal */
-	uint32_t ring_base_align = 8;
-	struct hal_srng_params ring_params;
-	uint32_t max_entries = hal_srng_max_entries(hal_soc, ring_type);
-
-	/* TODO: Currently hal layer takes care of endianness related settings.
-	 * See if these settings need to passed from DP layer
-	 */
-	ring_params.flags = 0;
 
-	num_entries = (num_entries > max_entries) ? max_entries : num_entries;
-	srng->hal_srng = NULL;
-	srng->alloc_size = num_entries * entry_size;
-	srng->num_entries = num_entries;
-
-	if (!dp_is_soc_reinit(soc)) {
-		if (!cached) {
-			ring_params.ring_base_vaddr =
-			    qdf_aligned_mem_alloc_consistent(
-						soc->osdev, &srng->alloc_size,
-						&srng->base_vaddr_unaligned,
-						&srng->base_paddr_unaligned,
-						&ring_params.ring_base_paddr,
-						ring_base_align);
+static void dp_srng_free(struct dp_soc *soc, struct dp_srng *srng)
+{
+	if (srng->alloc_size && srng->base_vaddr_unaligned) {
+		if (!srng->cached) {
+			qdf_mem_free_consistent(soc->osdev, soc->osdev->dev,
+						srng->alloc_size,
+						srng->base_vaddr_unaligned,
+						srng->base_paddr_unaligned, 0);
 		} else {
-			ring_params.ring_base_vaddr = qdf_aligned_malloc(
-					&srng->alloc_size,
-					&srng->base_vaddr_unaligned,
-					&srng->base_paddr_unaligned,
-					&ring_params.ring_base_paddr,
-					ring_base_align);
-		}
-
-		if (!ring_params.ring_base_vaddr) {
-			dp_err("alloc failed - ring_type: %d, ring_num %d",
-					ring_type, ring_num);
-			return QDF_STATUS_E_NOMEM;
+			qdf_mem_free(srng->base_vaddr_unaligned);
 		}
+		srng->alloc_size = 0;
+		srng->base_vaddr_unaligned = NULL;
 	}
+	srng->hal_srng = NULL;
+}
 
-	ring_params.ring_base_paddr = (qdf_dma_addr_t)qdf_align(
-			(unsigned long)(srng->base_paddr_unaligned),
-			ring_base_align);
+/*
+ * dp_srng_init() - Initialize SRNG
+ * @soc  : Data path soc handle
+ * @srng : SRNG pointer
+ * @ring_type : Ring Type
+ * @ring_num: Ring number
+ * @mac_id: mac_id
+ *
+ * return: QDF_STATUS
+ */
+static QDF_STATUS dp_srng_init(struct dp_soc *soc, struct dp_srng *srng,
+			       int ring_type, int ring_num, int mac_id)
+{
+	hal_soc_handle_t hal_soc = soc->hal_soc;
+	struct hal_srng_params ring_params;
+
+	if (srng->hal_srng) {
+		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
+			  FL("Ring type: %d, num:%d is already initialized"),
+			  ring_type, ring_num);
+		return QDF_STATUS_SUCCESS;
+	}
 
-	ring_params.ring_base_vaddr = (void *)(
-			(unsigned long)(srng->base_vaddr_unaligned) +
-			((unsigned long)(ring_params.ring_base_paddr) -
-			 (unsigned long)(srng->base_paddr_unaligned)));
+	/* memset the srng ring to zero */
+	qdf_mem_zero(srng->base_vaddr_unaligned, srng->alloc_size);
 
-	qdf_assert_always(ring_params.ring_base_vaddr);
+	ring_params.flags = 0;
+	ring_params.ring_base_paddr = srng->base_paddr_aligned;
+	ring_params.ring_base_vaddr = srng->base_vaddr_aligned;
 
-	ring_params.num_entries = num_entries;
+	ring_params.num_entries = srng->num_entries;
 
 	dp_verbose_debug("Ring type: %d, num:%d vaddr %pK paddr %pK entries %u",
 			 ring_type, ring_num,
@@ -1435,28 +1423,96 @@ static int dp_srng_setup(struct dp_soc *soc, struct dp_srng *srng,
 
 	dp_srng_configure_interrupt_thresholds(soc, &ring_params,
 					       ring_type, ring_num,
-					       num_entries);
+					       srng->num_entries);
 
-	if (cached) {
+	if (srng->cached)
 		ring_params.flags |= HAL_SRNG_CACHED_DESC;
-		srng->cached = 1;
-	}
 
 	srng->hal_srng = hal_srng_setup(hal_soc, ring_type, ring_num,
-		mac_id, &ring_params);
+					mac_id, &ring_params);
 
 	if (!srng->hal_srng) {
-		if (cached) {
-			qdf_mem_free(srng->base_vaddr_unaligned);
-		} else {
-			qdf_mem_free_consistent(soc->osdev, soc->osdev->dev,
-						srng->alloc_size,
-						srng->base_vaddr_unaligned,
-						srng->base_paddr_unaligned, 0);
-		}
+		dp_srng_free(soc, srng);
+		return QDF_STATUS_E_FAILURE;
 	}
 
-	return 0;
+	return QDF_STATUS_SUCCESS;
+}
+
+/*
+ * dp_srng_alloc() - Allocate memory for SRNG
+ * @soc  : Data path soc handle
+ * @srng : SRNG pointer
+ * @ring_type : Ring Type
+ * @num_entries: Number of entries
+ * @cached: cached flag variable
+ *
+ * return: QDF_STATUS
+ */
+static QDF_STATUS dp_srng_alloc(struct dp_soc *soc, struct dp_srng *srng,
+				int ring_type, uint32_t num_entries,
+				bool cached)
+{
+	hal_soc_handle_t hal_soc = soc->hal_soc;
+	uint32_t entry_size = hal_srng_get_entrysize(hal_soc, ring_type);
+	uint32_t ring_base_align = 32;
+	uint32_t max_entries = hal_srng_max_entries(hal_soc, ring_type);
+
+	if (srng->base_vaddr_unaligned) {
+		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
+			  FL("Ring type: %d, is already allocated"), ring_type);
+		return QDF_STATUS_SUCCESS;
+	}
+
+	num_entries = (num_entries > max_entries) ? max_entries : num_entries;
+	srng->hal_srng = NULL;
+	srng->alloc_size = num_entries * entry_size;
+	srng->num_entries = num_entries;
+	srng->cached = cached;
+
+	if (!cached) {
+		srng->base_vaddr_aligned =
+		    qdf_aligned_mem_alloc_consistent(
+					soc->osdev, &srng->alloc_size,
+					&srng->base_vaddr_unaligned,
+					&srng->base_paddr_unaligned,
+					&srng->base_paddr_aligned,
+					ring_base_align);
+	} else {
+		srng->base_vaddr_aligned = qdf_aligned_malloc(
+					&srng->alloc_size,
+					&srng->base_vaddr_unaligned,
+					&srng->base_paddr_unaligned,
+					&srng->base_paddr_aligned,
+					ring_base_align);
+	}
+
+	if (!srng->base_vaddr_aligned)
+		return QDF_STATUS_E_NOMEM;
+
+	return QDF_STATUS_SUCCESS;
+}
+
+/**
+ * dp_srng_setup() - Internal function to setup SRNG rings used by data path
+ * @soc: datapath soc handle
+ * @srng: srng handle
+ * @ring_type: ring that needs to be configured
+ * @mac_id: mac number
+ * @num_entries: Total number of entries for a given ring
+ *
+ * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_FAILURE on failure
+ */
+static QDF_STATUS dp_srng_setup(struct dp_soc *soc, struct dp_srng *srng,
+				int ring_type, int ring_num, int mac_id,
+				uint32_t num_entries, bool cached)
+{
+	if (!dp_is_soc_reinit(soc)) {
+		if (dp_srng_alloc(soc, srng, ring_type, num_entries, cached))
+			return QDF_STATUS_E_FAILURE;
+	}
+
+	return dp_srng_init(soc, srng, ring_type, ring_num, mac_id);
 }
 
 /*
@@ -1488,35 +1544,11 @@ static void dp_srng_deinit(struct dp_soc *soc, struct dp_srng *srng,
  * before calling this function.
  */
 static void dp_srng_cleanup(struct dp_soc *soc, struct dp_srng *srng,
-	int ring_type, int ring_num)
+			    int ring_type, int ring_num)
 {
-	if (!dp_is_soc_reinit(soc)) {
-		if (!srng->hal_srng && (srng->alloc_size == 0)) {
-			QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
-				  FL("Ring type: %d, num:%d not setup"),
-				  ring_type, ring_num);
-			return;
-		}
-
-		if (srng->hal_srng) {
-			hal_srng_cleanup(soc->hal_soc, srng->hal_srng);
-			srng->hal_srng = NULL;
-		}
-	}
+	dp_srng_deinit(soc, srng, ring_type, ring_num);
 
-	if (srng->alloc_size && srng->base_vaddr_unaligned) {
-		if (!srng->cached) {
-			qdf_mem_free_consistent(soc->osdev, soc->osdev->dev,
-						srng->alloc_size,
-						srng->base_vaddr_unaligned,
-						srng->base_paddr_unaligned, 0);
-		} else {
-			qdf_mem_free(srng->base_vaddr_unaligned);
-		}
-		srng->alloc_size = 0;
-		srng->base_vaddr_unaligned = NULL;
-	}
-	srng->hal_srng = NULL;
+	dp_srng_free(soc, srng);
 }
 
 /* TODO: Need this interface from HIF */
@@ -2468,28 +2500,24 @@ static void dp_hw_link_desc_pool_cleanup(struct dp_soc *soc)
 	int i;
 	struct qdf_mem_multi_page_t *pages;
 
-	if (soc->wbm_idle_link_ring.hal_srng) {
-		wlan_minidump_remove(
-			soc->wbm_idle_link_ring.base_vaddr_unaligned);
-		dp_srng_cleanup(soc, &soc->wbm_idle_link_ring,
-			WBM_IDLE_LINK, 0);
-	}
+	wlan_minidump_remove(soc->wbm_idle_link_ring.base_vaddr_unaligned);
+	dp_srng_cleanup(soc, &soc->wbm_idle_link_ring, WBM_IDLE_LINK, 0);
 
 	for (i = 0; i < MAX_IDLE_SCATTER_BUFS; i++) {
 		if (soc->wbm_idle_scatter_buf_base_vaddr[i]) {
 			qdf_mem_free_consistent(soc->osdev, soc->osdev->dev,
-				soc->wbm_idle_scatter_buf_size,
-				soc->wbm_idle_scatter_buf_base_vaddr[i],
-				soc->wbm_idle_scatter_buf_base_paddr[i], 0);
+					soc->wbm_idle_scatter_buf_size,
+					soc->wbm_idle_scatter_buf_base_vaddr[i],
+					soc->wbm_idle_scatter_buf_base_paddr[i],
+					0);
 			soc->wbm_idle_scatter_buf_base_vaddr[i] = NULL;
 		}
 	}
 
 	pages = &soc->link_desc_pages;
-	wlan_minidump_remove(
-		(void *)pages->dma_pages->page_v_addr_start);
+	wlan_minidump_remove((void *)pages->dma_pages->page_v_addr_start);
 	qdf_mem_multi_pages_free(soc->osdev,
-				 pages, 0, false);
+			pages, 0, false);
 }
 
 #ifdef IPA_OFFLOAD
@@ -4163,7 +4191,41 @@ static void dp_htt_ppdu_stats_detach(struct dp_pdev *pdev)
 
 }
 
+/**
+ * dp_mon_ring_deinit() - Deinitialize monitor rings
+ * @soc: DP soc handle
+ * @pdev: DP pdev handle
+ * mac_id: Mac ID
+ *
+ * Return: void
+ */
 #if !defined(DISABLE_MON_CONFIG)
+static
+void dp_mon_ring_deinit(struct dp_soc *soc, struct dp_pdev *pdev,
+			int mac_id)
+{
+	if (soc->wlan_cfg_ctx->rxdma1_enable) {
+		dp_srng_deinit(soc,
+			       &soc->rxdma_mon_buf_ring[mac_id],
+			       RXDMA_MONITOR_BUF, 0);
+
+		dp_srng_deinit(soc,
+			       &soc->rxdma_mon_dst_ring[mac_id],
+			       RXDMA_MONITOR_DST, 0);
+
+		dp_srng_deinit(soc,
+			       &soc->rxdma_mon_status_ring[mac_id],
+			       RXDMA_MONITOR_STATUS, 0);
+
+		dp_srng_deinit(soc,
+			       &soc->rxdma_mon_desc_ring[mac_id],
+			       RXDMA_MONITOR_DESC, 0);
+	} else {
+		dp_srng_deinit(soc,
+			       &soc->rxdma_mon_status_ring[mac_id],
+			       RXDMA_MONITOR_STATUS, 0);
+	}
+}
 
 static
 void dp_mon_ring_cleanup(struct dp_soc *soc, struct dp_pdev *pdev,
@@ -4205,28 +4267,34 @@ void dp_mon_ring_cleanup(struct dp_soc *soc, struct dp_pdev *pdev,
 				&soc->rxdma_err_dst_ring[mac_id],
 				RXDMA_DST, 0);
 	}
-
 }
 #else
-static void dp_mon_ring_cleanup(struct dp_soc *soc, struct dp_pdev *pdev,
-				int mac_id)
+/**
+ * dp_mon_ring_deinit() - Deinitialize monitor rings
+ * @soc: DP soc handle
+ * @pdev: DP pdev handle
+ * mac_id: Mac ID
+ *
+ * Return: void
+ */
+static void dp_mon_ring_deinit(struct dp_soc *soc, struct dp_pdev *pdev,
+			       int mac_id)
 {
 }
-#endif
 
 /**
- * dp_mon_ring_deinit() - Placeholder to deinitialize Monitor rings
- *
- * @soc: soc handle
- * @pdev: datapath physical dev handle
- * @mac_id: mac number
+ * dp_mon_ring_cleanup() - Cleanup all monitor rings
+ * @soc: DP soc handle
+ * @pdev: DP pdev handle
+ * mac_id: Mac ID
  *
- * Return: None
+ * Return: void
  */
-static void dp_mon_ring_deinit(struct dp_soc *soc, struct dp_pdev *pdev,
-			       int mac_id)
+static void dp_mon_ring_cleanup(struct dp_soc *soc, struct dp_pdev *pdev,
+				int mac_id)
 {
 }
+#endif
 
 /**
  * dp_pdev_mem_reset() - Reset txrx pdev memory
@@ -4603,8 +4671,10 @@ static void dp_soc_deinit(void *txrx_soc)
 
 	dp_peer_find_detach(soc);
 
-	/* Free the ring memories */
+	/* de-initialize srng rings */
 	/* Common rings */
+	dp_srng_deinit(soc, &soc->wbm_idle_link_ring, WBM_IDLE_LINK, 0);
+
 	dp_srng_deinit(soc, &soc->wbm_desc_rel_ring, SW2WBM_RELEASE, 0);
 
 	/* Tx data rings */

+ 14 - 0
dp/wifi3.0/dp_types.h

@@ -500,10 +500,24 @@ struct dp_txrx_pool_stats {
 	uint16_t pkt_drop_no_pool;
 };
 
+/**
+ * struct dp_srng - DP srng structure
+ * @hal_srng: hal_srng handle
+ * @base_vaddr_unaligned: un-aligned virtual base address of the srng ring
+ * @base_vaddr_aligned: aligned virtual base address of the srng ring
+ * @base_paddr_unaligned: un-aligned physical base address of the srng ring
+ * @base_paddr_aligned: aligned physical base address of the srng ring
+ * @alloc_size: size of the srng ring
+ * @cached: is the srng ring memory cached or un-cached memory
+ * @irq: irq number of the srng ring
+ * @num_entries: number of entries in the srng ring
+ */
 struct dp_srng {
 	hal_ring_handle_t hal_srng;
 	void *base_vaddr_unaligned;
+	void *base_vaddr_aligned;
 	qdf_dma_addr_t base_paddr_unaligned;
+	qdf_dma_addr_t base_paddr_aligned;
 	uint32_t alloc_size;
 	uint8_t cached;
 	int irq;