Browse Source

qcacmn: Add API to clean up tx desc pool

Add an API to clean up tx dec pool in case of
umac reset.

Change-Id: I99fe11bcd07471f5aafefbeae10a9d4683cc5c5c
CRs-Fixed: 3266252
Pavankumar Nandeshwar 3 years ago
parent
commit
d9709af89a
3 changed files with 90 additions and 0 deletions
  1. 19 0
      qdf/inc/qdf_mem.h
  2. 4 0
      qdf/inc/qdf_types.h
  3. 67 0
      qdf/linux/src/qdf_mem.c

+ 19 - 0
qdf/inc/qdf_mem.h

@@ -1053,6 +1053,25 @@ qdf_mem_set_dma_pa(qdf_device_t osdev,
  */
 qdf_shared_mem_t *qdf_mem_shared_mem_alloc(qdf_device_t osdev, uint32_t size);
 
+#ifdef DP_UMAC_HW_RESET_SUPPORT
+/**
+ * qdf_tx_desc_pool_free_bufs() - Go through elems and call the registered  cb
+ * @ctxt: Context to be passed to the cb
+ * @pages: Multi page information storage
+ * @elem_size: Each element size
+ * @elem_count: Total number of elements should be allocated
+ * @cacheable: Coherent memory or cacheable memory
+ * @cb: Callback to free the elements
+ * @elem_list: elem list for delayed free
+ *
+ * Return: 0 on Succscc, or Error code
+ */
+int qdf_tx_desc_pool_free_bufs(void *ctxt, struct qdf_mem_multi_page_t *pages,
+			       uint32_t elem_size, uint32_t elem_count,
+			       uint8_t cacheable, qdf_mem_release_cb cb,
+			       void *elem_list);
+#endif
+
 /**
  * qdf_mem_shared_mem_free() - Free shared memory
  * @osdev: parent device instance

+ 4 - 0
qdf/inc/qdf_types.h

@@ -281,6 +281,10 @@ enum qdf_driver_type {
 	QDF_DRIVER_TYPE_INVALID = 0x7FFFFFFF
 };
 
+#ifdef DP_UMAC_HW_RESET_SUPPORT
+typedef void (*qdf_mem_release_cb) (void *ctxt, void *elem, void *elem_list);
+#endif
+
 /* work queue(kernel thread)/DPC function callback */
 typedef void (*qdf_defer_fn_t)(void *);
 

+ 67 - 0
qdf/linux/src/qdf_mem.c

@@ -2261,6 +2261,73 @@ void *qdf_aligned_malloc_fl(uint32_t *size,
 
 qdf_export_symbol(qdf_aligned_malloc_fl);
 
+#ifdef DP_UMAC_HW_RESET_SUPPORT
+/**
+ * qdf_tx_desc_pool_free_bufs() - Go through elems and call the registered  cb
+ * @ctxt: Context to be passed to the cb
+ * @pages: Multi page information storage
+ * @elem_size: Each element size
+ * @elem_count: Total number of elements should be allocated
+ * @cacheable: Coherent memory or cacheable memory
+ * @cb: Callback to free the elements
+ * @elem_list: elem list for delayed free
+ *
+ * Return: 0 on Succscc, or Error code
+ */
+int qdf_tx_desc_pool_free_bufs(void *ctxt, struct qdf_mem_multi_page_t *pages,
+			       uint32_t elem_size, uint32_t elem_count,
+			       uint8_t cacheable, qdf_mem_release_cb cb,
+			       void *elem_list)
+{
+	uint16_t i, i_int;
+	void *page_info;
+	void *elem;
+	uint32_t num_link = 0;
+
+	for (i = 0; i < pages->num_pages; i++) {
+		if (cacheable)
+			page_info = pages->cacheable_pages[i];
+		else
+			page_info = pages->dma_pages[i].page_v_addr_start;
+
+		if (!page_info)
+			return -ENOMEM;
+
+		elem = page_info;
+		for (i_int = 0; i_int < pages->num_element_per_page; i_int++) {
+			if (i_int == (pages->num_element_per_page - 1)) {
+				cb(ctxt, elem, elem_list);
+
+				if ((i + 1) == pages->num_pages)
+					break;
+				if (cacheable)
+					elem =
+					(void *)(pages->cacheable_pages[i + 1]);
+				else
+					elem = (void *)(pages->
+					dma_pages[i + 1].page_v_addr_start);
+
+				num_link++;
+
+				break;
+			}
+
+			cb(ctxt, elem, elem_list);
+			elem = ((char *)elem + elem_size);
+			num_link++;
+
+			/* Last link established exit */
+			if (num_link == (elem_count - 1))
+				break;
+		}
+	}
+
+	return 0;
+}
+
+qdf_export_symbol(qdf_tx_desc_pool_free_bufs);
+#endif
+
 /**
  * qdf_mem_multi_page_link() - Make links for multi page elements
  * @osdev: OS device handle pointer