From f7c5baa657e85496724dffee41525e75ee2880ae Mon Sep 17 00:00:00 2001 From: Nisha Menon Date: Wed, 23 Oct 2019 12:50:16 -0700 Subject: [PATCH] qcacmn: Fix for IPA rx buff map failure Add an atomic variable to indicate IPA pipes are connected. Use it to ensure that SMMU mapping for rx buffers is sent to IPA even if REO is not remapped but IPA pipes are connected. Change-Id: I5d82dc073fc2f0de6df102f7bfd2a1e945297aa8 CRs-Fixed: 2552128 --- dp/wifi3.0/dp_ipa.c | 29 +++++------------------------ dp/wifi3.0/dp_rx.c | 2 +- dp/wifi3.0/dp_types.h | 3 +-- 3 files changed, 7 insertions(+), 27 deletions(-) diff --git a/dp/wifi3.0/dp_ipa.c b/dp/wifi3.0/dp_ipa.c index 7a72aca958..6ea59d5d1d 100644 --- a/dp/wifi3.0/dp_ipa.c +++ b/dp/wifi3.0/dp_ipa.c @@ -65,7 +65,6 @@ QDF_STATUS dp_ipa_handle_rx_buf_smmu_mapping(struct dp_soc *soc, qdf_nbuf_t nbuf, bool create) { - bool reo_remapped = false; struct dp_pdev *pdev; int i; @@ -79,11 +78,7 @@ QDF_STATUS dp_ipa_handle_rx_buf_smmu_mapping(struct dp_soc *soc, !qdf_mem_smmu_s1_enabled(soc->osdev)) return QDF_STATUS_SUCCESS; - qdf_spin_lock_bh(&soc->remap_lock); - reo_remapped = soc->reo_remapped; - qdf_spin_unlock_bh(&soc->remap_lock); - - if (!reo_remapped) + if (!qdf_atomic_read(&soc->ipa_pipes_enabled)) return QDF_STATUS_SUCCESS; return __dp_ipa_handle_buf_smmu_mapping(soc, nbuf, create); @@ -229,8 +224,6 @@ int dp_ipa_uc_detach(struct dp_soc *soc, struct dp_pdev *pdev) /* RX resource detach */ dp_rx_ipa_uc_detach(soc, pdev); - qdf_spinlock_destroy(&soc->remap_lock); - return QDF_STATUS_SUCCESS; /* success */ } @@ -374,8 +367,6 @@ int dp_ipa_uc_attach(struct dp_soc *soc, struct dp_pdev *pdev) if (!wlan_cfg_is_ipa_enabled(soc->wlan_cfg_ctx)) return QDF_STATUS_SUCCESS; - qdf_spinlock_create(&soc->remap_lock); - /* TX resource attach */ error = dp_tx_ipa_uc_attach(soc, pdev); if (error) { @@ -766,10 +757,6 @@ QDF_STATUS dp_ipa_enable_autonomy(struct cdp_pdev *ppdev) if (!wlan_cfg_is_ipa_enabled(soc->wlan_cfg_ctx)) return QDF_STATUS_SUCCESS; - qdf_spin_lock_bh(&soc->remap_lock); - soc->reo_remapped = true; - qdf_spin_unlock_bh(&soc->remap_lock); - /* Call HAL API to remap REO rings to REO2IPA ring */ ix0 = HAL_REO_REMAP_VAL(REO_REMAP_TCL, REO_REMAP_TCL) | HAL_REO_REMAP_VAL(REO_REMAP_SW1, REO_REMAP_SW4) | @@ -829,10 +816,6 @@ QDF_STATUS dp_ipa_disable_autonomy(struct cdp_pdev *ppdev) &ix2, &ix3); } - qdf_spin_lock_bh(&soc->remap_lock); - soc->reo_remapped = false; - qdf_spin_unlock_bh(&soc->remap_lock); - return QDF_STATUS_SUCCESS; } @@ -1571,6 +1554,7 @@ QDF_STATUS dp_ipa_enable_pipes(struct cdp_pdev *ppdev) struct dp_soc *soc = pdev->soc; QDF_STATUS result; + qdf_atomic_set(&soc->ipa_pipes_enabled, 1); dp_ipa_handle_rx_buf_pool_smmu_mapping(soc, pdev, true); result = qdf_ipa_wdi_enable_pipes(); @@ -1578,6 +1562,7 @@ QDF_STATUS dp_ipa_enable_pipes(struct cdp_pdev *ppdev) QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, "%s: Enable WDI PIPE fail, code %d", __func__, result); + qdf_atomic_set(&soc->ipa_pipes_enabled, 0); dp_ipa_handle_rx_buf_pool_smmu_mapping(soc, pdev, false); return QDF_STATUS_E_FAILURE; } @@ -1603,6 +1588,7 @@ QDF_STATUS dp_ipa_disable_pipes(struct cdp_pdev *ppdev) "%s: Disable WDI PIPE fail, code %d", __func__, result); + qdf_atomic_set(&soc->ipa_pipes_enabled, 0); dp_ipa_handle_rx_buf_pool_smmu_mapping(soc, pdev, false); return result ? QDF_STATUS_E_FAILURE : QDF_STATUS_SUCCESS; @@ -1769,17 +1755,12 @@ bool dp_ipa_is_mdm_platform(void) qdf_nbuf_t dp_ipa_handle_rx_reo_reinject(struct dp_soc *soc, qdf_nbuf_t nbuf) { uint8_t *rx_pkt_tlvs; - bool reo_remapped; if (!wlan_cfg_is_ipa_enabled(soc->wlan_cfg_ctx)) return nbuf; - qdf_spin_lock_bh(&soc->remap_lock); - reo_remapped = soc->reo_remapped; - qdf_spin_unlock_bh(&soc->remap_lock); - /* WLAN IPA is run-time disabled */ - if (!reo_remapped) + if (!qdf_atomic_read(&soc->ipa_pipes_enabled)) return nbuf; /* Linearize the skb since IPA assumes linear buffer */ diff --git a/dp/wifi3.0/dp_rx.c b/dp/wifi3.0/dp_rx.c index 659c22582f..049447d0cc 100644 --- a/dp/wifi3.0/dp_rx.c +++ b/dp/wifi3.0/dp_rx.c @@ -210,6 +210,7 @@ QDF_STATUS dp_rx_buffers_replenish(struct dp_soc *dp_soc, uint32_t mac_id, paddr = qdf_nbuf_get_frag_paddr(rx_netbuf, 0); + dp_ipa_handle_rx_buf_smmu_mapping(dp_soc, rx_netbuf, true); /* * check if the physical address of nbuf->data is * less then 0x50000000 then free the nbuf and try @@ -248,7 +249,6 @@ QDF_STATUS dp_rx_buffers_replenish(struct dp_soc *dp_soc, uint32_t mac_id, *desc_list = next; - dp_ipa_handle_rx_buf_smmu_mapping(dp_soc, rx_netbuf, true); } hal_srng_access_end(dp_soc->hal_soc, rxdma_srng); diff --git a/dp/wifi3.0/dp_types.h b/dp/wifi3.0/dp_types.h index bb5a5626f6..25400bbe5f 100644 --- a/dp/wifi3.0/dp_types.h +++ b/dp/wifi3.0/dp_types.h @@ -1122,8 +1122,7 @@ struct dp_soc { qdf_dma_addr_t ipa_rx_refill_buf_hp_paddr; } ipa_uc_rx_rsc; - bool reo_remapped; /* Indicate if REO2IPA rings are remapped */ - qdf_spinlock_t remap_lock; + qdf_atomic_t ipa_pipes_enabled; #endif /* Smart monitor capability for HKv2 */