From 6a7b702184e76d0729c6d5561a7224600d309035 Mon Sep 17 00:00:00 2001 From: Zhu Jianmin Date: Sat, 10 Mar 2018 21:42:21 +0800 Subject: [PATCH] qcacld-3.0: Fix ifconfig wlan0 up failed on Rome Fix 2 sub issues: 1. wlan_hdd_update_dbs_scan_and_fw_mode_config and sme_soc_set_dual_mac_config is called in hdd_wlan_start_modules->hdd_configure_cds->hdd_features_init, before hdd_start_adapter, so vdev isn't created yet, csr_queue_sme_command returned failed Fixed by moving wlan_hdd_update_dbs_scan_and_fw_mode_config to end of hdd_start_adapter 2. Rome doesn't support DBS, doesn't support cmd and wmi service WMI_PDEV_SET_MAC_CONFIG_CMDID. so no response event for the cmd, the cmd can't be removed from active list. so next cmd: WMA_ADD_STA_SELF_REQ can't be executed at all, no complete event for sme_open_session, hdd_init_station_mode failed Fixed by checking whether support HW DBS before sme_soc_set_dual_mac_config Change-Id: Iec2ef7e77e91f332028904c319d24e1ed134306d CRs-Fixed: 2202262 --- core/hdd/src/wlan_hdd_main.c | 107 +++++++++++++++++------------------ 1 file changed, 52 insertions(+), 55 deletions(-) diff --git a/core/hdd/src/wlan_hdd_main.c b/core/hdd/src/wlan_hdd_main.c index 0d7165bdeaee..1e77d35bea50 100644 --- a/core/hdd/src/wlan_hdd_main.c +++ b/core/hdd/src/wlan_hdd_main.c @@ -2278,6 +2278,57 @@ static int hdd_mon_open(struct net_device *dev) return ret; } +static QDF_STATUS +wlan_hdd_update_dbs_scan_and_fw_mode_config(void) +{ + struct policy_mgr_dual_mac_config cfg = {0}; + QDF_STATUS status; + uint32_t channel_select_logic_conc; + struct hdd_context *hdd_ctx = cds_get_context(QDF_MODULE_ID_HDD); + + if (!hdd_ctx) { + hdd_err("HDD context is NULL"); + return QDF_STATUS_E_FAILURE; + } + + + if (!policy_mgr_is_hw_dbs_capable(hdd_ctx->hdd_psoc)) + return QDF_STATUS_SUCCESS; + + cfg.scan_config = 0; + cfg.fw_mode_config = 0; + cfg.set_dual_mac_cb = policy_mgr_soc_set_dual_mac_cfg_cb; + + channel_select_logic_conc = hdd_ctx->config-> + channel_select_logic_conc; + + if (hdd_ctx->config->dual_mac_feature_disable != + DISABLE_DBS_CXN_AND_SCAN) { + status = policy_mgr_get_updated_scan_and_fw_mode_config( + hdd_ctx->hdd_psoc, &cfg.scan_config, + &cfg.fw_mode_config, + hdd_ctx->config->dual_mac_feature_disable, + channel_select_logic_conc); + + if (status != QDF_STATUS_SUCCESS) { + hdd_err("wma_get_updated_scan_and_fw_mode_config failed %d", + status); + return status; + } + } + + hdd_debug("send scan_cfg: 0x%x fw_mode_cfg: 0x%x to fw", + cfg.scan_config, cfg.fw_mode_config); + + status = sme_soc_set_dual_mac_config(cfg); + if (status != QDF_STATUS_SUCCESS) { + hdd_err("sme_soc_set_dual_mac_config failed %d", status); + return status; + } + + return QDF_STATUS_SUCCESS; +} + /** * hdd_start_adapter() - Wrapper function for device specific adapter * @adapter: pointer to HDD adapter @@ -2339,6 +2390,7 @@ int hdd_start_adapter(struct hdd_adapter *adapter) hdd_err("Failed to register frames - ret %d", ret); goto err_start_adapter; } + wlan_hdd_update_dbs_scan_and_fw_mode_config(); exit_with_success: EXIT(); @@ -8194,55 +8246,6 @@ void hdd_acs_response_timeout_handler(void *context) } } -static QDF_STATUS -wlan_hdd_update_dbs_scan_and_fw_mode_config(struct hdd_context *hdd_ctx) -{ - struct policy_mgr_dual_mac_config cfg = {0}; - QDF_STATUS status; - uint32_t channel_select_logic_conc; - - if (!hdd_ctx) { - hdd_err("HDD context is NULL"); - return QDF_STATUS_E_FAILURE; - } - - cfg.scan_config = 0; - cfg.fw_mode_config = 0; - cfg.set_dual_mac_cb = policy_mgr_soc_set_dual_mac_cfg_cb; - - if (!policy_mgr_is_dbs_enable(hdd_ctx->hdd_psoc)) - channel_select_logic_conc = 0; - else - channel_select_logic_conc = hdd_ctx->config-> - channel_select_logic_conc; - - if (hdd_ctx->config->dual_mac_feature_disable != - DISABLE_DBS_CXN_AND_SCAN) { - status = policy_mgr_get_updated_scan_and_fw_mode_config( - hdd_ctx->hdd_psoc, &cfg.scan_config, - &cfg.fw_mode_config, - hdd_ctx->config->dual_mac_feature_disable, - channel_select_logic_conc); - - if (status != QDF_STATUS_SUCCESS) { - hdd_err("wma_get_updated_scan_and_fw_mode_config failed %d", - status); - return status; - } - } - - hdd_debug("send scan_cfg: 0x%x fw_mode_cfg: 0x%x to fw", - cfg.scan_config, cfg.fw_mode_config); - - status = sme_soc_set_dual_mac_config(cfg); - if (status != QDF_STATUS_SUCCESS) { - hdd_err("sme_soc_set_dual_mac_config failed %d", status); - return status; - } - - return QDF_STATUS_SUCCESS; -} - /** * hdd_override_ini_config - Override INI config * @hdd_ctx: HDD context @@ -9906,12 +9909,6 @@ static int hdd_features_init(struct hdd_context *hdd_ctx, struct hdd_adapter *ad goto deregister_frames; } - status = wlan_hdd_update_dbs_scan_and_fw_mode_config(hdd_ctx); - if (!QDF_IS_STATUS_SUCCESS(status)) { - hdd_err("Failed to set dbs scan and fw mode cfg"); - goto deregister_cb; - } - if (hdd_ctx->config->goptimize_chan_avoid_event) { status = sme_enable_disable_chanavoidind_event( hdd_ctx->hHal, 0);