xref: /wlan-dirver/qca-wifi-host-cmn/umac/dfs/dispatcher/src/wlan_dfs_ucfg_api.c (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 implementation which is exposed
22  * to outside of DFS component.
23  */
24 
25 #include "wlan_dfs_ucfg_api.h"
26 #include "wlan_dfs_init_deinit_api.h"
27 #include "../../core/src/dfs.h"
28 #include "../../core/src/dfs_zero_cac.h"
29 #include "../../core/src/dfs_partial_offload_radar.h"
30 #include "../../core/src/dfs_process_radar_found_ind.h"
31 #include <qdf_module.h>
32 
33 QDF_STATUS ucfg_dfs_is_ap_cac_timer_running(struct wlan_objmgr_pdev *pdev,
34 		int *is_ap_cac_timer_running)
35 {
36 	struct wlan_dfs *dfs;
37 
38 	dfs = wlan_pdev_get_dfs_obj(pdev);
39 	if (!dfs)
40 		return  QDF_STATUS_E_FAILURE;
41 
42 	*is_ap_cac_timer_running = dfs_is_ap_cac_timer_running(dfs);
43 
44 	return QDF_STATUS_SUCCESS;
45 }
46 qdf_export_symbol(ucfg_dfs_is_ap_cac_timer_running);
47 
48 QDF_STATUS ucfg_dfs_getnol(struct wlan_objmgr_pdev *pdev,
49 		void *dfs_nolinfo)
50 {
51 	struct wlan_dfs *dfs;
52 
53 	dfs = wlan_pdev_get_dfs_obj(pdev);
54 	if (!dfs)
55 		return  QDF_STATUS_E_FAILURE;
56 
57 	dfs_getnol(dfs, dfs_nolinfo);
58 
59 	return QDF_STATUS_SUCCESS;
60 }
61 qdf_export_symbol(ucfg_dfs_getnol);
62 
63 QDF_STATUS ucfg_dfs_override_cac_timeout(struct wlan_objmgr_pdev *pdev,
64 		int cac_timeout,
65 		int *status)
66 {
67 	struct wlan_dfs *dfs;
68 
69 	dfs = wlan_pdev_get_dfs_obj(pdev);
70 	if (!dfs)
71 		return  QDF_STATUS_E_FAILURE;
72 
73 	*status = dfs_override_cac_timeout(dfs, cac_timeout);
74 
75 	return QDF_STATUS_SUCCESS;
76 }
77 qdf_export_symbol(ucfg_dfs_override_cac_timeout);
78 
79 QDF_STATUS ucfg_dfs_get_override_cac_timeout(struct wlan_objmgr_pdev *pdev,
80 		int *cac_timeout,
81 		int *status)
82 {
83 	struct wlan_dfs *dfs;
84 
85 	dfs = wlan_pdev_get_dfs_obj(pdev);
86 	if (!dfs)
87 		return  QDF_STATUS_E_FAILURE;
88 
89 	*status = dfs_get_override_cac_timeout(dfs, cac_timeout);
90 
91 	return QDF_STATUS_SUCCESS;
92 }
93 qdf_export_symbol(ucfg_dfs_get_override_cac_timeout);
94 
95 QDF_STATUS ucfg_dfs_get_override_precac_timeout(struct wlan_objmgr_pdev *pdev,
96 		int *precac_timeout)
97 {
98 	struct wlan_dfs *dfs;
99 
100 	dfs = wlan_pdev_get_dfs_obj(pdev);
101 	if (!dfs)
102 		return  QDF_STATUS_E_FAILURE;
103 
104 	dfs_get_override_precac_timeout(dfs, precac_timeout);
105 
106 	return QDF_STATUS_SUCCESS;
107 }
108 qdf_export_symbol(ucfg_dfs_get_override_precac_timeout);
109 
110 QDF_STATUS ucfg_dfs_override_precac_timeout(struct wlan_objmgr_pdev *pdev,
111 		int precac_timeout)
112 {
113 	struct wlan_dfs *dfs;
114 
115 	dfs = wlan_pdev_get_dfs_obj(pdev);
116 	if (!dfs)
117 		return  QDF_STATUS_E_FAILURE;
118 
119 	dfs_override_precac_timeout(dfs, precac_timeout);
120 
121 	return QDF_STATUS_SUCCESS;
122 }
123 qdf_export_symbol(ucfg_dfs_override_precac_timeout);
124 
125 QDF_STATUS ucfg_dfs_set_precac_enable(struct wlan_objmgr_pdev *pdev,
126 		uint32_t value)
127 {
128 	struct wlan_dfs *dfs;
129 
130 	dfs = wlan_pdev_get_dfs_obj(pdev);
131 	if (!dfs) {
132 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS,  "null dfs");
133 		return  QDF_STATUS_E_FAILURE;
134 	}
135 
136 	dfs_set_precac_enable(dfs, value);
137 
138 	return QDF_STATUS_SUCCESS;
139 }
140 qdf_export_symbol(ucfg_dfs_set_precac_enable);
141 
142 QDF_STATUS ucfg_dfs_get_precac_enable(struct wlan_objmgr_pdev *pdev,
143 		int *buff)
144 {
145 	struct wlan_dfs *dfs;
146 
147 	if (!tgt_dfs_is_pdev_5ghz(pdev))
148 		return QDF_STATUS_SUCCESS;
149 
150 	dfs = wlan_pdev_get_dfs_obj(pdev);
151 	if (!dfs) {
152 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS,  "null dfs");
153 		return  QDF_STATUS_E_FAILURE;
154 	}
155 
156 	*buff = dfs_get_precac_enable(dfs);
157 
158 	return QDF_STATUS_SUCCESS;
159 }
160 qdf_export_symbol(ucfg_dfs_get_precac_enable);
161 
162 QDF_STATUS
163 ucfg_dfs_set_nol_subchannel_marking(struct wlan_objmgr_pdev *pdev,
164 				    bool nol_subchannel_marking)
165 {
166 	struct wlan_dfs *dfs;
167 
168 	dfs = wlan_pdev_get_dfs_obj(pdev);
169 	if (!dfs)
170 		return  QDF_STATUS_E_FAILURE;
171 
172 	dfs_set_nol_subchannel_marking(dfs, nol_subchannel_marking);
173 
174 	return QDF_STATUS_SUCCESS;
175 }
176 qdf_export_symbol(ucfg_dfs_set_nol_subchannel_marking);
177 
178 QDF_STATUS ucfg_dfs_get_nol_subchannel_marking(struct wlan_objmgr_pdev *pdev,
179 					       bool *nol_subchannel_marking)
180 {
181 	struct wlan_dfs *dfs;
182 
183 	dfs = wlan_pdev_get_dfs_obj(pdev);
184 	if (!dfs)
185 		return  QDF_STATUS_E_FAILURE;
186 
187 	dfs_get_nol_subchannel_marking(dfs, nol_subchannel_marking);
188 
189 	return QDF_STATUS_SUCCESS;
190 }
191 qdf_export_symbol(ucfg_dfs_get_nol_subchannel_marking);
192 #ifdef WLAN_DFS_PRECAC_AUTO_CHAN_SUPPORT
193 QDF_STATUS ucfg_dfs_set_precac_intermediate_chan(struct wlan_objmgr_pdev *pdev,
194 						 uint32_t value)
195 {
196 	struct wlan_dfs *dfs;
197 
198 	dfs = wlan_pdev_get_dfs_obj(pdev);
199 	if (!dfs) {
200 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS,  "null dfs");
201 		return  QDF_STATUS_E_FAILURE;
202 	}
203 
204 	dfs_set_precac_intermediate_chan(dfs, value);
205 
206 	return QDF_STATUS_SUCCESS;
207 }
208 
209 QDF_STATUS ucfg_dfs_get_precac_intermediate_chan(struct wlan_objmgr_pdev *pdev,
210 						 int *buff)
211 {
212 	struct wlan_dfs *dfs;
213 
214 	dfs = wlan_pdev_get_dfs_obj(pdev);
215 	if (!dfs) {
216 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS,  "null dfs");
217 		return  QDF_STATUS_E_FAILURE;
218 	}
219 
220 	*buff = dfs_get_precac_intermediate_chan(dfs);
221 
222 	return QDF_STATUS_SUCCESS;
223 }
224 
225 enum precac_chan_state
226 ucfg_dfs_get_precac_chan_state(struct wlan_objmgr_pdev *pdev,
227 			       uint8_t precac_chan)
228 {
229 	struct wlan_dfs *dfs;
230 	enum precac_chan_state retval = PRECAC_ERR;
231 
232 	dfs = wlan_pdev_get_dfs_obj(pdev);
233 	if (!dfs) {
234 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS,  "null dfs");
235 		return PRECAC_ERR;
236 	}
237 
238 	retval = dfs_get_precac_chan_state(dfs, precac_chan);
239 	if (PRECAC_ERR == retval) {
240 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS,
241 			"Could not find precac channel state");
242 	}
243 
244 	return retval;
245 }
246 #endif
247 
248 #ifdef QCA_MCL_DFS_SUPPORT
249 QDF_STATUS ucfg_dfs_update_config(struct wlan_objmgr_psoc *psoc,
250 		struct dfs_user_config *req)
251 {
252 	struct dfs_soc_priv_obj *soc_obj;
253 
254 	if (!psoc || !req) {
255 		dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS,
256 			"psoc: 0x%pK, req: 0x%pK", psoc, req);
257 		return QDF_STATUS_E_FAILURE;
258 	}
259 
260 	soc_obj = wlan_objmgr_psoc_get_comp_private_obj(psoc,
261 							WLAN_UMAC_COMP_DFS);
262 	if (!soc_obj) {
263 		dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS,
264 			"Failed to get dfs psoc component");
265 		return QDF_STATUS_E_FAILURE;
266 	}
267 
268 	soc_obj->dfs_is_phyerr_filter_offload =
269 			req->dfs_is_phyerr_filter_offload;
270 
271 	return QDF_STATUS_SUCCESS;
272 }
273 qdf_export_symbol(ucfg_dfs_update_config);
274 #endif
275 
276 #if defined(WLAN_DFS_PARTIAL_OFFLOAD) && defined(HOST_DFS_SPOOF_TEST)
277 QDF_STATUS ucfg_dfs_set_override_status_timeout(struct wlan_objmgr_pdev *pdev,
278 					    int status_timeout)
279 {
280 	struct wlan_dfs *dfs;
281 
282 	dfs = wlan_pdev_get_dfs_obj(pdev);
283 	if (!dfs) {
284 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS,  "null dfs");
285 		return  QDF_STATUS_E_FAILURE;
286 	}
287 
288 	dfs_set_override_status_timeout(dfs, status_timeout);
289 
290 	return QDF_STATUS_SUCCESS;
291 }
292 
293 qdf_export_symbol(ucfg_dfs_set_override_status_timeout);
294 
295 QDF_STATUS ucfg_dfs_get_override_status_timeout(struct wlan_objmgr_pdev *pdev,
296 						int *status_timeout)
297 {
298 	struct wlan_dfs *dfs;
299 
300 	dfs = wlan_pdev_get_dfs_obj(pdev);
301 	if (!dfs) {
302 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS,  "null dfs");
303 		return  QDF_STATUS_E_FAILURE;
304 	}
305 
306 	dfs_get_override_status_timeout(dfs, status_timeout);
307 
308 	return QDF_STATUS_SUCCESS;
309 }
310 
311 qdf_export_symbol(ucfg_dfs_get_override_status_timeout);
312 #endif
313