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
This commit is contained in:
Pavankumar Nandeshwar
2022-04-18 02:43:41 -07:00
committed by Madan Koyyalamudi
parent d5a9b008f4
commit d9709af89a
3 changed files with 90 additions and 0 deletions

View File

@@ -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); 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 * qdf_mem_shared_mem_free() - Free shared memory
* @osdev: parent device instance * @osdev: parent device instance

View File

@@ -281,6 +281,10 @@ enum qdf_driver_type {
QDF_DRIVER_TYPE_INVALID = 0x7FFFFFFF 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 */ /* work queue(kernel thread)/DPC function callback */
typedef void (*qdf_defer_fn_t)(void *); typedef void (*qdf_defer_fn_t)(void *);

View File

@@ -2261,6 +2261,73 @@ void *qdf_aligned_malloc_fl(uint32_t *size,
qdf_export_symbol(qdf_aligned_malloc_fl); 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 * qdf_mem_multi_page_link() - Make links for multi page elements
* @osdev: OS device handle pointer * @osdev: OS device handle pointer