xref: /wlan-dirver/qca-wifi-host-cmn/umac/wifi_pos/src/wifi_pos_api.c (revision 0626a4da6c07f30da06dd6747e8cc290a60371d8)
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 	qdf_spin_lock_bh(&wifi_pos_psoc->wifi_pos_lock);
118 	wifi_pos_psoc->oem_target_type = val;
119 	qdf_spin_unlock_bh(&wifi_pos_psoc->wifi_pos_lock);
120 }
121 
122 void wifi_pos_set_oem_fw_version(struct wlan_objmgr_psoc *psoc, uint32_t val)
123 {
124 	struct wifi_pos_psoc_priv_obj *wifi_pos_psoc =
125 			wifi_pos_get_psoc_priv_obj(psoc);
126 
127 	qdf_spin_lock_bh(&wifi_pos_psoc->wifi_pos_lock);
128 	wifi_pos_psoc->oem_fw_version = val;
129 	qdf_spin_unlock_bh(&wifi_pos_psoc->wifi_pos_lock);
130 }
131 
132 void wifi_pos_set_drv_ver_major(struct wlan_objmgr_psoc *psoc, uint8_t val)
133 {
134 	struct wifi_pos_psoc_priv_obj *wifi_pos_psoc =
135 			wifi_pos_get_psoc_priv_obj(psoc);
136 
137 	qdf_spin_lock_bh(&wifi_pos_psoc->wifi_pos_lock);
138 	wifi_pos_psoc->driver_version.major = val;
139 	qdf_spin_unlock_bh(&wifi_pos_psoc->wifi_pos_lock);
140 }
141 
142 void wifi_pos_set_drv_ver_minor(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 	qdf_spin_lock_bh(&wifi_pos_psoc->wifi_pos_lock);
148 	wifi_pos_psoc->driver_version.minor = val;
149 	qdf_spin_unlock_bh(&wifi_pos_psoc->wifi_pos_lock);
150 }
151 
152 void wifi_pos_set_drv_ver_patch(struct wlan_objmgr_psoc *psoc, uint8_t val)
153 {
154 	struct wifi_pos_psoc_priv_obj *wifi_pos_psoc =
155 			wifi_pos_get_psoc_priv_obj(psoc);
156 
157 	qdf_spin_lock_bh(&wifi_pos_psoc->wifi_pos_lock);
158 	wifi_pos_psoc->driver_version.patch = val;
159 	qdf_spin_unlock_bh(&wifi_pos_psoc->wifi_pos_lock);
160 }
161 
162 void wifi_pos_set_drv_ver_build(struct wlan_objmgr_psoc *psoc, uint8_t val)
163 {
164 	struct wifi_pos_psoc_priv_obj *wifi_pos_psoc =
165 			wifi_pos_get_psoc_priv_obj(psoc);
166 
167 	qdf_spin_lock_bh(&wifi_pos_psoc->wifi_pos_lock);
168 	wifi_pos_psoc->driver_version.build = val;
169 	qdf_spin_unlock_bh(&wifi_pos_psoc->wifi_pos_lock);
170 }
171 
172 void wifi_pos_set_dwell_time_min(struct wlan_objmgr_psoc *psoc, uint16_t val)
173 {
174 	struct wifi_pos_psoc_priv_obj *wifi_pos_psoc =
175 			wifi_pos_get_psoc_priv_obj(psoc);
176 
177 	qdf_spin_lock_bh(&wifi_pos_psoc->wifi_pos_lock);
178 	wifi_pos_psoc->allowed_dwell_time_min = val;
179 	qdf_spin_unlock_bh(&wifi_pos_psoc->wifi_pos_lock);
180 }
181 void wifi_pos_set_dwell_time_max(struct wlan_objmgr_psoc *psoc, uint16_t val)
182 {
183 	struct wifi_pos_psoc_priv_obj *wifi_pos_psoc =
184 			wifi_pos_get_psoc_priv_obj(psoc);
185 
186 	qdf_spin_lock_bh(&wifi_pos_psoc->wifi_pos_lock);
187 	wifi_pos_psoc->allowed_dwell_time_max = val;
188 	qdf_spin_unlock_bh(&wifi_pos_psoc->wifi_pos_lock);
189 }
190 
191 void wifi_pos_set_current_dwell_time_max(struct wlan_objmgr_psoc *psoc,
192 					 uint16_t val)
193 {
194 	struct wifi_pos_psoc_priv_obj *wifi_pos_psoc =
195 			wifi_pos_get_psoc_priv_obj(psoc);
196 
197 	qdf_spin_lock_bh(&wifi_pos_psoc->wifi_pos_lock);
198 	wifi_pos_psoc->current_dwell_time_max = val;
199 	qdf_spin_unlock_bh(&wifi_pos_psoc->wifi_pos_lock);
200 }
201 
202 void wifi_pos_set_current_dwell_time_min(struct wlan_objmgr_psoc *psoc,
203 					 uint16_t val)
204 {
205 	struct wifi_pos_psoc_priv_obj *wifi_pos_psoc =
206 			wifi_pos_get_psoc_priv_obj(psoc);
207 
208 	qdf_spin_lock_bh(&wifi_pos_psoc->wifi_pos_lock);
209 	wifi_pos_psoc->current_dwell_time_max = val;
210 	qdf_spin_unlock_bh(&wifi_pos_psoc->wifi_pos_lock);
211 }
212 
213 uint32_t wifi_pos_get_app_pid(struct wlan_objmgr_psoc *psoc)
214 {
215 	uint32_t app_pid;
216 	struct wifi_pos_psoc_priv_obj *wifi_pos_psoc =
217 				wifi_pos_get_psoc_priv_obj(psoc);
218 
219 	if (!wifi_pos_psoc) {
220 		wifi_pos_err("wifi_pos priv obj is null");
221 		return 0;
222 	}
223 
224 	qdf_spin_lock_bh(&wifi_pos_psoc->wifi_pos_lock);
225 	app_pid = wifi_pos_psoc->app_pid;
226 	qdf_spin_unlock_bh(&wifi_pos_psoc->wifi_pos_lock);
227 
228 	return app_pid;
229 
230 }
231 
232 bool wifi_pos_is_app_registered(struct wlan_objmgr_psoc *psoc)
233 {
234 	bool is_app_registered;
235 	struct wifi_pos_psoc_priv_obj *wifi_pos_psoc =
236 				wifi_pos_get_psoc_priv_obj(psoc);
237 
238 	if (!wifi_pos_psoc) {
239 		wifi_pos_err("wifi_pos priv obj is null");
240 		return false;
241 	}
242 
243 	qdf_spin_lock_bh(&wifi_pos_psoc->wifi_pos_lock);
244 	is_app_registered = wifi_pos_psoc->is_app_registered;
245 	qdf_spin_unlock_bh(&wifi_pos_psoc->wifi_pos_lock);
246 
247 	return is_app_registered;
248 }
249 
250 #ifdef WLAN_FEATURE_CIF_CFR
251 QDF_STATUS wifi_pos_init_cir_cfr_rings(struct wlan_objmgr_psoc *psoc,
252 				   void *hal_soc, uint8_t num_mac, void *buf)
253 {
254 	return target_if_wifi_pos_init_cir_cfr_rings(psoc, hal_soc,
255 						     num_mac, buf);
256 }
257 #endif
258 
259 QDF_STATUS wifi_pos_register_get_phy_mode_cb(
260 				struct wlan_objmgr_psoc *psoc,
261 				void (*handler)(uint8_t, uint32_t, uint32_t *))
262 {
263 	struct wifi_pos_psoc_priv_obj *wifi_pos_psoc;
264 
265 	if (!psoc) {
266 		wifi_pos_err("psoc is null");
267 		return QDF_STATUS_E_NULL_VALUE;
268 	}
269 
270 	if (!handler) {
271 		wifi_pos_err("Null callback");
272 		return QDF_STATUS_E_NULL_VALUE;
273 	}
274 	wifi_pos_psoc = wifi_pos_get_psoc_priv_obj(psoc);
275 	if (!wifi_pos_psoc) {
276 		wifi_pos_err("wifi_pos priv obj is null");
277 		return QDF_STATUS_E_NULL_VALUE;
278 	}
279 
280 	wifi_pos_psoc->wifi_pos_get_phy_mode = handler;
281 
282 	return QDF_STATUS_SUCCESS;
283 }
284 
285