diff options
| author | bings <bings@codeaurora.org> | 2017-03-28 07:47:32 +0800 |
|---|---|---|
| committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2017-03-30 04:55:24 -0700 |
| commit | 7e387c1626e27870a8fbb3eccd750b9eb3d960f3 (patch) | |
| tree | 610f6529230dc5d7108bb66baba34f958bf18bb2 | |
| parent | b7bc4efed6409119d1cc5a8e4dcba0c4edf877e4 (diff) | |
qcacld-2.0: Do not access target register in driver unloading
Crash happens when driver continues to access target register in
ol_target_failure when driver is unloading.
If rmmod happens firstly, do nothing in ol_target_failure in ssr.
If ssr happens firstly, wait for ssr finish in rmmod.
Change-Id: I2a4980b6cd4b689da07c34f2acdfaafbbb0715bb
CRs-Fixed: 2025585
| -rw-r--r-- | CORE/HDD/src/wlan_hdd_main.c | 12 | ||||
| -rw-r--r-- | CORE/SERVICES/BMI/ol_fw.c | 3 |
2 files changed, 8 insertions, 7 deletions
diff --git a/CORE/HDD/src/wlan_hdd_main.c b/CORE/HDD/src/wlan_hdd_main.c index a2e9284b7feb..018908e8eb8e 100644 --- a/CORE/HDD/src/wlan_hdd_main.c +++ b/CORE/HDD/src/wlan_hdd_main.c @@ -16626,6 +16626,12 @@ static void hdd_driver_exit(void) pHddCtx->driver_being_stopped = false; + rtnl_lock(); + pHddCtx->isUnloadInProgress = TRUE; + vos_set_load_unload_in_progress(VOS_MODULE_ID_VOSS, TRUE); + vos_set_unload_in_progress(TRUE); + rtnl_unlock(); + while(pHddCtx->isLogpInProgress || vos_is_logp_in_progress(VOS_MODULE_ID_VOSS, NULL)) { VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, @@ -16638,12 +16644,6 @@ static void hdd_driver_exit(void) VOS_BUG(0); } } - - rtnl_lock(); - pHddCtx->isUnloadInProgress = TRUE; - vos_set_load_unload_in_progress(VOS_MODULE_ID_VOSS, TRUE); - vos_set_unload_in_progress(TRUE); - rtnl_unlock(); } vos_wait_for_work_thread_completion(__func__); diff --git a/CORE/SERVICES/BMI/ol_fw.c b/CORE/SERVICES/BMI/ol_fw.c index 5181120d3e6e..47e665365b23 100644 --- a/CORE/SERVICES/BMI/ol_fw.c +++ b/CORE/SERVICES/BMI/ol_fw.c @@ -1470,12 +1470,13 @@ void ol_target_failure(void *instance, A_STATUS status) } #endif + vos_set_logp_in_progress(VOS_MODULE_ID_VOSS, TRUE); if (vos_is_load_unload_in_progress(VOS_MODULE_ID_VOSS, NULL)) { printk("%s: Loading/Unloading is in progress, ignore!\n", __func__); + vos_set_logp_in_progress(VOS_MODULE_ID_VOSS, FALSE); return; } - vos_set_logp_in_progress(VOS_MODULE_ID_VOSS, TRUE); #ifdef HIF_PCI ret = hif_pci_check_fw_reg(scn->hif_sc); |
