qcacmn: Add TX global desc pool per arch type

As cookie format is different between LI and BE have
different global descriptor pool for Lithium and
Beryllium

Change-Id: Idd222f4009c017a1bc4bc4b14043b36d927a9e27
CRs-Fixed: 3608792
This commit is contained in:
Chaithanya Garrepalli
2023-09-08 02:20:37 +05:30
committed by Rahul Choudhary
parent e762867930
commit 31c9403303
4 changed files with 49 additions and 36 deletions

View File

@@ -175,18 +175,18 @@ typedef void (*ipa_uc_op_cb_type)(uint8_t *op_msg,
/* Global level structure for win contexts */ /* Global level structure for win contexts */
struct dp_global_context { struct dp_global_context {
struct dp_rx_fst *fst_ctx; 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_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]; struct dp_hw_cookie_conversion_t *spcl_tx_cc_ctx[4];
qdf_atomic_t rx_fst_ref_cnt; qdf_atomic_t rx_fst_ref_cnt;
qdf_atomic_t global_descriptor_in_use; qdf_atomic_t global_descriptor_in_use;
int tx_cookie_ctx_alloc_cnt; int tx_cookie_ctx_alloc_cnt;
int tx_desc_pool_alloc_cnt; int tx_desc_pool_alloc_cnt[2];
int tx_desc_pool_init_cnt; int tx_desc_pool_init_cnt[2];
int spcl_tx_cookie_ctx_alloc_cnt; int spcl_tx_cookie_ctx_alloc_cnt;
int spcl_tx_desc_pool_alloc_cnt; int spcl_tx_desc_pool_alloc_cnt[2];
int spcl_tx_desc_pool_init_cnt; int spcl_tx_desc_pool_init_cnt[2];
}; };
/** /**

View File

@@ -6525,7 +6525,7 @@ static QDF_STATUS dp_tx_alloc_static_pools(struct dp_soc *soc, int num_pool,
/* Allocate software Tx descriptor pools */ /* 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++) { for (i = 0; i < num_pool; i++) {
if (dp_tx_desc_pool_alloc(soc, i, num_desc, false)) { if (dp_tx_desc_pool_alloc(soc, i, num_desc, false)) {
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, 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; return QDF_STATUS_SUCCESS;
fail: 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(); dp_global = wlan_objmgr_get_global_ctx();
/* Allocate software Tx descriptor pools */ /* 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++) { for (j = 0; j < num_pool; j++) {
if (dp_tx_desc_pool_alloc(soc, j, num_spcl_desc, true)) { if (dp_tx_desc_pool_alloc(soc, j, num_spcl_desc, true)) {
QDF_TRACE(QDF_MODULE_ID_DP, 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; return QDF_STATUS_SUCCESS;
fail: 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(); 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++) { for (i = 0; i < num_pool; i++) {
if (dp_tx_desc_pool_init(soc, i, num_desc, false)) { if (dp_tx_desc_pool_init(soc, i, num_desc, false)) {
QDF_TRACE(QDF_MODULE_ID_DP, 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; 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(); 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++) { for (i = 0; i < num_pool; i++) {
if (dp_tx_desc_pool_init(soc, i, num_spcl_desc, true)) { if (dp_tx_desc_pool_init(soc, i, num_spcl_desc, true)) {
QDF_TRACE(QDF_MODULE_ID_DP, 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; 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 = wlan_objmgr_get_global_ctx();
dp_global->tx_desc_pool_init_cnt--; dp_global->tx_desc_pool_init_cnt[soc->arch_id]--;
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++) for (i = 0; i < num_pool; i++)
dp_tx_desc_pool_deinit(soc, i, false); 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 = wlan_objmgr_get_global_ctx();
dp_global->spcl_tx_desc_pool_init_cnt--; dp_global->spcl_tx_desc_pool_init_cnt[soc->arch_id]--;
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++) for (i = 0; i < num_pool; i++)
dp_tx_desc_pool_deinit(soc, i, true); 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 = wlan_objmgr_get_global_ctx();
dp_global->tx_desc_pool_alloc_cnt--; dp_global->tx_desc_pool_alloc_cnt[soc->arch_id]--;
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++) for (i = 0; i < num_pool; i++)
dp_tx_desc_pool_free(soc, i, false); 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 = wlan_objmgr_get_global_ctx();
dp_global->spcl_tx_desc_pool_alloc_cnt--; dp_global->spcl_tx_desc_pool_alloc_cnt[soc->arch_id]--;
if (dp_global->spcl_tx_desc_pool_alloc_cnt == 0) { if (dp_global->spcl_tx_desc_pool_alloc_cnt[soc->arch_id] == 0) {
for (i = 0; i < num_pool; i++) for (i = 0; i < num_pool; i++)
dp_tx_desc_pool_free(soc, i, true); dp_tx_desc_pool_free(soc, i, true);
} }

View File

@@ -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; struct dp_global_context *dp_global = NULL;
dp_global = wlan_objmgr_get_global_ctx(); 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 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; struct dp_global_context *dp_global = NULL;
dp_global = wlan_objmgr_get_global_ctx(); 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 #else
static inline static inline

View File

@@ -116,37 +116,50 @@ void dp_tx_desc_pool_cleanup(struct dp_soc *soc, qdf_nbuf_t *nbuf_list)
#endif #endif
#ifdef QCA_SUPPORT_DP_GLOBAL_CTX #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; struct dp_global_context *dp_global = NULL;
dp_global = wlan_objmgr_get_global_ctx(); dp_global = wlan_objmgr_get_global_ctx();
if (spcl_tx_desc) { 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)); qdf_mem_malloc(sizeof(struct dp_tx_desc_pool_s));
} else { } 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)); 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; struct dp_global_context *dp_global = NULL;
dp_global = wlan_objmgr_get_global_ctx(); dp_global = wlan_objmgr_get_global_ctx();
if (spcl_tx_desc) if (spcl_tx_desc) {
qdf_mem_free(dp_global->spcl_tx_desc[pool_id]); if (!dp_global->spcl_tx_desc[soc->arch_id][pool_id])
else return;
qdf_mem_free(dp_global->tx_desc[pool_id]);
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 #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 #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)); 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) { if (spcl_tx_desc) {
tx_desc_pool = dp_get_spcl_tx_desc_pool(soc, pool_id); tx_desc_pool = dp_get_spcl_tx_desc_pool(soc, pool_id);
desc_type = QDF_DP_TX_SPCL_DESC_TYPE; 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 */ /* Free arch specific TX descriptor */
soc->arch_ops.dp_tx_desc_pool_free(soc, pool_id); 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, QDF_STATUS dp_tx_desc_pool_init(struct dp_soc *soc, uint8_t pool_id,