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