Browse Source

qcacld-3.0: Allow CSA to DFS channel only if PCL list has it

Currently, PCL returns all 5 GHz channel and SCC channel for SAP
when an ML-STA is present. But this may lead to a case
where the CSA request might be for a DFS channel which needs CAC.

This needs a dedicated mac and ML-STA can't move to MLMR in such
cases. When firmware attempts to move STA to MLMR from MLSR,
firmware asserts as the other mac is occupied by DFS SAP for
CAC operation.
So, allow CSA to a DFS channel only if the channel is present in
PCL list as it covers the supported channel list anyway. Fix
policy mgr table entries also by allowing SCC channels only.

Change-Id: I079fa6beea97fcd7c926ad4bd2bf928a0442d146
CRs-Fixed: 3484572
Srinivas Dasari 1 year ago
parent
commit
db403bc9de

+ 2 - 1
components/cmn_services/interface_mgr/src/wlan_if_mgr_roam.c

@@ -890,7 +890,8 @@ QDF_STATUS if_mgr_validate_candidate(struct wlan_objmgr_vdev *vdev,
 	 */
 	if (!wlan_vdev_mlme_is_mlo_link_vdev(vdev) &&
 	    !policy_mgr_is_concurrency_allowed(psoc, mode, chan_freq,
-					  HW_MODE_20_MHZ, conc_ext_flags)) {
+					       HW_MODE_20_MHZ, conc_ext_flags,
+					       NULL)) {
 		ifmgr_info("Concurrency not allowed for this channel freq %d bssid "QDF_MAC_ADDR_FMT", selecting next",
 			   chan_freq,
 			   QDF_MAC_ADDR_REF(bssid_arg.peer_addr.bytes));

+ 27 - 6
components/cmn_services/policy_mgr/src/wlan_policy_mgr_get_set_utils.c

@@ -4083,7 +4083,7 @@ policy_mgr_ml_link_vdev_need_to_be_disabled(struct wlan_objmgr_psoc *psoc,
 	return !policy_mgr_is_concurrency_allowed(psoc, PM_STA_MODE,
 					wlan_get_operation_chan_freq(vdev),
 					HW_MODE_20_MHZ,
-					conc_ext_flags.value);
+					conc_ext_flags.value, NULL);
 }
 
 static void
@@ -6764,7 +6764,7 @@ policy_mgr_sta_ml_link_enable_allowed(struct wlan_objmgr_psoc *psoc,
 
 	return policy_mgr_is_concurrency_allowed(psoc, PM_STA_MODE,
 					disabled_link_freq, HW_MODE_20_MHZ,
-					conc_ext_flags.value);
+					conc_ext_flags.value, NULL);
 }
 
 /*
@@ -7166,7 +7166,8 @@ policy_mgr_pick_link_vdev_from_inactive_list(
 		if (policy_mgr_is_concurrency_allowed(psoc, PM_STA_MODE,
 						      inactive_freq_lst[i],
 						      HW_MODE_20_MHZ,
-						      conc_ext_flags.value)) {
+						      conc_ext_flags.value,
+						      NULL)) {
 			*picked_vdev_id = inactive_vdev_lst[i];
 			wlan_objmgr_vdev_release_ref(partner_vdev,
 						     WLAN_POLICY_MGR_ID);
@@ -8061,9 +8062,10 @@ bool policy_mgr_is_concurrency_allowed(struct wlan_objmgr_psoc *psoc,
 				       enum policy_mgr_con_mode mode,
 				       uint32_t ch_freq,
 				       enum hw_mode_bandwidth bw,
-				       uint32_t ext_flags)
+				       uint32_t ext_flags,
+				       struct policy_mgr_pcl_list *pcl)
 {
-	uint32_t num_connections = 0, count = 0, index = 0;
+	uint32_t num_connections = 0, count = 0, index = 0, i;
 	bool status = false, match = false;
 	uint32_t list[MAX_NUMBER_OF_CONC_CONNECTIONS];
 	struct policy_mgr_psoc_priv_obj *pm_ctx;
@@ -8212,6 +8214,25 @@ bool policy_mgr_is_concurrency_allowed(struct wlan_objmgr_psoc *psoc,
 		policy_mgr_err("LL SAP concurrency is not valid");
 		return status;
 	}
+
+	/*
+	 * Don't allow DFS SAP on non-SCC channels if an ML-STA is already
+	 * present. PCL list returns the SCC channels and all channels from
+	 * other MAC in case of non-ML/single link STA.
+	 */
+	if (mode == PM_SAP_MODE && pcl &&
+	    wlan_reg_is_dfs_for_freq(pm_ctx->pdev, ch_freq)) {
+		for (i = 0; i < pcl->pcl_len; i++)
+			if (pcl->pcl_list[i] == ch_freq) {
+				status = true;
+				break;
+			}
+		if (!status) {
+			policy_mgr_err("SAP channel %d Not present in PCL",
+				       ch_freq);
+			return status;
+		}
+	}
 	status = true;
 
 	return status;
@@ -8237,7 +8258,7 @@ bool policy_mgr_allow_concurrency(struct wlan_objmgr_psoc *psoc,
 	}
 
 	allowed = policy_mgr_is_concurrency_allowed(psoc, mode, ch_freq,
-						    bw, ext_flags);
+						    bw, ext_flags, &pcl);
 
 	/* Fourth connection concurrency check */
 	if (allowed && policy_mgr_get_connection_count(psoc) == 3)

+ 3 - 1
components/cmn_services/policy_mgr/src/wlan_policy_mgr_i.h

@@ -1086,6 +1086,7 @@ QDF_STATUS policy_mgr_nss_update(struct wlan_objmgr_psoc *psoc,
  * @ch_freq: channel frequency on which new connection is coming up
  * @bw: Bandwidth requested by the connection (optional)
  * @ext_flags: extended flags for concurrency check (union conc_ext_flag)
+ * @pcl: Optional PCL for new connection
  *
  * When a new connection is about to come up check if current
  * concurrency combination including the new connection is
@@ -1098,7 +1099,8 @@ bool policy_mgr_is_concurrency_allowed(struct wlan_objmgr_psoc *psoc,
 				       enum policy_mgr_con_mode mode,
 				       uint32_t ch_freq,
 				       enum hw_mode_bandwidth bw,
-				       uint32_t ext_flags);
+				       uint32_t ext_flags,
+				       struct policy_mgr_pcl_list *pcl);
 
 /**
  * policy_mgr_can_2ghz_share_low_high_5ghz_sbs() - if SBS mode is dynamic where

+ 1 - 1
components/cmn_services/policy_mgr/src/wlan_policy_mgr_pcl.c

@@ -3859,7 +3859,7 @@ QDF_STATUS policy_mgr_get_valid_chan_weights(struct wlan_objmgr_psoc *psoc,
 			if (!policy_mgr_is_concurrency_allowed
 			    (psoc, mode, weight->saved_chan_list[i],
 			     HW_MODE_20_MHZ,
-			     policy_mgr_get_conc_ext_flags(vdev, false)))
+			     policy_mgr_get_conc_ext_flags(vdev, false), NULL))
 				continue;
 			/*
 			 * Keep weight 0 (WEIGHT_OF_DISALLOWED_CHANNELS) not

+ 3 - 3
components/cmn_services/policy_mgr/src/wlan_policy_mgr_tables_2x2_dbs_i.h

@@ -2073,7 +2073,7 @@ pm_third_connection_pcl_dbs_2x2_table = {
 	[PM_STA_STA_DBS_1x1] = {
 	[PM_STA_MODE] = {PM_SCC_ON_5_SCC_ON_24_5G, PM_SCC_ON_5_SCC_ON_24,
 		PM_SCC_ON_5_SCC_ON_24},
-	[PM_SAP_MODE] = {PM_SCC_ON_5_SCC_ON_24_5G, PM_SCC_ON_5_SCC_ON_24,
+	[PM_SAP_MODE] = {PM_SCC_ON_5_SCC_ON_24, PM_SCC_ON_5_SCC_ON_24,
 		PM_SCC_ON_5_SCC_ON_24},
 	[PM_P2P_CLIENT_MODE] =  {PM_SCC_ON_5_SCC_ON_24_5G,
 		PM_SCC_ON_5_SCC_ON_24, PM_SCC_ON_5_SCC_ON_24},
@@ -2088,7 +2088,7 @@ pm_third_connection_pcl_dbs_2x2_table = {
 	[PM_STA_STA_DBS_2x2] = {
 	[PM_STA_MODE] = {PM_SCC_ON_5_SCC_ON_24_5G, PM_SCC_ON_5_SCC_ON_24,
 		PM_SCC_ON_5_SCC_ON_24},
-	[PM_SAP_MODE] = {PM_SCC_ON_5_SCC_ON_24_5G, PM_SCC_ON_5_SCC_ON_24,
+	[PM_SAP_MODE] = {PM_SCC_ON_5_SCC_ON_24, PM_SCC_ON_5_SCC_ON_24,
 		PM_SCC_ON_5_SCC_ON_24},
 	[PM_P2P_CLIENT_MODE] = {PM_SCC_ON_5_SCC_ON_24_5G, PM_SCC_ON_5_SCC_ON_24,
 		PM_SCC_ON_5_SCC_ON_24},
@@ -2105,7 +2105,7 @@ pm_third_connection_pcl_dbs_2x2_table = {
 	[PM_STA_MODE] = {
 		PM_SBS_CH_5G, PM_SBS_CH, PM_SBS_CH},
 	[PM_SAP_MODE] = {
-		PM_SBS_CH_5G, PM_SBS_CH, PM_SBS_CH},
+		PM_SCC_CH, PM_SCC_CH, PM_SCC_CH},
 	[PM_P2P_CLIENT_MODE] = {
 		PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE},
 	[PM_P2P_GO_MODE] = {

+ 3 - 3
components/cmn_services/policy_mgr/src/wlan_policy_mgr_tables_2x2_dbs_sbs_i.h

@@ -1974,7 +1974,7 @@ pm_third_connection_pcl_dbs_sbs_2x2_table = {
 	[PM_STA_STA_DBS_1x1] = {
 	[PM_STA_MODE] = {PM_SCC_ON_5_SCC_ON_24_5G, PM_SCC_ON_5_SCC_ON_24_5G,
 		PM_SCC_ON_5_SCC_ON_24},
-	[PM_SAP_MODE] = {PM_SCC_ON_5_SCC_ON_24_5G, PM_SCC_ON_5_SCC_ON_24,
+	[PM_SAP_MODE] = {PM_SCC_ON_5_SCC_ON_24, PM_SCC_ON_5_SCC_ON_24,
 		PM_SCC_ON_5_SCC_ON_24},
 	[PM_P2P_CLIENT_MODE] = {PM_SCC_ON_5_SCC_ON_24_5G,
 				PM_SCC_ON_5_SCC_ON_24_5G,
@@ -1991,7 +1991,7 @@ pm_third_connection_pcl_dbs_sbs_2x2_table = {
 	[PM_STA_STA_DBS_2x2] = {
 	[PM_STA_MODE] = {PM_SCC_ON_5_SCC_ON_24_5G, PM_SCC_ON_5_SCC_ON_24_5G,
 		PM_SCC_ON_5_SCC_ON_24},
-	[PM_SAP_MODE] = {PM_SCC_ON_5_SCC_ON_24_5G, PM_SCC_ON_5_SCC_ON_24,
+	[PM_SAP_MODE] = {PM_SCC_ON_5_SCC_ON_24, PM_SCC_ON_5_SCC_ON_24,
 		PM_SCC_ON_5_SCC_ON_24},
 	[PM_P2P_CLIENT_MODE] = {PM_SCC_ON_5_SCC_ON_24_5G,
 				PM_SCC_ON_5_SCC_ON_24_5G,
@@ -2009,7 +2009,7 @@ pm_third_connection_pcl_dbs_sbs_2x2_table = {
 	[PM_STA_MODE] = {
 		PM_SBS_CH_5G, PM_SBS_CH_5G, PM_SBS_CH},
 	[PM_SAP_MODE] = {
-		PM_SBS_CH_5G, PM_SBS_CH_5G, PM_SBS_CH},
+		PM_SCC_CH, PM_SCC_CH, PM_SCC_CH},
 	[PM_P2P_CLIENT_MODE] = {
 		PM_SBS_CH_5G, PM_SBS_CH_5G, PM_SBS_CH},
 	[PM_P2P_GO_MODE] = {