qcacmn: Clean up global desc pool during Umac reset

Make sure that the global dp tx desc pools are cleaned
up only once during MLO umac reset.

Change-Id: Id6e0ac6532b11ffb9ea190b6ab4d481fb486d853
CRs-Fixed: 3647660
This commit is contained in:
Pavankumar Nandeshwar
2023-10-26 00:47:44 +05:30
committed by Ravindra Konda
parent 136b01ad6b
commit c71f2aaf75
7 changed files with 101 additions and 4 deletions

View File

@@ -1736,6 +1736,53 @@ dp_get_umac_reset_in_progress_state(struct cdp_soc_t *psoc)
CDP_UMAC_RESET_IN_PROGRESS_DURING_BUFFER_WINDOW : CDP_UMAC_RESET_IN_PROGRESS_DURING_BUFFER_WINDOW :
CDP_UMAC_RESET_NOT_IN_PROGRESS); CDP_UMAC_RESET_NOT_IN_PROGRESS);
} }
/**
* dp_get_global_tx_desc_cleanup_flag() - Get cleanup needed flag
* @soc: dp soc handle
*
* Return: cleanup needed/ not needed
*/
bool dp_get_global_tx_desc_cleanup_flag(struct dp_soc *soc)
{
struct dp_soc_be *be_soc = dp_get_be_soc_from_dp_soc(soc);
struct dp_mlo_ctxt *mlo_ctx = be_soc->ml_ctxt;
struct dp_soc_mlo_umac_reset_ctx *grp_umac_reset_ctx;
bool flag;
if (!mlo_ctx)
return true;
grp_umac_reset_ctx = &mlo_ctx->grp_umac_reset_ctx;
qdf_spin_lock_bh(&grp_umac_reset_ctx->grp_ctx_lock);
flag = grp_umac_reset_ctx->tx_desc_pool_cleaned;
if (!flag)
grp_umac_reset_ctx->tx_desc_pool_cleaned = true;
qdf_spin_unlock_bh(&grp_umac_reset_ctx->grp_ctx_lock);
return !flag;
}
/**
* dp_reset_global_tx_desc_cleanup_flag() - Reset cleanup needed flag
* @soc: dp soc handle
*
* Return: None
*/
void dp_reset_global_tx_desc_cleanup_flag(struct dp_soc *soc)
{
struct dp_soc_be *be_soc = dp_get_be_soc_from_dp_soc(soc);
struct dp_mlo_ctxt *mlo_ctx = be_soc->ml_ctxt;
struct dp_soc_mlo_umac_reset_ctx *grp_umac_reset_ctx;
if (!mlo_ctx)
return;
grp_umac_reset_ctx = &mlo_ctx->grp_umac_reset_ctx;
grp_umac_reset_ctx->tx_desc_pool_cleaned = false;
}
#endif #endif
struct dp_soc * struct dp_soc *

View File

@@ -2985,6 +2985,23 @@ static inline void dp_umac_reset_trigger_pre_reset_notify_cb(struct dp_soc *soc)
callback(soc); callback(soc);
} }
/**
* dp_reset_global_tx_desc_cleanup_flag() - Reset cleanup needed flag
* @soc: dp soc handle
*
* Return: None
*/
void dp_reset_global_tx_desc_cleanup_flag(struct dp_soc *soc);
/**
* dp_get_global_tx_desc_cleanup_flag() - Get cleanup needed flag
* @soc: dp soc handle
*
* Return: cleanup needed/ not needed
*/
bool dp_get_global_tx_desc_cleanup_flag(struct dp_soc *soc);
#if defined(WLAN_FEATURE_11BE_MLO) && defined(WLAN_MLO_MULTI_CHIP) #if defined(WLAN_FEATURE_11BE_MLO) && defined(WLAN_MLO_MULTI_CHIP)
/** /**
* dp_umac_reset_complete_umac_recovery() - Complete Umac reset session * dp_umac_reset_complete_umac_recovery() - Complete Umac reset session

View File

@@ -11917,6 +11917,7 @@ static QDF_STATUS dp_umac_reset_handle_pre_reset(struct dp_soc *soc)
static QDF_STATUS dp_umac_reset_handle_post_reset(struct dp_soc *soc) static QDF_STATUS dp_umac_reset_handle_post_reset(struct dp_soc *soc)
{ {
if (!soc->umac_reset_ctx.skel_enable) { if (!soc->umac_reset_ctx.skel_enable) {
bool cleanup_needed;
qdf_nbuf_t *nbuf_list = &soc->umac_reset_ctx.nbuf_list; qdf_nbuf_t *nbuf_list = &soc->umac_reset_ctx.nbuf_list;
dp_set_umac_regs(soc); dp_set_umac_regs(soc);
@@ -11929,7 +11930,9 @@ static QDF_STATUS dp_umac_reset_handle_post_reset(struct dp_soc *soc)
dp_umac_reset_ppeds_txdesc_pool_reset(soc, nbuf_list); dp_umac_reset_ppeds_txdesc_pool_reset(soc, nbuf_list);
dp_tx_desc_pool_cleanup(soc, nbuf_list); cleanup_needed = dp_get_global_tx_desc_cleanup_flag(soc);
dp_tx_desc_pool_cleanup(soc, nbuf_list, cleanup_needed);
dp_reset_tid_q_setup(soc); dp_reset_tid_q_setup(soc);
} }
@@ -11963,6 +11966,8 @@ static QDF_STATUS dp_umac_reset_handle_post_reset_complete(struct dp_soc *soc)
dp_resume_tx_hardstart(soc); dp_resume_tx_hardstart(soc);
dp_reset_global_tx_desc_cleanup_flag(soc);
status = dp_umac_reset_notify_action_completion(soc, status = dp_umac_reset_notify_action_completion(soc,
UMAC_RESET_ACTION_DO_POST_RESET_COMPLETE); UMAC_RESET_ACTION_DO_POST_RESET_COMPLETE);

View File

@@ -95,15 +95,20 @@ static void dp_tx_desc_clean_up(void *ctxt, void *elem, void *elem_list)
} }
} }
void dp_tx_desc_pool_cleanup(struct dp_soc *soc, qdf_nbuf_t *nbuf_list) void dp_tx_desc_pool_cleanup(struct dp_soc *soc, qdf_nbuf_t *nbuf_list,
bool cleanup)
{ {
int i; int i;
struct dp_tx_desc_pool_s *tx_desc_pool = NULL; struct dp_tx_desc_pool_s *tx_desc_pool = NULL;
uint8_t num_pool = wlan_cfg_get_num_tx_desc_pool(soc->wlan_cfg_ctx); uint8_t num_pool = wlan_cfg_get_num_tx_desc_pool(soc->wlan_cfg_ctx);
if (!cleanup)
return;
for (i = 0; i < num_pool; i++) { for (i = 0; i < num_pool; i++) {
tx_desc_pool = dp_get_tx_desc_pool(soc, i); tx_desc_pool = dp_get_tx_desc_pool(soc, i);
TX_DESC_LOCK_LOCK(&tx_desc_pool->lock);
if (tx_desc_pool) if (tx_desc_pool)
qdf_tx_desc_pool_free_bufs(soc, qdf_tx_desc_pool_free_bufs(soc,
&tx_desc_pool->desc_pages, &tx_desc_pool->desc_pages,
@@ -112,7 +117,10 @@ void dp_tx_desc_pool_cleanup(struct dp_soc *soc, qdf_nbuf_t *nbuf_list)
true, &dp_tx_desc_clean_up, true, &dp_tx_desc_clean_up,
nbuf_list); nbuf_list);
TX_DESC_LOCK_UNLOCK(&tx_desc_pool->lock);
tx_desc_pool = dp_get_spcl_tx_desc_pool(soc, i); tx_desc_pool = dp_get_spcl_tx_desc_pool(soc, i);
TX_DESC_LOCK_LOCK(&tx_desc_pool->lock);
if (tx_desc_pool) if (tx_desc_pool)
qdf_tx_desc_pool_free_bufs(soc, qdf_tx_desc_pool_free_bufs(soc,
@@ -121,6 +129,8 @@ void dp_tx_desc_pool_cleanup(struct dp_soc *soc, qdf_nbuf_t *nbuf_list)
tx_desc_pool->elem_count, tx_desc_pool->elem_count,
true, &dp_tx_desc_clean_up, true, &dp_tx_desc_clean_up,
nbuf_list); nbuf_list);
TX_DESC_LOCK_UNLOCK(&tx_desc_pool->lock);
} }
} }
#endif #endif

View File

@@ -454,9 +454,11 @@ void dp_tx_tso_num_seg_pool_deinit(struct dp_soc *soc, uint8_t num_pool);
* dp_tx_desc_pool_cleanup() - Clean up the tx dexcriptor pools * dp_tx_desc_pool_cleanup() - Clean up the tx dexcriptor pools
* @soc: Handle to DP SoC structure * @soc: Handle to DP SoC structure
* @nbuf_list: nbuf list for delayed free * @nbuf_list: nbuf list for delayed free
* @cleanup: cleanup the pool
* *
*/ */
void dp_tx_desc_pool_cleanup(struct dp_soc *soc, qdf_nbuf_t *nbuf_list); void dp_tx_desc_pool_cleanup(struct dp_soc *soc, qdf_nbuf_t *nbuf_list,
bool cleanup);
#endif #endif
/** /**

View File

@@ -321,6 +321,20 @@ bool dp_check_umac_reset_in_progress(struct dp_soc *soc)
return !!soc->umac_reset_ctx.intr_ctx_bkp; return !!soc->umac_reset_ctx.intr_ctx_bkp;
} }
#if !defined(QCA_SUPPORT_DP_GLOBAL_CTX) || \
(defined(QCA_SUPPORT_DP_GLOBAL_CTX) && \
!defined(WLAN_FEATURE_11BE_MLO) || !defined(WLAN_MLO_MULTI_CHIP))
bool dp_get_global_tx_desc_cleanup_flag(struct dp_soc *soc)
{
return true;
}
void dp_reset_global_tx_desc_cleanup_flag(struct dp_soc *soc)
{
}
#endif
#if !defined(WLAN_FEATURE_11BE_MLO) || !defined(WLAN_MLO_MULTI_CHIP) #if !defined(WLAN_FEATURE_11BE_MLO) || !defined(WLAN_MLO_MULTI_CHIP)
/** /**
* dp_umac_reset_initiate_umac_recovery() - Initiate Umac reset session * dp_umac_reset_initiate_umac_recovery() - Initiate Umac reset session

View File

@@ -178,6 +178,7 @@ struct reset_ts {
* @grp_ctx_lock: lock for accessing group level umac reset context * @grp_ctx_lock: lock for accessing group level umac reset context
* @umac_reset_in_progress: Flag to indicate if umac reset is in progress * @umac_reset_in_progress: Flag to indicate if umac reset is in progress
* @is_target_recovery: Flag to indicate if this is for target recovery * @is_target_recovery: Flag to indicate if this is for target recovery
* @tx_desc_pool_cleaned: Global tx_desc pool clean up has been done
* @initiator_chip_id: chip id of the Umac reset initiator * @initiator_chip_id: chip id of the Umac reset initiator
* @umac_reset_count: Number of times Umac reset happened on this MLO group * @umac_reset_count: Number of times Umac reset happened on this MLO group
*/ */
@@ -187,7 +188,8 @@ struct dp_soc_mlo_umac_reset_ctx {
unsigned long response_map; unsigned long response_map;
qdf_spinlock_t grp_ctx_lock; qdf_spinlock_t grp_ctx_lock;
uint8_t umac_reset_in_progress:1, uint8_t umac_reset_in_progress:1,
is_target_recovery:1; is_target_recovery:1,
tx_desc_pool_cleaned:1;
uint8_t initiator_chip_id; uint8_t initiator_chip_id;
uint32_t umac_reset_count; uint32_t umac_reset_count;
}; };