diff --git a/dp/inc/cdp_txrx_cmn.h b/dp/inc/cdp_txrx_cmn.h index 8ccff36289..6dcd25b905 100644 --- a/dp/inc/cdp_txrx_cmn.h +++ b/dp/inc/cdp_txrx_cmn.h @@ -175,18 +175,18 @@ 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_tx_desc_pool_s *tx_desc[2][4]; struct dp_hw_cookie_conversion_t *tx_cc_ctx[4]; - struct dp_tx_desc_pool_s *spcl_tx_desc[4]; + struct dp_tx_desc_pool_s *spcl_tx_desc[2][4]; struct dp_hw_cookie_conversion_t *spcl_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; + int tx_desc_pool_alloc_cnt[2]; + int tx_desc_pool_init_cnt[2]; int spcl_tx_cookie_ctx_alloc_cnt; - int spcl_tx_desc_pool_alloc_cnt; - int spcl_tx_desc_pool_init_cnt; + int spcl_tx_desc_pool_alloc_cnt[2]; + int spcl_tx_desc_pool_init_cnt[2]; }; /** diff --git a/dp/wifi3.0/dp_tx.c b/dp/wifi3.0/dp_tx.c index 380d552c7b..a58b94e14e 100644 --- a/dp/wifi3.0/dp_tx.c +++ b/dp/wifi3.0/dp_tx.c @@ -6525,7 +6525,7 @@ static QDF_STATUS dp_tx_alloc_static_pools(struct dp_soc *soc, int num_pool, /* Allocate software Tx descriptor pools */ - if (dp_global->tx_desc_pool_alloc_cnt == 0) { + if (dp_global->tx_desc_pool_alloc_cnt[soc->arch_id] == 0) { for (i = 0; i < num_pool; i++) { if (dp_tx_desc_pool_alloc(soc, i, num_desc, false)) { QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, @@ -6535,7 +6535,7 @@ static QDF_STATUS dp_tx_alloc_static_pools(struct dp_soc *soc, int num_pool, } } } - dp_global->tx_desc_pool_alloc_cnt++; + dp_global->tx_desc_pool_alloc_cnt[soc->arch_id]++; return QDF_STATUS_SUCCESS; fail: @@ -6554,7 +6554,7 @@ static QDF_STATUS dp_tx_spcl_alloc_static_pools(struct dp_soc *soc, dp_global = wlan_objmgr_get_global_ctx(); /* Allocate software Tx descriptor pools */ - if (dp_global->spcl_tx_desc_pool_alloc_cnt == 0) { + if (dp_global->spcl_tx_desc_pool_alloc_cnt[soc->arch_id] == 0) { for (j = 0; j < num_pool; j++) { if (dp_tx_desc_pool_alloc(soc, j, num_spcl_desc, true)) { QDF_TRACE(QDF_MODULE_ID_DP, @@ -6565,7 +6565,7 @@ static QDF_STATUS dp_tx_spcl_alloc_static_pools(struct dp_soc *soc, } } } - dp_global->spcl_tx_desc_pool_alloc_cnt++; + dp_global->spcl_tx_desc_pool_alloc_cnt[soc->arch_id]++; return QDF_STATUS_SUCCESS; fail: @@ -6582,7 +6582,7 @@ static QDF_STATUS dp_tx_init_static_pools(struct dp_soc *soc, int num_pool, dp_global = wlan_objmgr_get_global_ctx(); - if (dp_global->tx_desc_pool_init_cnt == 0) { + if (dp_global->tx_desc_pool_init_cnt[soc->arch_id] == 0) { for (i = 0; i < num_pool; i++) { if (dp_tx_desc_pool_init(soc, i, num_desc, false)) { QDF_TRACE(QDF_MODULE_ID_DP, @@ -6593,7 +6593,7 @@ static QDF_STATUS dp_tx_init_static_pools(struct dp_soc *soc, int num_pool, } } } - dp_global->tx_desc_pool_init_cnt++; + dp_global->tx_desc_pool_init_cnt[soc->arch_id]++; return QDF_STATUS_SUCCESS; } @@ -6605,7 +6605,7 @@ static QDF_STATUS dp_tx_spcl_init_static_pools(struct dp_soc *soc, int num_pool, dp_global = wlan_objmgr_get_global_ctx(); - if (dp_global->spcl_tx_desc_pool_init_cnt == 0) { + if (dp_global->spcl_tx_desc_pool_init_cnt[soc->arch_id] == 0) { for (i = 0; i < num_pool; i++) { if (dp_tx_desc_pool_init(soc, i, num_spcl_desc, true)) { QDF_TRACE(QDF_MODULE_ID_DP, @@ -6616,7 +6616,7 @@ static QDF_STATUS dp_tx_spcl_init_static_pools(struct dp_soc *soc, int num_pool, } } } - dp_global->spcl_tx_desc_pool_init_cnt++; + dp_global->spcl_tx_desc_pool_init_cnt[soc->arch_id]++; return QDF_STATUS_SUCCESS; } @@ -6627,8 +6627,8 @@ static void dp_tx_deinit_static_pools(struct dp_soc *soc, int num_pool) dp_global = wlan_objmgr_get_global_ctx(); - dp_global->tx_desc_pool_init_cnt--; - if (dp_global->tx_desc_pool_init_cnt == 0) { + dp_global->tx_desc_pool_init_cnt[soc->arch_id]--; + if (dp_global->tx_desc_pool_init_cnt[soc->arch_id] == 0) { for (i = 0; i < num_pool; i++) dp_tx_desc_pool_deinit(soc, i, false); } @@ -6641,8 +6641,8 @@ static void dp_tx_spcl_deinit_static_pools(struct dp_soc *soc, int num_pool) dp_global = wlan_objmgr_get_global_ctx(); - dp_global->spcl_tx_desc_pool_init_cnt--; - if (dp_global->spcl_tx_desc_pool_init_cnt == 0) { + dp_global->spcl_tx_desc_pool_init_cnt[soc->arch_id]--; + if (dp_global->spcl_tx_desc_pool_init_cnt[soc->arch_id] == 0) { for (i = 0; i < num_pool; i++) dp_tx_desc_pool_deinit(soc, i, true); } @@ -6655,8 +6655,8 @@ static void dp_tx_delete_static_pools(struct dp_soc *soc, int num_pool) dp_global = wlan_objmgr_get_global_ctx(); - dp_global->tx_desc_pool_alloc_cnt--; - if (dp_global->tx_desc_pool_alloc_cnt == 0) { + dp_global->tx_desc_pool_alloc_cnt[soc->arch_id]--; + if (dp_global->tx_desc_pool_alloc_cnt[soc->arch_id] == 0) { for (i = 0; i < num_pool; i++) dp_tx_desc_pool_free(soc, i, false); } @@ -6669,8 +6669,8 @@ static void dp_tx_spcl_delete_static_pools(struct dp_soc *soc, int num_pool) dp_global = wlan_objmgr_get_global_ctx(); - dp_global->spcl_tx_desc_pool_alloc_cnt--; - if (dp_global->spcl_tx_desc_pool_alloc_cnt == 0) { + dp_global->spcl_tx_desc_pool_alloc_cnt[soc->arch_id]--; + if (dp_global->spcl_tx_desc_pool_alloc_cnt[soc->arch_id] == 0) { for (i = 0; i < num_pool; i++) dp_tx_desc_pool_free(soc, i, true); } diff --git a/dp/wifi3.0/dp_tx.h b/dp/wifi3.0/dp_tx.h index d3926a3471..60b669afe3 100644 --- a/dp/wifi3.0/dp_tx.h +++ b/dp/wifi3.0/dp_tx.h @@ -1597,7 +1597,7 @@ struct dp_tx_desc_pool_s *dp_get_tx_desc_pool(struct dp_soc *soc, struct dp_global_context *dp_global = NULL; dp_global = wlan_objmgr_get_global_ctx(); - return dp_global->tx_desc[pool_id]; + return dp_global->tx_desc[soc->arch_id][pool_id]; } static inline @@ -1607,7 +1607,7 @@ struct dp_tx_desc_pool_s *dp_get_spcl_tx_desc_pool(struct dp_soc *soc, struct dp_global_context *dp_global = NULL; dp_global = wlan_objmgr_get_global_ctx(); - return dp_global->spcl_tx_desc[pool_id]; + return dp_global->spcl_tx_desc[soc->arch_id][pool_id]; } #else static inline diff --git a/dp/wifi3.0/dp_tx_desc.c b/dp/wifi3.0/dp_tx_desc.c index e13cb3ba0b..462a84529d 100644 --- a/dp/wifi3.0/dp_tx_desc.c +++ b/dp/wifi3.0/dp_tx_desc.c @@ -116,37 +116,50 @@ void dp_tx_desc_pool_cleanup(struct dp_soc *soc, qdf_nbuf_t *nbuf_list) #endif #ifdef QCA_SUPPORT_DP_GLOBAL_CTX -static void dp_tx_desc_pool_alloc_mem(int8_t pool_id, bool spcl_tx_desc) +static void dp_tx_desc_pool_alloc_mem(struct dp_soc *soc, int8_t pool_id, + bool spcl_tx_desc) { struct dp_global_context *dp_global = NULL; dp_global = wlan_objmgr_get_global_ctx(); if (spcl_tx_desc) { - dp_global->spcl_tx_desc[pool_id] = + dp_global->spcl_tx_desc[soc->arch_id][pool_id] = qdf_mem_malloc(sizeof(struct dp_tx_desc_pool_s)); } else { - dp_global->tx_desc[pool_id] = + dp_global->tx_desc[soc->arch_id][pool_id] = qdf_mem_malloc(sizeof(struct dp_tx_desc_pool_s)); } } -static void dp_tx_desc_pool_free_mem(int8_t pool_id, bool spcl_tx_desc) +static void dp_tx_desc_pool_free_mem(struct dp_soc *soc, int8_t pool_id, + bool spcl_tx_desc) { struct dp_global_context *dp_global = NULL; dp_global = wlan_objmgr_get_global_ctx(); - if (spcl_tx_desc) - qdf_mem_free(dp_global->spcl_tx_desc[pool_id]); - else - qdf_mem_free(dp_global->tx_desc[pool_id]); + if (spcl_tx_desc) { + if (!dp_global->spcl_tx_desc[soc->arch_id][pool_id]) + return; + + qdf_mem_free(dp_global->spcl_tx_desc[soc->arch_id][pool_id]); + dp_global->spcl_tx_desc[soc->arch_id][pool_id] = NULL; + } else { + if (!dp_global->tx_desc[soc->arch_id][pool_id]) + return; + + qdf_mem_free(dp_global->tx_desc[soc->arch_id][pool_id]); + dp_global->tx_desc[soc->arch_id][pool_id] = NULL; + } } #else -static void dp_tx_desc_pool_alloc_mem(int8_t pool_id, bool spcl_tx_desc) +static void dp_tx_desc_pool_alloc_mem(struct dp_soc *soc, int8_t pool_id, + bool spcl_tx_desc) { } -static void dp_tx_desc_pool_free_mem(int8_t pool_id, bool spcl_tx_desc) +static void dp_tx_desc_pool_free_mem(struct dp_soc *soc, int8_t pool_id, + bool spcl_tx_desc) { } #endif @@ -161,7 +174,7 @@ QDF_STATUS dp_tx_desc_pool_alloc(struct dp_soc *soc, uint8_t pool_id, desc_size = DP_TX_DESC_SIZE(sizeof(struct dp_tx_desc_s)); - dp_tx_desc_pool_alloc_mem(pool_id, spcl_tx_desc); + dp_tx_desc_pool_alloc_mem(soc, pool_id, spcl_tx_desc); if (spcl_tx_desc) { tx_desc_pool = dp_get_spcl_tx_desc_pool(soc, pool_id); desc_type = QDF_DP_TX_SPCL_DESC_TYPE; @@ -214,7 +227,7 @@ void dp_tx_desc_pool_free(struct dp_soc *soc, uint8_t pool_id, /* Free arch specific TX descriptor */ soc->arch_ops.dp_tx_desc_pool_free(soc, pool_id); - dp_tx_desc_pool_free_mem(pool_id, spcl_tx_desc); + dp_tx_desc_pool_free_mem(soc, pool_id, spcl_tx_desc); } QDF_STATUS dp_tx_desc_pool_init(struct dp_soc *soc, uint8_t pool_id,