From b4260d5e383b07900c5bfeafc616eb7749caf0e8 Mon Sep 17 00:00:00 2001 From: Dustin Brown Date: Thu, 24 Jan 2019 11:53:08 -0800 Subject: [PATCH] qcacld-3.0: Simplify pre-cac flush prevention Change I875c2f14ffd54272fc9ea0df1cecc6dd1171e310 introduced an elaborate workaround to prevent the pre-cac work from flushing itself during stop adapter. Introduce a less complicated work around by simply checking if the current adapter is the pre-cac adapter before flushing the pre-cac work. Change-Id: Ib3e0716f8d088d124e960dcd724f579fb39a3d74 CRs-Fixed: 2387173 --- core/hdd/inc/wlan_hdd_main.h | 8 ------- core/hdd/src/wlan_hdd_hostapd.c | 42 +++++---------------------------- core/hdd/src/wlan_hdd_main.c | 13 ++++------ core/sap/inc/sap_api.h | 14 ++++++++--- core/sap/src/sap_module.c | 12 +++++++--- 5 files changed, 31 insertions(+), 58 deletions(-) diff --git a/core/hdd/inc/wlan_hdd_main.h b/core/hdd/inc/wlan_hdd_main.h index bc54e7570d..1bf6a6c518 100644 --- a/core/hdd/inc/wlan_hdd_main.h +++ b/core/hdd/inc/wlan_hdd_main.h @@ -2132,14 +2132,6 @@ void hdd_deinit_adapter(struct hdd_context *hdd_ctx, QDF_STATUS hdd_stop_adapter(struct hdd_context *hdd_ctx, struct hdd_adapter *adapter); -enum hdd_adapter_stop_flag_t { - HDD_IN_CAC_WORK_TH_CONTEXT = 0x00000001, -}; - -QDF_STATUS hdd_stop_adapter_ext(struct hdd_context *hdd_ctx, - struct hdd_adapter *adapter, - enum hdd_adapter_stop_flag_t flag); - void hdd_set_station_ops(struct net_device *dev); /** diff --git a/core/hdd/src/wlan_hdd_hostapd.c b/core/hdd/src/wlan_hdd_hostapd.c index 610737d12a..51a069530b 100644 --- a/core/hdd/src/wlan_hdd_hostapd.c +++ b/core/hdd/src/wlan_hdd_hostapd.c @@ -1025,32 +1025,6 @@ static int wlan_hdd_set_pre_cac_complete_status(struct hdd_adapter *ap_adapter, return 0; } -/** - * hdd_check_adapter() - check adapter existing or not - * @adapter: adapter - * - * Check adapter in the hdd global list or not - * - * Return: true if adapter exists. - */ -static bool hdd_check_adapter(struct hdd_adapter *adapter) -{ - struct hdd_adapter *temp; - struct hdd_context *hdd_ctx; - - hdd_ctx = cds_get_context(QDF_MODULE_ID_HDD); - if (!hdd_ctx) { - hdd_err("HDD context is null"); - return false; - } - hdd_for_each_adapter(hdd_ctx, temp) { - if (temp == adapter) - return true; - } - - return false; -} - /** * __wlan_hdd_sap_pre_cac_failure() - Process the pre cac failure * @data: AP adapter @@ -1067,8 +1041,7 @@ static void __wlan_hdd_sap_pre_cac_failure(void *data) hdd_enter(); adapter = (struct hdd_adapter *) data; - if (!adapter || !hdd_check_adapter(adapter) || - adapter->magic != WLAN_HDD_ADAPTER_MAGIC) { + if (!adapter || adapter->magic != WLAN_HDD_ADAPTER_MAGIC) { hdd_err("SAP Pre CAC adapter invalid"); return; } @@ -1079,9 +1052,8 @@ static void __wlan_hdd_sap_pre_cac_failure(void *data) return; } - wlan_hdd_release_intf_addr(hdd_ctx, - adapter->mac_addr.bytes); - hdd_stop_adapter_ext(hdd_ctx, adapter, HDD_IN_CAC_WORK_TH_CONTEXT); + wlan_hdd_release_intf_addr(hdd_ctx, adapter->mac_addr.bytes); + hdd_stop_adapter(hdd_ctx, adapter); hdd_close_adapter(hdd_ctx, adapter, false); } @@ -1118,8 +1090,7 @@ static void wlan_hdd_sap_pre_cac_success(void *data) hdd_enter(); adapter = (struct hdd_adapter *) data; - if (!adapter || !hdd_check_adapter(adapter) || - adapter->magic != WLAN_HDD_ADAPTER_MAGIC) { + if (!adapter || adapter->magic != WLAN_HDD_ADAPTER_MAGIC) { hdd_err("SAP Pre CAC adapter invalid"); return; } @@ -1131,9 +1102,8 @@ static void wlan_hdd_sap_pre_cac_success(void *data) } cds_ssr_protect(__func__); - wlan_hdd_release_intf_addr(hdd_ctx, - adapter->mac_addr.bytes); - hdd_stop_adapter_ext(hdd_ctx, adapter, HDD_IN_CAC_WORK_TH_CONTEXT); + wlan_hdd_release_intf_addr(hdd_ctx, adapter->mac_addr.bytes); + hdd_stop_adapter(hdd_ctx, adapter); hdd_close_adapter(hdd_ctx, adapter, false); cds_ssr_unprotect(__func__); diff --git a/core/hdd/src/wlan_hdd_main.c b/core/hdd/src/wlan_hdd_main.c index 5b3533b773..5a2604e1fd 100644 --- a/core/hdd/src/wlan_hdd_main.c +++ b/core/hdd/src/wlan_hdd_main.c @@ -5377,16 +5377,10 @@ void wlan_hdd_reset_prob_rspies(struct hdd_adapter *adapter) QDF_STATUS hdd_stop_adapter(struct hdd_context *hdd_ctx, struct hdd_adapter *adapter) -{ - return hdd_stop_adapter_ext(hdd_ctx, adapter, 0); -} - -QDF_STATUS hdd_stop_adapter_ext(struct hdd_context *hdd_ctx, - struct hdd_adapter *adapter, - enum hdd_adapter_stop_flag_t flag) { QDF_STATUS status = QDF_STATUS_SUCCESS; struct hdd_station_ctx *sta_ctx; + struct sap_context *sap_ctx; struct csr_roam_profile *roam_profile; union iwreq_data wrqu; tSirUpdateIE updateIE; @@ -5539,8 +5533,11 @@ QDF_STATUS hdd_stop_adapter_ext(struct hdd_context *hdd_ctx, ucfg_ipa_flush(hdd_ctx->pdev); - if (!(flag & HDD_IN_CAC_WORK_TH_CONTEXT)) + /* don't flush pre-cac destroy if we are destroying pre-cac */ + sap_ctx = WLAN_HDD_GET_SAP_CTX_PTR(adapter); + if (!wlan_sap_is_pre_cac_context(sap_ctx)) cds_flush_work(&hdd_ctx->sap_pre_cac_work); + /* fallthrough */ case QDF_P2P_GO_MODE: diff --git a/core/sap/inc/sap_api.h b/core/sap/inc/sap_api.h index 9c8cf877c3..3f04f0c813 100644 --- a/core/sap/inc/sap_api.h +++ b/core/sap/inc/sap_api.h @@ -643,15 +643,15 @@ typedef struct sSapDfsInfo { uint16_t reduced_beacon_interval; } tSapDfsInfo; -typedef struct tagSapCtxList { +struct sap_ctx_list { void *sap_context; enum QDF_OPMODE sapPersona; -} tSapCtxList, tpSapCtxList; +}; typedef struct tagSapStruct { /* Information Required for SAP DFS Master mode */ tSapDfsInfo SapDfsInfo; - tSapCtxList sapCtxList[SAP_MAX_NUM_SESSION]; + struct sap_ctx_list sapCtxList[SAP_MAX_NUM_SESSION]; #ifdef FEATURE_AP_MCC_CH_AVOIDANCE bool sap_channel_avoidance; #endif /* FEATURE_AP_MCC_CH_AVOIDANCE */ @@ -882,6 +882,14 @@ QDF_STATUS wlan_sap_set_chan_before_pre_cac(struct sap_context *sap_ctx, QDF_STATUS wlan_sap_set_pre_cac_complete_status(struct sap_context *sap_ctx, bool status); +/** + * wlan_sap_is_pre_cac_context() - checks if @context is for a pre-cac adapter + * @context: the SAP context to check + * + * Return: true if @context is for a pre-cac adapter + */ +bool wlan_sap_is_pre_cac_context(struct sap_context *context); + bool wlan_sap_is_pre_cac_active(mac_handle_t handle); QDF_STATUS wlan_sap_get_pre_cac_vdev_id(mac_handle_t handle, uint8_t *vdev_id); #ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH diff --git a/core/sap/src/sap_module.c b/core/sap/src/sap_module.c index a5b4086dcc..c8f241b026 100644 --- a/core/sap/src/sap_module.c +++ b/core/sap/src/sap_module.c @@ -1518,6 +1518,11 @@ QDF_STATUS wlan_sap_set_pre_cac_complete_status(struct sap_context *sap_ctx, return QDF_STATUS_SUCCESS; } +bool wlan_sap_is_pre_cac_context(struct sap_context *context) +{ + return context && context->is_pre_cac_on; +} + /** * wlan_sap_is_pre_cac_active() - Checks if pre cac in in progress * @handle: Global MAC handle @@ -1529,6 +1534,7 @@ QDF_STATUS wlan_sap_set_pre_cac_complete_status(struct sap_context *sap_ctx, bool wlan_sap_is_pre_cac_active(mac_handle_t handle) { struct mac_context *mac = NULL; + struct sap_ctx_list *ctx_list; int i; mac = MAC_CONTEXT(handle); @@ -1538,12 +1544,12 @@ bool wlan_sap_is_pre_cac_active(mac_handle_t handle) return false; } + ctx_list = mac->sap.sapCtxList; for (i = 0; i < SAP_MAX_NUM_SESSION; i++) { - struct sap_context *context = - mac->sap.sapCtxList[i].sap_context; - if (context && context->is_pre_cac_on) + if (wlan_sap_is_pre_cac_context(ctx_list[i].sap_context)) return true; } + return false; }