diff --git a/hif/src/hif_main.c b/hif/src/hif_main.c index 643a558218d5..f2338c6f7221 100644 --- a/hif/src/hif_main.c +++ b/hif/src/hif_main.c @@ -483,11 +483,26 @@ static QDF_STATUS hif_hal_attach(struct hif_softc *scn) return QDF_STATUS_SUCCESS; } + +static QDF_STATUS hif_hal_detach(struct hif_softc *scn) +{ + if (ce_srng_based(scn)) { + hal_detach(scn->hal_soc); + scn->hal_soc = NULL; + } + + return QDF_STATUS_SUCCESS; +} #else static QDF_STATUS hif_hal_attach(struct hif_softc *scn) { return QDF_STATUS_SUCCESS; } + +static QDF_STATUS hif_hal_detach(struct hif_softc *scn) +{ + return QDF_STATUS_SUCCESS; +} #endif /** @@ -525,14 +540,13 @@ QDF_STATUS hif_enable(struct hif_opaque_softc *hif_ctx, struct device *dev, status = hif_hal_attach(scn); if (status != QDF_STATUS_SUCCESS) { HIF_ERROR("%s: hal attach failed", __func__); - return status; + goto disable_bus; } if (hif_bus_configure(scn)) { HIF_ERROR("%s: Target probe failed.", __func__); - hif_disable_bus(scn); status = QDF_STATUS_E_FAILURE; - return status; + goto hal_detach; } hif_ut_suspend_init(scn); @@ -550,6 +564,12 @@ QDF_STATUS hif_enable(struct hif_opaque_softc *hif_ctx, struct device *dev, HIF_DBG("%s: OK", __func__); return QDF_STATUS_SUCCESS; + +hal_detach: + hif_hal_detach(scn); +disable_bus: + hif_disable_bus(scn); + return status; } void hif_disable(struct hif_opaque_softc *hif_ctx, enum hif_disable_type type) @@ -565,6 +585,8 @@ void hif_disable(struct hif_opaque_softc *hif_ctx, enum hif_disable_type type) else hif_stop(hif_ctx); + hif_hal_detach(scn); + hif_disable_bus(scn); hif_wlan_disable(scn);