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