Просмотр исходного кода

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
Zhu Jianmin 7 лет назад
Родитель
Сommit
6a7b702184
1 измененных файлов с 52 добавлено и 55 удалено
  1. 52 55
      core/hdd/src/wlan_hdd_main.c

+ 52 - 55
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);