xref: /wlan-dirver/qca-wifi-host-cmn/umac/dfs/dispatcher/src/wlan_dfs_ucfg_api.c (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 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 	dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev);
146 	if (!dfs) {
147 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS,  "null dfs");
148 		return  QDF_STATUS_E_FAILURE;
149 	}
150 
151 	*buff = dfs_get_precac_enable(dfs);
152 
153 	return QDF_STATUS_SUCCESS;
154 }
155 qdf_export_symbol(ucfg_dfs_get_precac_enable);
156 
157 #ifdef WLAN_DFS_PRECAC_AUTO_CHAN_SUPPORT
158 QDF_STATUS ucfg_dfs_set_precac_intermediate_chan(struct wlan_objmgr_pdev *pdev,
159 						 uint32_t value)
160 {
161 	struct wlan_dfs *dfs;
162 
163 	dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev);
164 	if (!dfs) {
165 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS,  "null dfs");
166 		return  QDF_STATUS_E_FAILURE;
167 	}
168 
169 	dfs_set_precac_intermediate_chan(dfs, value);
170 
171 	return QDF_STATUS_SUCCESS;
172 }
173 
174 QDF_STATUS ucfg_dfs_get_precac_intermediate_chan(struct wlan_objmgr_pdev *pdev,
175 						 int *buff)
176 {
177 	struct wlan_dfs *dfs;
178 
179 	dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev);
180 	if (!dfs) {
181 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS,  "null dfs");
182 		return  QDF_STATUS_E_FAILURE;
183 	}
184 
185 	*buff = dfs_get_precac_intermediate_chan(dfs);
186 
187 	return QDF_STATUS_SUCCESS;
188 }
189 
190 enum precac_chan_state
191 ucfg_dfs_get_precac_chan_state(struct wlan_objmgr_pdev *pdev,
192 			       uint8_t precac_chan)
193 {
194 	struct wlan_dfs *dfs;
195 	enum precac_chan_state retval = PRECAC_ERR;
196 
197 	dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev);
198 	if (!dfs) {
199 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS,  "null dfs");
200 		return PRECAC_ERR;
201 	}
202 
203 	retval = dfs_get_precac_chan_state(dfs, precac_chan);
204 	if (PRECAC_ERR == retval) {
205 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS,
206 			"Could not find precac channel state");
207 	}
208 
209 	return retval;
210 }
211 #endif
212 
213 #ifdef QCA_MCL_DFS_SUPPORT
214 QDF_STATUS ucfg_dfs_update_config(struct wlan_objmgr_psoc *psoc,
215 		struct dfs_user_config *req)
216 {
217 	struct dfs_soc_priv_obj *soc_obj;
218 
219 	if (!psoc || !req) {
220 		dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS,
221 			"psoc: 0x%pK, req: 0x%pK", psoc, req);
222 		return QDF_STATUS_E_FAILURE;
223 	}
224 
225 	soc_obj = wlan_objmgr_psoc_get_comp_private_obj(psoc,
226 							WLAN_UMAC_COMP_DFS);
227 	if (!soc_obj) {
228 		dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS,
229 			"Failed to get dfs psoc component");
230 		return QDF_STATUS_E_FAILURE;
231 	}
232 
233 	soc_obj->dfs_is_phyerr_filter_offload =
234 			req->dfs_is_phyerr_filter_offload;
235 
236 	return QDF_STATUS_SUCCESS;
237 }
238 qdf_export_symbol(ucfg_dfs_update_config);
239 #endif
240 
241 #if defined(WLAN_DFS_PARTIAL_OFFLOAD) && defined(HOST_DFS_SPOOF_TEST)
242 QDF_STATUS ucfg_dfs_set_override_status_timeout(struct wlan_objmgr_pdev *pdev,
243 					    int status_timeout)
244 {
245 	struct wlan_dfs *dfs;
246 
247 	dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev);
248 	if (!dfs) {
249 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS,  "null dfs");
250 		return  QDF_STATUS_E_FAILURE;
251 	}
252 
253 	dfs_set_override_status_timeout(dfs, status_timeout);
254 
255 	return QDF_STATUS_SUCCESS;
256 }
257 
258 qdf_export_symbol(ucfg_dfs_set_override_status_timeout);
259 
260 QDF_STATUS ucfg_dfs_get_override_status_timeout(struct wlan_objmgr_pdev *pdev,
261 						int *status_timeout)
262 {
263 	struct wlan_dfs *dfs;
264 
265 	dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev);
266 	if (!dfs) {
267 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS,  "null dfs");
268 		return  QDF_STATUS_E_FAILURE;
269 	}
270 
271 	dfs_get_override_status_timeout(dfs, status_timeout);
272 
273 	return QDF_STATUS_SUCCESS;
274 }
275 
276 qdf_export_symbol(ucfg_dfs_get_override_status_timeout);
277 #endif
278