Ver Fonte

Merge "qca-wifi: Set FW ADFS support flags in dfs"

Linux Build Service Account há 5 anos atrás
pai
commit
9d730ccf95

+ 2 - 1
umac/dfs/core/src/misc/dfs_etsi_precac.c

@@ -37,6 +37,7 @@
 #include "wlan_dfs_mlme_api.h"
 #include "wlan_dfs_utils_api.h"
 #include "dfs_internal.h"
+#include "dfs_zero_cac.h"
 #include "dfs_process_radar_found_ind.h"
 
 #define ETSI_CAC_TIME_OUT_MS 86400000
@@ -328,7 +329,7 @@ void dfs_add_to_etsi_precac_required_list(struct wlan_dfs *dfs, uint8_t *chan)
 	}
 
 	if (utils_get_dfsdomain(dfs->dfs_pdev_obj) == DFS_ETSI_REGION &&
-	    dfs->dfs_precac_enable) {
+	    dfs_is_legacy_precac_enabled(dfs)) {
 		etsi_precac_entry = qdf_mem_malloc(sizeof(*etsi_precac_entry));
 
 		if (!etsi_precac_entry) {

+ 46 - 27
umac/dfs/core/src/misc/dfs_zero_cac.c

@@ -297,6 +297,16 @@ int dfs_get_override_precac_timeout(struct wlan_dfs *dfs, int *precac_timeout)
 	return 0;
 }
 
+bool dfs_is_legacy_precac_enabled(struct wlan_dfs *dfs)
+{
+	return dfs->dfs_legacy_precac_ucfg;
+}
+
+bool dfs_is_agile_precac_enabled(struct wlan_dfs *dfs)
+{
+	return (dfs->dfs_agile_precac_ucfg && dfs->dfs_fw_adfs_support_non_160);
+}
+
 /* dfs_descend_precac_tree() - Descend into the precac BSTree based on the
  *                             channel provided. If the channel is less than
  *                             given node's channel, descend left, else right.
@@ -836,7 +846,7 @@ void dfs_unmark_precac_nol(struct wlan_dfs *dfs, uint8_t channel)
 		 "NOL expired for channel %u, trying to start preCAC",
 		 channel);
 	if (!dfs->dfs_soc_obj->dfs_precac_timer_running) {
-		if (dfs->dfs_precac_enable) {
+		if (dfs_is_legacy_precac_enabled(dfs)) {
 			if (dfs_is_ap_cac_timer_running(dfs)) {
 				dfs->dfs_defer_precac_channel_change = 1;
 				dfs_debug(dfs, WLAN_DEBUG_DFS,
@@ -857,7 +867,7 @@ void dfs_unmark_precac_nol(struct wlan_dfs *dfs, uint8_t channel)
 				dfs_mlme_channel_change_by_precac(
 						dfs->dfs_pdev_obj);
 			}
-		} else if (dfs->dfs_agile_precac_enable &&
+		} else if (dfs_is_agile_precac_enabled(dfs) &&
 			   !dfs->dfs_soc_obj->precac_state_started) {
 			/* precac_state_started will be set to false if
 			 * agile CAC is not begun for any channels or
@@ -931,7 +941,7 @@ void dfs_mark_precac_nol(struct wlan_dfs *dfs,
 	if (!dfs_soc_obj->dfs_precac_timer_running)
 		return;
 
-	if (dfs->dfs_precac_enable) {
+	if (dfs_is_legacy_precac_enabled(dfs)) {
 		qdf_timer_sync_cancel(&dfs_soc_obj->dfs_precac_timer);
 		dfs_soc_obj->dfs_precac_timer_running = 0;
 		/*
@@ -956,7 +966,7 @@ void dfs_mark_precac_nol(struct wlan_dfs *dfs,
 						dfs->dfs_pdev_obj);
 			}
 		}
-	} else if (dfs->dfs_agile_precac_enable) {
+	} else if (dfs_is_agile_precac_enabled(dfs)) {
 		/* If preCAC is not running on the DFS where radar is detected,
 		 * no need to configure agile channel.
 		 * Return from this function.
@@ -1146,7 +1156,7 @@ static os_timer_func(dfs_precac_timeout)
 	dfs = dfs_soc_obj->dfs_priv[dfs_soc_obj->cur_precac_dfs_index].dfs;
 	dfs_soc_obj->dfs_precac_timer_running = 0;
 
-	if (!dfs->dfs_agile_precac_enable) {
+	if (dfs_is_legacy_precac_enabled(dfs)) {
 		/*
 		 * Remove the HT80 freq from the precac-required-list
 		 * and add it to the precac-done-list
@@ -1175,7 +1185,7 @@ static os_timer_func(dfs_precac_timeout)
 			 */
 			dfs_mlme_channel_change_by_precac(dfs->dfs_pdev_obj);
 		}
-	} else {
+	} else if (dfs_is_agile_precac_enabled(dfs)) {
 		current_time = qdf_system_ticks_to_msecs(qdf_system_ticks());
 		dfs_info(dfs, WLAN_DEBUG_DFS_ALWAYS,
 			 "Pre-cac expired, Agile Precac chan %u curr time %d",
@@ -2306,6 +2316,17 @@ void dfs_get_ieeechan_for_agilecac(struct wlan_dfs *dfs,
 	 * 20 - 20, 40 - 40, 80 - 80, 160 - 80, 160 (non contiguous) - 80.
 	 */
 	dfs_find_chwidth_and_center_chan(dfs, &chwidth, NULL, NULL);
+
+	/* Check if the FW supports agile DFS when the pdev is operating on
+	 * 160 or 80P80MHz bandwidth. This information is stored in the flag
+	 * "dfs_fw_adfs_support_160" when the current chainmask is configured.
+	 */
+	if ((chwidth == CH_WIDTH_80P80MHZ || chwidth == CH_WIDTH_160MHZ) &&
+	    (!dfs->dfs_fw_adfs_support_160)) {
+		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS,
+			"aDFS during 160MHz operation not supported by target");
+		return;
+	}
 	dfs->dfs_precac_chwidth = dfs_find_agile_width(dfs, chwidth);
 	if (dfs->dfs_precac_chwidth == CH_WIDTH_INVALID) {
 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "cannot start agile CAC!");
@@ -2355,7 +2376,7 @@ void dfs_find_vht80_chan_for_precac(struct wlan_dfs *dfs,
 	 * the secondary VHT80 and Change the mode to
 	 * VHT80_80 or VHT160.
 	 */
-	if (dfs->dfs_precac_enable) {
+	if (dfs_is_legacy_precac_enabled(dfs)) {
 		/*
 		 * If precac timer is running then do not change the
 		 * secondary channel use the old secondary VHT80
@@ -2443,7 +2464,7 @@ void dfs_find_vht80_chan_for_precac(struct wlan_dfs *dfs,
 		} else {
 			dfs->dfs_precac_secondary_freq = 0;
 		} /* End of if(ieee_freq) */
-	} /* End of if(dfs->dfs_precac_enable) */
+	} /* End of if(dfs_is_legacy_precac_enabled(dfs)) */
 }
 
 void dfs_set_precac_enable(struct wlan_dfs *dfs, uint32_t value)
@@ -2457,8 +2478,8 @@ void dfs_set_precac_enable(struct wlan_dfs *dfs, uint32_t value)
 	psoc = wlan_pdev_get_psoc(dfs->dfs_pdev_obj);
 	if (!psoc) {
 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS,  "psoc is NULL");
-		dfs->dfs_precac_enable = 0;
-		dfs->dfs_agile_precac_enable = 0;
+		dfs->dfs_legacy_precac_ucfg = 0;
+		dfs->dfs_agile_precac_ucfg = 0;
 		return;
 	}
 
@@ -2494,15 +2515,15 @@ void dfs_set_precac_enable(struct wlan_dfs *dfs, uint32_t value)
 	 * then enable Agile preCAC.
 	 */
 
-	if ((1 == value) && tx_ops->tgt_is_tgt_type_qca9984(target_type) &&
+	if ((1 == value) &&
 	    (utils_get_dfsdomain(dfs->dfs_pdev_obj) == DFS_ETSI_DOMAIN)) {
-		dfs->dfs_precac_enable = value;
-	} else if ((1 == value) && (info->wlan_res_cfg.agile_capability == 1) &&
-		(utils_get_dfsdomain(dfs->dfs_pdev_obj) == DFS_ETSI_DOMAIN)) {
-		dfs->dfs_agile_precac_enable = value;
+		if (tx_ops->tgt_is_tgt_type_qca9984(target_type))
+			dfs->dfs_legacy_precac_ucfg = value;
+		else
+			dfs->dfs_agile_precac_ucfg = value;
 	} else {
-		dfs->dfs_agile_precac_enable = 0;
-		dfs->dfs_precac_enable = 0;
+		dfs->dfs_agile_precac_ucfg = 0;
+		dfs->dfs_legacy_precac_ucfg = 0;
 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS,  "preCAC disabled");
 	}
 
@@ -2553,16 +2574,6 @@ void dfs_agile_precac_start(struct wlan_dfs *dfs)
 }
 #endif
 
-uint32_t dfs_get_precac_enable(struct wlan_dfs *dfs)
-{
-	return dfs->dfs_precac_enable;
-}
-
-bool dfs_get_agile_precac_enable(struct wlan_dfs *dfs)
-{
-	return dfs->dfs_agile_precac_enable;
-}
-
 #ifdef WLAN_DFS_PRECAC_AUTO_CHAN_SUPPORT
 int32_t dfs_set_precac_intermediate_chan(struct wlan_dfs *dfs, uint32_t value)
 {
@@ -2612,4 +2623,12 @@ void dfs_reset_agile_config(struct dfs_soc_priv_obj *dfs_soc)
 	dfs_soc->precac_state_started = PRECAC_NOT_STARTED;
 	dfs_soc->ocac_status = OCAC_SUCCESS;
 }
+
+void dfs_set_fw_adfs_support(struct wlan_dfs *dfs,
+			     bool fw_adfs_support_160,
+			     bool fw_adfs_support_non_160)
+{
+	dfs->dfs_fw_adfs_support_non_160 = fw_adfs_support_non_160;
+	dfs->dfs_fw_adfs_support_160 = fw_adfs_support_160;
+}
 #endif