summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWill Huang <wilhuang@codeaurora.org>2018-08-13 17:25:02 +0800
committernshrivas <nshrivas@codeaurora.org>2018-10-08 15:26:54 -0700
commitcc949404c251bcf0020e23f38c9174b82dc1e218 (patch)
tree5e3f97f213a123fbf2f8886c3a0afcf5c6db7858
parent001fdd10be5c3e563573e2821cf46e42ea56efd0 (diff)
qcacld-3.0: Fix ACS delayed worker running after adapter stopped
While ACS delayed worker scheduled and is running the function wlan_hdd_cfg80211_start_acs(), ACS_PENDING has already been cleared by wlan_hdd_cfg80211_start_pending_acs() before it, so the later coming stop sap event can't cancel the running delayed worker and free the sap context which need access by delayed worker. Fix by clear ACS_PENDING after wlan_hdd_cfg80211_start_acs(), and move cancel ACS delayed worker before cancel any scan, it can cancel ACS scan invoke by delayed worker and avoid race condition. CRs-Fixed: 2289364 Change-Id: Ibd771fc199a0778ac1d8f1f04ba22b49014437de
-rw-r--r--core/hdd/src/wlan_hdd_cfg80211.c2
-rw-r--r--core/hdd/src/wlan_hdd_main.c9
2 files changed, 5 insertions, 6 deletions
diff --git a/core/hdd/src/wlan_hdd_cfg80211.c b/core/hdd/src/wlan_hdd_cfg80211.c
index 26d16b9ffa81..e61ef00b2e4b 100644
--- a/core/hdd/src/wlan_hdd_cfg80211.c
+++ b/core/hdd/src/wlan_hdd_cfg80211.c
@@ -1940,8 +1940,8 @@ static void wlan_hdd_cfg80211_start_pending_acs(struct work_struct *work)
hdd_adapter_t *adapter = container_of(work, hdd_adapter_t,
acs_pending_work.work);
- clear_bit(ACS_PENDING, &adapter->event_flags);
wlan_hdd_cfg80211_start_acs(adapter);
+ clear_bit(ACS_PENDING, &adapter->event_flags);
}
/**
diff --git a/core/hdd/src/wlan_hdd_main.c b/core/hdd/src/wlan_hdd_main.c
index 3387a7be70ee..bd1d50deaca2 100644
--- a/core/hdd/src/wlan_hdd_main.c
+++ b/core/hdd/src/wlan_hdd_main.c
@@ -4956,6 +4956,10 @@ QDF_STATUS hdd_stop_adapter(hdd_context_t *hdd_ctx, hdd_adapter_t *adapter,
break;
case QDF_SAP_MODE:
+ if (test_bit(ACS_PENDING, &adapter->event_flags)) {
+ cds_flush_delayed_work(&adapter->acs_pending_work);
+ clear_bit(ACS_PENDING, &adapter->event_flags);
+ }
hdd_ipa_flush(hdd_ctx);
case QDF_P2P_GO_MODE:
@@ -4968,11 +4972,6 @@ QDF_STATUS hdd_stop_adapter(hdd_context_t *hdd_ctx, hdd_adapter_t *adapter,
cds_flush_work(&hdd_ctx->sap_start_work);
hdd_debug("Canceled the pending SAP restart work");
cds_change_sap_restart_required_status(false);
- if (test_bit(ACS_PENDING, &adapter->event_flags)) {
- cds_flush_delayed_work(
- &adapter->acs_pending_work);
- clear_bit(ACS_PENDING, &adapter->event_flags);
- }
}
cds_flush_work(&adapter->sap_stop_bss_work);