diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c index a05dc16f1b..a8d5e3091a 100644 --- a/dp/wifi3.0/dp_main.c +++ b/dp/wifi3.0/dp_main.c @@ -1371,6 +1371,7 @@ static void dp_pdev_detach_wifi3(struct cdp_pdev *txrx_pdev, int force) soc->pdev_list[pdev->pdev_id] = NULL; soc->pdev_count--; + wlan_cfg_pdev_detach(pdev->wlan_cfg_ctx); qdf_mem_free(pdev); } @@ -1427,10 +1428,9 @@ static void dp_soc_detach_wifi3(void *txrx_soc) /* Common rings */ dp_srng_cleanup(soc, &soc->wbm_desc_rel_ring, SW2WBM_RELEASE, 0); + dp_tx_soc_detach(soc); /* Tx data rings */ if (!wlan_cfg_per_pdev_tx_ring(soc->wlan_cfg_ctx)) { - dp_tx_soc_detach(soc); - for (i = 0; i < soc->num_tcl_data_rings; i++) { dp_srng_cleanup(soc, &soc->tcl_data_ring[i], TCL_DATA, i); @@ -1477,6 +1477,7 @@ static void dp_soc_detach_wifi3(void *txrx_soc) htt_soc_detach(soc->htt_handle); dp_reo_desc_freelist_destroy(soc); + wlan_cfg_soc_detach(soc->wlan_cfg_ctx); qdf_mem_free(soc); } diff --git a/dp/wifi3.0/dp_rx_desc.c b/dp/wifi3.0/dp_rx_desc.c index 859f8fab73..bfd0679a8d 100644 --- a/dp/wifi3.0/dp_rx_desc.c +++ b/dp/wifi3.0/dp_rx_desc.c @@ -55,11 +55,13 @@ QDF_STATUS dp_rx_desc_pool_alloc(struct dp_soc *soc, uint32_t pool_id, rx_desc_pool->array[i].next = &rx_desc_pool->array[i+1]; rx_desc_pool->array[i].rx_desc.cookie = i | (pool_id << 18); rx_desc_pool->array[i].rx_desc.pool_id = pool_id; + rx_desc_pool->array[i].rx_desc.nbuf = NULL; } rx_desc_pool->array[i].next = NULL; rx_desc_pool->array[i].rx_desc.cookie = i | (pool_id << 18); rx_desc_pool->array[i].rx_desc.pool_id = pool_id; + rx_desc_pool->array[i].rx_desc.nbuf = NULL; qdf_spin_unlock_bh(&soc->rx_desc_mutex[pool_id]); return QDF_STATUS_SUCCESS; } @@ -75,8 +77,13 @@ QDF_STATUS dp_rx_desc_pool_alloc(struct dp_soc *soc, uint32_t pool_id, void dp_rx_desc_pool_free(struct dp_soc *soc, uint32_t pool_id, struct rx_desc_pool *rx_desc_pool) { + int i; qdf_spin_lock_bh(&soc->rx_desc_mutex[pool_id]); + for (i = 0; i < rx_desc_pool->pool_size; i++) { + if (rx_desc_pool->array[i].rx_desc.nbuf) + qdf_nbuf_free(rx_desc_pool->array[i].rx_desc.nbuf); + } qdf_mem_free(rx_desc_pool->array); qdf_spin_unlock_bh(&soc->rx_desc_mutex[pool_id]); } diff --git a/hif/src/pcie/if_pci.c b/hif/src/pcie/if_pci.c index d03aa54111..aa2756e869 100644 --- a/hif/src/pcie/if_pci.c +++ b/hif/src/pcie/if_pci.c @@ -1310,6 +1310,8 @@ static void hif_pm_runtime_close(struct hif_pci_softc *sc) { struct hif_softc *scn = HIF_GET_SOFTC(sc); + hif_runtime_lock_deinit(GET_HIF_OPAQUE_HDL(sc), + sc->prevent_linkdown_lock); if (qdf_atomic_read(&sc->pm_state) == HIF_PM_RUNTIME_STATE_NONE) return; else @@ -4400,20 +4402,17 @@ void hif_runtime_lock_deinit(struct hif_opaque_softc *hif_ctx, struct hif_pm_runtime_lock *context = data; struct hif_pci_softc *sc = HIF_GET_PCI_SOFTC(hif_ctx); - if (!sc) - return; - if (!context) return; - /* * Ensure to delete the context list entry and reduce the usage count * before freeing the context if context is active. */ - spin_lock_bh(&sc->runtime_lock); - __hif_pm_runtime_allow_suspend(sc, context); - spin_unlock_bh(&sc->runtime_lock); - + if (sc) { + spin_lock_bh(&sc->runtime_lock); + __hif_pm_runtime_allow_suspend(sc, context); + spin_unlock_bh(&sc->runtime_lock); + } qdf_mem_free(context); } #endif /* FEATURE_RUNTIME_PM */