xref: /wlan-dirver/qca-wifi-host-cmn/umac/dfs/dispatcher/inc/wlan_dfs_ucfg_api.h (revision 8ddef7dd9a290d4a9b1efd5d3efacf51d78a1a0d)
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 
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 des_chan,
128 						  enum wlan_phymode des_mode);
129 #endif
130 	QDF_STATUS (*mlme_nol_timeout_notification)(
131 			struct wlan_objmgr_pdev *pdev);
132 	QDF_STATUS (*mlme_clist_update)(struct wlan_objmgr_pdev *pdev,
133 			void *nollist,
134 			int nentries);
135 	bool (*mlme_is_opmode_sta)(struct wlan_objmgr_pdev *pdev);
136 	QDF_STATUS (*mlme_get_cac_timeout)(struct wlan_objmgr_pdev *pdev,
137 			uint16_t dfs_ch_freq,
138 			uint8_t c_vhtop_ch_freq_seg2,
139 			uint64_t dfs_ch_flags,
140 			int *cac_timeout);
141 	QDF_STATUS (*mlme_rebuild_chan_list_with_non_dfs_channels)
142 			(struct wlan_objmgr_pdev *pdev);
143 	QDF_STATUS (*mlme_restart_vaps_with_non_dfs_chan)
144 			(struct wlan_objmgr_pdev *pdev, int no_chans_avail);
145 	bool (*mlme_check_allowed_prim_chanlist)
146 			(struct wlan_objmgr_pdev *pdev, uint32_t chan_num);
147 	QDF_STATUS (*mlme_update_scan_channel_list)
148 			(struct wlan_objmgr_pdev *pdev);
149 	QDF_STATUS (*mlme_bringdown_vaps)
150 			(struct wlan_objmgr_pdev *pdev);
151 };
152 
153 extern struct dfs_to_mlme global_dfs_to_mlme;
154 
155 /**
156  * wlan_dfs_pdev_obj_create_notification() - DFS pdev object create handler.
157  * @pdev: Pointer to DFS pdev object.
158  */
159 QDF_STATUS wlan_dfs_pdev_obj_create_notification(struct wlan_objmgr_pdev *pdev,
160 		void *arg);
161 
162 /**
163  * wlan_dfs_pdev_obj_destroy_notification() - DFS pdev object delete handler.
164  * @pdev: Pointer to DFS pdev object.
165  */
166 QDF_STATUS wlan_dfs_pdev_obj_destroy_notification(struct wlan_objmgr_pdev *pdev,
167 		void *arg);
168 
169 /**
170  * ucfg_dfs_is_ap_cac_timer_running() - Returns the dfs cac timer.
171  * @pdev: Pointer to DFS pdev object.
172  * @is_ap_cac_timer_running: Pointer to save dfs_cac_timer_running value.
173  *
174  * Wrapper function for dfs_is_ap_cac_timer_running().
175  * This function called from outside of dfs component.
176  */
177 QDF_STATUS ucfg_dfs_is_ap_cac_timer_running(struct wlan_objmgr_pdev *pdev,
178 		int *is_ap_cac_timer_running);
179 
180 /**
181  * ucfg_dfs_getnol() - Wrapper function for dfs_get_nol()
182  * @pdev: Pointer to DFS pdev object.
183  * @dfs_nolinfo: Pointer to dfsreq_nolinfo structure.
184  *
185  * Wrapper function for dfs_getnol().
186  * This function called from outside of dfs component.
187  */
188 QDF_STATUS ucfg_dfs_getnol(struct wlan_objmgr_pdev *pdev, void *dfs_nolinfo);
189 
190 /**
191  * ucfg_dfs_override_cac_timeout() -  Override the default CAC timeout.
192  * @pdev: Pointer to DFS pdev object.
193  * @cac_timeout: CAC timeout value.
194  *
195  * Wrapper function for dfs_override_cac_timeout().
196  * This function called from outside of dfs component.
197  */
198 QDF_STATUS ucfg_dfs_override_cac_timeout(struct wlan_objmgr_pdev *pdev,
199 		int cac_timeout, int *status);
200 
201 /**
202  * ucfg_dfs_get_override_cac_timeout() -  Get override CAC timeout value.
203  * @pdev: Pointer to DFS pdev object.
204  * @cac_timeout: Pointer to save the CAC timeout value.
205  *
206  * Wrapper function for dfs_get_override_cac_timeout().
207  * This function called from outside of dfs component.
208  */
209 QDF_STATUS ucfg_dfs_get_override_cac_timeout(struct wlan_objmgr_pdev *pdev,
210 		int *cac_timeout, int *status);
211 
212 /**
213  * ucfg_dfs_get_override_precac_timeout() - Get precac timeout.
214  * @pdev: Pointer to DFS pdev object.
215  * @precac_timeout: Get precac timeout value in this variable.
216  *
217  * Wrapper function for dfs_get_override_precac_timeout().
218  * This function called from outside of dfs component.
219  */
220 QDF_STATUS ucfg_dfs_get_override_precac_timeout(struct wlan_objmgr_pdev *pdev,
221 		int *precac_timeout);
222 
223 /**
224  * ucfg_dfs_override_precac_timeout() - Override the default precac timeout.
225  * @pdev: Pointer to DFS pdev object.
226  * @precac_timeout: Precac timeout value.
227  *
228  * Wrapper function for dfs_override_precac_timeout().
229  * This function called from outside of dfs component.
230  */
231 QDF_STATUS ucfg_dfs_override_precac_timeout(struct wlan_objmgr_pdev *pdev,
232 		int precac_timeout);
233 
234 /**
235  * ucfg_dfs_set_precac_enable() - Set precac enable flag.
236  * @pdev: Pointer to DFS pdev object.
237  * @value: input value for dfs_precac_enable flag.
238  *
239  * Wrapper function for dfs_set_precac_enable().
240  * This function called from outside of dfs component.
241  */
242 QDF_STATUS ucfg_dfs_set_precac_enable(struct wlan_objmgr_pdev *pdev,
243 				      uint32_t value);
244 
245 /**
246  * ucfg_dfs_get_precac_enable() - Get precac enable flag.
247  * @pdev: Pointer to DFS pdev object.
248  * @buff: Pointer to save precac_enable value.
249  *
250  * Wrapper function for dfs_get_precac_enable().
251  * This function called from outside of dfs component.
252  */
253 QDF_STATUS ucfg_dfs_get_precac_enable(struct wlan_objmgr_pdev *pdev, int *buff);
254 
255 #ifdef WLAN_DFS_PRECAC_AUTO_CHAN_SUPPORT
256 /**
257  * ucfg_dfs_set_precac_intermediate_chan() - Set intermediate channel
258  *                                           for preCAC.
259  * @pdev: Pointer to DFS pdev object.
260  * @value: Channel number of intermediate channel
261  *
262  * Wrapper function for dfs_set_precac_intermediate_chan().
263  * This function is called from outside of dfs component.
264  *
265  * Return:
266  * * QDF_STATUS_SUCCESS  : Successfully set intermediate channel.
267  * * QDF_STATUS_E_FAILURE: Failed to set intermediate channel.
268  */
269 QDF_STATUS ucfg_dfs_set_precac_intermediate_chan(struct wlan_objmgr_pdev *pdev,
270 						 uint32_t value);
271 
272 /**
273  * ucfg_dfs_get_precac_intermediate_chan() - Get intermediate channel
274  *						for preCAC.
275  * @pdev: Pointer to DFS pdev object.
276  * @buff: Pointer to Channel number of intermediate channel.
277  *
278  * Wrapper function for dfs_get_precac_intermediate_chan().
279  * This function is called from outside of dfs component.
280  *
281  * Return: Configured intermediate precac channel.
282  */
283 QDF_STATUS ucfg_dfs_get_precac_intermediate_chan(struct wlan_objmgr_pdev *pdev,
284 						 int *buff);
285 
286 /**
287  * ucfg_dfs_get_precac_chan_state() - Get precac status for the given channel.
288  * @pdev: Pointer to DFS pdev object.
289  * @precac_chan: Channel number for which precac state needs to be determined.
290  *
291  * Wrapper function for dfs_get_precac_chan_state().
292  * This function called from outside of dfs component.
293  *
294  * Return: Precac state of the given channel.
295  */
296 enum precac_chan_state
297 ucfg_dfs_get_precac_chan_state(struct wlan_objmgr_pdev *pdev,
298 			       uint8_t precac_chan);
299 #endif
300 
301 #ifdef QCA_MCL_DFS_SUPPORT
302 /**
303  * ucfg_dfs_update_config() - Update DFS user config.
304  * @psoc: Pointer to psoc.
305  * @req: DFS user config.
306  *
307  * Return: QDF_STATUS
308  */
309 QDF_STATUS ucfg_dfs_update_config(struct wlan_objmgr_psoc *psoc,
310 		struct dfs_user_config *req);
311 #else
312 static inline QDF_STATUS ucfg_dfs_update_config(struct wlan_objmgr_psoc *psoc,
313 		struct dfs_user_config *req)
314 {
315 	return QDF_STATUS_SUCCESS;
316 }
317 #endif
318 
319 /**
320  * ucfg_dfs_set_override_status_timeout() - override the value of host dfs
321  * status wait timeout.
322  * @pdev: Pointer to DFS pdev object.
323  * @status_timeout: timeout value.
324  *
325  * Wrapper function for dfs_set_override_status_timeout().
326  * This function called from outside of dfs component.
327  *
328  * Return: QDF_STATUS
329  */
330 #if defined(WLAN_DFS_PARTIAL_OFFLOAD) && defined(HOST_DFS_SPOOF_TEST)
331 QDF_STATUS ucfg_dfs_set_override_status_timeout(struct wlan_objmgr_pdev *pdev,
332 					    int status_timeout);
333 #else
334 static inline
335 QDF_STATUS ucfg_dfs_set_override_status_timeout(struct wlan_objmgr_pdev *pdev,
336 					    int status_timeout)
337 {
338 	return QDF_STATUS_SUCCESS;
339 }
340 #endif
341 
342 /**
343  * ucfg_dfs_get_override_status_timeout() - Get the value of host dfs status
344  * wait timeout.
345  * @pdev: Pointer to DFS pdev object.
346  * @status_timeout: Pointer to save the timeout value.
347  *
348  * Wrapper function for dfs_get_override_status_timeout().
349  * This function called from outside of dfs component.
350  *
351  * Return: QDF_STATUS
352  */
353 #if defined(WLAN_DFS_PARTIAL_OFFLOAD) && defined(HOST_DFS_SPOOF_TEST)
354 QDF_STATUS ucfg_dfs_get_override_status_timeout(struct wlan_objmgr_pdev *pdev,
355 						int *status_timeout);
356 #else
357 static inline
358 QDF_STATUS ucfg_dfs_get_override_status_timeout(struct wlan_objmgr_pdev *pdev,
359 						int *status_timeout)
360 {
361 	return QDF_STATUS_SUCCESS;
362 }
363 #endif
364 
365 /**
366  * ucfg_dfs_set_nol_subchannel_marking() - Set or unset NOL subchannel marking.
367  * @pdev: Pointer to DFS pdev object.
368  * @nol_subchannel_marking: Set NOL subchannel marking based on this value.
369  *
370  * Wrapper function for dfs_set_nol_subchannel_marking().
371  * This function is called from outside of dfs component.
372  *
373  * Return: QDF_STATUS
374  */
375 QDF_STATUS ucfg_dfs_set_nol_subchannel_marking(struct wlan_objmgr_pdev *pdev,
376 					       bool nol_subchannel_marking);
377 
378 /**
379  * ucfg_dfs_get_nol_subchannel_marking() - Get the value of NOL subchannel
380  * marking.
381  * @pdev: Pointer to DFS pdev object.
382  * @nol_subchannel_marking: Store the value of  NOL subchannel marking.
383  *
384  * Wrapper function for dfs_get_nol_subchannel_marking().
385  * This function is called from outside of dfs component.
386  *
387  * Return: QDF_STATUS
388  */
389 QDF_STATUS ucfg_dfs_get_nol_subchannel_marking(struct wlan_objmgr_pdev *pdev,
390 					       bool *nol_subchannel_marking);
391 #endif /* _WLAN_DFS_UCFG_API_H_ */
392