xref: /wlan-dirver/qca-wifi-host-cmn/umac/dfs/dispatcher/inc/wlan_dfs_tgt_api.h (revision dd4dc88b837a295134aa9869114a2efee0f4894b)
1 /*
2  * Copyright (c) 2016-2019 The Linux Foundation. All rights reserved.
3  *
4  *
5  * Permission to use, copy, modify, and/or distribute this software for
6  * any purpose with or without fee is hereby granted, provided that the
7  * above copyright notice and this permission notice appear in all
8  * copies.
9  *
10  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17  * PERFORMANCE OF THIS SOFTWARE.
18  */
19 
20 /**
21  * DOC: This file has the DFS dispatcher API which is exposed to outside of DFS
22  * component.
23  */
24 
25 #ifndef _WLAN_DFS_TGT_API_H_
26 #define _WLAN_DFS_TGT_API_H_
27 
28 #include <wlan_dfs_public_struct.h>
29 
30 #define WLAN_DFS_RESET_TIME_S 7
31 #define WLAN_DFS_WAIT (60 + WLAN_DFS_RESET_TIME_S) /* 60 seconds */
32 #define WLAN_DFS_WAIT_MS ((WLAN_DFS_WAIT) * 1000)  /*in MS*/
33 
34 /* Command id to send test radar to firmware */
35 #define DFS_PHYERR_OFFLOAD_TEST_SET_RADAR 0
36 
37 /* Segment ID corresponding to primary segment */
38 #define SEG_ID_PRIMARY 0
39 
40 /* Segment ID corresponding to secondary segment */
41 #define SEG_ID_SECONDARY 1
42 
43 /* dfs_radar_args_for_unit_test: Radar parameters to be sent in unit test cmd.
44  * @IDX_CMD_ID:          Index id pointing to command id value
45  * @IDX_PDEV_ID:         Index id pointing to pdev id value
46  * @IDX_RADAR_PARAM1_ID: Index pointing to packed arguments value that includes
47  *                         1). Segment ID,
48  *                         2). Chirp information (is chirp or non chirp),
49  *                         3). Frequency offset.
50  *
51  * The packed argument structure is:
52  *
53  * ------------------------------32 bits arg-------------------------
54  *
55  * ------------21 bits-------------|-------8 bits------|1 bit|2 bits|
56  * __________________________________________________________________
57  *|                                | | | | | | | | | | |     |   |   |
58  *|---------21 Unused bits---------|x|x|x| |x|x|x|x| |x|  x  | x | x |
59  *|________________________________|_|_|_|_|_|_|_|_|_|_|_____|___|___|
60  *
61  *                                 |___________________|_____|_______|
62  *                                   freq.offset        Chirp  segID
63  *
64  * @DFS_UNIT_TEST_NUM_ARGS:     Number of arguments for bangradar unit test
65  *                              command.
66  * @DFS_MAX_NUM_UNIT_TEST_ARGS: Maximum number of arguments for unit test
67  *                              command in radar simulation.
68  */
69 enum {
70 	IDX_CMD_ID = 0,
71 	IDX_PDEV_ID,
72 	IDX_RADAR_PARAM1_ID,
73 	DFS_UNIT_TEST_NUM_ARGS,
74 	DFS_MAX_NUM_UNIT_TEST_ARGS = DFS_UNIT_TEST_NUM_ARGS
75 };
76 
77 #define SEG_ID_SIZE 2
78 #define IS_CHIRP_SIZE 1
79 #define MASK 0xFF
80 
81 /**
82  * struct dfs_emulate_bang_radar_test_cmd - Unit test command structure to send
83  *                                          WMI command to firmware from host
84  *                                          and simulate bangradar event.
85  * @vdev_id: vdev id
86  * @num_args: number of arguments
87  * @args: arguments
88  */
89 struct dfs_emulate_bang_radar_test_cmd {
90 	uint32_t vdev_id;
91 	uint32_t num_args;
92 	uint32_t args[DFS_MAX_NUM_UNIT_TEST_ARGS];
93 };
94 
95 /**
96  * struct vdev_adfs_complete_status - OCAC complete status event param
97  * @vdev_id: Physical device identifier
98  * @chan_freq: Channel number
99  * @chan_width: Channel Width
100  * @center_freq: Center Frequency channel number
101  * @ocac_status: off channel cac status
102  */
103 struct vdev_adfs_complete_status {
104 	uint32_t vdev_id;
105 	uint32_t chan_freq;
106 	uint32_t chan_width;
107 	uint32_t center_freq;
108 	uint32_t ocac_status;
109 };
110 
111 extern struct dfs_to_mlme global_dfs_to_mlme;
112 
113 /**
114  * tgt_dfs_set_current_channel() - Fill dfs channel structure from
115  *                                 dfs_channel structure.
116  * @pdev: Pointer to DFS pdev object.
117  * @dfs_ch_freq: Frequency in Mhz.
118  * @dfs_ch_flags: Channel flags.
119  * @dfs_ch_flagext: Extended channel flags.
120  * @dfs_ch_ieee: IEEE channel number.
121  * @dfs_ch_vhtop_ch_freq_seg1: Channel Center frequency1.
122  * @dfs_ch_vhtop_ch_freq_seg2: Channel Center frequency2.
123  */
124 #ifdef DFS_COMPONENT_ENABLE
125 QDF_STATUS tgt_dfs_set_current_channel(struct wlan_objmgr_pdev *pdev,
126 		uint16_t dfs_ch_freq,
127 		uint64_t dfs_ch_flags,
128 		uint16_t dfs_ch_flagext,
129 		uint8_t dfs_ch_ieee,
130 		uint8_t dfs_ch_vhtop_ch_freq_seg1,
131 		uint8_t dfs_ch_vhtop_ch_freq_seg2);
132 
133 /**
134  * tgt_dfs_radar_enable() - Enables the radar.
135  * @pdev: Pointer to DFS pdev object.
136  * @no_cac: If no_cac is 0, it cancels the CAC.
137  *
138  * This is called each time a channel change occurs, to (potentially) enable
139  * the radar code.
140  */
141 QDF_STATUS tgt_dfs_radar_enable(struct wlan_objmgr_pdev *pdev,
142 	int no_cac, uint32_t opmode);
143 
144 /**
145  * tgt_dfs_control()- Used to process ioctls related to DFS.
146  * @pdev: Pointer to DFS pdev object.
147  * @id: Command type.
148  * @indata: Input buffer.
149  * @insize: size of the input buffer.
150  * @outdata: A buffer for the results.
151  * @outsize: Size of the output buffer.
152  */
153 QDF_STATUS tgt_dfs_control(struct wlan_objmgr_pdev *pdev,
154 	u_int id,
155 	void *indata,
156 	uint32_t insize,
157 	void *outdata,
158 	uint32_t *outsize,
159 	int *error);
160 
161 /**
162  * tgt_dfs_get_radars() - Based on the chipset, calls init radar table functions
163  * @pdev: Pointer to DFS pdev object.
164  *
165  * Wrapper function for dfs_get_radars(). This function called from
166  * outside of DFS component.
167  */
168 QDF_STATUS tgt_dfs_get_radars(struct wlan_objmgr_pdev *pdev);
169 
170 /**
171  * tgt_dfs_process_radar_ind() - Process radar found indication.
172  * @pdev: Pointer to DFS pdev object.
173  * @radar_found: radar found info.
174  *
175  * Process radar found indication.
176  *
177  * Return QDF_STATUS.
178  */
179 QDF_STATUS tgt_dfs_process_radar_ind(struct wlan_objmgr_pdev *pdev,
180 		struct radar_found_info *radar_found);
181 #else
182 static inline QDF_STATUS tgt_dfs_set_current_channel(
183 		struct wlan_objmgr_pdev *pdev,
184 		uint16_t dfs_ch_freq,
185 		uint64_t dfs_ch_flags,
186 		uint16_t dfs_ch_flagext,
187 		uint8_t dfs_ch_ieee,
188 		uint8_t dfs_ch_vhtop_ch_freq_seg1,
189 		uint8_t dfs_ch_vhtop_ch_freq_seg2)
190 {
191 	return QDF_STATUS_SUCCESS;
192 }
193 
194 static inline QDF_STATUS tgt_dfs_radar_enable(struct wlan_objmgr_pdev *pdev,
195 	int no_cac, uint32_t opmode)
196 {
197 	return QDF_STATUS_SUCCESS;
198 }
199 
200 static inline QDF_STATUS tgt_dfs_control(struct wlan_objmgr_pdev *pdev,
201 	u_int id,
202 	void *indata,
203 	uint32_t insize,
204 	void *outdata,
205 	uint32_t *outsize,
206 	int *error)
207 {
208 	return QDF_STATUS_SUCCESS;
209 }
210 
211 static inline QDF_STATUS tgt_dfs_get_radars(struct wlan_objmgr_pdev *pdev)
212 {
213 	return QDF_STATUS_SUCCESS;
214 }
215 
216 static inline QDF_STATUS tgt_dfs_process_radar_ind(
217 		struct wlan_objmgr_pdev *pdev,
218 		struct radar_found_info *radar_found)
219 {
220 	return QDF_STATUS_SUCCESS;
221 }
222 #endif
223 
224 /**
225  * tgt_dfs_process_phyerr() - Process phyerr.
226  * @pdev: Pointer to DFS pdev object.
227  * @buf: Phyerr buffer.
228  * @datalen: phyerr buffer length.
229  * @r_rssi: RSSI.
230  * @r_ext_rssi: Extension channel RSSI.
231  * @r_rs_tstamp: Timestamp.
232  * @r_fulltsf: TSF64.
233  *
234  * Wrapper function for dfs_process_phyerr(). This function called from
235  * outside of DFS component.
236  */
237 QDF_STATUS tgt_dfs_process_phyerr(struct wlan_objmgr_pdev *pdev,
238 	void *buf,
239 	uint16_t datalen,
240 	uint8_t r_rssi,
241 	uint8_t r_ext_rssi,
242 	uint32_t r_rs_tstamp,
243 	uint64_t r_fulltsf);
244 
245 /**
246  * tgt_dfs_process_phyerr_filter_offload() - Process radar event.
247  * Wrapper function for dfs_process_phyerr_filter_offload(). This function
248  * called from outside of DFS component.
249  * @pdev: Pointer to DFS pdev object.
250  * @wlan_radar_event: pointer to radar_event_info.
251  *
252  * Return: QDF_STATUS
253  */
254 QDF_STATUS tgt_dfs_process_phyerr_filter_offload(struct wlan_objmgr_pdev *pdev,
255 	struct radar_event_info *wlan_radar_event);
256 
257 /**
258  * tgt_dfs_is_phyerr_filter_offload() - Is phyerr filter offload.
259  * @psoc: Pointer to psoc object.
260  * @is_phyerr_filter_offload: Pointer to is_phyerr_filter_offload.
261  *
262  * Return: QDF_STATUS
263  */
264 QDF_STATUS tgt_dfs_is_phyerr_filter_offload(struct wlan_objmgr_psoc *psoc,
265 					    bool *is_phyerr_filter_offload);
266 
267 /**
268  * tgt_dfs_destroy_object() - Destroys the DFS object.
269  * @pdev: Pointer to DFS pdev object.
270  *
271  * Wrapper function for  dfs_destroy_object(). This function called from
272  * outside of DFS component.
273  */
274 QDF_STATUS tgt_dfs_destroy_object(struct wlan_objmgr_pdev *pdev);
275 
276 #ifdef QCA_MCL_DFS_SUPPORT
277 /**
278  * tgt_dfs_set_tx_leakage_threshold() - set tx_leakage_threshold.
279  * @pdev: Pointer to DFS pdev object.
280  *
281  * Return QDF_STATUS.
282  */
283 QDF_STATUS tgt_dfs_set_tx_leakage_threshold(struct wlan_objmgr_pdev *pdev);
284 #else
285 static inline QDF_STATUS tgt_dfs_set_tx_leakage_threshold
286 		(struct wlan_objmgr_pdev *pdev)
287 {
288 	return QDF_STATUS_SUCCESS;
289 }
290 #endif
291 
292 /**
293  * tgt_dfs_is_precac_timer_running() - Check whether precac timer is running.
294  * @pdev: Pointer to DFS pdev object.
295  * @is_precac_timer_running: Pointer to save precac timer value.
296  *
297  * Wrapper function for dfs_is_precac_timer_running(). This function called from
298  * outside of DFS component.
299  */
300 QDF_STATUS tgt_dfs_is_precac_timer_running(struct wlan_objmgr_pdev *pdev,
301 	bool *is_precac_timer_running);
302 
303 /**
304  * tgt_dfs_set_agile_precac_state() - set state for Agile Precac.
305  *
306  * @pdev: Pointer to DFS pdev object.
307  * @agile_precac_state: Agile Precac state
308  *
309  * wrapper function for  dfs_set_agile_precac_state.
310  * This function called from outside of dfs component.
311  */
312 QDF_STATUS tgt_dfs_set_agile_precac_state(struct wlan_objmgr_pdev *pdev,
313 					  int agile_precac_state);
314 
315 /**
316  * tgt_dfs_agile_precac_start() - Start agile precac
317  *
318  * @pdev: Pointer to DFS pdev object.
319  *
320  * wrapper function for  dfs_set_agile_precac_state.
321  * This function called from outside of dfs component.
322  */
323 QDF_STATUS tgt_dfs_agile_precac_start(struct wlan_objmgr_pdev *pdev);
324 
325 /**
326  * tgt_dfs_ocac_complete() - Process off channel cac complete indication.
327  * @pdev: Pointer to DFS pdev object.
328  * @vdev_adfs_complete_status: Off channel CAC complete status.
329  *
330  * wrapper function for  dfs_set_agile_precac_state.
331  * This function called from outside of dfs component.
332  */
333 QDF_STATUS tgt_dfs_ocac_complete(struct wlan_objmgr_pdev *pdev,
334 				 struct vdev_adfs_complete_status *ocac_status);
335 
336 /**
337  * utils_dfs_find_vht80_chan_for_precac() - Find VHT80 channel for precac.
338  * @pdev: Pointer to DFS pdev object.
339  * @chan_mode: Channel mode.
340  * @ch_freq_seg1: Segment1 channel freq.
341  * @cfreq1: cfreq1.
342  * @cfreq2: cfreq2.
343  * @phy_mode: Precac phymode.
344  * @dfs_set_cfreq2: Precac cfreq2
345  * @set_agile: Agile mode flag.
346  *
347  * wrapper function for  dfs_find_vht80_chan_for_precacdfs_cancel_cac_timer().
348  * This function called from outside of dfs component.
349  */
350 QDF_STATUS tgt_dfs_find_vht80_chan_for_precac(struct wlan_objmgr_pdev *pdev,
351 		uint32_t chan_mode,
352 		uint8_t ch_freq_seg1,
353 		uint32_t *cfreq1,
354 		uint32_t *cfreq2,
355 		uint32_t *phy_mode,
356 		bool *dfs_set_cfreq2,
357 		bool *set_agile);
358 
359 /**
360  * tgt_dfs_cac_complete() - Process cac complete indication.
361  * @pdev: Pointer to DFS pdev object.
362  * @vdev_id: vdev id.
363  *
364  * Process cac complete indication from firmware.
365  *
366  * Return QDF_STATUS.
367  */
368 QDF_STATUS tgt_dfs_cac_complete(struct wlan_objmgr_pdev *pdev,
369 		uint32_t vdev_id);
370 
371 /**
372  * tgt_dfs_reg_ev_handler() - Register dfs events.
373  * @psoc: Pointer to psoc.
374  *
375  * Register dfs events.
376  *
377  * Return: QDF_STATUS.
378  */
379 QDF_STATUS tgt_dfs_reg_ev_handler(struct wlan_objmgr_psoc *psoc);
380 
381 /**
382  * tgt_dfs_stop() - Clear dfs timers.
383  * @dfs: Pointer to wlan_dfs structure.
384  */
385 QDF_STATUS tgt_dfs_stop(struct wlan_objmgr_pdev *pdev);
386 
387 /**
388 * tgt_dfs_process_emulate_bang_radar_cmd() - Process to emulate dfs bangradar
389 *                                            command.
390 * @pdev: Pointer to DFS pdev object.
391 *
392 * Process  to emulate dfs bangradar command.
393 *
394 * Return: QDF_STATUS.
395 */
396 QDF_STATUS tgt_dfs_process_emulate_bang_radar_cmd(struct wlan_objmgr_pdev *pdev,
397 		struct dfs_emulate_bang_radar_test_cmd *dfs_unit_test);
398 
399 #ifdef QCA_MCL_DFS_SUPPORT
400 /**
401  * tgt_dfs_set_phyerr_filter_offload() - config phyerr filter offload
402  * @pdev: Pointer to DFS pdev object.
403  *
404  * Return: QDF_STATUS
405  */
406 QDF_STATUS tgt_dfs_set_phyerr_filter_offload(struct wlan_objmgr_pdev *pdev);
407 #else
408 static inline QDF_STATUS tgt_dfs_set_phyerr_filter_offload
409 	(struct wlan_objmgr_pdev *pdev)
410 {
411 	return QDF_STATUS_SUCCESS;
412 }
413 #endif
414 
415 #if defined(WLAN_DFS_PARTIAL_OFFLOAD) && defined(HOST_DFS_SPOOF_TEST)
416 /**
417  * tgt_dfs_send_avg_params_to_fw() - send average radar parameters to fw.
418  * @pdev: Pointer to DFS pdev object.
419  * @params: Pointer to dfs radar average parameters.
420  *
421  * Return: QDF_STATUS
422  */
423 QDF_STATUS
424 tgt_dfs_send_avg_params_to_fw(struct wlan_objmgr_pdev *pdev,
425 			      struct dfs_radar_found_params *params);
426 #endif
427 
428 /**
429  * tgt_dfs_action_on_status_from_fw() - trigger the action to be taken based on
430  * host dfs status received from fw.
431  * @pdev: Pointer to pdev object.
432  * @status: Pointer to the host dfs status received from fw.
433  *
434  * Return: QDF_STATUS
435  */
436 #if defined(WLAN_DFS_PARTIAL_OFFLOAD) && defined(HOST_DFS_SPOOF_TEST)
437 QDF_STATUS tgt_dfs_action_on_status_from_fw(struct wlan_objmgr_pdev *pdev,
438 					    uint32_t *status);
439 #else
440 static inline
441 QDF_STATUS tgt_dfs_action_on_status_from_fw(struct wlan_objmgr_pdev *pdev,
442 					    uint32_t *status)
443 {
444 	return QDF_STATUS_SUCCESS;
445 }
446 #endif
447 
448 /**
449  * tgt_dfs_is_radar_enabled() - checks if radar detection is enabled.
450  * @pdev: Pointer to pdev object.
451  * @ignore_dfs: Pointer to check the value. If 1, radar detection is disabled.
452  */
453 void tgt_dfs_is_radar_enabled(struct wlan_objmgr_pdev *pdev, int *ignore_dfs);
454 
455 /**
456  * tgt_dfs_reset_spoof_test() - reset the dfs spoof check variables
457  * @pdev: Pointer to pdev object.
458  *
459  * Return: QDF_STATUS
460  */
461 #if defined(WLAN_DFS_PARTIAL_OFFLOAD) && defined(HOST_DFS_SPOOF_TEST)
462 QDF_STATUS tgt_dfs_reset_spoof_test(struct wlan_objmgr_pdev *pdev);
463 #else
464 static inline
465 QDF_STATUS tgt_dfs_reset_spoof_test(struct wlan_objmgr_pdev *pdev)
466 {
467 	return QDF_STATUS_SUCCESS;
468 }
469 #endif
470 
471 /**
472  * tgt_dfs_enable_stadfs() - Enable/Disable STADFS capability.
473  * @pdev: Pointer to DFS pdev object.
474  * @val: input value.
475  */
476 void tgt_dfs_enable_stadfs(struct wlan_objmgr_pdev *pdev, bool val);
477 
478 /**
479  * tgt_dfs_is_stadfs_enabled() - Get STADFS capability
480  * @pdev: Pointer to DFS pdev object.
481  *
482  * Return: true if STADFS is enabled, else false.
483  */
484 bool tgt_dfs_is_stadfs_enabled(struct wlan_objmgr_pdev *pdev);
485 
486 /**
487  * tgt_dfs_is_pdev_5ghz() - Check if the input pdev is 5GHZ.
488  * @pdev: Pointer to DFS pdev object.
489  *
490  * Return: true if the pdev supports 5GHz, else false.
491  */
492 bool tgt_dfs_is_pdev_5ghz(struct wlan_objmgr_pdev *pdev);
493 
494 #if defined(WLAN_DFS_FULL_OFFLOAD) && defined(QCA_DFS_NOL_OFFLOAD)
495 /**
496  * tgt_dfs_send_usenol_pdev_param() - Send usenol pdev param to FW.
497  * @pdev: Pointer to pdev object.
498  * @usenol: Value of usenol
499  *
500  * Return: QDF_STATUS
501  */
502 QDF_STATUS tgt_dfs_send_usenol_pdev_param(struct wlan_objmgr_pdev *pdev,
503 					  bool usenol);
504 
505 /**
506  * tgt_dfs_send_subchan_marking() - Send subchannel marking pdev param to FW.
507  * @pdev: Pointer to pdev object.
508  * @subchanmark: Value of subchannel_marking.
509  *
510  * Return: QDF_STATUS
511  */
512 QDF_STATUS tgt_dfs_send_subchan_marking(struct wlan_objmgr_pdev *pdev,
513 					bool subchanmark);
514 #else
515 static inline
516 QDF_STATUS tgt_dfs_send_usenol_pdev_param(struct wlan_objmgr_pdev *pdev,
517 					  bool usenol)
518 {
519 	return QDF_STATUS_SUCCESS;
520 }
521 
522 static inline QDF_STATUS
523 tgt_dfs_send_subchan_marking(struct wlan_objmgr_pdev *pdev, bool subchanmark)
524 {
525 	return QDF_STATUS_SUCCESS;
526 }
527 #endif
528 #endif /* _WLAN_DFS_TGT_API_H_ */
529