xref: /wlan-dirver/qca-wifi-host-cmn/umac/dfs/dispatcher/inc/wlan_dfs_ucfg_api.h (revision a175314c51a4ce5cec2835cc8a8c7dc0c1810915)
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_get_cac_timeout:              Gets the CAC timeout.
56  * @mlme_rebuild_chan_list_with_non_dfs_channel: Rebuild channels with non-dfs
57  *                                     channels.
58  * @mlme_restart_vaps_with_non_dfs_chan: Restart vaps with non-dfs channel.
59  * @mlme_check_allowed_prim_chanlist:  Check whether the given channel is
60  *                                     present in the primary allowed channel
61  *                                     list or not.
62  */
63 struct dfs_to_mlme {
64 	QDF_STATUS (*pdev_component_obj_attach)(struct wlan_objmgr_pdev *pdev,
65 			enum wlan_umac_comp_id id,
66 			void *comp_priv_obj,
67 			QDF_STATUS status);
68 	QDF_STATUS (*pdev_component_obj_detach)(struct wlan_objmgr_pdev *pdev,
69 			enum wlan_umac_comp_id id,
70 			void *comp_priv_obj);
71 	struct wlan_dfs *(*pdev_get_comp_private_obj)(
72 			struct wlan_objmgr_pdev *pdev);
73 	QDF_STATUS (*dfs_start_rcsa)(struct wlan_objmgr_pdev *pdev,
74 			bool *wait_for_csa);
75 	QDF_STATUS (*mlme_mark_dfs)(struct wlan_objmgr_pdev *pdev,
76 			uint8_t ieee,
77 			uint16_t freq,
78 			uint8_t vhtop_ch_freq_seg2,
79 			uint64_t flags);
80 	QDF_STATUS (*mlme_start_csa)(struct wlan_objmgr_pdev *pdev,
81 			uint8_t ieee_chan, uint16_t freq,
82 			uint8_t cfreq2, uint64_t flags);
83 	QDF_STATUS (*mlme_proc_cac)(struct wlan_objmgr_pdev *pdev);
84 	QDF_STATUS (*mlme_deliver_event_up_after_cac)(
85 			struct wlan_objmgr_pdev *pdev);
86 	QDF_STATUS (*mlme_get_dfs_ch_nchans)(struct wlan_objmgr_pdev *pdev,
87 			int *nchans);
88 	QDF_STATUS (*mlme_get_extchan)(struct wlan_objmgr_pdev *pdev,
89 			uint16_t *dfs_ch_freq,
90 			uint64_t *dfs_ch_flags,
91 			uint16_t *dfs_ch_flagext,
92 			uint8_t *dfs_ch_ieee,
93 			uint8_t *dfs_ch_vhtop_ch_freq_seg1,
94 			uint8_t *dfs_ch_vhtop_ch_freq_seg2);
95 	QDF_STATUS (*mlme_set_no_chans_available)(struct wlan_objmgr_pdev *pdev,
96 			int val);
97 	QDF_STATUS (*mlme_ieee2mhz)(struct wlan_objmgr_pdev *pdev,
98 			int ieee,
99 			uint64_t flag,
100 			int *freq);
101 	QDF_STATUS (*mlme_find_dot11_channel)(struct wlan_objmgr_pdev *pdev,
102 			uint8_t ieee,
103 			uint8_t des_cfreq2,
104 			int mode,
105 			uint16_t *dfs_ch_freq,
106 			uint64_t *dfs_ch_flags,
107 			uint16_t *dfs_ch_flagext,
108 			uint8_t *dfs_ch_ieee,
109 			uint8_t *dfs_ch_vhtop_ch_freq_seg1,
110 			uint8_t *dfs_ch_vhtop_ch_freq_seg2);
111 
112 	QDF_STATUS (*mlme_get_dfs_ch_channels)(struct wlan_objmgr_pdev *pdev,
113 			uint16_t *dfs_ch_freq,
114 			uint64_t *dfs_ch_flags,
115 			uint16_t *dfs_ch_flagext,
116 			uint8_t *dfs_ch_ieee,
117 			uint8_t *dfs_ch_vhtop_ch_freq_seg1,
118 			uint8_t *dfs_ch_vhtop_ch_freq_seg2,
119 			int index);
120 	QDF_STATUS (*mlme_dfs_ch_flags_ext)(struct wlan_objmgr_pdev *pdev,
121 			uint16_t *flag_ext);
122 	QDF_STATUS (*mlme_channel_change_by_precac)(
123 			struct wlan_objmgr_pdev *pdev);
124 #ifdef WLAN_DFS_PRECAC_AUTO_CHAN_SUPPORT
125 	QDF_STATUS (*mlme_precac_chan_change_csa)(struct wlan_objmgr_pdev *pdev,
126 						  uint8_t ch_ieee);
127 #endif
128 	QDF_STATUS (*mlme_nol_timeout_notification)(
129 			struct wlan_objmgr_pdev *pdev);
130 	QDF_STATUS (*mlme_clist_update)(struct wlan_objmgr_pdev *pdev,
131 			void *nollist,
132 			int nentries);
133 	QDF_STATUS (*mlme_get_cac_timeout)(struct wlan_objmgr_pdev *pdev,
134 			uint16_t dfs_ch_freq,
135 			uint8_t c_vhtop_ch_freq_seg2,
136 			uint64_t dfs_ch_flags,
137 			int *cac_timeout);
138 	QDF_STATUS (*mlme_rebuild_chan_list_with_non_dfs_channels)
139 			(struct wlan_objmgr_pdev *pdev);
140 	QDF_STATUS (*mlme_restart_vaps_with_non_dfs_chan)
141 			(struct wlan_objmgr_pdev *pdev, int no_chans_avail);
142 	bool (*mlme_check_allowed_prim_chanlist)
143 			(struct wlan_objmgr_pdev *pdev, uint32_t chan_num);
144 };
145 
146 extern struct dfs_to_mlme global_dfs_to_mlme;
147 
148 /**
149  * wlan_dfs_pdev_obj_create_notification() - DFS pdev object create handler.
150  * @pdev: Pointer to DFS pdev object.
151  */
152 QDF_STATUS wlan_dfs_pdev_obj_create_notification(struct wlan_objmgr_pdev *pdev,
153 		void *arg);
154 
155 /**
156  * wlan_dfs_pdev_obj_destroy_notification() - DFS pdev object delete handler.
157  * @pdev: Pointer to DFS pdev object.
158  */
159 QDF_STATUS wlan_dfs_pdev_obj_destroy_notification(struct wlan_objmgr_pdev *pdev,
160 		void *arg);
161 
162 /**
163  * ucfg_dfs_is_ap_cac_timer_running() - Returns the dfs cac timer.
164  * @pdev: Pointer to DFS pdev object.
165  * @is_ap_cac_timer_running: Pointer to save dfs_cac_timer_running value.
166  *
167  * Wrapper function for dfs_is_ap_cac_timer_running().
168  * This function called from outside of dfs component.
169  */
170 QDF_STATUS ucfg_dfs_is_ap_cac_timer_running(struct wlan_objmgr_pdev *pdev,
171 		int *is_ap_cac_timer_running);
172 
173 /**
174  * ucfg_dfs_getnol() - Wrapper function for dfs_get_nol()
175  * @pdev: Pointer to DFS pdev object.
176  * @dfs_nolinfo: Pointer to dfsreq_nolinfo structure.
177  *
178  * Wrapper function for dfs_getnol().
179  * This function called from outside of dfs component.
180  */
181 QDF_STATUS ucfg_dfs_getnol(struct wlan_objmgr_pdev *pdev, void *dfs_nolinfo);
182 
183 /**
184  * ucfg_dfs_override_cac_timeout() -  Override the default CAC timeout.
185  * @pdev: Pointer to DFS pdev object.
186  * @cac_timeout: CAC timeout value.
187  *
188  * Wrapper function for dfs_override_cac_timeout().
189  * This function called from outside of dfs component.
190  */
191 QDF_STATUS ucfg_dfs_override_cac_timeout(struct wlan_objmgr_pdev *pdev,
192 		int cac_timeout, int *status);
193 
194 /**
195  * ucfg_dfs_get_override_cac_timeout() -  Get override CAC timeout value.
196  * @pdev: Pointer to DFS pdev object.
197  * @cac_timeout: Pointer to save the CAC timeout value.
198  *
199  * Wrapper function for dfs_get_override_cac_timeout().
200  * This function called from outside of dfs component.
201  */
202 QDF_STATUS ucfg_dfs_get_override_cac_timeout(struct wlan_objmgr_pdev *pdev,
203 		int *cac_timeout, int *status);
204 
205 /**
206  * ucfg_dfs_get_override_precac_timeout() - Get precac timeout.
207  * @pdev: Pointer to DFS pdev object.
208  * @precac_timeout: Get precac timeout value in this variable.
209  *
210  * Wrapper function for dfs_get_override_precac_timeout().
211  * This function called from outside of dfs component.
212  */
213 QDF_STATUS ucfg_dfs_get_override_precac_timeout(struct wlan_objmgr_pdev *pdev,
214 		int *precac_timeout);
215 
216 /**
217  * ucfg_dfs_override_precac_timeout() - Override the default precac timeout.
218  * @pdev: Pointer to DFS pdev object.
219  * @precac_timeout: Precac timeout value.
220  *
221  * Wrapper function for dfs_override_precac_timeout().
222  * This function called from outside of dfs component.
223  */
224 QDF_STATUS ucfg_dfs_override_precac_timeout(struct wlan_objmgr_pdev *pdev,
225 		int precac_timeout);
226 
227 /**
228  * ucfg_dfs_set_precac_enable() - Set precac enable flag.
229  * @pdev: Pointer to DFS pdev object.
230  * @value: input value for dfs_precac_enable flag.
231  *
232  * Wrapper function for dfs_set_precac_enable().
233  * This function called from outside of dfs component.
234  */
235 QDF_STATUS ucfg_dfs_set_precac_enable(struct wlan_objmgr_pdev *pdev,
236 				      uint32_t value);
237 
238 /**
239  * ucfg_dfs_get_precac_enable() - Get precac enable flag.
240  * @pdev: Pointer to DFS pdev object.
241  * @buff: Pointer to save precac_enable value.
242  *
243  * Wrapper function for dfs_get_precac_enable().
244  * This function called from outside of dfs component.
245  */
246 QDF_STATUS ucfg_dfs_get_precac_enable(struct wlan_objmgr_pdev *pdev, int *buff);
247 
248 #ifdef WLAN_DFS_PRECAC_AUTO_CHAN_SUPPORT
249 /**
250  * ucfg_dfs_set_precac_intermediate_chan() - Set intermediate channel
251  *                                           for preCAC.
252  * @pdev: Pointer to DFS pdev object.
253  * @value: Channel number of intermediate channel
254  *
255  * Wrapper function for dfs_set_precac_intermediate_chan().
256  * This function is called from outside of dfs component.
257  *
258  * Return:
259  * * QDF_STATUS_SUCCESS  : Successfully set intermediate channel.
260  * * QDF_STATUS_E_FAILURE: Failed to set intermediate channel.
261  */
262 QDF_STATUS ucfg_dfs_set_precac_intermediate_chan(struct wlan_objmgr_pdev *pdev,
263 						 uint32_t value);
264 
265 /**
266  * ucfg_dfs_get_precac_intermediate_chan() - Get intermediate channel
267  *						for preCAC.
268  * @pdev: Pointer to DFS pdev object.
269  * @buff: Pointer to Channel number of intermediate channel.
270  *
271  * Wrapper function for dfs_get_precac_intermediate_chan().
272  * This function is called from outside of dfs component.
273  *
274  * Return: Configured intermediate precac channel.
275  */
276 QDF_STATUS ucfg_dfs_get_precac_intermediate_chan(struct wlan_objmgr_pdev *pdev,
277 						 int *buff);
278 
279 /**
280  * ucfg_dfs_get_precac_chan_state() - Get precac status for the given channel.
281  * @pdev: Pointer to DFS pdev object.
282  * @precac_chan: Channel number for which precac state needs to be determined.
283  *
284  * Wrapper function for dfs_get_precac_chan_state().
285  * This function called from outside of dfs component.
286  *
287  * Return: Precac state of the given channel.
288  */
289 enum precac_chan_state
290 ucfg_dfs_get_precac_chan_state(struct wlan_objmgr_pdev *pdev,
291 			       uint8_t precac_chan);
292 #endif
293 
294 #ifdef QCA_MCL_DFS_SUPPORT
295 /**
296  * ucfg_dfs_update_config() - Update DFS user config.
297  * @psoc: Pointer to psoc.
298  * @req: DFS user config.
299  *
300  * Return: QDF_STATUS
301  */
302 QDF_STATUS ucfg_dfs_update_config(struct wlan_objmgr_psoc *psoc,
303 		struct dfs_user_config *req);
304 #else
305 static inline QDF_STATUS ucfg_dfs_update_config(struct wlan_objmgr_psoc *psoc,
306 		struct dfs_user_config *req)
307 {
308 	return QDF_STATUS_SUCCESS;
309 }
310 #endif
311 
312 /**
313  * ucfg_dfs_set_override_status_timeout() - override the value of host dfs
314  * status wait timeout.
315  * @pdev: Pointer to DFS pdev object.
316  * @status_timeout: timeout value.
317  *
318  * Wrapper function for dfs_set_override_status_timeout().
319  * This function called from outside of dfs component.
320  *
321  * Return: QDF_STATUS
322  */
323 #if defined(WLAN_DFS_PARTIAL_OFFLOAD) && defined(HOST_DFS_SPOOF_TEST)
324 QDF_STATUS ucfg_dfs_set_override_status_timeout(struct wlan_objmgr_pdev *pdev,
325 					    int status_timeout);
326 #else
327 static inline
328 QDF_STATUS ucfg_dfs_set_override_status_timeout(struct wlan_objmgr_pdev *pdev,
329 					    int status_timeout)
330 {
331 	return QDF_STATUS_SUCCESS;
332 }
333 #endif
334 
335 /**
336  * ucfg_dfs_get_override_status_timeout() - Get the value of host dfs status
337  * wait timeout.
338  * @pdev: Pointer to DFS pdev object.
339  * @status_timeout: Pointer to save the timeout value.
340  *
341  * Wrapper function for dfs_get_override_status_timeout().
342  * This function called from outside of dfs component.
343  *
344  * Return: QDF_STATUS
345  */
346 #if defined(WLAN_DFS_PARTIAL_OFFLOAD) && defined(HOST_DFS_SPOOF_TEST)
347 QDF_STATUS ucfg_dfs_get_override_status_timeout(struct wlan_objmgr_pdev *pdev,
348 						int *status_timeout);
349 #else
350 static inline
351 QDF_STATUS ucfg_dfs_get_override_status_timeout(struct wlan_objmgr_pdev *pdev,
352 						int *status_timeout)
353 {
354 	return QDF_STATUS_SUCCESS;
355 }
356 #endif
357 #endif /* _WLAN_DFS_UCFG_API_H_ */
358