Browse Source

qcacld-3.0: Add support for DCS channel switch from DFS to DFS

Bring up SAP+SAP with acs mode on 5G and set chanlist only with
DFS channel, run heavy traffic to make noisy on SAP beacon channel,
then DCS will be triggered to do ACS again for choosing better
channel to switch, new DFS channel will be choosed, but channel
switch is failed.

DCS policy is SAP do channel switch one by one with the same target
channel, ignore three fail point concurrency check in
wlan_hdd_cfg80211_start_acs/wlansap_set_channel_change_with_csa/
wlansap_roam_process_dfs_chansw_update, furthermore need to add DFS
channel to acs channel list in sap_get_freq_list.

Change-Id: I7360792105cd1fdd4f4c75040c510cc620c3d5c5
CRs-Fixed: 2648641
hqu 5 years ago
parent
commit
14cdfe2c91

+ 3 - 1
core/hdd/src/wlan_hdd_cfg80211.c

@@ -2020,7 +2020,9 @@ int wlan_hdd_cfg80211_start_acs(struct hdd_adapter *adapter)
 	if (QDF_MCC_TO_SCC_SWITCH_FORCE_PREFERRED_WITHOUT_DISCONNECTION !=
 	    mcc_to_scc_switch &&
 	    !(policy_mgr_is_hw_dbs_capable(hdd_ctx->psoc) &&
-	    WLAN_REG_IS_24GHZ_CH_FREQ(sap_config->acs_cfg.end_ch_freq))) {
+	    WLAN_REG_IS_24GHZ_CH_FREQ(sap_config->acs_cfg.end_ch_freq)) &&
+	    !wlansap_dcs_is_wlan_interference_mitigation_enabled(
+					WLAN_HDD_GET_SAP_CTX_PTR(adapter))) {
 		status = wlan_hdd_sap_cfg_dfs_override(adapter);
 		if (status < 0)
 			return status;

+ 3 - 0
core/sap/src/sap_api_link_cntl.c

@@ -575,10 +575,13 @@ wlansap_roam_process_dfs_chansw_update(mac_handle_t mac_handle,
 	 * second SAP's channel change due to some previous platform's single
 	 * radio limitation.
 	 *
+	 * For DCS case, SAP will do channel switch one by one.
+	 *
 	 */
 	sap_scc_dfs = sap_is_conc_sap_doing_scc_dfs(mac_handle, sap_ctx);
 	if (sap_get_total_number_sap_intf(mac_handle) <= 1 ||
 	    policy_mgr_is_current_hwmode_dbs(mac_ctx->psoc) ||
+	    sap_ctx->csa_reason == CSA_REASON_DCS ||
 	    !sap_scc_dfs) {
 		sap_get_cac_dur_dfs_region(sap_ctx,
 			&sap_ctx->csr_roamProfile.cac_duration_ms,

+ 13 - 6
core/sap/src/sap_fsm.c

@@ -3387,12 +3387,19 @@ static QDF_STATUS sap_get_freq_list(struct sap_context *sap_ctx,
 		 * resulting  MCC on DFS channel
 		 */
 		if (wlan_reg_is_dfs_for_freq(
-				mac_ctx->pdev,
-				WLAN_REG_CH_TO_FREQ(loop_count)) &&
-		    (policy_mgr_disallow_mcc(mac_ctx->psoc,
-			WLAN_REG_CH_TO_FREQ(loop_count)) ||
-		    !dfs_master_enable))
-			continue;
+					mac_ctx->pdev,
+					WLAN_REG_CH_TO_FREQ(loop_count))) {
+			if (!dfs_master_enable)
+				continue;
+			if (wlansap_dcs_is_wlan_interference_mitigation_enabled(
+								sap_ctx))
+				sap_debug("dfs chan_freq %d added when dcs enabled",
+					  WLAN_REG_CH_TO_FREQ(loop_count));
+			else if (policy_mgr_disallow_mcc(
+					mac_ctx->psoc,
+					WLAN_REG_CH_TO_FREQ(loop_count)))
+				continue;
+		}
 
 		/* Dont scan ETSI13 SRD channels if the ETSI13 SRD channels
 		 * are not enabled in master mode

+ 2 - 1
core/sap/src/sap_module.c

@@ -1374,7 +1374,8 @@ QDF_STATUS wlansap_set_channel_change_with_csa(struct sap_context *sap_ctx,
 		(!policy_mgr_is_any_mode_active_on_band_along_with_session(
 			mac->psoc, sap_ctx->sessionId,
 			POLICY_MGR_BAND_5) ||
-			sta_sap_scc_on_dfs_chan)))) {
+			sta_sap_scc_on_dfs_chan ||
+			sap_ctx->csa_reason == CSA_REASON_DCS)))) {
 		/*
 		 * validate target channel switch w.r.t various concurrency
 		 * rules set.