diff options
author | Sourav Mohapatra <mohapatr@codeaurora.org> | 2020-06-16 16:25:08 +0530 |
---|---|---|
committer | Kumar Anand <kumaranand@google.com> | 2020-07-22 00:00:17 +0000 |
commit | f9d54215e9aead406c43008c1bc9b73751a00adf (patch) | |
tree | 26da53f7b0db150bb79ad9328565cdb87b94688b | |
parent | c2a7e0a86ae97290f1eb9a42ddc2ed0c62c63c7a (diff) | |
download | qcacld-f9d54215e9aead406c43008c1bc9b73751a00adf.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.
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.
Bug: 157090295
Change-Id: Ia1c4f8d7076d77c591276ee380b55a747cf606bd
CRs-Fixed: 2701513
-rw-r--r-- | core/hdd/src/wlan_hdd_driver_ops.c | 5 | ||||
-rw-r--r-- | core/hdd/src/wlan_hdd_main.c | 2 |
2 files changed, 4 insertions, 3 deletions
diff --git a/core/hdd/src/wlan_hdd_driver_ops.c b/core/hdd/src/wlan_hdd_driver_ops.c index efee8e24a3..b46b22775f 100644 --- a/core/hdd/src/wlan_hdd_driver_ops.c +++ b/core/hdd/src/wlan_hdd_driver_ops.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2018 The Linux Foundation. All rights reserved. + * Copyright (c) 2015-2018,2020 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -413,12 +413,12 @@ static int wlan_hdd_probe(struct device *dev, void *bdev, const struct hif_bus_i goto err_hdd_deinit; + hdd_start_complete(0); if (reinit) { cds_set_recovery_in_progress(false); } else { cds_set_load_in_progress(false); cds_set_driver_loaded(true); - hdd_start_complete(0); } hdd_allow_suspend(WIFI_POWER_EVENT_WAKELOCK_DRIVER_INIT); @@ -449,6 +449,7 @@ err_init_qdf_ctx: hdd_remove_pm_qos(dev); hdd_stop_driver_ops_timer(); + hdd_start_complete(0); mutex_unlock(&hdd_init_deinit_lock); return check_for_probe_defer(ret); } diff --git a/core/hdd/src/wlan_hdd_main.c b/core/hdd/src/wlan_hdd_main.c index 4ecd4a85e1..e76b17f73e 100644 --- a/core/hdd/src/wlan_hdd_main.c +++ b/core/hdd/src/wlan_hdd_main.c @@ -12153,7 +12153,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)); |