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:

committed by
Rahul Choudhary

parent
f95831ad9a
commit
82e9711f5b
@@ -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;
|
||||
};
|
||||
|
||||
/**
|
||||
|
@@ -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 =
|
||||
|
@@ -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
|
||||
|
@@ -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];
|
||||
|
@@ -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);
|
||||
|
@@ -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 */
|
||||
|
||||
/**
|
||||
|
@@ -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
|
||||
|
@@ -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);
|
||||
|
@@ -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;
|
||||
|
@@ -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;
|
||||
|
Reference in New Issue
Block a user