qcacmn: Do not use WBM2SW4 as tx completion ring

Ageout flush does not happen for WBM2SW4 if there
is only one TX completion pending in FIFO and all the
other WBM release rings are not active. This is due to
an issue in HW and this prevents suspend to happen due
to pending tx completions.

Fix is to avoid using WBM2SW4 release ring and instead
reuse WBM2SW0.

Change-Id: I250d8c9d460895449939212ebdb7abd62edb0234
CRs-Fixed: 3124733
This commit is contained in:
Yeshwanth Sriram Guntuka
2022-02-15 19:38:52 +05:30
committed by Madan Koyyalamudi
parent badb6230e2
commit c467daf31c
4 changed files with 52 additions and 11 deletions

View File

@@ -4432,8 +4432,8 @@ static void dp_deinit_tx_pair_by_index(struct dp_soc *soc, int index)
&tcl_ring_num,
&wbm_ring_num);
if (tcl_ring_num == -1 || wbm_ring_num == -1) {
dp_err("incorrect tcl/wbm ring num for index %u", index);
if (tcl_ring_num == -1) {
dp_err("incorrect tcl ring num for index %u", index);
return;
}
@@ -4446,6 +4446,9 @@ static void dp_deinit_tx_pair_by_index(struct dp_soc *soc, int index)
dp_srng_deinit(soc, &soc->tcl_data_ring[index], TCL_DATA,
tcl_ring_num);
if (wbm_ring_num == INVALID_WBM_RING_NUM)
return;
wlan_minidump_remove(soc->tx_comp_ring[index].base_vaddr_unaligned,
soc->tx_comp_ring[index].alloc_size,
soc->ctrl_psoc,
@@ -4480,8 +4483,8 @@ static QDF_STATUS dp_init_tx_ring_pair_by_index(struct dp_soc *soc,
&tcl_ring_num,
&wbm_ring_num);
if (tcl_ring_num == -1 || wbm_ring_num == -1) {
dp_err("incorrect tcl/wbm ring num for index %u", index);
if (tcl_ring_num == -1) {
dp_err("incorrect tcl ring num for index %u", index);
goto fail1;
}
@@ -4497,20 +4500,24 @@ static QDF_STATUS dp_init_tx_ring_pair_by_index(struct dp_soc *soc,
WLAN_MD_DP_SRNG_TCL_DATA,
"tcl_data_ring");
if (wbm_ring_num == INVALID_WBM_RING_NUM)
goto set_rbm;
if (dp_srng_init(soc, &soc->tx_comp_ring[index], WBM2SW_RELEASE,
wbm_ring_num, 0)) {
dp_err("dp_srng_init failed for tx_comp_ring");
goto fail1;
}
bm_id = wlan_cfg_get_rbm_id_for_index(soc->wlan_cfg_ctx, tcl_ring_num);
soc->arch_ops.tx_implicit_rbm_set(soc, tcl_ring_num, bm_id);
wlan_minidump_log(soc->tx_comp_ring[index].base_vaddr_unaligned,
soc->tx_comp_ring[index].alloc_size,
soc->ctrl_psoc,
WLAN_MD_DP_SRNG_TX_COMP,
"tcl_comp_ring");
set_rbm:
bm_id = wlan_cfg_get_rbm_id_for_index(soc->wlan_cfg_ctx, tcl_ring_num);
soc->arch_ops.tx_implicit_rbm_set(soc, tcl_ring_num, bm_id);
return QDF_STATUS_SUCCESS;
@@ -4563,6 +4570,10 @@ static QDF_STATUS dp_alloc_tx_ring_pair_by_index(struct dp_soc *soc,
if (!wlan_cfg_get_dp_soc_nss_cfg(soc_cfg_ctx))
cached = WLAN_CFG_DST_RING_CACHED_DESC;
if (wlan_cfg_get_wbm_ring_num_for_index(soc->wlan_cfg_ctx, index) ==
INVALID_WBM_RING_NUM)
return QDF_STATUS_SUCCESS;
if (dp_srng_alloc(soc, &soc->tx_comp_ring[index], WBM2SW_RELEASE,
tx_comp_ring_size, cached)) {
dp_err("dp_srng_alloc failed for tx_comp_ring");
@@ -11387,6 +11398,10 @@ static void dp_display_srng_info(struct cdp_soc_t *soc_hdl)
&tp, &hp);
dp_info("TCL DATA ring[%d]: hp=0x%x, tp=0x%x", i, hp, tp);
if (wlan_cfg_get_wbm_ring_num_for_index(soc->wlan_cfg_ctx, i) ==
INVALID_WBM_RING_NUM)
continue;
hal_get_sw_hptp(hal_soc, soc->tx_comp_ring[i].hal_srng,
&tp, &hp);
dp_info("TX comp ring[%d]: hp=0x%x, tp=0x%x", i, hp, tp);