From a9d8a404fce94e953f53f5edb418f5c95b9ab3c1 Mon Sep 17 00:00:00 2001 From: Pavankumar Nandeshwar Date: Fri, 8 Sep 2023 08:15:23 -0700 Subject: [PATCH] qcacmn: Handle special tx descriptor pool cases Fix the missing special tx descriptor pool cases Change-Id: Ie6a7539e77b805483c32cb7bcfbc3143f9ef8034 CRs-Fixed: 3610126 --- dp/wifi3.0/dp_main.c | 3 ++- dp/wifi3.0/dp_stats.c | 3 +++ dp/wifi3.0/dp_tx.c | 40 +++++++++++++++++++++++++++++----------- dp/wifi3.0/dp_tx_desc.c | 10 ++++++++++ dp/wifi3.0/dp_tx_desc.h | 22 ++++++++++++++++------ dp/wifi3.0/li/dp_li.c | 3 ++- dp/wifi3.0/li/dp_li_tx.c | 6 ++++-- 7 files changed, 66 insertions(+), 21 deletions(-) diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c index a916736626..cf436b1dce 100644 --- a/dp/wifi3.0/dp_main.c +++ b/dp/wifi3.0/dp_main.c @@ -12562,7 +12562,8 @@ void dp_find_missing_tx_comp(struct dp_soc *soc) desc_pages.cacheable_pages))) break; - tx_desc = dp_tx_desc_find(soc, i, page_id, offset); + tx_desc = dp_tx_desc_find(soc, i, page_id, offset, + false); if (tx_desc->magic == DP_TX_MAGIC_PATTERN_FREE) { continue; } else if (tx_desc->magic == diff --git a/dp/wifi3.0/dp_stats.c b/dp/wifi3.0/dp_stats.c index 58d18e2529..f593472908 100644 --- a/dp/wifi3.0/dp_stats.c +++ b/dp/wifi3.0/dp_stats.c @@ -6249,6 +6249,9 @@ void dp_print_soc_tx_stats(struct dp_soc *soc) tx_desc_pool = dp_get_tx_desc_pool(soc, desc_pool_id); soc->stats.tx.desc_in_use += tx_desc_pool->num_allocated; + tx_desc_pool = dp_get_spcl_tx_desc_pool(soc, desc_pool_id); + soc->stats.tx.desc_in_use += + tx_desc_pool->num_allocated; } DP_PRINT_STATS("Tx Descriptors In Use = %u", diff --git a/dp/wifi3.0/dp_tx.c b/dp/wifi3.0/dp_tx.c index c529caad34..b03deb717d 100644 --- a/dp/wifi3.0/dp_tx.c +++ b/dp/wifi3.0/dp_tx.c @@ -6360,7 +6360,8 @@ void dp_tx_desc_flush(struct dp_pdev *pdev, struct dp_vdev *vdev, desc_pages.cacheable_pages))) break; - tx_desc = dp_tx_desc_find(soc, i, page_id, offset); + tx_desc = dp_tx_desc_find(soc, i, page_id, offset, + false); if (dp_is_tx_desc_flush_match(pdev, vdev, tx_desc)) { /* @@ -6389,14 +6390,16 @@ void dp_tx_desc_flush(struct dp_pdev *pdev, struct dp_vdev *vdev, * @soc: Handle to DP soc structure * @tx_desc: pointer of one TX desc * @desc_pool_id: TX Desc pool id + * @spcl_pool: Special pool */ static inline void dp_tx_desc_reset_vdev(struct dp_soc *soc, struct dp_tx_desc_s *tx_desc, - uint8_t desc_pool_id) + uint8_t desc_pool_id, bool spcl_pool) { struct dp_tx_desc_pool_s *pool = NULL; - pool = dp_get_tx_desc_pool(soc, desc_pool_id); + pool = spcl_pool ? dp_get_spcl_tx_desc_pool(soc, desc_pool_id) : + dp_get_tx_desc_pool(soc, desc_pool_id); TX_DESC_LOCK_LOCK(&pool->lock); tx_desc->vdev_id = DP_INVALID_VDEV_ID; @@ -6404,8 +6407,8 @@ dp_tx_desc_reset_vdev(struct dp_soc *soc, struct dp_tx_desc_s *tx_desc, TX_DESC_LOCK_UNLOCK(&pool->lock); } -void dp_tx_desc_flush(struct dp_pdev *pdev, struct dp_vdev *vdev, - bool force_free) +void __dp_tx_desc_flush(struct dp_pdev *pdev, struct dp_vdev *vdev, + bool force_free, bool spcl_pool) { uint8_t i, num_pool; uint32_t j; @@ -6420,22 +6423,30 @@ void dp_tx_desc_flush(struct dp_pdev *pdev, struct dp_vdev *vdev, return; } - num_desc = wlan_cfg_get_num_tx_desc(soc->wlan_cfg_ctx); + num_desc = spcl_pool ? wlan_cfg_get_num_tx_spl_desc(soc->wlan_cfg_ctx) : + wlan_cfg_get_num_tx_desc(soc->wlan_cfg_ctx); + num_pool = wlan_cfg_get_num_tx_desc_pool(soc->wlan_cfg_ctx); for (i = 0; i < num_pool; i++) { - tx_desc_pool = dp_get_tx_desc_pool(soc, i); + tx_desc_pool = spcl_pool ? dp_get_spcl_tx_desc_pool(soc, i) : + dp_get_tx_desc_pool(soc, i); if (!tx_desc_pool->desc_pages.cacheable_pages) continue; - num_desc_t = dp_get_updated_tx_desc(soc->ctrl_psoc, i, - num_desc); + if (spcl_pool) + num_desc_t = num_desc; + else + num_desc_t = dp_get_updated_tx_desc(soc->ctrl_psoc, i, + num_desc); + num_desc_per_page = tx_desc_pool->desc_pages.num_element_per_page; for (j = 0; j < num_desc_t; j++) { page_id = j / num_desc_per_page; offset = j % num_desc_per_page; - tx_desc = dp_tx_desc_find(soc, i, page_id, offset); + tx_desc = dp_tx_desc_find(soc, i, page_id, offset, + spcl_pool); if (dp_is_tx_desc_flush_match(pdev, vdev, tx_desc)) { if (force_free) { @@ -6444,12 +6455,19 @@ void dp_tx_desc_flush(struct dp_pdev *pdev, struct dp_vdev *vdev, dp_tx_desc_release(soc, tx_desc, i); } else { dp_tx_desc_reset_vdev(soc, tx_desc, - i); + i, spcl_pool); } } } } } + +void dp_tx_desc_flush(struct dp_pdev *pdev, struct dp_vdev *vdev, + bool force_free) +{ + __dp_tx_desc_flush(pdev, vdev, force_free, false); + __dp_tx_desc_flush(pdev, vdev, force_free, true); +} #endif /* !QCA_LL_TX_FLOW_CONTROL_V2 */ QDF_STATUS dp_tx_vdev_detach(struct dp_vdev *vdev) diff --git a/dp/wifi3.0/dp_tx_desc.c b/dp/wifi3.0/dp_tx_desc.c index 462a84529d..9ac9953897 100644 --- a/dp/wifi3.0/dp_tx_desc.c +++ b/dp/wifi3.0/dp_tx_desc.c @@ -104,6 +104,16 @@ void dp_tx_desc_pool_cleanup(struct dp_soc *soc, qdf_nbuf_t *nbuf_list) for (i = 0; i < num_pool; i++) { tx_desc_pool = dp_get_tx_desc_pool(soc, i); + if (tx_desc_pool) + qdf_tx_desc_pool_free_bufs(soc, + &tx_desc_pool->desc_pages, + tx_desc_pool->elem_size, + tx_desc_pool->elem_count, + true, &dp_tx_desc_clean_up, + nbuf_list); + + tx_desc_pool = dp_get_spcl_tx_desc_pool(soc, i); + if (tx_desc_pool) qdf_tx_desc_pool_free_bufs(soc, &tx_desc_pool->desc_pages, diff --git a/dp/wifi3.0/dp_tx_desc.h b/dp/wifi3.0/dp_tx_desc.h index b4fef3eff0..7b723bbc32 100644 --- a/dp/wifi3.0/dp_tx_desc.h +++ b/dp/wifi3.0/dp_tx_desc.h @@ -26,6 +26,8 @@ /* * 21 bits cookie + * 1 bit special pool indicator + * 3 bits unused * 2 bits pool id 0 ~ 3, * 10 bits page id 0 ~ 1023 * 5 bits offset id 0 ~ 31 (Desc size = 128, Num descs per page = 4096/128 = 32) @@ -34,6 +36,8 @@ /* TODO: Need to revisit this change for Rhine */ #ifdef WLAN_SOFTUMAC_SUPPORT +#define DP_TX_DESC_ID_SPCL_MASK 0x100000 +#define DP_TX_DESC_ID_SPCL_OS 20 #define DP_TX_DESC_ID_POOL_MASK 0x018000 #define DP_TX_DESC_ID_POOL_OS 15 #define DP_TX_DESC_ID_PAGE_MASK 0x007FF0 @@ -41,6 +45,8 @@ #define DP_TX_DESC_ID_OFFSET_MASK 0x00000F #define DP_TX_DESC_ID_OFFSET_OS 0 #else +#define DP_TX_DESC_ID_SPCL_MASK 0x100000 +#define DP_TX_DESC_ID_SPCL_OS 20 #define DP_TX_DESC_ID_POOL_MASK 0x018000 #define DP_TX_DESC_ID_POOL_OS 15 #define DP_TX_DESC_ID_PAGE_MASK 0x007FE0 @@ -1289,21 +1295,25 @@ static inline void dp_tx_desc_update_fast_comp_flag(struct dp_soc *soc, /** * dp_tx_desc_find() - find dp tx descriptor from pool/page/offset * @soc: handle for the device sending the data - * @pool_id: - * @page_id: - * @offset: + * @pool_id: pool id + * @page_id: page id + * @offset: offset from base address + * @spcl_pool: bit to indicate if this is a special pool * * Use page and offset to find the corresponding descriptor object in * the given descriptor pool. * * Return: the descriptor object that has the specified ID */ -static inline struct dp_tx_desc_s *dp_tx_desc_find(struct dp_soc *soc, - uint8_t pool_id, uint16_t page_id, uint16_t offset) +static inline +struct dp_tx_desc_s *dp_tx_desc_find(struct dp_soc *soc, + uint8_t pool_id, uint16_t page_id, + uint16_t offset, bool spcl_pool) { struct dp_tx_desc_pool_s *tx_desc_pool = NULL; - tx_desc_pool = dp_get_tx_desc_pool(soc, pool_id); + tx_desc_pool = spcl_pool ? dp_get_spcl_tx_desc_pool(soc, pool_id) : + dp_get_tx_desc_pool(soc, pool_id); return tx_desc_pool->desc_pages.cacheable_pages[page_id] + tx_desc_pool->elem_size * offset; diff --git a/dp/wifi3.0/li/dp_li.c b/dp/wifi3.0/li/dp_li.c index f75fc90bf6..5b72ea2f7d 100644 --- a/dp/wifi3.0/li/dp_li.c +++ b/dp/wifi3.0/li/dp_li.c @@ -744,7 +744,8 @@ void dp_tx_comp_get_prefetched_params_from_hal_desc( (tx_desc_id & DP_TX_DESC_ID_PAGE_MASK) >> DP_TX_DESC_ID_PAGE_OS, (tx_desc_id & DP_TX_DESC_ID_OFFSET_MASK) >> - DP_TX_DESC_ID_OFFSET_OS); + DP_TX_DESC_ID_OFFSET_OS, + (tx_desc_id & DP_TX_DESC_ID_SPCL_MASK)); qdf_prefetch((uint8_t *)*r_tx_desc); } #endif diff --git a/dp/wifi3.0/li/dp_li_tx.c b/dp/wifi3.0/li/dp_li_tx.c index 573ee1b1ef..a06eb5b156 100644 --- a/dp/wifi3.0/li/dp_li_tx.c +++ b/dp/wifi3.0/li/dp_li_tx.c @@ -49,7 +49,8 @@ void dp_tx_comp_get_params_from_hal_desc_li(struct dp_soc *soc, (tx_desc_id & DP_TX_DESC_ID_PAGE_MASK) >> DP_TX_DESC_ID_PAGE_OS, (tx_desc_id & DP_TX_DESC_ID_OFFSET_MASK) >> - DP_TX_DESC_ID_OFFSET_OS); + DP_TX_DESC_ID_OFFSET_OS, + (tx_desc_id & DP_TX_DESC_ID_SPCL_MASK)); /* Pool id is not matching. Error */ if ((*r_tx_desc)->pool_id != pool_id) { dp_tx_comp_alert("Tx Comp pool id %d not matched %d", @@ -603,7 +604,8 @@ QDF_STATUS dp_tx_desc_pool_init_li(struct dp_soc *soc, while (tx_desc) { page_id = count / num_desc_per_page; offset = count % num_desc_per_page; - id = ((pool_id_32 << DP_TX_DESC_ID_POOL_OS) | + id = ((!!spcl_tx_desc) << DP_TX_DESC_ID_SPCL_OS | + (pool_id_32 << DP_TX_DESC_ID_POOL_OS) | (page_id << DP_TX_DESC_ID_PAGE_OS) | offset); tx_desc->id = id;