From 82e9711f5b5642fd2ee8b4d53582bc12a1974d1c Mon Sep 17 00:00:00 2001 From: Neha Bisht Date: Wed, 9 Aug 2023 14:28:00 +0530 Subject: [PATCH] qcacmn: Move Tx desc pool to global context level Move Tx descriptor pool to global context level. Change-Id: Iff13a41f3bebbaa93e559c38842a596d47f4e534 CRs-Fixed: 3534184 --- dp/inc/cdp_txrx_cmn.h | 5 ++ dp/wifi3.0/be/dp_be.c | 180 +++++++++++++++++++++++++++++++++------ dp/wifi3.0/be/dp_be.h | 21 +++++ dp/wifi3.0/be/dp_be_tx.c | 6 +- dp/wifi3.0/dp_stats.c | 7 +- dp/wifi3.0/dp_tx.c | 67 ++++++++++----- dp/wifi3.0/dp_tx.h | 153 +++++++-------------------------- dp/wifi3.0/dp_tx_desc.c | 14 +-- dp/wifi3.0/dp_tx_desc.h | 15 ++-- dp/wifi3.0/li/dp_li_tx.c | 2 +- 10 files changed, 287 insertions(+), 183 deletions(-) diff --git a/dp/inc/cdp_txrx_cmn.h b/dp/inc/cdp_txrx_cmn.h index ff8895b661..d1e1683546 100644 --- a/dp/inc/cdp_txrx_cmn.h +++ b/dp/inc/cdp_txrx_cmn.h @@ -175,8 +175,13 @@ typedef void (*ipa_uc_op_cb_type)(uint8_t *op_msg, /* Global level structure for win contexts */ struct dp_global_context { struct dp_rx_fst *fst_ctx; + struct dp_tx_desc_pool_s *tx_desc[4]; + struct dp_hw_cookie_conversion_t *tx_cc_ctx[4]; qdf_atomic_t rx_fst_ref_cnt; qdf_atomic_t global_descriptor_in_use; + int tx_cookie_ctx_alloc_cnt; + int tx_desc_pool_alloc_cnt; + int tx_desc_pool_init_cnt; }; /** diff --git a/dp/wifi3.0/be/dp_be.c b/dp/wifi3.0/be/dp_be.c index 29a2a9ebf5..2df5cfae15 100644 --- a/dp/wifi3.0/be/dp_be.c +++ b/dp/wifi3.0/be/dp_be.c @@ -851,6 +851,153 @@ void dp_reo_shared_qaddr_detach(struct dp_soc *soc) soc->reo_qref.non_mlo_reo_qref_table_paddr, 0); } +#ifdef QCA_SUPPORT_DP_GLOBAL_CTX +static void dp_soc_tx_cookie_detach_be(struct dp_soc *soc) +{ + struct dp_soc_be *be_soc = dp_get_be_soc_from_dp_soc(soc); + int i = 0; + struct dp_global_context *dp_global; + + dp_global = wlan_objmgr_get_global_ctx(); + + dp_global->tx_cookie_ctx_alloc_cnt--; + if (dp_global->tx_cookie_ctx_alloc_cnt == 0) { + for (i = 0; i < MAX_TXDESC_POOLS; i++) { + dp_hw_cookie_conversion_detach(be_soc, + dp_global->tx_cc_ctx[i]); + qdf_mem_free(dp_global->tx_cc_ctx[i]); + } + } +} + +static QDF_STATUS dp_soc_tx_cookie_attach_be(struct dp_soc *soc) +{ + struct dp_soc_be *be_soc = dp_get_be_soc_from_dp_soc(soc); + struct dp_hw_cookie_conversion_t *cc_ctx; + struct dp_global_context *dp_global; + uint32_t num_entries; + int i = 0; + QDF_STATUS qdf_status; + + dp_global = wlan_objmgr_get_global_ctx(); + if (dp_global->tx_cookie_ctx_alloc_cnt == 0) { + for (i = 0; i < MAX_TXDESC_POOLS; i++) { + dp_global->tx_cc_ctx[i] = + qdf_mem_malloc( + sizeof(struct dp_hw_cookie_conversion_t)); + cc_ctx = dp_global->tx_cc_ctx[i]; + num_entries = wlan_cfg_get_num_tx_desc( + soc->wlan_cfg_ctx); + qdf_status = + dp_hw_cookie_conversion_attach( + be_soc, + cc_ctx, + num_entries, + QDF_DP_TX_DESC_TYPE, i); + if (!QDF_IS_STATUS_SUCCESS(qdf_status)) + return QDF_STATUS_E_FAILURE; + } + } + dp_global->tx_cookie_ctx_alloc_cnt++; + return QDF_STATUS_SUCCESS; +} + +static void dp_soc_tx_cookie_deinit_be(struct dp_soc *soc) +{ + struct dp_soc_be *be_soc = dp_get_be_soc_from_dp_soc(soc); + struct dp_global_context *dp_global; + int i = 0; + + dp_global = wlan_objmgr_get_global_ctx(); + + for (i = 0; i < MAX_TXDESC_POOLS; i++) + dp_hw_cookie_conversion_deinit( + be_soc, + dp_global->tx_cc_ctx[i]); +} + +static QDF_STATUS dp_soc_tx_cookie_init_be(struct dp_soc *soc) +{ + struct dp_soc_be *be_soc = dp_get_be_soc_from_dp_soc(soc); + struct dp_global_context *dp_global; + struct dp_hw_cookie_conversion_t *cc_ctx; + QDF_STATUS qdf_status; + int i = 0; + + dp_global = wlan_objmgr_get_global_ctx(); + for (i = 0; i < MAX_TXDESC_POOLS; i++) { + cc_ctx = dp_global->tx_cc_ctx[i]; + qdf_status = + dp_hw_cookie_conversion_init(be_soc, + cc_ctx); + if (!QDF_IS_STATUS_SUCCESS(qdf_status)) + return QDF_STATUS_E_FAILURE; + } + return QDF_STATUS_SUCCESS; +} +#else +static void dp_soc_tx_cookie_detach_be(struct dp_soc *soc) +{ + struct dp_soc_be *be_soc = dp_get_be_soc_from_dp_soc(soc); + int i = 0; + + for (i = 0; i < MAX_TXDESC_POOLS; i++) { + dp_hw_cookie_conversion_detach( + be_soc, + &be_soc->tx_cc_ctx[i]); + } +} + +static QDF_STATUS dp_soc_tx_cookie_attach_be(struct dp_soc *soc) +{ + struct dp_soc_be *be_soc = dp_get_be_soc_from_dp_soc(soc); + uint32_t num_entries; + int i = 0; + QDF_STATUS qdf_status; + + for (i = 0; i < MAX_TXDESC_POOLS; i++) { + num_entries = wlan_cfg_get_num_tx_desc(soc->wlan_cfg_ctx); + qdf_status = + dp_hw_cookie_conversion_attach( + be_soc, + &be_soc->tx_cc_ctx[i], + num_entries, + QDF_DP_TX_DESC_TYPE, i); + if (!QDF_IS_STATUS_SUCCESS(qdf_status)) + return QDF_STATUS_E_FAILURE; + } + return QDF_STATUS_SUCCESS; +} + +static void dp_soc_tx_cookie_deinit_be(struct dp_soc *soc) +{ + struct dp_soc_be *be_soc = dp_get_be_soc_from_dp_soc(soc); + int i = 0; + + for (i = 0; i < MAX_TXDESC_POOLS; i++) + dp_hw_cookie_conversion_deinit( + be_soc, + &be_soc->tx_cc_ctx[i]); +} + +static QDF_STATUS dp_soc_tx_cookie_init_be(struct dp_soc *soc) +{ + struct dp_soc_be *be_soc = dp_get_be_soc_from_dp_soc(soc); + int i = 0; + QDF_STATUS qdf_status; + + for (i = 0; i < MAX_TXDESC_POOLS; i++) { + qdf_status = + dp_hw_cookie_conversion_init( + be_soc, + &be_soc->tx_cc_ctx[i]); + if (!QDF_IS_STATUS_SUCCESS(qdf_status)) + return QDF_STATUS_E_FAILURE; + } + return QDF_STATUS_SUCCESS; +} +#endif + static QDF_STATUS dp_soc_detach_be(struct dp_soc *soc) { struct dp_soc_be *be_soc = dp_get_be_soc_from_dp_soc(soc); @@ -862,10 +1009,7 @@ static QDF_STATUS dp_soc_detach_be(struct dp_soc *soc) mlo_dev_obj = dp_get_mlo_dev_list_obj(be_soc); dp_mlo_dev_ctxt_list_detach_wrapper(mlo_dev_obj); - - for (i = 0; i < MAX_TXDESC_POOLS; i++) - dp_hw_cookie_conversion_detach(be_soc, - &be_soc->tx_cc_ctx[i]); + dp_soc_tx_cookie_detach_be(soc); for (i = 0; i < MAX_RXDESC_POOLS; i++) dp_hw_cookie_conversion_detach(be_soc, @@ -917,6 +1061,7 @@ static void dp_rx_fst_get_ref_be(void) if (dp_global) qdf_atomic_inc(&dp_global->rx_fst_ref_cnt); } + #else static void dp_set_rx_fst_be(struct dp_rx_fst *fst) { @@ -1127,16 +1272,9 @@ static QDF_STATUS dp_soc_attach_be(struct dp_soc *soc, if (!QDF_IS_STATUS_SUCCESS(qdf_status)) goto fail; - for (i = 0; i < MAX_TXDESC_POOLS; i++) { - num_entries = wlan_cfg_get_num_tx_desc(soc->wlan_cfg_ctx); - qdf_status = - dp_hw_cookie_conversion_attach(be_soc, - &be_soc->tx_cc_ctx[i], - num_entries, - QDF_DP_TX_DESC_TYPE, i); - if (!QDF_IS_STATUS_SUCCESS(qdf_status)) - goto fail; - } + qdf_status = dp_soc_tx_cookie_attach_be(soc); + if (!QDF_IS_STATUS_SUCCESS(qdf_status)) + goto fail; for (i = 0; i < MAX_RXDESC_POOLS; i++) { num_entries = @@ -1167,9 +1305,7 @@ static QDF_STATUS dp_soc_deinit_be(struct dp_soc *soc) dp_ppeds_stop_soc_be(soc); dp_tx_deinit_bank_profiles(be_soc); - for (i = 0; i < MAX_TXDESC_POOLS; i++) - dp_hw_cookie_conversion_deinit(be_soc, - &be_soc->tx_cc_ctx[i]); + dp_soc_tx_cookie_deinit_be(soc); for (i = 0; i < MAX_RXDESC_POOLS; i++) dp_hw_cookie_conversion_deinit(be_soc, @@ -1212,13 +1348,9 @@ static void *dp_soc_init_be(struct dp_soc *soc, HTC_HANDLE htc_handle, dp_ppeds_init_soc_be(soc); - for (i = 0; i < MAX_TXDESC_POOLS; i++) { - qdf_status = - dp_hw_cookie_conversion_init(be_soc, - &be_soc->tx_cc_ctx[i]); - if (!QDF_IS_STATUS_SUCCESS(qdf_status)) - goto fail; - } + qdf_status = dp_soc_tx_cookie_init_be(soc); + if (!QDF_IS_STATUS_SUCCESS(qdf_status)) + goto fail; for (i = 0; i < MAX_RXDESC_POOLS; i++) { qdf_status = diff --git a/dp/wifi3.0/be/dp_be.h b/dp/wifi3.0/be/dp_be.h index 526982e754..f3cae97463 100644 --- a/dp/wifi3.0/be/dp_be.h +++ b/dp/wifi3.0/be/dp_be.h @@ -644,6 +644,27 @@ dp_get_mlo_dev_list_obj(struct dp_soc_be *be_soc) } #endif +#ifdef QCA_SUPPORT_DP_GLOBAL_CTX +static inline +struct dp_hw_cookie_conversion_t *dp_get_tx_cookie_t(struct dp_soc *soc, + uint8_t pool_id) +{ + struct dp_global_context *dp_global = NULL; + + dp_global = wlan_objmgr_get_global_ctx(); + return dp_global->tx_cc_ctx[pool_id]; +} +#else +static inline +struct dp_hw_cookie_conversion_t *dp_get_tx_cookie_t(struct dp_soc *soc, + uint8_t pool_id) +{ + struct dp_soc_be *be_soc = dp_get_be_soc_from_dp_soc(soc); + + return &be_soc->tx_cc_ctx[pool_id]; +} +#endif + /** * dp_mlo_peer_find_hash_attach_be() - API to initialize ML peer hash table * @mld_hash_obj: Peer has object diff --git a/dp/wifi3.0/be/dp_be_tx.c b/dp/wifi3.0/be/dp_be_tx.c index 77f4f03324..d70c3aa565 100644 --- a/dp/wifi3.0/be/dp_be_tx.c +++ b/dp/wifi3.0/be/dp_be_tx.c @@ -1626,8 +1626,8 @@ QDF_STATUS dp_tx_desc_pool_init_be(struct dp_soc *soc, } be_soc = dp_get_be_soc_from_dp_soc(soc); - tx_desc_pool = &soc->tx_desc[pool_id]; - cc_ctx = &be_soc->tx_cc_ctx[pool_id]; + tx_desc_pool = dp_get_tx_desc_pool(soc, pool_id); + cc_ctx = dp_get_tx_cookie_t(soc, pool_id); tx_desc = tx_desc_pool->freelist; page_desc = &cc_ctx->page_desc_base[0]; @@ -1669,7 +1669,7 @@ void dp_tx_desc_pool_deinit_be(struct dp_soc *soc, struct dp_hw_cookie_conversion_t *cc_ctx; be_soc = dp_get_be_soc_from_dp_soc(soc); - cc_ctx = &be_soc->tx_cc_ctx[pool_id]; + cc_ctx = dp_get_tx_cookie_t(soc, pool_id); for (i = 0; i < cc_ctx->total_page_num; i++) { page_desc = &cc_ctx->page_desc_base[i]; diff --git a/dp/wifi3.0/dp_stats.c b/dp/wifi3.0/dp_stats.c index b1a32f68b0..e77f84161f 100644 --- a/dp/wifi3.0/dp_stats.c +++ b/dp/wifi3.0/dp_stats.c @@ -6237,6 +6237,7 @@ dp_print_rx_err_stats(struct dp_soc *soc, struct dp_pdev *pdev) void dp_print_soc_tx_stats(struct dp_soc *soc) { uint8_t desc_pool_id; + struct dp_tx_desc_pool_s *tx_desc_pool; soc->stats.tx.desc_in_use = 0; @@ -6244,9 +6245,11 @@ void dp_print_soc_tx_stats(struct dp_soc *soc) for (desc_pool_id = 0; desc_pool_id < wlan_cfg_get_num_tx_desc_pool(soc->wlan_cfg_ctx); - desc_pool_id++) + desc_pool_id++) { + tx_desc_pool = dp_get_tx_desc_pool(soc, desc_pool_id); soc->stats.tx.desc_in_use += - soc->tx_desc[desc_pool_id].num_allocated; + tx_desc_pool->num_allocated; + } DP_PRINT_STATS("Tx Descriptors In Use = %u", soc->stats.tx.desc_in_use); diff --git a/dp/wifi3.0/dp_tx.c b/dp/wifi3.0/dp_tx.c index ef973e0d06..bb96c80a59 100644 --- a/dp/wifi3.0/dp_tx.c +++ b/dp/wifi3.0/dp_tx.c @@ -5655,8 +5655,9 @@ dp_tx_comp_process_desc_list_fast(struct dp_soc *soc, uint8_t ring_id, uint32_t fast_desc_count) { - struct dp_tx_desc_pool_s *pool = &soc->tx_desc[head_desc->pool_id]; + struct dp_tx_desc_pool_s *pool = NULL; + pool = dp_get_tx_desc_pool(soc, head_desc->pool_id); dp_tx_outstanding_sub(head_desc->pdev, fast_desc_count); dp_tx_desc_free_list(pool, head_desc, tail_desc, fast_desc_count); } @@ -5726,7 +5727,6 @@ dp_tx_comp_process_desc_list(struct dp_soc *soc, false); qdf_assert(pdev); dp_tx_outstanding_dec(pdev); - /* * Calling a QDF WRAPPER here is creating significant * performance impact so avoided the wrapper call here @@ -6331,11 +6331,14 @@ static inline void dp_tx_desc_reset_vdev(struct dp_soc *soc, struct dp_tx_desc_s *tx_desc, uint8_t desc_pool_id) { - TX_DESC_LOCK_LOCK(&soc->tx_desc[desc_pool_id].lock); + struct dp_tx_desc_pool_s *pool = NULL; + + pool = dp_get_tx_desc_pool(soc, desc_pool_id); + TX_DESC_LOCK_LOCK(&pool->lock); tx_desc->vdev_id = DP_INVALID_VDEV_ID; - TX_DESC_LOCK_UNLOCK(&soc->tx_desc[desc_pool_id].lock); + TX_DESC_LOCK_UNLOCK(&pool->lock); } void dp_tx_desc_flush(struct dp_pdev *pdev, struct dp_vdev *vdev, @@ -6358,7 +6361,7 @@ void dp_tx_desc_flush(struct dp_pdev *pdev, struct dp_vdev *vdev, num_pool = wlan_cfg_get_num_tx_desc_pool(soc->wlan_cfg_ctx); for (i = 0; i < num_pool; i++) { - tx_desc_pool = &soc->tx_desc[i]; + tx_desc_pool = dp_get_tx_desc_pool(soc, i); if (!tx_desc_pool->desc_pages.cacheable_pages) continue; @@ -6433,16 +6436,23 @@ static QDF_STATUS dp_tx_alloc_static_pools(struct dp_soc *soc, int num_pool, uint32_t num_desc) { uint8_t i, count; + struct dp_global_context *dp_global; + + dp_global = wlan_objmgr_get_global_ctx(); /* Allocate software Tx descriptor pools */ - for (i = 0; i < num_pool; i++) { - if (dp_tx_desc_pool_alloc(soc, i, num_desc)) { + + if (dp_global->tx_desc_pool_alloc_cnt == 0) { + for (i = 0; i < num_pool; i++) { + if (dp_tx_desc_pool_alloc(soc, i, num_desc)) { QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, FL("Tx Desc Pool alloc %d failed %pK"), i, soc); - goto fail; + goto fail; + } } } + dp_global->tx_desc_pool_alloc_cnt++; return QDF_STATUS_SUCCESS; fail: @@ -6456,33 +6466,52 @@ static QDF_STATUS dp_tx_init_static_pools(struct dp_soc *soc, int num_pool, uint32_t num_desc) { uint8_t i; - for (i = 0; i < num_pool; i++) { - if (dp_tx_desc_pool_init(soc, i, num_desc)) { - QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, - FL("Tx Desc Pool init %d failed %pK"), - i, soc); - return QDF_STATUS_E_NOMEM; + struct dp_global_context *dp_global; + + dp_global = wlan_objmgr_get_global_ctx(); + + if (dp_global->tx_desc_pool_init_cnt == 0) { + for (i = 0; i < num_pool; i++) { + if (dp_tx_desc_pool_init(soc, i, num_desc)) { + QDF_TRACE(QDF_MODULE_ID_DP, + QDF_TRACE_LEVEL_ERROR, + FL("Tx Desc Pool init %d failed %pK"), + i, soc); + return QDF_STATUS_E_NOMEM; + } } } + dp_global->tx_desc_pool_init_cnt++; return QDF_STATUS_SUCCESS; } static void dp_tx_deinit_static_pools(struct dp_soc *soc, int num_pool) { uint8_t i; + struct dp_global_context *dp_global; - for (i = 0; i < num_pool; i++) - dp_tx_desc_pool_deinit(soc, i); + dp_global = wlan_objmgr_get_global_ctx(); + + dp_global->tx_desc_pool_init_cnt--; + if (dp_global->tx_desc_pool_init_cnt == 0) { + for (i = 0; i < num_pool; i++) + dp_tx_desc_pool_deinit(soc, i); + } } static void dp_tx_delete_static_pools(struct dp_soc *soc, int num_pool) { uint8_t i; + struct dp_global_context *dp_global; - for (i = 0; i < num_pool; i++) - dp_tx_desc_pool_free(soc, i); + dp_global = wlan_objmgr_get_global_ctx(); + + dp_global->tx_desc_pool_alloc_cnt--; + if (dp_global->tx_desc_pool_alloc_cnt == 0) { + for (i = 0; i < num_pool; i++) + dp_tx_desc_pool_free(soc, i); + } } - #endif /* !QCA_LL_TX_FLOW_CONTROL_V2 */ /** diff --git a/dp/wifi3.0/dp_tx.h b/dp/wifi3.0/dp_tx.h index b08c90496e..466aee54df 100644 --- a/dp/wifi3.0/dp_tx.h +++ b/dp/wifi3.0/dp_tx.h @@ -1588,6 +1588,25 @@ bool dp_tx_pkt_tracepoints_enabled(void) qdf_trace_dp_tx_comp_pkt_enabled()); } +#ifdef QCA_SUPPORT_DP_GLOBAL_CTX +static inline +struct dp_tx_desc_pool_s *dp_get_tx_desc_pool(struct dp_soc *soc, + uint8_t pool_id) +{ + struct dp_global_context *dp_global = NULL; + + dp_global = wlan_objmgr_get_global_ctx(); + return dp_global->tx_desc[pool_id]; +} +#else +static inline +struct dp_tx_desc_pool_s *dp_get_tx_desc_pool(struct dp_soc *soc, + uint8_t pool_id) +{ + return &soc->tx_desc[pool_id]; +} +#endif + #ifdef DP_TX_TRACKING /** * dp_tx_desc_set_timestamp() - set timestamp in tx descriptor @@ -1750,63 +1769,6 @@ static inline bool is_spl_packet(qdf_nbuf_t nbuf) } #ifdef QCA_SUPPORT_DP_GLOBAL_CTX -/** - * is_dp_spl_tx_limit_reached - Check if the packet is a special packet to allow - * allocation if allocated tx descriptors are within the global max limit - * and pdev max limit. - * @vdev: DP vdev handle - * @nbuf: network buffer - * - * Return: true if allocated tx descriptors reached max configured value, else - * false - */ -static inline bool -is_dp_spl_tx_limit_reached(struct dp_vdev *vdev, qdf_nbuf_t nbuf) -{ - struct dp_pdev *pdev = vdev->pdev; - struct dp_soc *soc = pdev->soc; - struct dp_global_context *dp_global; - uint32_t global_tx_desc_allowed; - - dp_global = wlan_objmgr_get_global_ctx(); - global_tx_desc_allowed = - wlan_cfg_get_num_global_tx_desc(soc->wlan_cfg_ctx); - - if (is_spl_packet(nbuf)) { - if (dp_tx_get_global_desc_in_use(dp_global) >= - global_tx_desc_allowed) - return true; - - if (qdf_atomic_read(&pdev->num_tx_outstanding) >= - pdev->num_tx_allowed) - return true; - - return false; - } - - return true; -} - -static inline bool -__dp_tx_limit_check(struct dp_soc *soc) -{ - struct dp_global_context *dp_global; - uint32_t global_tx_desc_allowed; - uint32_t global_tx_desc_reg_allowed; - uint32_t global_tx_desc_spcl_allowed; - - dp_global = wlan_objmgr_get_global_ctx(); - global_tx_desc_allowed = - wlan_cfg_get_num_global_tx_desc(soc->wlan_cfg_ctx); - global_tx_desc_spcl_allowed = - wlan_cfg_get_num_global_spcl_tx_desc(soc->wlan_cfg_ctx); - global_tx_desc_reg_allowed = global_tx_desc_allowed - - global_tx_desc_spcl_allowed; - - return (dp_tx_get_global_desc_in_use(dp_global) >= - global_tx_desc_reg_allowed); -} - /** * dp_tx_limit_check - Check if allocated tx descriptors reached * global max reg limit and pdev max reg limit for regular packets. Also check @@ -1821,27 +1783,12 @@ __dp_tx_limit_check(struct dp_soc *soc) static inline bool dp_tx_limit_check(struct dp_vdev *vdev, qdf_nbuf_t nbuf) { - struct dp_pdev *pdev = vdev->pdev; - struct dp_soc *soc = pdev->soc; + return false; +} - if (__dp_tx_limit_check(soc)) { - if (is_dp_spl_tx_limit_reached(vdev, nbuf)) { - dp_tx_info("queued packets are more than max tx, drop the frame"); - DP_STATS_INC(vdev, tx_i.dropped.desc_na.num, 1); - return true; - } - } - - if (qdf_atomic_read(&pdev->num_tx_outstanding) >= - pdev->num_reg_tx_allowed) { - if (is_dp_spl_tx_limit_reached(vdev, nbuf)) { - dp_tx_info("queued packets are more than max tx, drop the frame"); - DP_STATS_INC(vdev, tx_i.dropped.desc_na.num, 1); - DP_STATS_INC(vdev, - tx_i.dropped.desc_na_exc_outstand.num, 1); - return true; - } - } +static inline bool +__dp_tx_limit_check(struct dp_soc *soc) +{ return false; } #else @@ -1947,16 +1894,6 @@ dp_tx_exception_limit_check(struct dp_vdev *vdev) } #ifdef QCA_SUPPORT_DP_GLOBAL_CTX -static inline void -__dp_tx_outstanding_inc(struct dp_soc *soc) -{ - struct dp_global_context *dp_global; - - dp_global = wlan_objmgr_get_global_ctx(); - - qdf_atomic_inc(&dp_global->global_descriptor_in_use); -} - /** * dp_tx_outstanding_inc - Inc outstanding tx desc values on global and pdev * @pdev: DP pdev handle @@ -1966,20 +1903,18 @@ __dp_tx_outstanding_inc(struct dp_soc *soc) static inline void dp_tx_outstanding_inc(struct dp_pdev *pdev) { - __dp_tx_outstanding_inc(pdev->soc); - qdf_atomic_inc(&pdev->num_tx_outstanding); - dp_update_tx_desc_stats(pdev); +} + +static inline void +__dp_tx_outstanding_inc(struct dp_soc *soc) +{ } static inline void __dp_tx_outstanding_dec(struct dp_soc *soc) { - struct dp_global_context *dp_global; - - dp_global = wlan_objmgr_get_global_ctx(); - - qdf_atomic_dec(&dp_global->global_descriptor_in_use); } + /** * dp_tx_outstanding_dec - Dec outstanding tx desc values on global and pdev * @pdev: DP pdev handle @@ -1989,28 +1924,6 @@ __dp_tx_outstanding_dec(struct dp_soc *soc) static inline void dp_tx_outstanding_dec(struct dp_pdev *pdev) { - struct dp_soc *soc = pdev->soc; - - __dp_tx_outstanding_dec(soc); - qdf_atomic_dec(&pdev->num_tx_outstanding); - dp_update_tx_desc_stats(pdev); -} - -/** - * __dp_tx_outstanding_sub - Sub outstanding tx desc values from global list - * @soc: DP soc handle - * @count: count of descs to subtract from outstanding - * - * Return: void - */ -static inline void -__dp_tx_outstanding_sub(struct dp_soc *soc, uint32_t count) -{ - struct dp_global_context *dp_global; - - dp_global = wlan_objmgr_get_global_ctx(); - - qdf_atomic_sub(count, &dp_global->global_descriptor_in_use); } /** @@ -2023,13 +1936,7 @@ __dp_tx_outstanding_sub(struct dp_soc *soc, uint32_t count) static inline void dp_tx_outstanding_sub(struct dp_pdev *pdev, uint32_t count) { - struct dp_soc *soc = pdev->soc; - - __dp_tx_outstanding_sub(soc, count); - qdf_atomic_sub(count, &pdev->num_tx_outstanding); - dp_update_tx_desc_stats(pdev); } - #else static inline void diff --git a/dp/wifi3.0/dp_tx_desc.c b/dp/wifi3.0/dp_tx_desc.c index 941a8d50d3..a3cdfdf665 100644 --- a/dp/wifi3.0/dp_tx_desc.c +++ b/dp/wifi3.0/dp_tx_desc.c @@ -102,7 +102,7 @@ void dp_tx_desc_pool_cleanup(struct dp_soc *soc, qdf_nbuf_t *nbuf_list) uint32_t num_pool = wlan_cfg_get_num_tx_desc_pool(soc->wlan_cfg_ctx); for (i = 0; i < num_pool; i++) { - tx_desc_pool = &soc->tx_desc[i]; + tx_desc_pool = dp_get_tx_desc_pool(soc, i); if (tx_desc_pool) qdf_tx_desc_pool_free_bufs(soc, @@ -124,7 +124,9 @@ QDF_STATUS dp_tx_desc_pool_alloc(struct dp_soc *soc, uint8_t pool_id, num_elem_t = dp_get_updated_tx_desc(soc->ctrl_psoc, pool_id, num_elem); desc_size = DP_TX_DESC_SIZE(sizeof(struct dp_tx_desc_s)); - tx_desc_pool = &((soc)->tx_desc[(pool_id)]); + + tx_desc_pool = dp_get_tx_desc_pool(soc, pool_id); + tx_desc_pool->desc_pages.page_size = DP_BLOCKMEM_SIZE; dp_desc_multi_pages_mem_alloc(soc, QDF_DP_TX_DESC_TYPE, &tx_desc_pool->desc_pages, @@ -150,7 +152,7 @@ void dp_tx_desc_pool_free(struct dp_soc *soc, uint8_t pool_id) { struct dp_tx_desc_pool_s *tx_desc_pool; - tx_desc_pool = &((soc)->tx_desc[pool_id]); + tx_desc_pool = dp_get_tx_desc_pool(soc, pool_id); if (tx_desc_pool->desc_pages.num_pages) dp_desc_multi_pages_mem_free(soc, QDF_DP_TX_DESC_TYPE, @@ -164,13 +166,13 @@ void dp_tx_desc_pool_free(struct dp_soc *soc, uint8_t pool_id) QDF_STATUS dp_tx_desc_pool_init(struct dp_soc *soc, uint8_t pool_id, uint32_t num_elem) { - struct dp_tx_desc_pool_s *tx_desc_pool; + struct dp_tx_desc_pool_s *tx_desc_pool = NULL; uint32_t desc_size, num_elem_t; desc_size = DP_TX_DESC_SIZE(sizeof(struct dp_tx_desc_s)); num_elem_t = dp_get_updated_tx_desc(soc->ctrl_psoc, pool_id, num_elem); - tx_desc_pool = &soc->tx_desc[pool_id]; + tx_desc_pool = dp_get_tx_desc_pool(soc, pool_id); if (qdf_mem_multi_page_link(soc->osdev, &tx_desc_pool->desc_pages, desc_size, num_elem_t, true)) { @@ -199,7 +201,7 @@ void dp_tx_desc_pool_deinit(struct dp_soc *soc, uint8_t pool_id) { struct dp_tx_desc_pool_s *tx_desc_pool; - tx_desc_pool = &soc->tx_desc[pool_id]; + tx_desc_pool = dp_get_tx_desc_pool(soc, pool_id); soc->arch_ops.dp_tx_desc_pool_deinit(soc, tx_desc_pool, pool_id); TX_DESC_POOL_MEMBER_CLEAN(tx_desc_pool); TX_DESC_LOCK_DESTROY(&tx_desc_pool->lock); diff --git a/dp/wifi3.0/dp_tx_desc.h b/dp/wifi3.0/dp_tx_desc.h index 3d1f7b8ca6..9a0964985b 100644 --- a/dp/wifi3.0/dp_tx_desc.h +++ b/dp/wifi3.0/dp_tx_desc.h @@ -990,7 +990,9 @@ static inline struct dp_tx_desc_s *dp_tx_desc_alloc(struct dp_soc *soc, uint8_t desc_pool_id) { struct dp_tx_desc_s *tx_desc = NULL; - struct dp_tx_desc_pool_s *pool = &soc->tx_desc[desc_pool_id]; + struct dp_tx_desc_pool_s *pool = NULL; + + pool = dp_get_tx_desc_pool(soc, desc_pool_id); TX_DESC_LOCK_LOCK(&pool->lock); @@ -1030,7 +1032,9 @@ static inline struct dp_tx_desc_s *dp_tx_desc_alloc_multiple( { struct dp_tx_desc_s *c_desc = NULL, *h_desc = NULL; uint8_t count; - struct dp_tx_desc_pool_s *pool = &soc->tx_desc[desc_pool_id]; + struct dp_tx_desc_pool_s *pool = NULL; + + pool = dp_get_tx_desc_pool(soc, desc_pool_id); TX_DESC_LOCK_LOCK(&pool->lock); @@ -1075,8 +1079,7 @@ dp_tx_desc_free(struct dp_soc *soc, struct dp_tx_desc_s *tx_desc, { struct dp_tx_desc_pool_s *pool = NULL; - dp_tx_desc_clear(tx_desc); - pool = &soc->tx_desc[desc_pool_id]; + pool = dp_get_tx_desc_pool(soc, desc_pool_id); TX_DESC_LOCK_LOCK(&pool->lock); tx_desc->next = pool->freelist; pool->freelist = tx_desc; @@ -1221,7 +1224,9 @@ static inline void dp_tx_desc_update_fast_comp_flag(struct dp_soc *soc, 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) { - struct dp_tx_desc_pool_s *tx_desc_pool = &soc->tx_desc[pool_id]; + struct dp_tx_desc_pool_s *tx_desc_pool = NULL; + + tx_desc_pool = 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_tx.c b/dp/wifi3.0/li/dp_li_tx.c index 3a50e8ae9a..48df54da7e 100644 --- a/dp/wifi3.0/li/dp_li_tx.c +++ b/dp/wifi3.0/li/dp_li_tx.c @@ -577,7 +577,7 @@ QDF_STATUS dp_tx_desc_pool_init_li(struct dp_soc *soc, struct dp_tx_desc_pool_s *tx_desc_pool; uint16_t num_desc_per_page; - tx_desc_pool = &soc->tx_desc[pool_id]; + tx_desc_pool = dp_get_tx_desc_pool(soc, pool_id); tx_desc = tx_desc_pool->freelist; count = 0; pool_id_32 = (uint32_t)pool_id;