qcacmn: Move Tx desc pool to global context level

Move Tx descriptor pool to global context level.

Change-Id: Iff13a41f3bebbaa93e559c38842a596d47f4e534
CRs-Fixed: 3534184
This commit is contained in:
Neha Bisht
2023-08-09 14:28:00 +05:30
committed by Rahul Choudhary
parent f95831ad9a
commit 82e9711f5b
10 changed files with 287 additions and 183 deletions

View File

@@ -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;
};
/**

View File

@@ -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 =

View File

@@ -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

View File

@@ -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];

View File

@@ -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);

View File

@@ -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 */
/**

View File

@@ -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

View File

@@ -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);

View File

@@ -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;

View File

@@ -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;