summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMukul Sharma <mukul@qti.qualcomm.com>2016-05-17 18:16:22 +0530
committerAnjaneedevi Kapparapu <akappa@codeaurora.org>2016-05-26 15:34:38 +0530
commitcf233379ec3ef4d16bbd7463500e4bc43c739560 (patch)
tree6e9ae386095c105c28b09004fbf8f0699ea8b859
parentd799e804419e72ab2e7d5e394b4ec78287f0b86c (diff)
qcacld 2.0: Perform proper clean up in SSR re-init failure case
If g_bug_on_reinit_failure is disable in ini then host does not raise VOS BUG instead perform all modules clean up. Currently in this error case, clean up is missing several things which include netdev/adpater cleanup, stop SSR timer, destroy wake locks and un-register netdev notifiers/callbacks and run time suspend de-initialization. As a part of fix, host performs proper clean up in this error case. Change-Id: If3be2a68147dbea0109c857328df2adb47b3e413 CRs-Fixed: 1018530
-rw-r--r--CORE/HDD/inc/wlan_hdd_main.h5
-rw-r--r--CORE/HDD/src/wlan_hdd_early_suspend.c50
-rw-r--r--CORE/HDD/src/wlan_hdd_main.c64
3 files changed, 93 insertions, 26 deletions
diff --git a/CORE/HDD/inc/wlan_hdd_main.h b/CORE/HDD/inc/wlan_hdd_main.h
index 652136e6b918..f1bdafb5f50d 100644
--- a/CORE/HDD/inc/wlan_hdd_main.h
+++ b/CORE/HDD/inc/wlan_hdd_main.h
@@ -1908,6 +1908,11 @@ void wlan_hdd_reset_prob_rspies(hdd_adapter_t* pHostapdAdapter);
void hdd_prevent_suspend(uint32_t reason);
void hdd_allow_suspend(uint32_t reason);
void hdd_prevent_suspend_timeout(v_U32_t timeout, uint32_t reason);
+void hdd_wlan_wakelock_create (void);
+void hdd_wlan_wakelock_destroy(void);
+void wlan_hdd_wakelocks_destroy(hdd_context_t *hdd_ctx);
+void wlan_hdd_netdev_notifiers_cleanup(hdd_context_t * hdd_ctx);
+
bool hdd_is_ssr_required(void);
void hdd_set_ssr_required(e_hdd_ssr_required value);
diff --git a/CORE/HDD/src/wlan_hdd_early_suspend.c b/CORE/HDD/src/wlan_hdd_early_suspend.c
index 4466c4a03c8d..48e8bc4b067d 100644
--- a/CORE/HDD/src/wlan_hdd_early_suspend.c
+++ b/CORE/HDD/src/wlan_hdd_early_suspend.c
@@ -2345,7 +2345,6 @@ err_unregister_pmops:
#ifdef CONFIG_HAS_EARLYSUSPEND
hdd_unregister_mcast_bcast_filter(pHddCtx);
#endif
- hdd_close_all_adapters(pHddCtx);
err_vosstop:
vos_stop(pVosContext);
@@ -2353,35 +2352,44 @@ err_vosstop:
err_vosclose:
vos_close(pVosContext);
vos_sched_close(pVosContext);
- if (pHddCtx)
- {
- /* Unregister the Net Device Notifier */
- unregister_netdevice_notifier(&hdd_netdev_notifier);
- /* Clean up HDD Nlink Service */
- send_btc_nlink_msg(WLAN_MODULE_DOWN_IND, 0);
- nl_srv_exit();
- /* Free up dynamically allocated members inside HDD Adapter */
- kfree(pHddCtx->cfg_ini);
- pHddCtx->cfg_ini= NULL;
- wlan_hdd_deinit_tx_rx_histogram(pHddCtx);
- wiphy_unregister(pHddCtx->wiphy);
- wlan_hdd_cfg80211_deinit(pHddCtx->wiphy);
- wiphy_free(pHddCtx->wiphy);
- }
- vos_preClose(&pVosContext);
#ifdef MEMORY_DEBUG
vos_mem_exit();
#endif
err_re_init:
+ if (bug_on_reinit_failure)
+ VOS_BUG(0);
+ else {
+ pr_err("SSR fails during reinit hence doing cleanup");
+ /* Stop SSR timer */
+ hdd_ssr_timer_del();
+ if (pHddCtx) {
+ /* Unregister all Net Device Notifiers */
+ wlan_hdd_netdev_notifiers_cleanup(pHddCtx);
+ /* Clean up HDD Nlink Service */
+ send_btc_nlink_msg(WLAN_MODULE_DOWN_IND, 0);
+ nl_srv_exit();
+ hdd_runtime_suspend_deinit(pHddCtx);
+ hdd_close_all_adapters(pHddCtx);
+ /* Free up dynamically allocated members
+ * inside HDD Adapter
+ */
+ kfree(pHddCtx->cfg_ini);
+ pHddCtx->cfg_ini= NULL;
+ /* Destroy all wakelocks */
+ wlan_hdd_wakelocks_destroy(pHddCtx);
+ wlan_hdd_deinit_tx_rx_histogram(pHddCtx);
+ wiphy_unregister(pHddCtx->wiphy);
+ wiphy_free(pHddCtx->wiphy);
+ }
+ }
+ vos_set_reinit_in_progress(VOS_MODULE_ID_VOSS, FALSE);
+ vos_preClose(&pVosContext);
/* Allow the phone to go to sleep */
hdd_allow_suspend(WIFI_POWER_EVENT_WAKELOCK_DRIVER_REINIT);
- vos_set_reinit_in_progress(VOS_MODULE_ID_VOSS, FALSE);
- if (bug_on_reinit_failure)
- VOS_BUG(0);
+ hdd_wlan_wakelock_destroy();
return -EPERM;
-
success:
/* Trigger replay of BTC events */
send_btc_nlink_msg(WLAN_MODULE_DOWN_IND, 0);
diff --git a/CORE/HDD/src/wlan_hdd_main.c b/CORE/HDD/src/wlan_hdd_main.c
index 1c70d4e37060..7e998d30083b 100644
--- a/CORE/HDD/src/wlan_hdd_main.c
+++ b/CORE/HDD/src/wlan_hdd_main.c
@@ -13306,6 +13306,60 @@ void hdd_prevent_suspend_timeout(v_U32_t timeout, uint32_t reason)
reason);
}
+/**
+ * hdd_wlan_wakelock_create() -Create wakelock named as wlan
+ *
+ * Return: none
+ */
+void hdd_wlan_wakelock_create(void)
+{
+ vos_wake_lock_init(&wlan_wake_lock, "wlan");
+}
+
+/**
+ * hdd_wlan_wakelock_destroy() -Destroy wakelock named as wlan
+ *
+ * Return: none
+ */
+void hdd_wlan_wakelock_destroy(void)
+{
+ vos_wake_lock_destroy(&wlan_wake_lock);
+}
+
+/**
+ * wlan_hdd_wakelocks_destroy() -Destroy all the wakelocks
+ * @hdd_ctx: hdd context
+ *
+ * Return: none
+ */
+void wlan_hdd_wakelocks_destroy(hdd_context_t *hdd_ctx)
+{
+ if (hdd_ctx) {
+#ifdef WLAN_FEATURE_HOLD_RX_WAKELOCK
+ vos_wake_lock_destroy(&hdd_ctx->rx_wake_lock);
+#endif
+ vos_wake_lock_destroy(&hdd_ctx->sap_wake_lock);
+ hdd_hostapd_channel_wakelock_deinit(hdd_ctx);
+ }
+}
+
+/**
+ * wlan_hdd_netdev_notifiers_cleanup() -unregister notifiers with kernel
+ * @hdd_ctx: hdd context
+ *
+ * Return: none
+ */
+void wlan_hdd_netdev_notifiers_cleanup(hdd_context_t * hdd_ctx)
+{
+ if (hdd_ctx) {
+ hddLog(LOGE, FL("Unregister IPv6 notifier"));
+ hdd_wlan_unregister_ip6_notifier(hdd_ctx);
+ hddLog(LOGE, FL("Unregister IPv4 notifier"));
+ unregister_inetaddr_notifier(&hdd_ctx->ipv4_notifier);
+ }
+ unregister_netdevice_notifier(&hdd_netdev_notifier);
+}
+
/**---------------------------------------------------------------------------
\brief hdd_exchange_version_and_caps() - HDD function to exchange version and capability
@@ -15621,7 +15675,7 @@ static int hdd_driver_init( void)
vos_mem_init();
#endif
- vos_wake_lock_init(&wlan_wake_lock, "wlan");
+ hdd_wlan_wakelock_create();
hdd_prevent_suspend(WIFI_POWER_EVENT_WAKELOCK_DRIVER_INIT);
/*
@@ -15651,7 +15705,7 @@ static int hdd_driver_init( void)
if (ret_status < 0) {
vos_remove_pm_qos();
hdd_allow_suspend(WIFI_POWER_EVENT_WAKELOCK_DRIVER_INIT);
- vos_wake_lock_destroy(&wlan_wake_lock);
+ hdd_wlan_wakelock_destroy();
}
return ret_status;
}
@@ -15662,7 +15716,7 @@ static int hdd_driver_init( void)
if (ret_status < 0) {
vos_remove_pm_qos();
hdd_allow_suspend(WIFI_POWER_EVENT_WAKELOCK_DRIVER_INIT);
- vos_wake_lock_destroy(&wlan_wake_lock);
+ hdd_wlan_wakelock_destroy();
}
return ret_status;
}
@@ -15717,7 +15771,7 @@ static int hdd_driver_init( void)
#ifdef MEMORY_DEBUG
vos_mem_exit();
#endif
- vos_wake_lock_destroy(&wlan_wake_lock);
+ hdd_wlan_wakelock_destroy();
#ifdef WLAN_LOGGING_SOCK_SVC_ENABLE
wlan_logging_sock_deinit_svc();
@@ -15846,7 +15900,7 @@ static void hdd_driver_exit(void)
#endif
done:
- vos_wake_lock_destroy(&wlan_wake_lock);
+ hdd_wlan_wakelock_destroy();
pr_info("%s: driver unloaded\n", WLAN_MODULE_NAME);
}