Эх сурвалжийг харах

qcacmn: Allow AP to come up on radar channel if punctured

Add an API dfs_is_radar_on_punc_chan() which determines if
radar is found on a punctured channel and if so, does not mark
the channel as radar.

CRs-Fixed: 3504792
Change-Id: I5b38499baa794138f94898a24918eedc91f314e9
Priyadarshnee Srinivasan 2 жил өмнө
parent
commit
23421e9478

+ 31 - 1
umac/dfs/core/src/misc/dfs_cac.c

@@ -87,6 +87,35 @@ static void dfs_clear_nol_history_for_curchan(struct wlan_dfs *dfs)
 				num_subchs, DFS_NOL_HISTORY_RESET);
 }
 
+#if defined(QCA_SUPPORT_DFS_CAC) && defined(WLAN_FEATURE_11BE)
+bool dfs_is_radar_on_punc_chan(struct wlan_dfs *dfs, struct dfs_channel *chan)
+{
+	qdf_freq_t sub_freq_list[MAX_20MHZ_SUBCHANS];
+	uint8_t n_subchans, i;
+	uint16_t radar_punc_bitmap = NO_SCHANS_PUNC;
+
+	if (!chan || !WLAN_IS_PRIMARY_OR_SECONDARY_CHAN_DFS(chan))
+		return false;
+
+	n_subchans = dfs_get_bonding_channel_without_seg_info_for_freq(
+				chan,
+				sub_freq_list);
+
+	for (i = 0; i < n_subchans; i++) {
+		if (wlan_reg_is_nol_for_freq(dfs->dfs_pdev_obj,
+					     sub_freq_list[i]))
+			radar_punc_bitmap |=  1 << i;
+	}
+	return (radar_punc_bitmap == chan->dfs_ch_punc_pattern);
+}
+#else
+static inline bool
+dfs_is_radar_on_punc_chan(struct wlan_dfs *dfs, struct dfs_channel *chan)
+{
+	return false;
+}
+#endif
+
 void dfs_process_cac_completion(struct wlan_dfs *dfs)
 {
 	enum phy_ch_width ch_width = CH_WIDTH_INVALID;
@@ -104,7 +133,8 @@ void dfs_process_cac_completion(struct wlan_dfs *dfs)
 	 * When radar is detected during a CAC we are woken up prematurely to
 	 * switch to a new channel. Check the channel to decide how to act.
 	 */
-	if (WLAN_IS_CHAN_RADAR(dfs, dfs->dfs_curchan)) {
+	if (WLAN_IS_CHAN_RADAR(dfs, dfs->dfs_curchan) &&
+	    !dfs_is_radar_on_punc_chan(dfs, dfs->dfs_curchan)) {
 		dfs_mlme_mark_dfs(dfs->dfs_pdev_obj,
 				  dfs_curchan->dfs_ch_ieee,
 				  dfs_curchan->dfs_ch_freq,