summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbings <bings@codeaurora.org>2017-03-28 07:47:32 +0800
committerGerrit - the friendly Code Review server <code-review@localhost>2017-03-30 04:55:24 -0700
commit7e387c1626e27870a8fbb3eccd750b9eb3d960f3 (patch)
tree610f6529230dc5d7108bb66baba34f958bf18bb2
parentb7bc4efed6409119d1cc5a8e4dcba0c4edf877e4 (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.c12
-rw-r--r--CORE/SERVICES/BMI/ol_fw.c3
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);