From d9709af89ae20dce1434642cbd9e0725bfded241 Mon Sep 17 00:00:00 2001 From: Pavankumar Nandeshwar Date: Mon, 18 Apr 2022 02:43:41 -0700 Subject: [PATCH] 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 --- qdf/inc/qdf_mem.h | 19 ++++++++++++ qdf/inc/qdf_types.h | 4 +++ qdf/linux/src/qdf_mem.c | 67 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 90 insertions(+) diff --git a/qdf/inc/qdf_mem.h b/qdf/inc/qdf_mem.h index c26e818e20..d9e5d28b24 100644 --- a/qdf/inc/qdf_mem.h +++ b/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 diff --git a/qdf/inc/qdf_types.h b/qdf/inc/qdf_types.h index a4d4da1bdf..a7f40f2747 100644 --- a/qdf/inc/qdf_types.h +++ b/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 *); diff --git a/qdf/linux/src/qdf_mem.c b/qdf/linux/src/qdf_mem.c index 9c99d06846..d872724cda 100644 --- a/qdf/linux/src/qdf_mem.c +++ b/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