From 6cddfae45a218e210abd1c2696eec2952c927ded Mon Sep 17 00:00:00 2001 From: Bapiraju Alla Date: Tue, 14 Apr 2020 20:07:00 +0530 Subject: [PATCH] qcacld-3.0: Wait for sme_soc_set_dual_mac_config to get complete SAP turn on is getting stuck for longer time due to vdev is getting deleted logically before response for sme_soc_set_dual_mac_config comes. To resolve this, add wait in wlan_hdd_update_dbs_scan_and_fw_mode_config to confirm sme_soc_set_dual_mac_config completion. Change-Id: I9408713fcf828d24688ecc45290d8c90a8d54c22 CRs-Fixed: 2663509 --- .../policy_mgr/inc/wlan_policy_mgr_api.h | 45 +++++++++++- .../inc/wlan_policy_mgr_public_struct.h | 7 +- .../policy_mgr/src/wlan_policy_mgr_action.c | 71 +++++++++++++++++++ .../src/wlan_policy_mgr_get_set_utils.c | 9 ++- .../policy_mgr/src/wlan_policy_mgr_i.h | 5 ++ .../src/wlan_policy_mgr_init_deinit.c | 15 ++++ core/hdd/src/wlan_hdd_main.c | 12 +++- core/sme/src/common/sme_api.c | 2 +- 8 files changed, 155 insertions(+), 11 deletions(-) diff --git a/components/cmn_services/policy_mgr/inc/wlan_policy_mgr_api.h b/components/cmn_services/policy_mgr/inc/wlan_policy_mgr_api.h index 395efccb9593..6ef14dd53f70 100644 --- a/components/cmn_services/policy_mgr/inc/wlan_policy_mgr_api.h +++ b/components/cmn_services/policy_mgr/inc/wlan_policy_mgr_api.h @@ -1545,6 +1545,7 @@ void policy_mgr_set_dual_mac_fw_mode_config(struct wlan_objmgr_psoc *psoc, /** * policy_mgr_soc_set_dual_mac_cfg_cb() - Callback for set dual mac config + * @psoc: PSOC object information * @status: Status of set dual mac config * @scan_config: Current scan config whose status is the first param * @fw_mode_config: Current FW mode config whose status is the first param @@ -1553,8 +1554,10 @@ void policy_mgr_set_dual_mac_fw_mode_config(struct wlan_objmgr_psoc *psoc, * * Return: None */ -void policy_mgr_soc_set_dual_mac_cfg_cb(enum set_hw_mode_status status, - uint32_t scan_config, uint32_t fw_mode_config); +void policy_mgr_soc_set_dual_mac_cfg_cb(struct wlan_objmgr_psoc *psoc, + enum set_hw_mode_status status, + uint32_t scan_config, + uint32_t fw_mode_config); /** * policy_mgr_map_concurrency_mode() - to map concurrency mode @@ -1720,6 +1723,44 @@ QDF_STATUS policy_mgr_reset_connection_update(struct wlan_objmgr_psoc *psoc); */ QDF_STATUS policy_mgr_set_connection_update(struct wlan_objmgr_psoc *psoc); +/** + * policy_mgr_reset_dual_mac_configuration() - Reset dual MAC configuration + * complete event + * @psoc: PSOC object information + * Resets the concurrent dual MAC configuration complete event + * + * Return: QDF_STATUS + */ +QDF_STATUS +policy_mgr_reset_dual_mac_configuration(struct wlan_objmgr_psoc *psoc); + + +/** + * policy_mgr_wait_for_dual_mac_configuration() - Wait for set dual MAC + * configuration command to get processed + * @psoc: PSOC object information + * Waits for DUAL_MAC_CONFIG_TIMEOUT duration until + * policy_mgr_soc_set_dual_mac_cfg_cb sets the event + * dual_mac_configuration_complete_evt + * + * Return: QDF_STATUS + */ +QDF_STATUS +policy_mgr_wait_for_dual_mac_configuration(struct wlan_objmgr_psoc *psoc); + + +/** + * policy_mgr_dual_mac_configuration_complete() - Complete dual MAC + * configuration wait event + * @psoc: PSOC object information + * Sets the concurrent dual MAC configuration complete event + * + * Return: QDF_STATUS + */ +QDF_STATUS +policy_mgr_dual_mac_configuration_complete(struct wlan_objmgr_psoc *psoc); + + /** * policy_mgr_set_chan_switch_complete_evt() - set channel * switch completion event diff --git a/components/cmn_services/policy_mgr/inc/wlan_policy_mgr_public_struct.h b/components/cmn_services/policy_mgr/inc/wlan_policy_mgr_public_struct.h index 9a743058adf5..5a548fdfe854 100644 --- a/components/cmn_services/policy_mgr/inc/wlan_policy_mgr_public_struct.h +++ b/components/cmn_services/policy_mgr/inc/wlan_policy_mgr_public_struct.h @@ -980,9 +980,10 @@ enum set_hw_mode_status { SET_HW_MODE_STATUS_ALREADY, }; -typedef void (*dual_mac_cb)(enum set_hw_mode_status status, - uint32_t scan_config, - uint32_t fw_mode_config); +typedef void (*dual_mac_cb)(struct wlan_objmgr_psoc *psoc, + enum set_hw_mode_status status, + uint32_t scan_config, + uint32_t fw_mode_config); /** * enum policy_mgr_hw_mode_change - identify the HW mode switching to. * diff --git a/components/cmn_services/policy_mgr/src/wlan_policy_mgr_action.c b/components/cmn_services/policy_mgr/src/wlan_policy_mgr_action.c index be87adb2e444..9ca70973feab 100644 --- a/components/cmn_services/policy_mgr/src/wlan_policy_mgr_action.c +++ b/components/cmn_services/policy_mgr/src/wlan_policy_mgr_action.c @@ -2273,6 +2273,77 @@ QDF_STATUS policy_mgr_set_connection_update(struct wlan_objmgr_psoc *psoc) return QDF_STATUS_SUCCESS; } +QDF_STATUS +policy_mgr_wait_for_dual_mac_configuration(struct wlan_objmgr_psoc *psoc) +{ + QDF_STATUS status; + struct policy_mgr_psoc_priv_obj *policy_mgr_context; + + policy_mgr_context = policy_mgr_get_context(psoc); + if (!policy_mgr_context) { + policy_mgr_err("Invalid context"); + return QDF_STATUS_E_FAILURE; + } + + status = qdf_wait_single_event( + &policy_mgr_context->dual_mac_configuration_complete_evt, + DUAL_MAC_CONFIG_TIMEOUT); + + if (!QDF_IS_STATUS_SUCCESS(status)) { + policy_mgr_err("wait for event failed"); + return QDF_STATUS_E_FAILURE; + } + + return QDF_STATUS_SUCCESS; +} + +QDF_STATUS +policy_mgr_dual_mac_configuration_complete(struct wlan_objmgr_psoc *psoc) +{ + QDF_STATUS status; + struct policy_mgr_psoc_priv_obj *policy_mgr_context; + + policy_mgr_context = policy_mgr_get_context(psoc); + if (!policy_mgr_context) { + policy_mgr_err("Invalid context"); + return QDF_STATUS_E_FAILURE; + } + + status = qdf_event_set( + &policy_mgr_context->dual_mac_configuration_complete_evt); + + if (!QDF_IS_STATUS_SUCCESS(status)) { + policy_mgr_err("set event failed"); + return QDF_STATUS_E_FAILURE; + } + + return QDF_STATUS_SUCCESS; +} + +QDF_STATUS +policy_mgr_reset_dual_mac_configuration(struct wlan_objmgr_psoc *psoc) +{ + QDF_STATUS status; + struct policy_mgr_psoc_priv_obj *policy_mgr_context; + + policy_mgr_context = policy_mgr_get_context(psoc); + if (!policy_mgr_context) { + policy_mgr_err("Invalid context"); + return QDF_STATUS_E_FAILURE; + } + + status = qdf_event_reset( + &policy_mgr_context->dual_mac_configuration_complete_evt); + + if (!QDF_IS_STATUS_SUCCESS(status)) { + policy_mgr_err("clear event failed"); + return QDF_STATUS_E_FAILURE; + } + + return QDF_STATUS_SUCCESS; +} + + QDF_STATUS policy_mgr_set_chan_switch_complete_evt( struct wlan_objmgr_psoc *psoc) { diff --git a/components/cmn_services/policy_mgr/src/wlan_policy_mgr_get_set_utils.c b/components/cmn_services/policy_mgr/src/wlan_policy_mgr_get_set_utils.c index dc3cf619cfc8..ff12f8121e17 100644 --- a/components/cmn_services/policy_mgr/src/wlan_policy_mgr_get_set_utils.c +++ b/components/cmn_services/policy_mgr/src/wlan_policy_mgr_get_set_utils.c @@ -1386,12 +1386,15 @@ QDF_STATUS policy_mgr_check_conn_with_mode_and_vdev_id( return qdf_status; } -void policy_mgr_soc_set_dual_mac_cfg_cb(enum set_hw_mode_status status, - uint32_t scan_config, - uint32_t fw_mode_config) +void policy_mgr_soc_set_dual_mac_cfg_cb(struct wlan_objmgr_psoc *psoc, + enum set_hw_mode_status status, + uint32_t scan_config, + uint32_t fw_mode_config) { policy_mgr_debug("Status:%d for scan_config:%x fw_mode_config:%x", status, scan_config, fw_mode_config); + + policy_mgr_dual_mac_configuration_complete(psoc); } void policy_mgr_set_dual_mac_scan_config(struct wlan_objmgr_psoc *psoc, diff --git a/components/cmn_services/policy_mgr/src/wlan_policy_mgr_i.h b/components/cmn_services/policy_mgr/src/wlan_policy_mgr_i.h index 9c1f7f4ad694..09c3b974ea6e 100644 --- a/components/cmn_services/policy_mgr/src/wlan_policy_mgr_i.h +++ b/components/cmn_services/policy_mgr/src/wlan_policy_mgr_i.h @@ -41,6 +41,8 @@ #define PM_5_GHZ_CH_FREQ_36 (5180) #define CHANNEL_SWITCH_COMPLETE_TIMEOUT (2000) +#define DUAL_MAC_CONFIG_TIMEOUT (POLICY_MGR_SER_CMD_TIMEOUT + 1000) + /** * Policy Mgr hardware mode list bit-mask definitions. * Bits 4:0, 31:29 are unused. @@ -333,6 +335,8 @@ struct policy_mgr_cfg { * @user_config_sap_ch_freq: SAP channel freq configured by user application * @cfg: Policy manager config data * @dynamic_mcc_adaptive_sched: disable/enable mcc adaptive scheduler feature + * @dual_mac_configuration_complete_evt: qdf event to synchronize dual mac + * configuration setting */ struct policy_mgr_psoc_priv_obj { struct wlan_objmgr_psoc *psoc; @@ -374,6 +378,7 @@ struct policy_mgr_psoc_priv_obj { uint32_t valid_ch_freq_list[NUM_CHANNELS]; uint32_t valid_ch_freq_list_count; bool dynamic_mcc_adaptive_sched; + qdf_event_t dual_mac_configuration_complete_evt; }; /** diff --git a/components/cmn_services/policy_mgr/src/wlan_policy_mgr_init_deinit.c b/components/cmn_services/policy_mgr/src/wlan_policy_mgr_init_deinit.c index ea6240c69952..b1a090109508 100644 --- a/components/cmn_services/policy_mgr/src/wlan_policy_mgr_init_deinit.c +++ b/components/cmn_services/policy_mgr/src/wlan_policy_mgr_init_deinit.c @@ -440,6 +440,13 @@ QDF_STATUS policy_mgr_psoc_enable(struct wlan_objmgr_psoc *psoc) return status; } + /* init dual_mac_configuration_complete_evt */ + status = qdf_event_create(&pm_ctx->dual_mac_configuration_complete_evt); + if (!QDF_IS_STATUS_SUCCESS(status)) { + policy_mgr_err("dual_mac_configuration_complete_evt init failed"); + return status; + } + status = qdf_event_create(&pm_ctx->opportunistic_update_done_evt); if (!QDF_IS_STATUS_SUCCESS(status)) { policy_mgr_err("opportunistic_update_done_evt init failed"); @@ -595,6 +602,14 @@ QDF_STATUS policy_mgr_psoc_disable(struct wlan_objmgr_psoc *psoc) QDF_ASSERT(0); } + /* destroy dual_mac_configuration_complete_evt */ + if (!QDF_IS_STATUS_SUCCESS(qdf_event_destroy + (&pm_ctx->dual_mac_configuration_complete_evt))) { + policy_mgr_err("Failed to destroy dual_mac_configuration_complete_evt"); + status = QDF_STATUS_E_FAILURE; + QDF_ASSERT(0); + } + /* deinit pm_conc_connection_list */ qdf_mem_zero(pm_conc_connection_list, sizeof(pm_conc_connection_list)); diff --git a/core/hdd/src/wlan_hdd_main.c b/core/hdd/src/wlan_hdd_main.c index e88508f0914f..4c2b7ee90b04 100644 --- a/core/hdd/src/wlan_hdd_main.c +++ b/core/hdd/src/wlan_hdd_main.c @@ -2762,13 +2762,21 @@ wlan_hdd_update_dbs_scan_and_fw_mode_config(void) hdd_debug("send scan_cfg: 0x%x fw_mode_cfg: 0x%x to fw", cfg.scan_config, cfg.fw_mode_config); + status = policy_mgr_reset_dual_mac_configuration(hdd_ctx->psoc); + if (QDF_IS_STATUS_ERROR(status)) + return status; + status = sme_soc_set_dual_mac_config(cfg); - if (status != QDF_STATUS_SUCCESS) { + if (QDF_IS_STATUS_SUCCESS(status)) { + /* wait for sme_soc_set_dual_mac_config to complete */ + status = + policy_mgr_wait_for_dual_mac_configuration(hdd_ctx->psoc); + } else { hdd_err("sme_soc_set_dual_mac_config failed %d", status); return status; } - return QDF_STATUS_SUCCESS; + return status; } /** diff --git a/core/sme/src/common/sme_api.c b/core/sme/src/common/sme_api.c index d26afd5e3a01..20883373e56c 100644 --- a/core/sme/src/common/sme_api.c +++ b/core/sme/src/common/sme_api.c @@ -1973,7 +1973,7 @@ static QDF_STATUS sme_process_dual_mac_config_resp(struct mac_context *mac, sme_err("Callback failed-Dual mac config is NULL"); } else { sme_debug("Calling HDD callback for Dual mac config"); - callback(param->status, + callback(mac->psoc, param->status, command->u.set_dual_mac_cmd.scan_config, command->u.set_dual_mac_cmd.fw_mode_config); }