Explorar o código

Merge "qca-wifi: Add support for InterCAC channel switch in Hawkeye"

Linux Build Service Account %!s(int64=6) %!d(string=hai) anos
pai
achega
85788ec51c
Modificáronse 1 ficheiros con 44 adicións e 34 borrados
  1. 44 34
      umac/dfs/core/src/misc/dfs_zero_cac.c

+ 44 - 34
umac/dfs/core/src/misc/dfs_zero_cac.c

@@ -191,7 +191,7 @@ bool dfs_is_ht8080_ht160_chan_in_precac_done_list(struct wlan_dfs *dfs,
 	bool ret_val = 0;
 	u_int8_t sec_freq = 0;
 
-	if (WLAN_IS_CHAN_11AC_VHT160(chan)) {
+	if (WLAN_IS_CHAN_MODE_160(chan)) {
 		if (chan->dfs_ch_ieee < chan->dfs_ch_vhtop_ch_freq_seg2)
 			sec_freq = chan->dfs_ch_vhtop_ch_freq_seg1 +
 				   VHT160_IEEE_FREQ_DIFF;
@@ -252,12 +252,12 @@ bool dfs_is_precac_done(struct wlan_dfs *dfs, struct dfs_channel *chan)
 {
 	bool ret_val = 0;
 
-	if (WLAN_IS_CHAN_11AC_VHT20(chan) ||
-	    WLAN_IS_CHAN_11AC_VHT40(chan) ||
-	    WLAN_IS_CHAN_11AC_VHT80(chan)) {
+	if (WLAN_IS_CHAN_MODE_20(chan) ||
+	    WLAN_IS_CHAN_MODE_40(chan) ||
+	    WLAN_IS_CHAN_MODE_80(chan)) {
 		ret_val = dfs_is_ht20_40_80_chan_in_precac_done_list(dfs, chan);
-	} else if (WLAN_IS_CHAN_11AC_VHT80_80(chan) ||
-		   WLAN_IS_CHAN_11AC_VHT160(chan)) {
+	} else if (WLAN_IS_CHAN_MODE_80_80(chan) ||
+		   WLAN_IS_CHAN_MODE_160(chan)) {
 		ret_val = dfs_is_ht8080_ht160_chan_in_precac_done_list(dfs, chan);
 	}
 
@@ -613,12 +613,11 @@ void dfs_precac_csa(struct wlan_dfs *dfs)
  *
  * @dfs: Pointer to dfs handler.
  *
- * If precac is done on the home channel, then change the channel from
- * intermediate channel to home channel and continue precac on other channels.
+ * If precac is done on the home channel, then return true, else false.
  *
- * Return: Void.
+ * Return: true if precac done on home channel, else false.
  */
-static void dfs_precac_check_home_chan_change(struct wlan_dfs *dfs)
+static bool dfs_precac_check_home_chan_change(struct wlan_dfs *dfs)
 {
 	struct dfs_channel chan;
 
@@ -637,7 +636,7 @@ static void dfs_precac_check_home_chan_change(struct wlan_dfs *dfs)
 			"Channel %d not found for mode %d",
 			dfs->dfs_autoswitch_des_chan,
 			dfs->dfs_autoswitch_des_mode);
-		return;
+		return false;
 	}
 	/*
 	 * If desired channel is in precac done list,
@@ -645,28 +644,15 @@ static void dfs_precac_check_home_chan_change(struct wlan_dfs *dfs)
 	 */
 	if (dfs->dfs_autoswitch_des_chan && dfs_is_precac_done(dfs, &chan)) {
 		dfs_precac_csa(dfs);
-	} else {
-		/*
-		 * Use same home channel, only change preCAC channel.
-		 */
-
-		/*
-		 * TO BE DONE xxx : Need to lock the channel change.
-		 */
-		dfs_mlme_channel_change_by_precac(dfs->dfs_pdev_obj);
+		dfs->dfs_soc_obj->precac_state_started = false;
+		return true;
 	}
+	return false;
 }
 #else
-static inline void dfs_precac_check_home_chan_change(struct wlan_dfs *dfs)
+static inline bool dfs_precac_check_home_chan_change(struct wlan_dfs *dfs)
 {
-	/*
-	 * Use same home channel, only change preCAC channel.
-	 */
-
-	/*
-	 * TO BE DONE xxx : Need to lock the channel change.
-	 */
-	dfs_mlme_channel_change_by_precac(dfs->dfs_pdev_obj);
+	return false;
 }
 #endif
 
@@ -682,6 +668,7 @@ static os_timer_func(dfs_precac_timeout)
 	struct wlan_dfs *dfs = NULL;
 	struct dfs_soc_priv_obj *dfs_soc_obj = NULL;
 	uint32_t current_time;
+	bool is_cac_done_on_des_chan = false;
 
 	OS_GET_TIMER_ARG(dfs_soc_obj, struct dfs_soc_priv_obj *);
 
@@ -725,7 +712,19 @@ static os_timer_func(dfs_precac_timeout)
 		 * Do vdev restart so that we can change
 		 * the secondary VHT80 channel.
 		 */
-		dfs_precac_check_home_chan_change(dfs);
+
+		/* check if CAC done on home channel */
+		is_cac_done_on_des_chan = dfs_precac_check_home_chan_change(dfs);
+		if (!is_cac_done_on_des_chan) {
+			/*
+			 * Use same home channel, only change preCAC channel.
+			 */
+
+			/*
+			 * TO BE DONE xxx : Need to lock the channel change.
+			 */
+			dfs_mlme_channel_change_by_precac(dfs->dfs_pdev_obj);
+		}
 	} else {
 		current_time = qdf_system_ticks_to_msecs(qdf_system_ticks());
 		dfs_info(dfs, WLAN_DEBUG_DFS_ALWAYS,
@@ -760,7 +759,18 @@ static os_timer_func(dfs_precac_timeout)
 			}
 			PRECAC_LIST_UNLOCK(dfs);
 		}
-		dfs_prepare_agile_precac_chan(dfs);
+		/* check if CAC done on home channel */
+		is_cac_done_on_des_chan = dfs_precac_check_home_chan_change(dfs);
+		if (!is_cac_done_on_des_chan) {
+			/*
+			 * Use same home channel, only change preCAC channel.
+			 */
+
+			/*
+			 * TO BE DONE xxx : Need to lock the channel change.
+			 */
+			dfs_prepare_agile_precac_chan(dfs);
+		}
 	}
 }
 
@@ -1199,7 +1209,7 @@ void dfs_set_precac_preferred_channel(struct wlan_dfs *dfs,
 	struct dfs_precac_entry *precac_entry;
 
 	if (dfs_is_precac_timer_running(dfs) &&
-	    mode == WLAN_PHYMODE_11AC_VHT80 &&
+	    WLAN_IS_CHAN_MODE_80(chan) &&
 	    (dfs->dfs_precac_secondary_freq == chan->dfs_ch_freq)) {
 		return;
 	}
@@ -1224,7 +1234,7 @@ void dfs_set_precac_preferred_channel(struct wlan_dfs *dfs,
 		}
 	}
 
-	if (mode == WLAN_PHYMODE_11AC_VHT160 && WLAN_IS_CHAN_DFS(chan) &&
+	if (WLAN_IS_CHAN_MODE_160(chan) && WLAN_IS_CHAN_DFS(chan) &&
 	    !TAILQ_EMPTY(&dfs->dfs_precac_required_list)) {
 		if (chan->dfs_ch_ieee < chan->dfs_ch_vhtop_ch_freq_seg2)
 			freq_160_sec = chan->dfs_ch_vhtop_ch_freq_seg1 +
@@ -1284,7 +1294,7 @@ dfs_decide_precac_preferred_chan(struct wlan_dfs *dfs,
 	 * non-DFS channel and trigger a precac on this channel.
 	 */
 	if ((WLAN_IS_CHAN_DFS(&chan) ||
-	    (mode == WLAN_PHYMODE_11AC_VHT160 &&
+	    (WLAN_IS_CHAN_MODE_160(&chan) &&
 	     WLAN_IS_CHAN_DFS_CFREQ2(&chan))) &&
 	    !dfs_is_precac_done(dfs, &chan)) {
 		dfs_set_precac_preferred_channel(dfs, &chan, mode);