xref: /wlan-dirver/qca-wifi-host-cmn/umac/wifi_pos/src/wifi_pos_api.c (revision 503663c6daafffe652fa360bde17243568cd6d2a)
1 /*
2  * Copyright (c) 2017-2019 The Linux Foundation. All rights reserved.
3  *
4  * Permission to use, copy, modify, and/or distribute this software for
5  * any purpose with or without fee is hereby granted, provided that the
6  * above copyright notice and this permission notice appear in all
7  * copies.
8  *
9  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
10  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
11  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
12  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
13  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
14  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
15  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
16  * PERFORMANCE OF THIS SOFTWARE.
17  */
18 /**
19  * DOC: wifi_pos_api.c
20  * This file defines the APIs wifi_pos component.
21  */
22 
23 #include "wifi_pos_api.h"
24 #include "wifi_pos_utils_i.h"
25 #include "wifi_pos_main_i.h"
26 #include "os_if_wifi_pos.h"
27 #include "target_if_wifi_pos.h"
28 #include "wlan_objmgr_cmn.h"
29 #include "wlan_objmgr_global_obj.h"
30 #include "wlan_objmgr_psoc_obj.h"
31 
32 QDF_STATUS wifi_pos_init(void)
33 {
34 	QDF_STATUS status;
35 
36 	wifi_pos_lock_init();
37 
38 	/* register psoc create handler functions. */
39 	status = wlan_objmgr_register_psoc_create_handler(
40 		WLAN_UMAC_COMP_WIFI_POS,
41 		wifi_pos_psoc_obj_created_notification,
42 		NULL);
43 	if (QDF_IS_STATUS_ERROR(status)) {
44 		wifi_pos_err("register_psoc_create_handler failed, status: %d",
45 			     status);
46 		return status;
47 	}
48 
49 	/* register psoc delete handler functions. */
50 	status = wlan_objmgr_register_psoc_destroy_handler(
51 		WLAN_UMAC_COMP_WIFI_POS,
52 		wifi_pos_psoc_obj_destroyed_notification,
53 		NULL);
54 	if (QDF_IS_STATUS_ERROR(status)) {
55 		wifi_pos_err("register_psoc_destroy_handler failed, status: %d",
56 			     status);
57 	}
58 
59 	return status;
60 }
61 
62 QDF_STATUS wifi_pos_deinit(void)
63 {
64 	QDF_STATUS status;
65 
66 	/* deregister psoc create handler functions. */
67 	status = wlan_objmgr_unregister_psoc_create_handler(
68 				WLAN_UMAC_COMP_WIFI_POS,
69 				wifi_pos_psoc_obj_created_notification,
70 				NULL);
71 	if (QDF_IS_STATUS_ERROR(status)) {
72 		wifi_pos_err("unregister_psoc_create_handler failed, status: %d",
73 			     status);
74 		return status;
75 	}
76 
77 	/* deregister psoc delete handler functions. */
78 	status = wlan_objmgr_unregister_psoc_destroy_handler(
79 				WLAN_UMAC_COMP_WIFI_POS,
80 				wifi_pos_psoc_obj_destroyed_notification,
81 				NULL);
82 	if (QDF_IS_STATUS_ERROR(status)) {
83 		wifi_pos_err("unregister_psoc_destroy_handler failed, status: %d",
84 			     status);
85 	}
86 
87 	wifi_pos_lock_deinit();
88 
89 	return QDF_STATUS_SUCCESS;
90 }
91 
92 QDF_STATUS wifi_pos_psoc_enable(struct wlan_objmgr_psoc *psoc)
93 {
94 	QDF_STATUS status;
95 	struct wlan_lmac_if_wifi_pos_tx_ops *tx_ops;
96 
97 	tx_ops = wifi_pos_get_tx_ops(psoc);
98 	if (!tx_ops) {
99 		wifi_pos_err("tx_ops is null");
100 		return QDF_STATUS_E_NULL_VALUE;
101 	}
102 
103 	status = tx_ops->wifi_pos_register_events(psoc);
104 
105 	if (QDF_IS_STATUS_ERROR(status))
106 		wifi_pos_err("target_if_wifi_pos_register_events failed");
107 
108 	return status;
109 }
110 
111 QDF_STATUS wifi_pos_psoc_disable(struct wlan_objmgr_psoc *psoc)
112 {
113 	QDF_STATUS status;
114 	struct wlan_lmac_if_wifi_pos_tx_ops *tx_ops;
115 
116 	tx_ops = wifi_pos_get_tx_ops(psoc);
117 	if (!tx_ops) {
118 		wifi_pos_err("tx_ops is null");
119 		return QDF_STATUS_E_NULL_VALUE;
120 	}
121 
122 	status = tx_ops->wifi_pos_deregister_events(psoc);
123 
124 	if (QDF_IS_STATUS_ERROR(status))
125 		wifi_pos_err("target_if_wifi_pos_deregister_events failed");
126 
127 	return QDF_STATUS_SUCCESS;
128 }
129 
130 void wifi_pos_set_oem_target_type(struct wlan_objmgr_psoc *psoc, uint32_t val)
131 {
132 	struct wifi_pos_psoc_priv_obj *wifi_pos_psoc =
133 			wifi_pos_get_psoc_priv_obj(psoc);
134 
135 	if (!wifi_pos_psoc) {
136 		wifi_pos_err("wifi_pos priv obj is null");
137 		return;
138 	}
139 
140 	qdf_spin_lock_bh(&wifi_pos_psoc->wifi_pos_lock);
141 	wifi_pos_psoc->oem_target_type = val;
142 	qdf_spin_unlock_bh(&wifi_pos_psoc->wifi_pos_lock);
143 }
144 
145 void wifi_pos_set_oem_fw_version(struct wlan_objmgr_psoc *psoc, uint32_t val)
146 {
147 	struct wifi_pos_psoc_priv_obj *wifi_pos_psoc =
148 			wifi_pos_get_psoc_priv_obj(psoc);
149 
150 	if (!wifi_pos_psoc) {
151 		wifi_pos_err("wifi_pos priv obj is null");
152 		return;
153 	}
154 
155 	qdf_spin_lock_bh(&wifi_pos_psoc->wifi_pos_lock);
156 	wifi_pos_psoc->oem_fw_version = val;
157 	qdf_spin_unlock_bh(&wifi_pos_psoc->wifi_pos_lock);
158 }
159 
160 void wifi_pos_set_drv_ver_major(struct wlan_objmgr_psoc *psoc, uint8_t val)
161 {
162 	struct wifi_pos_psoc_priv_obj *wifi_pos_psoc =
163 			wifi_pos_get_psoc_priv_obj(psoc);
164 
165 	if (!wifi_pos_psoc) {
166 		wifi_pos_err("wifi_pos priv obj is null");
167 		return;
168 	}
169 
170 	qdf_spin_lock_bh(&wifi_pos_psoc->wifi_pos_lock);
171 	wifi_pos_psoc->driver_version.major = val;
172 	qdf_spin_unlock_bh(&wifi_pos_psoc->wifi_pos_lock);
173 }
174 
175 void wifi_pos_set_drv_ver_minor(struct wlan_objmgr_psoc *psoc, uint8_t val)
176 {
177 	struct wifi_pos_psoc_priv_obj *wifi_pos_psoc =
178 			wifi_pos_get_psoc_priv_obj(psoc);
179 
180 	if (!wifi_pos_psoc) {
181 		wifi_pos_err("wifi_pos priv obj is null");
182 		return;
183 	}
184 
185 	qdf_spin_lock_bh(&wifi_pos_psoc->wifi_pos_lock);
186 	wifi_pos_psoc->driver_version.minor = val;
187 	qdf_spin_unlock_bh(&wifi_pos_psoc->wifi_pos_lock);
188 }
189 
190 void wifi_pos_set_drv_ver_patch(struct wlan_objmgr_psoc *psoc, uint8_t val)
191 {
192 	struct wifi_pos_psoc_priv_obj *wifi_pos_psoc =
193 			wifi_pos_get_psoc_priv_obj(psoc);
194 
195 	if (!wifi_pos_psoc) {
196 		wifi_pos_err("wifi_pos priv obj is null");
197 		return;
198 	}
199 
200 	qdf_spin_lock_bh(&wifi_pos_psoc->wifi_pos_lock);
201 	wifi_pos_psoc->driver_version.patch = val;
202 	qdf_spin_unlock_bh(&wifi_pos_psoc->wifi_pos_lock);
203 }
204 
205 void wifi_pos_set_drv_ver_build(struct wlan_objmgr_psoc *psoc, uint8_t val)
206 {
207 	struct wifi_pos_psoc_priv_obj *wifi_pos_psoc =
208 			wifi_pos_get_psoc_priv_obj(psoc);
209 
210 	if (!wifi_pos_psoc) {
211 		wifi_pos_err("wifi_pos priv obj is null");
212 		return;
213 	}
214 
215 	qdf_spin_lock_bh(&wifi_pos_psoc->wifi_pos_lock);
216 	wifi_pos_psoc->driver_version.build = val;
217 	qdf_spin_unlock_bh(&wifi_pos_psoc->wifi_pos_lock);
218 }
219 
220 void wifi_pos_set_dwell_time_min(struct wlan_objmgr_psoc *psoc, uint16_t val)
221 {
222 	struct wifi_pos_psoc_priv_obj *wifi_pos_psoc =
223 			wifi_pos_get_psoc_priv_obj(psoc);
224 
225 	if (!wifi_pos_psoc) {
226 		wifi_pos_err("wifi_pos priv obj is null");
227 		return;
228 	}
229 
230 	qdf_spin_lock_bh(&wifi_pos_psoc->wifi_pos_lock);
231 	wifi_pos_psoc->allowed_dwell_time_min = val;
232 	qdf_spin_unlock_bh(&wifi_pos_psoc->wifi_pos_lock);
233 }
234 void wifi_pos_set_dwell_time_max(struct wlan_objmgr_psoc *psoc, uint16_t val)
235 {
236 	struct wifi_pos_psoc_priv_obj *wifi_pos_psoc =
237 			wifi_pos_get_psoc_priv_obj(psoc);
238 
239 	if (!wifi_pos_psoc) {
240 		wifi_pos_err("wifi_pos priv obj is null");
241 		return;
242 	}
243 
244 	qdf_spin_lock_bh(&wifi_pos_psoc->wifi_pos_lock);
245 	wifi_pos_psoc->allowed_dwell_time_max = val;
246 	qdf_spin_unlock_bh(&wifi_pos_psoc->wifi_pos_lock);
247 }
248 
249 void wifi_pos_set_current_dwell_time_max(struct wlan_objmgr_psoc *psoc,
250 					 uint16_t val)
251 {
252 	struct wifi_pos_psoc_priv_obj *wifi_pos_psoc =
253 			wifi_pos_get_psoc_priv_obj(psoc);
254 
255 	if (!wifi_pos_psoc) {
256 		wifi_pos_err("wifi_pos priv obj is null");
257 		return;
258 	}
259 
260 	qdf_spin_lock_bh(&wifi_pos_psoc->wifi_pos_lock);
261 	wifi_pos_psoc->current_dwell_time_max = val;
262 	qdf_spin_unlock_bh(&wifi_pos_psoc->wifi_pos_lock);
263 }
264 
265 void wifi_pos_set_current_dwell_time_min(struct wlan_objmgr_psoc *psoc,
266 					 uint16_t val)
267 {
268 	struct wifi_pos_psoc_priv_obj *wifi_pos_psoc =
269 			wifi_pos_get_psoc_priv_obj(psoc);
270 
271 	if (!wifi_pos_psoc) {
272 		wifi_pos_err("wifi_pos priv obj is null");
273 		return;
274 	}
275 
276 	qdf_spin_lock_bh(&wifi_pos_psoc->wifi_pos_lock);
277 	wifi_pos_psoc->current_dwell_time_max = val;
278 	qdf_spin_unlock_bh(&wifi_pos_psoc->wifi_pos_lock);
279 }
280 
281 uint32_t wifi_pos_get_app_pid(struct wlan_objmgr_psoc *psoc)
282 {
283 	uint32_t app_pid;
284 	struct wifi_pos_psoc_priv_obj *wifi_pos_psoc =
285 				wifi_pos_get_psoc_priv_obj(psoc);
286 
287 	if (!wifi_pos_psoc) {
288 		wifi_pos_err("wifi_pos priv obj is null");
289 		return 0;
290 	}
291 
292 	qdf_spin_lock_bh(&wifi_pos_psoc->wifi_pos_lock);
293 	app_pid = wifi_pos_psoc->app_pid;
294 	qdf_spin_unlock_bh(&wifi_pos_psoc->wifi_pos_lock);
295 
296 	return app_pid;
297 
298 }
299 
300 bool wifi_pos_is_app_registered(struct wlan_objmgr_psoc *psoc)
301 {
302 	bool is_app_registered;
303 	struct wifi_pos_psoc_priv_obj *wifi_pos_psoc =
304 				wifi_pos_get_psoc_priv_obj(psoc);
305 
306 	if (!wifi_pos_psoc) {
307 		wifi_pos_err("wifi_pos priv obj is null");
308 		return false;
309 	}
310 
311 	qdf_spin_lock_bh(&wifi_pos_psoc->wifi_pos_lock);
312 	is_app_registered = wifi_pos_psoc->is_app_registered;
313 	qdf_spin_unlock_bh(&wifi_pos_psoc->wifi_pos_lock);
314 
315 	return is_app_registered;
316 }
317 
318 #ifdef WLAN_FEATURE_CIF_CFR
319 QDF_STATUS wifi_pos_init_cir_cfr_rings(struct wlan_objmgr_psoc *psoc,
320 				   void *hal_soc, uint8_t num_mac, void *buf)
321 {
322 	return target_if_wifi_pos_init_cir_cfr_rings(psoc, hal_soc,
323 						     num_mac, buf);
324 }
325 #endif
326 
327 QDF_STATUS wifi_pos_register_get_phy_mode_cb(
328 				struct wlan_objmgr_psoc *psoc,
329 				void (*handler)(uint8_t, uint32_t, uint32_t *))
330 {
331 	struct wifi_pos_psoc_priv_obj *wifi_pos_psoc;
332 
333 	if (!psoc) {
334 		wifi_pos_err("psoc is null");
335 		return QDF_STATUS_E_NULL_VALUE;
336 	}
337 
338 	if (!handler) {
339 		wifi_pos_err("Null callback");
340 		return QDF_STATUS_E_NULL_VALUE;
341 	}
342 	wifi_pos_psoc = wifi_pos_get_psoc_priv_obj(psoc);
343 	if (!wifi_pos_psoc) {
344 		wifi_pos_err("wifi_pos priv obj is null");
345 		return QDF_STATUS_E_NULL_VALUE;
346 	}
347 
348 	wifi_pos_psoc->wifi_pos_get_phy_mode = handler;
349 
350 	return QDF_STATUS_SUCCESS;
351 }
352 
353 QDF_STATUS wifi_pos_register_send_action(
354 				struct wlan_objmgr_psoc *psoc,
355 				void (*handler)(struct wlan_objmgr_psoc *psoc,
356 						uint32_t sub_type,
357 						uint8_t *buf,
358 						uint32_t buf_len))
359 {
360 	struct wifi_pos_psoc_priv_obj *wifi_pos_psoc;
361 
362 	if (!psoc) {
363 		wifi_pos_err("psoc is null");
364 		return QDF_STATUS_E_NULL_VALUE;
365 	}
366 
367 	if (!handler) {
368 		wifi_pos_err("Null callback");
369 		return QDF_STATUS_E_NULL_VALUE;
370 	}
371 	wifi_pos_psoc = wifi_pos_get_psoc_priv_obj(psoc);
372 	if (!wifi_pos_psoc) {
373 		wifi_pos_err("wifi_pos priv obj is null");
374 		return QDF_STATUS_E_NULL_VALUE;
375 	}
376 
377 	wifi_pos_psoc->wifi_pos_send_action = handler;
378 
379 	return QDF_STATUS_SUCCESS;
380 }
381