ソースを参照

qcacmn: Reset dfs_precac_active flag only for the calling pdev

When tgt_dfs_set_precac_state API is called, the dfs_precac_active
boolean is set to false for all pdevs. This results in preCAC
being stopped for all pdevs in DBS_SBS mode when one of the
pdev becomes inactive.

Reset dfs_precac_active flag only for the calling pdev and
set the global boolean 'precac_state_started' to false only
if all the individual pdev flags are inactive.

Change-Id: I73fcacb911a5eb9028b03aa1c86775a66f2a7fc9
CRs-Fixed: 2556734
Vignesh Mohan 5 年 前
コミット
42bc1a9d68
1 ファイル変更50 行追加12 行削除
  1. 50 12
      umac/dfs/dispatcher/src/wlan_dfs_tgt_api.c

+ 50 - 12
umac/dfs/dispatcher/src/wlan_dfs_tgt_api.c

@@ -425,6 +425,8 @@ QDF_STATUS tgt_dfs_set_agile_precac_state(struct wlan_objmgr_pdev *pdev,
 					  int agile_precac_state)
 {
 	struct wlan_dfs *dfs;
+	struct dfs_soc_priv_obj *dfs_soc;
+	bool is_precac_running_on_given_pdev = false;
 	int i;
 
 	if (!tgt_dfs_is_pdev_5ghz(pdev))
@@ -436,12 +438,29 @@ QDF_STATUS tgt_dfs_set_agile_precac_state(struct wlan_objmgr_pdev *pdev,
 		return  QDF_STATUS_E_FAILURE;
 	}
 
-	dfs->dfs_soc_obj->precac_state_started = agile_precac_state;
-	if (!dfs->dfs_soc_obj->precac_state_started) {
-		for (i = 0; i < dfs->dfs_soc_obj->num_dfs_privs; i++)
-			dfs->dfs_soc_obj->dfs_priv[i].agile_precac_active = 0;
-		dfs->dfs_agile_precac_freq_mhz = 0;
-	}
+	dfs_soc = dfs->dfs_soc_obj;
+	for (i = 0; i < dfs_soc->num_dfs_privs; i++) {
+		if (dfs_soc->dfs_priv[i].dfs == dfs) {
+			/* Set the pdev state to given value. */
+			dfs_soc->dfs_priv[i].agile_precac_active =
+				agile_precac_state;
+			/* If the pdev state is changed to inactive,
+			 * reset the agile channel.
+			 */
+			if (!agile_precac_state)
+				dfs->dfs_agile_precac_freq_mhz = 0;
+			if (dfs_soc->cur_precac_dfs_index == i)
+				is_precac_running_on_given_pdev = true;
+		}
+	}
+
+	/* If preCAC is running on this pdev and the agile_precac_state
+	 * is set to false, set the global state in dfs_soc_obj to false.
+	 * If this global state is not set to false, then preCAC will not be
+	 * started the next time this pdev becomes active.
+	 */
+	if (is_precac_running_on_given_pdev && !agile_precac_state)
+		dfs_soc->precac_state_started = PRECAC_NOT_STARTED;
 
 	return  QDF_STATUS_SUCCESS;
 }
@@ -451,6 +470,8 @@ QDF_STATUS tgt_dfs_set_agile_precac_state(struct wlan_objmgr_pdev *pdev,
 					  int agile_precac_state)
 {
 	struct wlan_dfs *dfs;
+	struct dfs_soc_priv_obj *dfs_soc;
+	bool is_precac_running_on_given_pdev = false;
 	int i;
 
 	if (!tgt_dfs_is_pdev_5ghz(pdev))
@@ -462,12 +483,29 @@ QDF_STATUS tgt_dfs_set_agile_precac_state(struct wlan_objmgr_pdev *pdev,
 		return  QDF_STATUS_E_FAILURE;
 	}
 
-	dfs->dfs_soc_obj->precac_state_started = agile_precac_state;
-	if (!dfs->dfs_soc_obj->precac_state_started) {
-		for (i = 0; i < dfs->dfs_soc_obj->num_dfs_privs; i++)
-			dfs->dfs_soc_obj->dfs_priv[i].agile_precac_active = 0;
-		dfs->dfs_agile_precac_freq = 0;
-	}
+	dfs_soc = dfs->dfs_soc_obj;
+	for (i = 0; i < dfs_soc->num_dfs_privs; i++) {
+		if (dfs_soc->dfs_priv[i].dfs == dfs) {
+			/* Set the pdev state to given value. */
+			dfs_soc->dfs_priv[i].agile_precac_active =
+				agile_precac_state;
+			/* If the pdev state is changed to inactive,
+			 * reset the agile channel.
+			 */
+			if (!agile_precac_state)
+				dfs->dfs_agile_precac_freq = 0;
+			if (dfs_soc->cur_precac_dfs_index == i)
+				is_precac_running_on_given_pdev = true;
+		}
+	}
+
+	/* If preCAC is running on this pdev and the agile_precac_state
+	 * is set to false, set the global state in dfs_soc_obj to false.
+	 * If this global state is not set to false, then preCAC will not be
+	 * started the next time this pdev becomes active.
+	 */
+	if (is_precac_running_on_given_pdev && !agile_precac_state)
+		dfs_soc->precac_state_started = PRECAC_NOT_STARTED;
 
 	return  QDF_STATUS_SUCCESS;
 }