summaryrefslogtreecommitdiff
path: root/core
diff options
context:
space:
mode:
authorAditya Kodukula <quic_akodukul@quicinc.com>2020-06-16 15:10:21 +0530
committerPaul Chen <chenpaul@google.com>2020-07-08 10:54:06 +0000
commitc56cb4d6c470feb1eca6431456ae2f2858b54c40 (patch)
tree2ab5f8b09cbb6e31a81c72f90444d17e7969ce47 /core
parent6e0025c17f580c528d9165413d89807232a31b2f (diff)
downloadqcacld-c56cb4d6c470feb1eca6431456ae2f2858b54c40.tar.gz
qcacld-3.0: Wait for driver recovery while WiFi ON/OFF
Currently the driver is not synchronized properly between SSR and wifi ON/OFF. This causes a potential deadlock resulting in a DSC timeout. To synchronize, add a wait in wlan_hdd_state_ctrl_param_write which is called during WiFi ON/OFF. This wait will ensure that the driver recovery is complete before proceeding with ON/OFF. Change-Id: Ia1c4f8d7076d77c591276ee380b55a747cf606bd CRs-Fixed: 2701513 Bug: 157090295 Signed-off-by: Aditya Kodukula <quic_akodukul@quicinc.com>
Diffstat (limited to 'core')
-rw-r--r--core/hdd/src/wlan_hdd_driver_ops.c2
-rw-r--r--core/hdd/src/wlan_hdd_main.c3
2 files changed, 2 insertions, 3 deletions
diff --git a/core/hdd/src/wlan_hdd_driver_ops.c b/core/hdd/src/wlan_hdd_driver_ops.c
index 9c15e53a4f..e8887e5325 100644
--- a/core/hdd/src/wlan_hdd_driver_ops.c
+++ b/core/hdd/src/wlan_hdd_driver_ops.c
@@ -380,6 +380,7 @@ static void hdd_soc_load_unlock(struct device *dev)
hdd_remove_pm_qos(dev);
hdd_allow_suspend(WIFI_POWER_EVENT_WAKELOCK_DRIVER_INIT);
hdd_stop_driver_ops_timer();
+ hdd_start_complete(0);
mutex_unlock(&hdd_init_deinit_lock);
}
@@ -414,7 +415,6 @@ static int hdd_soc_probe(struct device *dev,
probe_fail_cnt = 0;
cds_set_driver_loaded(true);
- hdd_start_complete(0);
cds_set_load_in_progress(false);
hdd_soc_load_unlock(dev);
diff --git a/core/hdd/src/wlan_hdd_main.c b/core/hdd/src/wlan_hdd_main.c
index 2116d40fe1..7da5907b5b 100644
--- a/core/hdd/src/wlan_hdd_main.c
+++ b/core/hdd/src/wlan_hdd_main.c
@@ -13073,7 +13073,7 @@ static ssize_t wlan_hdd_state_ctrl_param_write(struct file *filp,
goto exit;
}
- if (!cds_is_driver_loaded()) {
+ if (!cds_is_driver_loaded() || cds_is_driver_recovering()) {
init_completion(&wlan_start_comp);
rc = wait_for_completion_timeout(&wlan_start_comp,
msecs_to_jiffies(HDD_WLAN_START_WAIT_TIME));
@@ -13082,7 +13082,6 @@ static ssize_t wlan_hdd_state_ctrl_param_write(struct file *filp,
ret = -EINVAL;
return ret;
}
-
hdd_start_complete(0);
}