Pārlūkot izejas kodu

qcacmn: Calculate frequency offsets instead of hardcoding

The radar found frequency offsets to find various 20MHz sub-channel
frequencies is hardcoded for different channel widths. These frequency
offsets can be calculated reducing repeatitive code.

Calculate frequency offsets from channel widths and center frequencies
to determine the radar found frequencies.

Change-Id: I146fa6dd06473ff90cad4bb5dd8ba4ce13ab7c7c
CRs-Fixed: 3182067
Vignesh U 3 gadi atpakaļ
vecāks
revīzija
6179a3a558

+ 10 - 0
umac/dfs/core/src/dfs.h

@@ -3122,4 +3122,14 @@ dfs_restart_rcac_on_nol_expiry(struct wlan_dfs *dfs)
 	return false;
 }
 #endif
+
+/**
+ * dfs_chan_to_ch_width: Outputs the channel width in MHz of the given input
+ * dfs_channel.
+ *
+ * chan: Pointer to the input dfs_channel structure.
+ *
+ * Return: Channel width in MHz. (uint16) -EINVAL on invalid channel.
+ */
+uint16_t dfs_chan_to_ch_width(struct dfs_channel *chan);
 #endif  /* _DFS_H_ */

+ 7 - 5
umac/dfs/core/src/dfs_process_radar_found_ind.h

@@ -28,11 +28,13 @@
 #define _DFS_PROCESS_RADAR_FOUND_IND_H_
 #include "dfs_partial_offload_radar.h"
 
-#define BW_20   20
-#define BW_40   40
-#define BW_80   80
-#define BW_160 160
-#define BW_320 320
+#define BW_INVALID    0
+#define BW_10        10
+#define BW_20        20
+#define BW_40        40
+#define BW_80        80
+#define BW_160      160
+#define BW_320      320
 /**
  * dfs_false_radarfound_reset_vars () - Reset dfs radar detection related
  * variables and queues after processing radar and disabling phyerror reception.

+ 31 - 0
umac/dfs/core/src/misc/dfs.c

@@ -1,6 +1,7 @@
 /*
  * Copyright (c) 2016-2021 The Linux Foundation. All rights reserved.
  * Copyright (c) 2002-2006, Atheros Communications Inc.
+ * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
  *
  * Permission to use, copy, modify, and/or distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
@@ -859,3 +860,33 @@ uint8_t dfs_get_agile_detector_id(struct wlan_dfs *dfs)
 	return dfs->dfs_agile_detector_id;
 }
 #endif
+
+/**
+ * dfs_chan_to_ch_width: Outputs the channel width in MHz of the given input
+ * dfs_channel.
+ * @chan: Pointer to the input dfs_channel structure.
+ *
+ * Return: Channel width in MHz. BW_INVALID(0MHz) on invalid channel.
+ */
+uint16_t dfs_chan_to_ch_width(struct dfs_channel *chan)
+{
+	uint16_t ch_width;
+
+	if (!chan)
+		return BW_INVALID;
+
+	if (WLAN_IS_CHAN_MODE_320(chan))
+		ch_width = BW_320;
+	else if (WLAN_IS_CHAN_MODE_160(chan))
+		ch_width = BW_160;
+	else if (WLAN_IS_CHAN_MODE_80(chan))
+		ch_width = BW_80;
+	else if (WLAN_IS_CHAN_MODE_40(chan))
+		ch_width = BW_40;
+	else if (WLAN_IS_CHAN_MODE_20(chan))
+		ch_width = BW_20;
+	else
+		ch_width = BW_INVALID;
+
+	return ch_width;
+}

+ 35 - 108
umac/dfs/core/src/misc/dfs_process_radar_found_ind.c

@@ -215,102 +215,40 @@ dfs_radar_add_channel_list_to_nol_for_freq(struct wlan_dfs *dfs,
 	return QDF_STATUS_SUCCESS;
 }
 #endif
-/**
- * dfs_radar_chan_for_80()- Find frequency offsets for 80MHz
- * @freq_offset: freq offset
- * @center_freq: center frequency
- *
- * Find frequency offsets for 80MHz
- *
- * Return: None
- */
-static void dfs_radar_chan_for_80(struct freqs_offsets *freq_offset,
-				  uint32_t center_freq)
-{
-	int i;
-
-	for (i = 0; i < DFS_NUM_FREQ_OFFSET; i++) {
-		if (freq_offset->offset[i] < DFS_OFFSET_SECOND_LOWER)
-			freq_offset->freq[i] =
-				DFS_THIRD_LOWER_CHANNEL(center_freq);
-		else if ((freq_offset->offset[i] > DFS_OFFSET_SECOND_LOWER) &&
-			 (freq_offset->offset[i] < DFS_OFFSET_FIRST_LOWER))
-			freq_offset->freq[i] =
-				DFS_SECOND_LOWER_CHANNEL(center_freq);
-		else if ((freq_offset->offset[i] > DFS_OFFSET_FIRST_LOWER) &&
-			 (freq_offset->offset[i] < 0))
-			freq_offset->freq[i] =
-				DFS_FIRST_LOWER_CHANNEL(center_freq);
-		else if ((freq_offset->offset[i] > 0) &&
-			  (freq_offset->offset[i] < DFS_OFFSET_FIRST_UPPER))
-			freq_offset->freq[i] =
-				DFS_FIRST_UPPER_CHANNEL(center_freq);
-		else if ((freq_offset->offset[i] > DFS_OFFSET_FIRST_UPPER) &&
-			 (freq_offset->offset[i] < DFS_OFFSET_SECOND_UPPER))
-			freq_offset->freq[i] =
-				DFS_SECOND_UPPER_CHANNEL(center_freq);
-		else if (freq_offset->offset[i] > DFS_OFFSET_SECOND_UPPER)
-			freq_offset->freq[i] =
-				DFS_THIRD_UPPER_CHANNEL(center_freq);
-	}
-}
 
 /**
- * dfs_radar_chan_for_40()- Find frequency offsets for 40MHz
- * @freq_offset: freq offset
- * @center_freq: center frequency
- *
- * Find frequency offsets for 40MHz
+ * dfs_find_20mhz_subchans_from_offsets()- Find frequency offsets
+ * that aligns with 20MHz sub-channel centers.
  *
- * Return: None
- */
-static void dfs_radar_chan_for_40(struct freqs_offsets *freq_offset,
-				  uint32_t center_freq)
-{
-	int i;
-
-	for (i = 0; i < DFS_NUM_FREQ_OFFSET; i++) {
-		if (freq_offset->offset[i] < DFS_OFFSET_FIRST_LOWER)
-			freq_offset->freq[i] =
-				DFS_SECOND_LOWER_CHANNEL(center_freq);
-		else if ((freq_offset->offset[i] > DFS_OFFSET_FIRST_LOWER) &&
-			 (freq_offset->offset[i] < 0))
-			freq_offset->freq[i] =
-				DFS_FIRST_LOWER_CHANNEL(center_freq);
-		else if ((freq_offset->offset[i] > 0) &&
-			 (freq_offset->offset[i] < DFS_OFFSET_FIRST_UPPER))
-			freq_offset->freq[i] =
-				DFS_FIRST_UPPER_CHANNEL(center_freq);
-		else if (freq_offset->offset[i] > DFS_OFFSET_FIRST_UPPER)
-			freq_offset->freq[i] =
-				DFS_SECOND_UPPER_CHANNEL(center_freq);
-	}
-}
-
-/**
- * dfs_radar_chan_for_20()- Find frequency offsets for 20MHz
  * @freq_offset: freq offset
  * @center_freq: center frequency
- *
- * Find frequency offsets for 20MHz
+ * @ch_width: Channel Width value: 20/40/80/160/320MHz.
+ * Find frequency offsets for 80MHz
  *
  * Return: None
  */
-static void dfs_radar_chan_for_20(struct freqs_offsets *freq_offset,
-				  uint32_t center_freq)
+static void
+dfs_find_20mhz_subchans_from_offsets(struct freqs_offsets *freq_offset,
+				     uint32_t center_freq,
+				     uint16_t ch_width)
 {
-	int i;
+	uint16_t first_chan20_cen = center_freq - (ch_width / 2) + BW_10;
+	uint16_t i, j;
+	uint8_t num_20mhz_subchans = ch_width / BW_20;
 
 	for (i = 0; i < DFS_NUM_FREQ_OFFSET; i++) {
-		if (freq_offset->offset[i] <= DFS_20MZ_OFFSET_LOWER)
-			freq_offset->freq[i] =
-				DFS_20MHZ_LOWER_CHANNEL(center_freq);
-		else if ((freq_offset->offset[i] > DFS_20MZ_OFFSET_LOWER) &&
-			  (freq_offset->offset[i] < DFS_20MZ_OFFSET_UPPER))
-			freq_offset->freq[i] = center_freq;
-		else if (freq_offset->offset[i] >= DFS_20MZ_OFFSET_UPPER)
-			freq_offset->freq[i] =
-				DFS_20MHZ_UPPER_CHANNEL(center_freq);
+		uint16_t radar_found_freq =
+					center_freq + freq_offset->offset[i];
+		uint16_t chan20_cen = first_chan20_cen;
+
+		for (j = 0; j < num_20mhz_subchans; j++) {
+			if ((radar_found_freq > chan20_cen - BW_10) &&
+			    (radar_found_freq < chan20_cen + BW_10)) {
+				freq_offset->freq[i] = chan20_cen;
+				break;
+			}
+			chan20_cen += BW_20;
+		}
 	}
 }
 
@@ -410,6 +348,7 @@ dfs_find_radar_affected_subchans_for_freq(struct wlan_dfs *dfs,
 	uint8_t n_cur_subchans;
 	struct dfs_channel *curchan = dfs->dfs_curchan;
 	struct freqs_offsets freq_offset;
+	uint16_t ch_width;
 
 	qdf_mem_zero(&freq_offset, sizeof(freq_offset));
 	flag = curchan->dfs_ch_flags;
@@ -425,35 +364,23 @@ dfs_find_radar_affected_subchans_for_freq(struct wlan_dfs *dfs,
 		 radar_found->freq_offset, radar_found->is_chirp,
 		 flag, freq_center);
 
-	if ((WLAN_IS_CHAN_A(curchan)) ||
-	    WLAN_IS_CHAN_MODE_20(curchan)) {
-		if (radar_found->is_chirp ||
-		    (sidx && !(abs(sidx) % DFS_BOUNDARY_SIDX))) {
-			freq_offset.offset[LEFT_CH] -= DFS_CHIRP_OFFSET;
-			freq_offset.offset[RIGHT_CH] += DFS_CHIRP_OFFSET;
-		}
-		dfs_radar_chan_for_20(&freq_offset, freq_center);
-	} else if (WLAN_IS_CHAN_MODE_40(curchan)) {
-		if (radar_found->is_chirp || !(abs(sidx) % DFS_BOUNDARY_SIDX)) {
-			freq_offset.offset[LEFT_CH] -= DFS_CHIRP_OFFSET;
-			freq_offset.offset[RIGHT_CH] += DFS_CHIRP_OFFSET;
+	if ((WLAN_IS_CHAN_A(curchan)) || WLAN_IS_CHAN_MODE_20(curchan)) {
+		freq_offset.offset[CENTER_CH] = freq_center;
+	} else {
+		ch_width = dfs_chan_to_ch_width(curchan);
+		if (ch_width == BW_INVALID) {
+			dfs_err(dfs, WLAN_DEBUG_DFS,
+				"channel flag=%d is invalid", flag);
+			return 0;
 		}
-		dfs_radar_chan_for_40(&freq_offset, freq_center);
-	} else if (WLAN_IS_CHAN_MODE_80(curchan) ||
-			WLAN_IS_CHAN_MODE_160(curchan) ||
-			WLAN_IS_CHAN_MODE_80_80(curchan) ||
-			WLAN_IS_CHAN_MODE_320(curchan)) {
+
 		if (radar_found->is_chirp || !(abs(sidx) % DFS_BOUNDARY_SIDX)) {
 			freq_offset.offset[LEFT_CH] -= DFS_CHIRP_OFFSET;
 			freq_offset.offset[RIGHT_CH] += DFS_CHIRP_OFFSET;
 		}
-		dfs_radar_chan_for_80(&freq_offset, freq_center);
-	} else {
-		dfs_err(dfs, WLAN_DEBUG_DFS,
-			"channel flag=%d is invalid", flag);
-		return 0;
+		dfs_find_20mhz_subchans_from_offsets(&freq_offset, freq_center,
+						     ch_width);
 	}
-
 	n_cur_subchans =
 	    dfs_get_bonding_channels_for_freq(dfs, curchan,
 					      radar_found->segment_id,