xref: /wlan-dirver/qca-wifi-host-cmn/umac/dfs/dispatcher/inc/wlan_dfs_ucfg_api.h (revision 1f55ed1a9f5050d8da228aa8dd3fff7c0242aa71)
1 /*
2  * Copyright (c) 2016-2018 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_UCFG_API_H_
26 #define _WLAN_DFS_UCFG_API_H_
27 
28 #include <wlan_objmgr_psoc_obj.h>
29 #include <wlan_objmgr_pdev_obj.h>
30 
31 /**
32  * struct dfs_to_mlme - These are MLME function pointer used by DFS component.
33  * @pdev_component_obj_attach:         Attach DFS object to PDEV.
34  * @pdev_component_obj_detach:         Detach DFS object from PDEV.
35  * @pdev_get_comp_private_obj:         Get DFS object from PDEV.
36  * @dfs_start_rcsa:                    Send RCSA to RootAP.
37  * @mlme_mark_dfs:                     Calls dfs_action function.
38  * @mlme_start_csa:                    Sends CSA.
39  * @mlme_proc_cac:                     Process the CAC completion event.
40  * @mlme_deliver_event_up_after_cac:   Send a CAC timeout, VAP up event to user
41  *                                     space
42  * @mlme_get_dfs_ch_nchans:            Get number of channels in the channel
43  *                                     list.
44  * @mlme_get_extchan:                  Gets the extension channel.
45  * @mlme_set_no_chans_available:       Sets no_chans_available flag.
46  * @mlme_ieee2mhz:                     Gets Channel freq from ieee number.
47  * @mlme_find_dot11_channel:           Find dot11 channel.
48  * @mlme_get_dfs_ch_channels:          Get the channel list.
49  * @mlme_dfs_ch_flags_ext:             Gets channel extension flag.
50  * @mlme_channel_change_by_precac:     Channel change triggered by PreCAC.
51  * @mlme_precac_chan_change_csa:       Channel change triggered by PrCAC using
52  *                                     Channel Switch Announcement.
53  * @mlme_nol_timeout_notification:     NOL timeout notification.
54  * @mlme_clist_update:                 Updates the channel list.
55  * @mlme_is_opmode_sta:                Check if pdev opmode is STA.
56  * @mlme_get_cac_timeout:              Gets the CAC timeout.
57  * @mlme_rebuild_chan_list_with_non_dfs_channel: Rebuild channels with non-dfs
58  *                                     channels.
59  * @mlme_restart_vaps_with_non_dfs_chan: Restart vaps with non-dfs channel.
60  * @mlme_check_allowed_prim_chanlist:  Check whether the given channel is
61  *                                     present in the primary allowed channel
62  *                                     list or not.
63  * @mlme_update_scan_channel_list:     Update the scan channel list sent to FW.
64  * @mlme_bringdown_vaps:               Bringdown vaps if no chans is present.
65  */
66 struct dfs_to_mlme {
67 	QDF_STATUS (*pdev_component_obj_attach)(struct wlan_objmgr_pdev *pdev,
68 			enum wlan_umac_comp_id id,
69 			void *comp_priv_obj,
70 			QDF_STATUS status);
71 	QDF_STATUS (*pdev_component_obj_detach)(struct wlan_objmgr_pdev *pdev,
72 			enum wlan_umac_comp_id id,
73 			void *comp_priv_obj);
74 	QDF_STATUS (*dfs_start_rcsa)(struct wlan_objmgr_pdev *pdev,
75 			bool *wait_for_csa);
76 	QDF_STATUS (*mlme_mark_dfs)(struct wlan_objmgr_pdev *pdev,
77 			uint8_t ieee,
78 			uint16_t freq,
79 			uint8_t vhtop_ch_freq_seg2,
80 			uint64_t flags);
81 	QDF_STATUS (*mlme_start_csa)(struct wlan_objmgr_pdev *pdev,
82 			uint8_t ieee_chan, uint16_t freq,
83 			uint8_t cfreq2, uint64_t flags);
84 	QDF_STATUS (*mlme_proc_cac)(struct wlan_objmgr_pdev *pdev);
85 	QDF_STATUS (*mlme_deliver_event_up_after_cac)(
86 			struct wlan_objmgr_pdev *pdev);
87 	QDF_STATUS (*mlme_get_dfs_ch_nchans)(struct wlan_objmgr_pdev *pdev,
88 			int *nchans);
89 	QDF_STATUS (*mlme_get_extchan)(struct wlan_objmgr_pdev *pdev,
90 			uint16_t *dfs_ch_freq,
91 			uint64_t *dfs_ch_flags,
92 			uint16_t *dfs_ch_flagext,
93 			uint8_t *dfs_ch_ieee,
94 			uint8_t *dfs_ch_vhtop_ch_freq_seg1,
95 			uint8_t *dfs_ch_vhtop_ch_freq_seg2);
96 	QDF_STATUS (*mlme_set_no_chans_available)(struct wlan_objmgr_pdev *pdev,
97 			int val);
98 	QDF_STATUS (*mlme_ieee2mhz)(struct wlan_objmgr_pdev *pdev,
99 			int ieee,
100 			uint64_t flag,
101 			int *freq);
102 	QDF_STATUS (*mlme_find_dot11_channel)(struct wlan_objmgr_pdev *pdev,
103 			uint8_t ieee,
104 			uint8_t des_cfreq2,
105 			int mode,
106 			uint16_t *dfs_ch_freq,
107 			uint64_t *dfs_ch_flags,
108 			uint16_t *dfs_ch_flagext,
109 			uint8_t *dfs_ch_ieee,
110 			uint8_t *dfs_ch_vhtop_ch_freq_seg1,
111 			uint8_t *dfs_ch_vhtop_ch_freq_seg2);
112 
113 	QDF_STATUS (*mlme_get_dfs_ch_channels)(struct wlan_objmgr_pdev *pdev,
114 			uint16_t *dfs_ch_freq,
115 			uint64_t *dfs_ch_flags,
116 			uint16_t *dfs_ch_flagext,
117 			uint8_t *dfs_ch_ieee,
118 			uint8_t *dfs_ch_vhtop_ch_freq_seg1,
119 			uint8_t *dfs_ch_vhtop_ch_freq_seg2,
120 			int index);
121 	QDF_STATUS (*mlme_dfs_ch_flags_ext)(struct wlan_objmgr_pdev *pdev,
122 			uint16_t *flag_ext);
123 	QDF_STATUS (*mlme_channel_change_by_precac)(
124 			struct wlan_objmgr_pdev *pdev);
125 #ifdef WLAN_DFS_PRECAC_AUTO_CHAN_SUPPORT
126 	QDF_STATUS (*mlme_precac_chan_change_csa)(struct wlan_objmgr_pdev *pdev,
127 						  uint8_t ch_ieee);
128 #endif
129 	QDF_STATUS (*mlme_nol_timeout_notification)(
130 			struct wlan_objmgr_pdev *pdev);
131 	QDF_STATUS (*mlme_clist_update)(struct wlan_objmgr_pdev *pdev,
132 			void *nollist,
133 			int nentries);
134 	bool (*mlme_is_opmode_sta)(struct wlan_objmgr_pdev *pdev);
135 	QDF_STATUS (*mlme_get_cac_timeout)(struct wlan_objmgr_pdev *pdev,
136 			uint16_t dfs_ch_freq,
137 			uint8_t c_vhtop_ch_freq_seg2,
138 			uint64_t dfs_ch_flags,
139 			int *cac_timeout);
140 	QDF_STATUS (*mlme_rebuild_chan_list_with_non_dfs_channels)
141 			(struct wlan_objmgr_pdev *pdev);
142 	QDF_STATUS (*mlme_restart_vaps_with_non_dfs_chan)
143 			(struct wlan_objmgr_pdev *pdev, int no_chans_avail);
144 	bool (*mlme_check_allowed_prim_chanlist)
145 			(struct wlan_objmgr_pdev *pdev, uint32_t chan_num);
146 	QDF_STATUS (*mlme_update_scan_channel_list)
147 			(struct wlan_objmgr_pdev *pdev);
148 	QDF_STATUS (*mlme_bringdown_vaps)
149 			(struct wlan_objmgr_pdev *pdev);
150 };
151 
152 extern struct dfs_to_mlme global_dfs_to_mlme;
153 
154 /**
155  * wlan_dfs_pdev_obj_create_notification() - DFS pdev object create handler.
156  * @pdev: Pointer to DFS pdev object.
157  */
158 QDF_STATUS wlan_dfs_pdev_obj_create_notification(struct wlan_objmgr_pdev *pdev,
159 		void *arg);
160 
161 /**
162  * wlan_dfs_pdev_obj_destroy_notification() - DFS pdev object delete handler.
163  * @pdev: Pointer to DFS pdev object.
164  */
165 QDF_STATUS wlan_dfs_pdev_obj_destroy_notification(struct wlan_objmgr_pdev *pdev,
166 		void *arg);
167 
168 /**
169  * ucfg_dfs_is_ap_cac_timer_running() - Returns the dfs cac timer.
170  * @pdev: Pointer to DFS pdev object.
171  * @is_ap_cac_timer_running: Pointer to save dfs_cac_timer_running value.
172  *
173  * Wrapper function for dfs_is_ap_cac_timer_running().
174  * This function called from outside of dfs component.
175  */
176 QDF_STATUS ucfg_dfs_is_ap_cac_timer_running(struct wlan_objmgr_pdev *pdev,
177 		int *is_ap_cac_timer_running);
178 
179 /**
180  * ucfg_dfs_getnol() - Wrapper function for dfs_get_nol()
181  * @pdev: Pointer to DFS pdev object.
182  * @dfs_nolinfo: Pointer to dfsreq_nolinfo structure.
183  *
184  * Wrapper function for dfs_getnol().
185  * This function called from outside of dfs component.
186  */
187 QDF_STATUS ucfg_dfs_getnol(struct wlan_objmgr_pdev *pdev, void *dfs_nolinfo);
188 
189 /**
190  * ucfg_dfs_override_cac_timeout() -  Override the default CAC timeout.
191  * @pdev: Pointer to DFS pdev object.
192  * @cac_timeout: CAC timeout value.
193  *
194  * Wrapper function for dfs_override_cac_timeout().
195  * This function called from outside of dfs component.
196  */
197 QDF_STATUS ucfg_dfs_override_cac_timeout(struct wlan_objmgr_pdev *pdev,
198 		int cac_timeout, int *status);
199 
200 /**
201  * ucfg_dfs_get_override_cac_timeout() -  Get override CAC timeout value.
202  * @pdev: Pointer to DFS pdev object.
203  * @cac_timeout: Pointer to save the CAC timeout value.
204  *
205  * Wrapper function for dfs_get_override_cac_timeout().
206  * This function called from outside of dfs component.
207  */
208 QDF_STATUS ucfg_dfs_get_override_cac_timeout(struct wlan_objmgr_pdev *pdev,
209 		int *cac_timeout, int *status);
210 
211 /**
212  * ucfg_dfs_get_override_precac_timeout() - Get precac timeout.
213  * @pdev: Pointer to DFS pdev object.
214  * @precac_timeout: Get precac timeout value in this variable.
215  *
216  * Wrapper function for dfs_get_override_precac_timeout().
217  * This function called from outside of dfs component.
218  */
219 QDF_STATUS ucfg_dfs_get_override_precac_timeout(struct wlan_objmgr_pdev *pdev,
220 		int *precac_timeout);
221 
222 /**
223  * ucfg_dfs_override_precac_timeout() - Override the default precac timeout.
224  * @pdev: Pointer to DFS pdev object.
225  * @precac_timeout: Precac timeout value.
226  *
227  * Wrapper function for dfs_override_precac_timeout().
228  * This function called from outside of dfs component.
229  */
230 QDF_STATUS ucfg_dfs_override_precac_timeout(struct wlan_objmgr_pdev *pdev,
231 		int precac_timeout);
232 
233 /**
234  * ucfg_dfs_set_precac_enable() - Set precac enable flag.
235  * @pdev: Pointer to DFS pdev object.
236  * @value: input value for dfs_precac_enable flag.
237  *
238  * Wrapper function for dfs_set_precac_enable().
239  * This function called from outside of dfs component.
240  */
241 QDF_STATUS ucfg_dfs_set_precac_enable(struct wlan_objmgr_pdev *pdev,
242 				      uint32_t value);
243 
244 /**
245  * ucfg_dfs_get_precac_enable() - Get precac enable flag.
246  * @pdev: Pointer to DFS pdev object.
247  * @buff: Pointer to save precac_enable value.
248  *
249  * Wrapper function for dfs_get_precac_enable().
250  * This function called from outside of dfs component.
251  */
252 QDF_STATUS ucfg_dfs_get_precac_enable(struct wlan_objmgr_pdev *pdev, int *buff);
253 
254 #ifdef WLAN_DFS_PRECAC_AUTO_CHAN_SUPPORT
255 /**
256  * ucfg_dfs_set_precac_intermediate_chan() - Set intermediate channel
257  *                                           for preCAC.
258  * @pdev: Pointer to DFS pdev object.
259  * @value: Channel number of intermediate channel
260  *
261  * Wrapper function for dfs_set_precac_intermediate_chan().
262  * This function is called from outside of dfs component.
263  *
264  * Return:
265  * * QDF_STATUS_SUCCESS  : Successfully set intermediate channel.
266  * * QDF_STATUS_E_FAILURE: Failed to set intermediate channel.
267  */
268 QDF_STATUS ucfg_dfs_set_precac_intermediate_chan(struct wlan_objmgr_pdev *pdev,
269 						 uint32_t value);
270 
271 /**
272  * ucfg_dfs_get_precac_intermediate_chan() - Get intermediate channel
273  *						for preCAC.
274  * @pdev: Pointer to DFS pdev object.
275  * @buff: Pointer to Channel number of intermediate channel.
276  *
277  * Wrapper function for dfs_get_precac_intermediate_chan().
278  * This function is called from outside of dfs component.
279  *
280  * Return: Configured intermediate precac channel.
281  */
282 QDF_STATUS ucfg_dfs_get_precac_intermediate_chan(struct wlan_objmgr_pdev *pdev,
283 						 int *buff);
284 
285 /**
286  * ucfg_dfs_get_precac_chan_state() - Get precac status for the given channel.
287  * @pdev: Pointer to DFS pdev object.
288  * @precac_chan: Channel number for which precac state needs to be determined.
289  *
290  * Wrapper function for dfs_get_precac_chan_state().
291  * This function called from outside of dfs component.
292  *
293  * Return: Precac state of the given channel.
294  */
295 enum precac_chan_state
296 ucfg_dfs_get_precac_chan_state(struct wlan_objmgr_pdev *pdev,
297 			       uint8_t precac_chan);
298 #endif
299 
300 #ifdef QCA_MCL_DFS_SUPPORT
301 /**
302  * ucfg_dfs_update_config() - Update DFS user config.
303  * @psoc: Pointer to psoc.
304  * @req: DFS user config.
305  *
306  * Return: QDF_STATUS
307  */
308 QDF_STATUS ucfg_dfs_update_config(struct wlan_objmgr_psoc *psoc,
309 		struct dfs_user_config *req);
310 #else
311 static inline QDF_STATUS ucfg_dfs_update_config(struct wlan_objmgr_psoc *psoc,
312 		struct dfs_user_config *req)
313 {
314 	return QDF_STATUS_SUCCESS;
315 }
316 #endif
317 
318 /**
319  * ucfg_dfs_set_override_status_timeout() - override the value of host dfs
320  * status wait timeout.
321  * @pdev: Pointer to DFS pdev object.
322  * @status_timeout: timeout value.
323  *
324  * Wrapper function for dfs_set_override_status_timeout().
325  * This function called from outside of dfs component.
326  *
327  * Return: QDF_STATUS
328  */
329 #if defined(WLAN_DFS_PARTIAL_OFFLOAD) && defined(HOST_DFS_SPOOF_TEST)
330 QDF_STATUS ucfg_dfs_set_override_status_timeout(struct wlan_objmgr_pdev *pdev,
331 					    int status_timeout);
332 #else
333 static inline
334 QDF_STATUS ucfg_dfs_set_override_status_timeout(struct wlan_objmgr_pdev *pdev,
335 					    int status_timeout)
336 {
337 	return QDF_STATUS_SUCCESS;
338 }
339 #endif
340 
341 /**
342  * ucfg_dfs_get_override_status_timeout() - Get the value of host dfs status
343  * wait timeout.
344  * @pdev: Pointer to DFS pdev object.
345  * @status_timeout: Pointer to save the timeout value.
346  *
347  * Wrapper function for dfs_get_override_status_timeout().
348  * This function called from outside of dfs component.
349  *
350  * Return: QDF_STATUS
351  */
352 #if defined(WLAN_DFS_PARTIAL_OFFLOAD) && defined(HOST_DFS_SPOOF_TEST)
353 QDF_STATUS ucfg_dfs_get_override_status_timeout(struct wlan_objmgr_pdev *pdev,
354 						int *status_timeout);
355 #else
356 static inline
357 QDF_STATUS ucfg_dfs_get_override_status_timeout(struct wlan_objmgr_pdev *pdev,
358 						int *status_timeout)
359 {
360 	return QDF_STATUS_SUCCESS;
361 }
362 #endif
363 
364 /**
365  * ucfg_dfs_set_nol_subchannel_marking() - Set or unset NOL subchannel marking.
366  * @pdev: Pointer to DFS pdev object.
367  * @nol_subchannel_marking: Set NOL subchannel marking based on this value.
368  *
369  * Wrapper function for dfs_set_nol_subchannel_marking().
370  * This function is called from outside of dfs component.
371  *
372  * Return: QDF_STATUS
373  */
374 QDF_STATUS ucfg_dfs_set_nol_subchannel_marking(struct wlan_objmgr_pdev *pdev,
375 					       bool nol_subchannel_marking);
376 
377 /**
378  * ucfg_dfs_get_nol_subchannel_marking() - Get the value of NOL subchannel
379  * marking.
380  * @pdev: Pointer to DFS pdev object.
381  * @nol_subchannel_marking: Store the value of  NOL subchannel marking.
382  *
383  * Wrapper function for dfs_get_nol_subchannel_marking().
384  * This function is called from outside of dfs component.
385  *
386  * Return: QDF_STATUS
387  */
388 QDF_STATUS ucfg_dfs_get_nol_subchannel_marking(struct wlan_objmgr_pdev *pdev,
389 					       bool *nol_subchannel_marking);
390 #endif /* _WLAN_DFS_UCFG_API_H_ */
391