xref: /wlan-dirver/qca-wifi-host-cmn/umac/dfs/dispatcher/inc/wlan_dfs_ioctl.h (revision bea437e2293c3d4fb1b5704fcf633aedac996962)
1 /*
2  * Copyright (c) 2011, 2016-2020 The Linux Foundation. All rights reserved.
3  * Copyright (c) 2010, Atheros Communications Inc.
4  * All Rights Reserved.
5  *
6  * Permission to use, copy, modify, and/or distribute this software for
7  * any purpose with or without fee is hereby granted, provided that the
8  * above copyright notice and this permission notice appear in all
9  * copies.
10  *
11  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
12  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
13  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
14  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
15  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
16  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
17  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
18  * PERFORMANCE OF THIS SOFTWARE.
19  */
20 
21 /**
22  * DOC: This file has dfs IOCTL Defines.
23  */
24 
25 #ifndef _DFS_IOCTL_H_
26 #define _DFS_IOCTL_H_
27 
28 #define DFS_MUTE_TIME            1
29 #define DFS_SET_THRESH           2
30 #define DFS_GET_THRESH           3
31 #define DFS_GET_USENOL           4
32 #define DFS_SET_USENOL           5
33 #define DFS_RADARDETECTS         6
34 #define DFS_BANGRADAR            7
35 #define DFS_SHOW_NOL             8
36 #define DFS_DISABLE_DETECT       9
37 #define DFS_ENABLE_DETECT        10
38 #define DFS_DISABLE_FFT          11
39 #define DFS_ENABLE_FFT           12
40 #define DFS_SET_DEBUG_LEVEL      13
41 #define DFS_GET_NOL              14
42 #define DFS_SET_NOL              15
43 
44 #define DFS_SET_FALSE_RSSI_THRES 16
45 #define DFS_SET_PEAK_MAG         17
46 #define DFS_IGNORE_CAC           18
47 #define DFS_SET_NOL_TIMEOUT      19
48 #define DFS_GET_CAC_VALID_TIME   20
49 #define DFS_SET_CAC_VALID_TIME   21
50 #define DFS_SHOW_NOLHISTORY      22
51 #define DFS_SHOW_PRECAC_LISTS    23
52 #define DFS_RESET_PRECAC_LISTS   24
53 #define DFS_SET_DISABLE_RADAR_MARKING 25
54 #define DFS_GET_DISABLE_RADAR_MARKING 26
55 
56 #define DFS_INJECT_SEQUENCE 27
57 #define DFS_ALLOW_HW_PULSES 28
58 #define DFS_SET_PRI_MULTIPILER   29
59 
60 #define RESTRICTED_80P80_START_CHAN 132
61 #define RESTRICTED_80P80_END_CHAN 161
62 
63 /* Check if the given channels are within restricted 80P80 start chan(132) and
64  * end chan (161).
65  */
66 #define CHAN_WITHIN_RESTRICTED_80P80(chan, cfreq_seg2) \
67 	((((chan) >= RESTRICTED_80P80_START_CHAN) && \
68 	  ((chan) <= RESTRICTED_80P80_END_CHAN) && \
69 	  ((cfreq_seg2) >= RESTRICTED_80P80_START_CHAN) && \
70 	  ((cfreq_seg2) <= RESTRICTED_80P80_END_CHAN)) ? true : false)
71 
72 /*
73  * Spectral IOCTLs use DFS_LAST_IOCTL as the base.
74  * This must always be the last IOCTL in DFS and have
75  * the highest value.
76  */
77 #define DFS_LAST_IOCTL 29
78 
79 #ifndef DFS_CHAN_MAX
80 #define DFS_CHAN_MAX 25
81 #endif
82 
83 /**
84  * struct dfsreq_nolelem - NOL elements.
85  * @nol_freq:          NOL channel frequency.
86  * @nol_chwidth:       NOL channel width.
87  * @nol_start_ticks:   OS ticks when the NOL timer started.
88  * @nol_timeout_ms:    Nol timeout value in msec.
89  */
90 
91 struct dfsreq_nolelem {
92 	uint16_t        nol_freq;
93 	uint16_t        nol_chwidth;
94 	unsigned long   nol_start_ticks;
95 	uint32_t        nol_timeout_ms;
96 };
97 
98 struct dfsreq_nolinfo {
99 	uint32_t  dfs_ch_nchans;
100 	struct dfsreq_nolelem dfs_nol[DFS_CHAN_MAX];
101 };
102 
103 /*
104  * IOCTL parameter types
105  */
106 
107 #define DFS_PARAM_FIRPWR  1
108 #define DFS_PARAM_RRSSI   2
109 #define DFS_PARAM_HEIGHT  3
110 #define DFS_PARAM_PRSSI   4
111 #define DFS_PARAM_INBAND  5
112 /* 5413 specific parameters */
113 #define DFS_PARAM_RELPWR  7
114 #define DFS_PARAM_RELSTEP 8
115 #define DFS_PARAM_MAXLEN  9
116 
117 /**
118  * struct dfs_ioctl_params - DFS ioctl params.
119  * @dfs_firpwr:     FIR pwr out threshold.
120  * @dfs_rrssi:      Radar rssi thresh.
121  * @dfs_height:     Pulse height thresh.
122  * @dfs_prssi:      Pulse rssi thresh.
123  * @dfs_inband:     Inband thresh.
124  * @dfs_relpwr:     Pulse relative pwr thresh.
125  * @dfs_relstep:    Pulse relative step thresh.
126  * @dfs_maxlen:     Pulse max duration.
127  */
128 struct dfs_ioctl_params {
129 	int32_t dfs_firpwr;
130 	int32_t dfs_rrssi;
131 	int32_t dfs_height;
132 	int32_t dfs_prssi;
133 	int32_t dfs_inband;
134 	int32_t dfs_relpwr;
135 	int32_t dfs_relstep;
136 	int32_t dfs_maxlen;
137 };
138 
139 /* Types of Bangradar commands:
140  * @DFS_BANGRADAR_FOR_ALL_SUBCHANS          : Bangradar with no arguments.
141  *                                            All the subchannels in the current
142  *                                            channel shall be added.
143  * @DFS_BANGRADAR_FOR_ALL_SUBCHANS_OF_SEGID : Bangradar with 1 (seg_id) argument
144  *                                            All subchannels of the specific
145  *                                            seg_id shall be added.
146  * @DFS_BANGRADAR_FOR_SPECIFIC_SUBCHANS     : Bangradar with all (segment ID,
147  *                                            is_chirp and frequency offset)
148  *                                            arguments.
149  *                                            Only radar infected subchannels
150  *                                            of the specific seg_id shall be
151  *                                            added.
152  *
153  * (Unless all arguments are given, we cannot determine which specific
154  * subchannels to simulate the radar on, hence simulate in all subchans).
155  */
156 enum dfs_bangradar_types {
157 	DFS_NO_BANGRADAR = 0,
158 	DFS_BANGRADAR_FOR_ALL_SUBCHANS,
159 	DFS_BANGRADAR_FOR_ALL_SUBCHANS_OF_SEGID,
160 	DFS_BANGRADAR_FOR_SPECIFIC_SUBCHANS,
161 	DFS_INVALID_BANGRADAR_TYPE
162 };
163 
164 /**
165  * struct dfs_bangradar_params - DFS bangradar params.
166  * @bangradar_type: Type of Bangradar.
167  * @seg_id:         Segment ID information.
168  * @is_chirp:       Chirp radar or not.
169  * @freq_offset:    Frequency offset at which radar was found.
170  */
171 struct dfs_bangradar_params {
172 	enum dfs_bangradar_types bangradar_type;
173 	uint8_t seg_id;
174 	uint8_t is_chirp;
175 	int32_t freq_offset;
176 };
177 #define DFS_IOCTL_PARAM_NOVAL  65535
178 #define DFS_IOCTL_PARAM_ENABLE 0x8000
179 
180 /* Random channel flags */
181 /* Flag to exclude current operating channels */
182 #define DFS_RANDOM_CH_FLAG_NO_CURR_OPE_CH       0x0001 /* 0000 0000 0000 0001 */
183 
184 /* Flag to exclude weather channels */
185 #define DFS_RANDOM_CH_FLAG_NO_WEATHER_CH        0x0002 /* 0000 0000 0000 0010 */
186 
187 /* Flag to exclude indoor channels */
188 #define DFS_RANDOM_CH_FLAG_NO_LOWER_5G_CH       0x0004 /* 0000 0000 0000 0100 */
189 
190 /* Flag to exclude outdoor channels */
191 #define DFS_RANDOM_CH_FLAG_NO_UPEER_5G_CH       0x0008 /* 0000 0000 0000 1000 */
192 
193 /* Flag to exclude dfs channels */
194 #define DFS_RANDOM_CH_FLAG_NO_DFS_CH            0x0010 /* 0000 0000 0001 0000 */
195 
196 /* Flag to exclude all 5GHz channels */
197 #define DFS_RANDOM_CH_FLAG_NO_5GHZ_CH           0x0020 /* 0000 0000 0010 0000 */
198 
199 /* Flag to exclude all 2.4GHz channels */
200 #define DFS_RANDOM_CH_FLAG_NO_2GHZ_CH           0x0040 /* 0000 0000 0100 0000 */
201 
202 /* Flag to enable Reduced BW Agile DFS */
203 #define DFS_RANDOM_CH_FLAG_ENABLE_REDUCED_BW    0x0080 /* 0000 0000 1000 0000 */
204 
205 /* Flag to exclude Japan W53 channnels */
206 #define DFS_RANDOM_CH_FLAG_NO_JAPAN_W53_CH      0x0100 /* 0000 0001 0000 0000 */
207 
208 /* Restricted 80P80 MHz is enabled */
209 #define DFS_RANDOM_CH_FLAG_RESTRICTED_80P80_ENABLED 0x0200
210 						       /* 0000 0010 0000 0000 */
211 
212 /**
213  * struct wlan_dfs_caps - DFS capability structure.
214  * @wlan_dfs_ext_chan_ok:         Can radar be detected on the extension chan?
215  * @wlan_dfs_combined_rssi_ok:    Can use combined radar RSSI?
216  * @wlan_dfs_use_enhancement:     This flag is used to indicate if radar
217  *                                detection scheme should use enhanced chirping
218  *                                detection algorithm. This flag also determines
219  *                                if certain radar data should be discarded to
220  *                                minimize false detection of radar.
221  * @wlan_strong_signal_diversiry: Strong Signal fast diversity count.
222  * @wlan_chip_is_bb_tlv:          Chip is BB TLV?
223  * @wlan_chip_is_over_sampled:    Is Over sampled.
224  * @wlan_chip_is_ht160:           IS VHT160?
225  * @wlan_chip_is_false_detect:    Is False detected?
226  * @wlan_fastdiv_val:             Goes with wlan_strong_signal_diversiry: If we
227  *                                have fast diversity capability, read off
228  *                                Strong Signal fast diversity count set in the
229  *                                ini file, and store so we can restore the
230  *                                value when radar is disabled.
231  */
232 struct wlan_dfs_caps {
233 	uint32_t wlan_dfs_ext_chan_ok:1,
234 			 wlan_dfs_combined_rssi_ok:1,
235 			 wlan_dfs_use_enhancement:1,
236 			 wlan_strong_signal_diversiry:1,
237 			 wlan_chip_is_bb_tlv:1,
238 			 wlan_chip_is_over_sampled:1,
239 			 wlan_chip_is_ht160:1,
240 			 wlan_chip_is_false_detect:1;
241 	uint32_t wlan_fastdiv_val;
242 };
243 
244 /**
245  * struct wlan_dfs_phyerr_param - DFS Phyerr structure.
246  * @pe_firpwr:     FIR pwr out threshold.
247  * @pe_rrssi:      Radar rssi thresh.
248  * @pe_height:     Pulse height thresh.
249  * @pe_prssi:      Pulse rssi thresh.
250  * @pe_inband:     Inband thresh.
251  * @pe_relpwr:     Relative power threshold in 0.5dB steps.
252  * @pe_relstep:    Pulse Relative step threshold in 0.5dB steps.
253  * @pe_maxlen:     Max length of radar sign in 0.8us units.
254  * @pe_usefir128:  Use the average in-band power measured over 128 cycles.
255  * @pe_blockradar: Enable to block radar check if pkt detect is done via OFDM
256  *                 weak signal detect or pkt is detected immediately after tx
257  *                 to rx transition.
258  * @pe_enmaxrssi:  Enable to use the max rssi instead of the last rssi during
259  *                 fine gain changes for radar detection.
260  */
261 struct wlan_dfs_phyerr_param {
262 	int32_t    pe_firpwr;
263 	int32_t    pe_rrssi;
264 	int32_t    pe_height;
265 	int32_t    pe_prssi;
266 	int32_t    pe_inband;
267 	uint32_t   pe_relpwr;
268 	uint32_t   pe_relstep;
269 	uint32_t   pe_maxlen;
270 	bool       pe_usefir128;
271 	bool       pe_blockradar;
272 	bool       pe_enmaxrssi;
273 };
274 
275 /**
276  * enum WLAN_DFS_EVENTS - DFS Events that will be sent to userspace
277  * @WLAN_EV_RADAR_DETECTED: Radar is detected
278  * @WLAN_EV_CAC_STARTED:    CAC timer has started
279  * @WLAN_EV_CAC_COMPLETED:  CAC timer completed
280  * @WLAN_EV_NOL_STARTED:    NOL started
281  * @WLAN_EV_NOL_FINISHED:   NOL Completed
282  *
283  * DFS events such as radar detected, CAC started,
284  * CAC completed, NOL started, NOL finished
285  */
286 enum WLAN_DFS_EVENTS {
287 	WLAN_EV_RADAR_DETECTED,
288 	WLAN_EV_CAC_STARTED,
289 	WLAN_EV_CAC_COMPLETED,
290 	WLAN_EV_NOL_STARTED,
291 	WLAN_EV_NOL_FINISHED,
292 };
293 
294 #if defined(WLAN_DFS_PARTIAL_OFFLOAD) && defined(WLAN_DFS_SYNTHETIC_RADAR)
295 /**
296  * Structure of Pulse to be injected into the DFS Module
297  * ******************************************************
298  * Header
299  * ======
300  * ----------|--------------|
301  * num_pulses| total_len_seq|
302  * ----------|--------------|
303  * Buffer Contents per pulse:
304  * ==========================
305  * ------|----------|-----------|----------|-----------|---------------|--------
306  * r_rssi|r_ext_rssi|r_rs_tstamp|r_fulltsf |fft_datalen|total_len_pulse|FFT
307  *       |          |           |          |           |               |Buffer..
308  * ------|----------|-----------|----------|-----------|---------------|--------
309  */
310 
311 /**
312  * struct synthetic_pulse - Radar Pulse Structure to be filled on reading the
313  * user file.
314  * @r_rssi:          RSSI of the pulse.
315  * @r_ext_rssi:      Extension Channel RSSI.
316  * @r_rs_tstamp:     Timestamp.
317  * @r_fulltsf:       TSF64.
318  * @fft_datalen:     Total len of FFT.
319  * @total_len_pulse: Total len of the pulse.
320  * @fft_buf:         Pointer to fft data.
321  */
322 
323 struct synthetic_pulse {
324 	uint8_t r_rssi;
325 	uint8_t r_ext_rssi;
326 	uint32_t r_rs_tstamp;
327 	uint64_t r_fulltsf;
328 	uint16_t fft_datalen;
329 	uint16_t total_len_pulse;
330 	unsigned char *fft_buf;
331 } qdf_packed;
332 
333 /**
334  * struct synthetic_seq - Structure to hold an array of pointers to the
335  * pulse structure.
336  * @num_pulses:    Total num of pulses in the sequence.
337  * @total_len_seq: Total len of the sequence.
338  * @pulse:         Array of pointers to synthetic_pulse structure.
339  */
340 
341 struct synthetic_seq {
342 	uint8_t num_pulses;
343 	uint32_t total_len_seq;
344 	struct synthetic_pulse *pulse[0];
345 };
346 
347 /**
348  * struct seq_store - Structure to hold an array of pointers to the synthetic
349  * sequence structure.
350  * @num_sequence: Total number of "sequence of pulses" in the file.
351  * @seq_arr:      Array of pointers to synthetic_seq structure.
352  */
353 
354 struct seq_store {
355 	uint8_t num_sequence;
356 	struct synthetic_seq *seq_arr[0];
357 };
358 #endif /* WLAN_DFS_PARTIAL_OFFLOAD && WLAN_DFS_SYNTHETIC_RADAR */
359 #endif  /* _DFS_IOCTL_H_ */
360