diff options
author | Aditya Kodukula <quic_akodukul@quicinc.com> | 2020-06-16 15:10:21 +0530 |
---|---|---|
committer | Paul Chen <chenpaul@google.com> | 2020-07-08 10:54:06 +0000 |
commit | c56cb4d6c470feb1eca6431456ae2f2858b54c40 (patch) | |
tree | 2ab5f8b09cbb6e31a81c72f90444d17e7969ce47 /core | |
parent | 6e0025c17f580c528d9165413d89807232a31b2f (diff) | |
download | qcacld-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.c | 2 | ||||
-rw-r--r-- | core/hdd/src/wlan_hdd_main.c | 3 |
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); } |