|
@@ -135,9 +135,6 @@ void hdd_wlan_offload_event(uint8_t type, uint8_t state)
|
|
|
|
|
|
extern struct notifier_block hdd_netdev_notifier;
|
|
|
|
|
|
-static struct timer_list ssr_timer;
|
|
|
-static bool ssr_timer_started;
|
|
|
-
|
|
|
/**
|
|
|
* hdd_enable_gtk_offload() - enable GTK offload
|
|
|
* @adapter: pointer to the adapter
|
|
@@ -1081,7 +1078,7 @@ hdd_suspend_wlan(void)
|
|
|
return -EINVAL;
|
|
|
}
|
|
|
|
|
|
- if (cds_is_driver_recovering()) {
|
|
|
+ if (cds_is_driver_recovering() || cds_is_driver_in_bad_state()) {
|
|
|
hdd_info("Recovery in Progress. State: 0x%x Ignore suspend!!!",
|
|
|
cds_get_driver_state());
|
|
|
return -EINVAL;
|
|
@@ -1140,7 +1137,7 @@ static int hdd_resume_wlan(void)
|
|
|
return -EINVAL;
|
|
|
}
|
|
|
|
|
|
- if (cds_is_driver_recovering()) {
|
|
|
+ if (cds_is_driver_recovering() || cds_is_driver_in_bad_state()) {
|
|
|
hdd_info("Recovery in Progress. State: 0x%x Ignore resume!!!",
|
|
|
cds_get_driver_state());
|
|
|
return -EINVAL;
|
|
@@ -1180,66 +1177,6 @@ next_adapter:
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-/**
|
|
|
- * DOC: SSR Timer
|
|
|
- *
|
|
|
- * When SSR is initiated, an SSR timer is started. Under normal
|
|
|
- * circumstances SSR should complete amd the timer should be deleted
|
|
|
- * before it fires. If the SSR timer does fire, it indicates SSR has
|
|
|
- * taken too long, and our only recourse is to invoke the QDF_BUG()
|
|
|
- * API which can allow a crashdump to be captured.
|
|
|
- */
|
|
|
-
|
|
|
-/**
|
|
|
- * hdd_ssr_timer_init() - Initialize SSR Timer
|
|
|
- *
|
|
|
- * Return: None.
|
|
|
- */
|
|
|
-static void hdd_ssr_timer_init(void)
|
|
|
-{
|
|
|
- init_timer(&ssr_timer);
|
|
|
-}
|
|
|
-
|
|
|
-/**
|
|
|
- * hdd_ssr_timer_del() - Delete SSR Timer
|
|
|
- *
|
|
|
- * Return: None.
|
|
|
- */
|
|
|
-static void hdd_ssr_timer_del(void)
|
|
|
-{
|
|
|
- del_timer(&ssr_timer);
|
|
|
- ssr_timer_started = false;
|
|
|
-}
|
|
|
-
|
|
|
-/**
|
|
|
- * hdd_ssr_timer_cb() - SSR Timer callback function
|
|
|
- * @data: opaque data registered with timer infrastructure
|
|
|
- *
|
|
|
- * Return: None.
|
|
|
- */
|
|
|
-static void hdd_ssr_timer_cb(unsigned long data)
|
|
|
-{
|
|
|
- hdd_info("HDD SSR timer expired!");
|
|
|
- QDF_BUG(0);
|
|
|
-}
|
|
|
-
|
|
|
-/**
|
|
|
- * hdd_ssr_timer_start() - Start SSR Timer
|
|
|
- * @msec: Timer timeout value in milliseconds
|
|
|
- *
|
|
|
- * Return: None.
|
|
|
- */
|
|
|
-static void hdd_ssr_timer_start(int msec)
|
|
|
-{
|
|
|
- if (ssr_timer_started) {
|
|
|
- hdd_debug("Trying to start SSR timer when " "it's running!");
|
|
|
- }
|
|
|
- ssr_timer.expires = jiffies + msecs_to_jiffies(msec);
|
|
|
- ssr_timer.function = hdd_ssr_timer_cb;
|
|
|
- add_timer(&ssr_timer);
|
|
|
- ssr_timer_started = true;
|
|
|
-}
|
|
|
-
|
|
|
/**
|
|
|
* hdd_svc_fw_shutdown_ind() - API to send FW SHUTDOWN IND to Userspace
|
|
|
*
|
|
@@ -1312,10 +1249,6 @@ QDF_STATUS hdd_wlan_shutdown(void)
|
|
|
|
|
|
hdd_info("WLAN driver shutting down!");
|
|
|
|
|
|
- /* If SSR never completes, then do kernel panic. */
|
|
|
- hdd_ssr_timer_init();
|
|
|
- hdd_ssr_timer_start(HDD_SSR_BRING_UP_TIME);
|
|
|
-
|
|
|
/* Get the global CDS context. */
|
|
|
p_cds_context = cds_get_global_context();
|
|
|
if (!p_cds_context) {
|
|
@@ -1459,7 +1392,7 @@ QDF_STATUS hdd_wlan_re_init(void)
|
|
|
ret = hdd_wlan_start_modules(pHddCtx, pAdapter, true);
|
|
|
if (ret) {
|
|
|
hdd_err("Failed to start wlan after error");
|
|
|
- goto err_wiphy_unregister;
|
|
|
+ goto err_re_init;
|
|
|
}
|
|
|
|
|
|
hdd_wlan_get_version(pHddCtx, NULL, NULL);
|
|
@@ -1498,26 +1431,7 @@ QDF_STATUS hdd_wlan_re_init(void)
|
|
|
err_cds_disable:
|
|
|
hdd_wlan_stop_modules(pHddCtx, false);
|
|
|
|
|
|
-err_wiphy_unregister:
|
|
|
- if (bug_on_reinit_failure)
|
|
|
- QDF_BUG(0);
|
|
|
-
|
|
|
- if (pHddCtx) {
|
|
|
- /* Unregister the Notifier's */
|
|
|
- hdd_unregister_notifiers(pHddCtx);
|
|
|
- ptt_sock_deactivate_svc();
|
|
|
- nl_srv_exit();
|
|
|
-
|
|
|
- hdd_close_all_adapters(pHddCtx, false);
|
|
|
- wlan_hdd_cfg80211_deinit(pHddCtx->wiphy);
|
|
|
- hdd_lpass_notify_stop(pHddCtx);
|
|
|
- wlan_hdd_deinit_tx_rx_histogram(pHddCtx);
|
|
|
- wiphy_unregister(pHddCtx->wiphy);
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
err_re_init:
|
|
|
- hdd_ssr_timer_del();
|
|
|
/* Allow the phone to go to sleep */
|
|
|
hdd_allow_suspend(WIFI_POWER_EVENT_WAKELOCK_DRIVER_REINIT);
|
|
|
if (bug_on_reinit_failure)
|
|
@@ -1527,7 +1441,7 @@ err_re_init:
|
|
|
success:
|
|
|
if (pHddCtx->config->sap_internal_restart)
|
|
|
hdd_ssr_restart_sap(pHddCtx);
|
|
|
- hdd_ssr_timer_del();
|
|
|
+
|
|
|
hdd_wlan_ssr_reinit_event();
|
|
|
return QDF_STATUS_SUCCESS;
|
|
|
}
|