From 730a5bdaa8da70bfce750d61c9113fdf8faaebcd Mon Sep 17 00:00:00 2001 From: phadiman Date: Thu, 16 Apr 2020 01:21:49 +0530 Subject: [PATCH] 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 --- dp/wifi3.0/dp_main.c | 320 +++++++++++++++++++++++++----------------- dp/wifi3.0/dp_types.h | 14 ++ 2 files changed, 209 insertions(+), 125 deletions(-) diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c index c5203cfc35..5f7dea2615 100644 --- a/dp/wifi3.0/dp_main.c +++ b/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) + +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 { + qdf_mem_free(srng->base_vaddr_unaligned); + } + srng->alloc_size = 0; + srng->base_vaddr_unaligned = NULL; + } + srng->hal_srng = NULL; +} + +/* + * 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; - 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); - } 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; - } + 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_paddr = (qdf_dma_addr_t)qdf_align( - (unsigned long)(srng->base_paddr_unaligned), - ring_base_align); + /* memset the srng ring to zero */ + qdf_mem_zero(srng->base_vaddr_unaligned, srng->alloc_size); - 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))); + ring_params.flags = 0; + ring_params.ring_base_paddr = srng->base_paddr_aligned; + ring_params.ring_base_vaddr = srng->base_vaddr_aligned; - qdf_assert_always(ring_params.ring_base_vaddr); - - 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; - } + dp_srng_deinit(soc, srng, ring_type, ring_num); - if (srng->hal_srng) { - hal_srng_cleanup(soc->hal_soc, srng->hal_srng); - srng->hal_srng = NULL; - } - } - - 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,29 +4267,35 @@ 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) -{ -} -#endif - /** - * dp_mon_ring_deinit() - Placeholder to deinitialize Monitor rings + * dp_mon_ring_deinit() - Deinitialize monitor rings + * @soc: DP soc handle + * @pdev: DP pdev handle + * mac_id: Mac ID * - * @soc: soc handle - * @pdev: datapath physical dev handle - * @mac_id: mac number - * - * Return: None + * Return: void */ static void dp_mon_ring_deinit(struct dp_soc *soc, struct dp_pdev *pdev, int mac_id) { } +/** + * dp_mon_ring_cleanup() - Cleanup all monitor rings + * @soc: DP soc handle + * @pdev: DP pdev handle + * mac_id: Mac ID + * + * Return: void + */ +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 * @pdev: dp pdev handle @@ -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 */ diff --git a/dp/wifi3.0/dp_types.h b/dp/wifi3.0/dp_types.h index f10cbcbba1..43f1569387 100644 --- a/dp/wifi3.0/dp_types.h +++ b/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;