xref: /wlan-dirver/qca-wifi-host-cmn/umac/wifi_pos/src/wifi_pos_api.c (revision 1397a33f48ea6455be40871470b286e535820eb8)
1 /*
2  * Copyright (c) 2017-2018 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 = target_if_wifi_pos_register_events(psoc);
95 
96 	if (QDF_IS_STATUS_ERROR(status))
97 		wifi_pos_err("target_if_wifi_pos_register_events failed");
98 
99 	return status;
100 }
101 
102 QDF_STATUS wifi_pos_psoc_disable(struct wlan_objmgr_psoc *psoc)
103 {
104 	QDF_STATUS status = target_if_wifi_pos_deregister_events(psoc);
105 
106 	if (QDF_IS_STATUS_ERROR(status))
107 		wifi_pos_err("target_if_wifi_pos_deregister_events failed");
108 
109 	return QDF_STATUS_SUCCESS;
110 }
111 
112 void wifi_pos_set_oem_target_type(struct wlan_objmgr_psoc *psoc, uint32_t val)
113 {
114 	struct wifi_pos_psoc_priv_obj *wifi_pos_psoc =
115 			wifi_pos_get_psoc_priv_obj(psoc);
116 
117 	if (!wifi_pos_psoc) {
118 		wifi_pos_err("wifi_pos priv obj is null");
119 		return;
120 	}
121 
122 	qdf_spin_lock_bh(&wifi_pos_psoc->wifi_pos_lock);
123 	wifi_pos_psoc->oem_target_type = val;
124 	qdf_spin_unlock_bh(&wifi_pos_psoc->wifi_pos_lock);
125 }
126 
127 void wifi_pos_set_oem_fw_version(struct wlan_objmgr_psoc *psoc, uint32_t val)
128 {
129 	struct wifi_pos_psoc_priv_obj *wifi_pos_psoc =
130 			wifi_pos_get_psoc_priv_obj(psoc);
131 
132 	if (!wifi_pos_psoc) {
133 		wifi_pos_err("wifi_pos priv obj is null");
134 		return;
135 	}
136 
137 	qdf_spin_lock_bh(&wifi_pos_psoc->wifi_pos_lock);
138 	wifi_pos_psoc->oem_fw_version = val;
139 	qdf_spin_unlock_bh(&wifi_pos_psoc->wifi_pos_lock);
140 }
141 
142 void wifi_pos_set_drv_ver_major(struct wlan_objmgr_psoc *psoc, uint8_t val)
143 {
144 	struct wifi_pos_psoc_priv_obj *wifi_pos_psoc =
145 			wifi_pos_get_psoc_priv_obj(psoc);
146 
147 	if (!wifi_pos_psoc) {
148 		wifi_pos_err("wifi_pos priv obj is null");
149 		return;
150 	}
151 
152 	qdf_spin_lock_bh(&wifi_pos_psoc->wifi_pos_lock);
153 	wifi_pos_psoc->driver_version.major = val;
154 	qdf_spin_unlock_bh(&wifi_pos_psoc->wifi_pos_lock);
155 }
156 
157 void wifi_pos_set_drv_ver_minor(struct wlan_objmgr_psoc *psoc, uint8_t val)
158 {
159 	struct wifi_pos_psoc_priv_obj *wifi_pos_psoc =
160 			wifi_pos_get_psoc_priv_obj(psoc);
161 
162 	if (!wifi_pos_psoc) {
163 		wifi_pos_err("wifi_pos priv obj is null");
164 		return;
165 	}
166 
167 	qdf_spin_lock_bh(&wifi_pos_psoc->wifi_pos_lock);
168 	wifi_pos_psoc->driver_version.minor = val;
169 	qdf_spin_unlock_bh(&wifi_pos_psoc->wifi_pos_lock);
170 }
171 
172 void wifi_pos_set_drv_ver_patch(struct wlan_objmgr_psoc *psoc, uint8_t val)
173 {
174 	struct wifi_pos_psoc_priv_obj *wifi_pos_psoc =
175 			wifi_pos_get_psoc_priv_obj(psoc);
176 
177 	if (!wifi_pos_psoc) {
178 		wifi_pos_err("wifi_pos priv obj is null");
179 		return;
180 	}
181 
182 	qdf_spin_lock_bh(&wifi_pos_psoc->wifi_pos_lock);
183 	wifi_pos_psoc->driver_version.patch = val;
184 	qdf_spin_unlock_bh(&wifi_pos_psoc->wifi_pos_lock);
185 }
186 
187 void wifi_pos_set_drv_ver_build(struct wlan_objmgr_psoc *psoc, uint8_t val)
188 {
189 	struct wifi_pos_psoc_priv_obj *wifi_pos_psoc =
190 			wifi_pos_get_psoc_priv_obj(psoc);
191 
192 	if (!wifi_pos_psoc) {
193 		wifi_pos_err("wifi_pos priv obj is null");
194 		return;
195 	}
196 
197 	qdf_spin_lock_bh(&wifi_pos_psoc->wifi_pos_lock);
198 	wifi_pos_psoc->driver_version.build = val;
199 	qdf_spin_unlock_bh(&wifi_pos_psoc->wifi_pos_lock);
200 }
201 
202 void wifi_pos_set_dwell_time_min(struct wlan_objmgr_psoc *psoc, uint16_t val)
203 {
204 	struct wifi_pos_psoc_priv_obj *wifi_pos_psoc =
205 			wifi_pos_get_psoc_priv_obj(psoc);
206 
207 	if (!wifi_pos_psoc) {
208 		wifi_pos_err("wifi_pos priv obj is null");
209 		return;
210 	}
211 
212 	qdf_spin_lock_bh(&wifi_pos_psoc->wifi_pos_lock);
213 	wifi_pos_psoc->allowed_dwell_time_min = val;
214 	qdf_spin_unlock_bh(&wifi_pos_psoc->wifi_pos_lock);
215 }
216 void wifi_pos_set_dwell_time_max(struct wlan_objmgr_psoc *psoc, uint16_t val)
217 {
218 	struct wifi_pos_psoc_priv_obj *wifi_pos_psoc =
219 			wifi_pos_get_psoc_priv_obj(psoc);
220 
221 	if (!wifi_pos_psoc) {
222 		wifi_pos_err("wifi_pos priv obj is null");
223 		return;
224 	}
225 
226 	qdf_spin_lock_bh(&wifi_pos_psoc->wifi_pos_lock);
227 	wifi_pos_psoc->allowed_dwell_time_max = val;
228 	qdf_spin_unlock_bh(&wifi_pos_psoc->wifi_pos_lock);
229 }
230 
231 void wifi_pos_set_current_dwell_time_max(struct wlan_objmgr_psoc *psoc,
232 					 uint16_t val)
233 {
234 	struct wifi_pos_psoc_priv_obj *wifi_pos_psoc =
235 			wifi_pos_get_psoc_priv_obj(psoc);
236 
237 	if (!wifi_pos_psoc) {
238 		wifi_pos_err("wifi_pos priv obj is null");
239 		return;
240 	}
241 
242 	qdf_spin_lock_bh(&wifi_pos_psoc->wifi_pos_lock);
243 	wifi_pos_psoc->current_dwell_time_max = val;
244 	qdf_spin_unlock_bh(&wifi_pos_psoc->wifi_pos_lock);
245 }
246 
247 void wifi_pos_set_current_dwell_time_min(struct wlan_objmgr_psoc *psoc,
248 					 uint16_t val)
249 {
250 	struct wifi_pos_psoc_priv_obj *wifi_pos_psoc =
251 			wifi_pos_get_psoc_priv_obj(psoc);
252 
253 	if (!wifi_pos_psoc) {
254 		wifi_pos_err("wifi_pos priv obj is null");
255 		return;
256 	}
257 
258 	qdf_spin_lock_bh(&wifi_pos_psoc->wifi_pos_lock);
259 	wifi_pos_psoc->current_dwell_time_max = val;
260 	qdf_spin_unlock_bh(&wifi_pos_psoc->wifi_pos_lock);
261 }
262 
263 uint32_t wifi_pos_get_app_pid(struct wlan_objmgr_psoc *psoc)
264 {
265 	uint32_t app_pid;
266 	struct wifi_pos_psoc_priv_obj *wifi_pos_psoc =
267 				wifi_pos_get_psoc_priv_obj(psoc);
268 
269 	if (!wifi_pos_psoc) {
270 		wifi_pos_err("wifi_pos priv obj is null");
271 		return 0;
272 	}
273 
274 	qdf_spin_lock_bh(&wifi_pos_psoc->wifi_pos_lock);
275 	app_pid = wifi_pos_psoc->app_pid;
276 	qdf_spin_unlock_bh(&wifi_pos_psoc->wifi_pos_lock);
277 
278 	return app_pid;
279 
280 }
281 
282 bool wifi_pos_is_app_registered(struct wlan_objmgr_psoc *psoc)
283 {
284 	bool is_app_registered;
285 	struct wifi_pos_psoc_priv_obj *wifi_pos_psoc =
286 				wifi_pos_get_psoc_priv_obj(psoc);
287 
288 	if (!wifi_pos_psoc) {
289 		wifi_pos_err("wifi_pos priv obj is null");
290 		return false;
291 	}
292 
293 	qdf_spin_lock_bh(&wifi_pos_psoc->wifi_pos_lock);
294 	is_app_registered = wifi_pos_psoc->is_app_registered;
295 	qdf_spin_unlock_bh(&wifi_pos_psoc->wifi_pos_lock);
296 
297 	return is_app_registered;
298 }
299 
300 #ifdef WLAN_FEATURE_CIF_CFR
301 QDF_STATUS wifi_pos_init_cir_cfr_rings(struct wlan_objmgr_psoc *psoc,
302 				   void *hal_soc, uint8_t num_mac, void *buf)
303 {
304 	return target_if_wifi_pos_init_cir_cfr_rings(psoc, hal_soc,
305 						     num_mac, buf);
306 }
307 #endif
308 
309 QDF_STATUS wifi_pos_register_get_phy_mode_cb(
310 				struct wlan_objmgr_psoc *psoc,
311 				void (*handler)(uint8_t, uint32_t, uint32_t *))
312 {
313 	struct wifi_pos_psoc_priv_obj *wifi_pos_psoc;
314 
315 	if (!psoc) {
316 		wifi_pos_err("psoc is null");
317 		return QDF_STATUS_E_NULL_VALUE;
318 	}
319 
320 	if (!handler) {
321 		wifi_pos_err("Null callback");
322 		return QDF_STATUS_E_NULL_VALUE;
323 	}
324 	wifi_pos_psoc = wifi_pos_get_psoc_priv_obj(psoc);
325 	if (!wifi_pos_psoc) {
326 		wifi_pos_err("wifi_pos priv obj is null");
327 		return QDF_STATUS_E_NULL_VALUE;
328 	}
329 
330 	wifi_pos_psoc->wifi_pos_get_phy_mode = handler;
331 
332 	return QDF_STATUS_SUCCESS;
333 }
334 
335