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