1 /*
2  * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved.
3  * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
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  * DOC: define internal APIs related to the fwol component
21  */
22 
23 #include "wlan_fw_offload_main.h"
24 #include "wlan_fwol_public_structs.h"
25 #include "wlan_fwol_ucfg_api.h"
26 #include "wlan_fwol_tgt_api.h"
27 #include "target_if_fwol.h"
28 #include "wlan_objmgr_vdev_obj.h"
29 
ucfg_fwol_psoc_open(struct wlan_objmgr_psoc * psoc)30 QDF_STATUS ucfg_fwol_psoc_open(struct wlan_objmgr_psoc *psoc)
31 {
32 	QDF_STATUS status;
33 
34 	status = fwol_cfg_on_psoc_enable(psoc);
35 	if (QDF_IS_STATUS_ERROR(status))
36 		fwol_err("Failed to initialize FWOL CFG");
37 
38 	return status;
39 }
40 
ucfg_fwol_psoc_close(struct wlan_objmgr_psoc * psoc)41 void ucfg_fwol_psoc_close(struct wlan_objmgr_psoc *psoc)
42 {
43 	/* Clear the FWOL CFG Structure */
44 }
45 
ucfg_fwol_psoc_enable(struct wlan_objmgr_psoc * psoc)46 QDF_STATUS ucfg_fwol_psoc_enable(struct wlan_objmgr_psoc *psoc)
47 {
48 	tgt_fwol_register_ev_handler(psoc);
49 
50 	return QDF_STATUS_SUCCESS;
51 }
52 
ucfg_fwol_psoc_disable(struct wlan_objmgr_psoc * psoc)53 void ucfg_fwol_psoc_disable(struct wlan_objmgr_psoc *psoc)
54 {
55 	tgt_fwol_unregister_ev_handler(psoc);
56 }
57 
58 /**
59  * fwol_psoc_object_created_notification(): fwol psoc create handler
60  * @psoc: psoc which is going to created by objmgr
61  * @arg: argument for vdev create handler
62  *
63  * Register this api with objmgr to detect psoc is created
64  *
65  * Return QDF_STATUS status in case of success else return error
66  */
67 static QDF_STATUS
fwol_psoc_object_created_notification(struct wlan_objmgr_psoc * psoc,void * arg)68 fwol_psoc_object_created_notification(struct wlan_objmgr_psoc *psoc, void *arg)
69 {
70 	QDF_STATUS status;
71 	struct wlan_fwol_psoc_obj *fwol_obj;
72 
73 	fwol_obj = qdf_mem_malloc(sizeof(*fwol_obj));
74 	if (!fwol_obj)
75 		return QDF_STATUS_E_NOMEM;
76 
77 	status = wlan_objmgr_psoc_component_obj_attach(psoc,
78 						       WLAN_UMAC_COMP_FWOL,
79 						       fwol_obj,
80 						       QDF_STATUS_SUCCESS);
81 	if (QDF_IS_STATUS_ERROR(status)) {
82 		fwol_err("Failed to attach psoc_ctx with psoc");
83 		qdf_mem_free(fwol_obj);
84 		return status;
85 	}
86 
87 	tgt_fwol_register_rx_ops(&fwol_obj->rx_ops);
88 	target_if_fwol_register_tx_ops(&fwol_obj->tx_ops);
89 
90 	return status;
91 }
92 
93 /**
94  * fwol_psoc_object_destroyed_notification(): fwol psoc delete handler
95  * @psoc: psoc which is going to delete by objmgr
96  * @arg: argument for vdev delete handler
97  *
98  * Register this api with objmgr to detect psoc is deleted
99  *
100  * Return QDF_STATUS status in case of success else return error
101  */
fwol_psoc_object_destroyed_notification(struct wlan_objmgr_psoc * psoc,void * arg)102 static QDF_STATUS fwol_psoc_object_destroyed_notification(
103 		struct wlan_objmgr_psoc *psoc, void *arg)
104 {
105 	struct wlan_fwol_psoc_obj *fwol_obj;
106 	QDF_STATUS status;
107 
108 	fwol_obj = fwol_get_psoc_obj(psoc);
109 	if (!fwol_obj)
110 		return QDF_STATUS_E_NOMEM;
111 
112 	status = wlan_objmgr_psoc_component_obj_detach(psoc,
113 						       WLAN_UMAC_COMP_FWOL,
114 						       fwol_obj);
115 	if (QDF_IS_STATUS_ERROR(status)) {
116 		fwol_err("Failed to detach psoc_ctx from psoc");
117 		return status;
118 	}
119 
120 	qdf_mem_free(fwol_obj);
121 
122 	return status;
123 }
124 
ucfg_fwol_init(void)125 QDF_STATUS ucfg_fwol_init(void)
126 {
127 	QDF_STATUS status;
128 
129 	status = wlan_objmgr_register_psoc_create_handler(
130 			WLAN_UMAC_COMP_FWOL,
131 			fwol_psoc_object_created_notification,
132 			NULL);
133 	if (QDF_IS_STATUS_ERROR(status)) {
134 		fwol_err("unable to register psoc create handle");
135 		return status;
136 	}
137 
138 	status = wlan_objmgr_register_psoc_destroy_handler(
139 			WLAN_UMAC_COMP_FWOL,
140 			fwol_psoc_object_destroyed_notification,
141 			NULL);
142 	if (QDF_IS_STATUS_ERROR(status)) {
143 		fwol_err("unable to register psoc create handle");
144 		wlan_objmgr_unregister_psoc_create_handler(
145 			WLAN_UMAC_COMP_FWOL,
146 			fwol_psoc_object_created_notification,
147 			NULL);
148 	}
149 
150 	return status;
151 }
152 
ucfg_fwol_deinit(void)153 void ucfg_fwol_deinit(void)
154 {
155 	QDF_STATUS status;
156 
157 	status = wlan_objmgr_unregister_psoc_destroy_handler(
158 			WLAN_UMAC_COMP_FWOL,
159 			fwol_psoc_object_destroyed_notification,
160 			NULL);
161 	if (QDF_IS_STATUS_ERROR(status))
162 		fwol_err("unable to unregister psoc destroy handle");
163 
164 	status = wlan_objmgr_unregister_psoc_create_handler(
165 			WLAN_UMAC_COMP_FWOL,
166 			fwol_psoc_object_created_notification,
167 			NULL);
168 	if (QDF_IS_STATUS_ERROR(status))
169 		fwol_err("unable to unregister psoc create handle");
170 }
171 
172 #ifdef FW_THERMAL_THROTTLE_SUPPORT
ucfg_fwol_thermal_register_callbacks(struct wlan_objmgr_psoc * psoc,struct fwol_thermal_callbacks * cb)173 QDF_STATUS ucfg_fwol_thermal_register_callbacks(
174 				struct wlan_objmgr_psoc *psoc,
175 				struct fwol_thermal_callbacks *cb)
176 {
177 	struct wlan_fwol_psoc_obj *fwol_obj;
178 
179 	fwol_obj = fwol_get_psoc_obj(psoc);
180 	if (!fwol_obj) {
181 		fwol_err("Failed to get fwol obj");
182 		return QDF_STATUS_E_FAILURE;
183 	}
184 	fwol_obj->thermal_cbs = *cb;
185 
186 	return QDF_STATUS_SUCCESS;
187 }
188 
ucfg_fwol_thermal_unregister_callbacks(struct wlan_objmgr_psoc * psoc)189 QDF_STATUS ucfg_fwol_thermal_unregister_callbacks(
190 				struct wlan_objmgr_psoc *psoc)
191 {
192 	struct wlan_fwol_psoc_obj *fwol_obj;
193 
194 	fwol_obj = fwol_get_psoc_obj(psoc);
195 	if (!fwol_obj) {
196 		fwol_err("Failed to get fwol obj");
197 		return QDF_STATUS_E_FAILURE;
198 	}
199 	qdf_mem_zero(&fwol_obj->thermal_cbs, sizeof(fwol_obj->thermal_cbs));
200 
201 	return QDF_STATUS_SUCCESS;
202 }
203 
204 QDF_STATUS
ucfg_fwol_thermal_get_target_level(struct wlan_objmgr_psoc * psoc,enum thermal_throttle_level * level)205 ucfg_fwol_thermal_get_target_level(struct wlan_objmgr_psoc *psoc,
206 				   enum thermal_throttle_level *level)
207 {
208 	struct wlan_fwol_psoc_obj *fwol_obj;
209 
210 	fwol_obj = fwol_get_psoc_obj(psoc);
211 	if (!fwol_obj) {
212 		fwol_err("Failed to get fwol obj");
213 		return QDF_STATUS_E_FAILURE;
214 	}
215 	*level = fwol_obj->thermal_throttle.level;
216 
217 	return QDF_STATUS_SUCCESS;
218 }
219 #endif
220 
221 QDF_STATUS
ucfg_fwol_get_coex_config_params(struct wlan_objmgr_psoc * psoc,struct wlan_fwol_coex_config * coex_config)222 ucfg_fwol_get_coex_config_params(struct wlan_objmgr_psoc *psoc,
223 				 struct wlan_fwol_coex_config *coex_config)
224 {
225 	struct wlan_fwol_psoc_obj *fwol_obj;
226 
227 	fwol_obj = fwol_get_psoc_obj(psoc);
228 	if (!fwol_obj) {
229 		fwol_err("Failed to get fwol obj");
230 		return QDF_STATUS_E_FAILURE;
231 	}
232 
233 	*coex_config = fwol_obj->cfg.coex_config;
234 
235 	return QDF_STATUS_SUCCESS;
236 }
237 
238 QDF_STATUS
ucfg_fwol_get_thermal_temp(struct wlan_objmgr_psoc * psoc,struct wlan_fwol_thermal_temp * thermal_info)239 ucfg_fwol_get_thermal_temp(struct wlan_objmgr_psoc *psoc,
240 			   struct wlan_fwol_thermal_temp *thermal_info)
241 {
242 	struct wlan_fwol_psoc_obj *fwol_obj;
243 
244 	fwol_obj = fwol_get_psoc_obj(psoc);
245 	if (!fwol_obj) {
246 		fwol_err("Failed to get fwol obj");
247 		return QDF_STATUS_E_FAILURE;
248 	}
249 
250 	*thermal_info = fwol_obj->cfg.thermal_temp_cfg;
251 
252 	return QDF_STATUS_SUCCESS;
253 }
254 
255 QDF_STATUS
ucfg_fwol_is_neighbor_report_req_supported(struct wlan_objmgr_psoc * psoc,bool * neighbor_report_req)256 ucfg_fwol_is_neighbor_report_req_supported(struct wlan_objmgr_psoc *psoc,
257 					   bool *neighbor_report_req)
258 {
259 	struct wlan_fwol_psoc_obj *fwol_obj;
260 
261 	fwol_obj = fwol_get_psoc_obj(psoc);
262 	if (!fwol_obj) {
263 		fwol_err("Failed to get fwol obj");
264 		*neighbor_report_req =
265 			 !!(cfg_get(psoc,
266 			    CFG_OFFLOAD_11K_ENABLE_BITMASK) &
267 			    OFFLOAD_11K_BITMASK_NEIGHBOR_REPORT_REQUEST);
268 		return QDF_STATUS_E_FAILURE;
269 	}
270 
271 	*neighbor_report_req =
272 		!!(fwol_obj->cfg.neighbor_report_cfg.enable_bitmask &
273 		   OFFLOAD_11K_BITMASK_NEIGHBOR_REPORT_REQUEST);
274 
275 	return QDF_STATUS_SUCCESS;
276 }
277 
278 QDF_STATUS
ucfg_fwol_get_ie_allowlist(struct wlan_objmgr_psoc * psoc,bool * ie_allowlist)279 ucfg_fwol_get_ie_allowlist(struct wlan_objmgr_psoc *psoc, bool *ie_allowlist)
280 {
281 	struct wlan_fwol_psoc_obj *fwol_obj;
282 
283 	fwol_obj = fwol_get_psoc_obj(psoc);
284 	if (!fwol_obj) {
285 		fwol_err("Failed to get fwol obj");
286 		return QDF_STATUS_E_FAILURE;
287 	}
288 
289 	*ie_allowlist = fwol_obj->cfg.ie_allowlist_cfg.ie_allowlist;
290 
291 	return QDF_STATUS_SUCCESS;
292 }
293 
294 QDF_STATUS
ucfg_fwol_set_ie_allowlist(struct wlan_objmgr_psoc * psoc,bool ie_allowlist)295 ucfg_fwol_set_ie_allowlist(struct wlan_objmgr_psoc *psoc, bool ie_allowlist)
296 {
297 	struct wlan_fwol_psoc_obj *fwol_obj;
298 
299 	fwol_obj = fwol_get_psoc_obj(psoc);
300 	if (!fwol_obj) {
301 		fwol_err("Failed to get fwol obj");
302 		return QDF_STATUS_E_FAILURE;
303 	}
304 
305 	fwol_obj->cfg.ie_allowlist_cfg.ie_allowlist = ie_allowlist;
306 
307 	return QDF_STATUS_SUCCESS;
308 }
309 
ucfg_fwol_get_ani_enabled(struct wlan_objmgr_psoc * psoc,bool * ani_enabled)310 QDF_STATUS ucfg_fwol_get_ani_enabled(struct wlan_objmgr_psoc *psoc,
311 				     bool *ani_enabled)
312 {
313 	struct wlan_fwol_psoc_obj *fwol_obj;
314 
315 	fwol_obj = fwol_get_psoc_obj(psoc);
316 	if (!fwol_obj) {
317 		fwol_err("Failed to get FWOL obj");
318 		return QDF_STATUS_E_FAILURE;
319 	}
320 
321 	*ani_enabled = fwol_obj->cfg.ani_enabled;
322 	return QDF_STATUS_SUCCESS;
323 }
324 
ucfg_fwol_get_pcie_config(struct wlan_objmgr_psoc * psoc,uint8_t * pcie_config)325 QDF_STATUS ucfg_fwol_get_pcie_config(struct wlan_objmgr_psoc *psoc,
326 				     uint8_t *pcie_config)
327 {
328 	struct wlan_fwol_psoc_obj *fwol_obj;
329 
330 	fwol_obj = fwol_get_psoc_obj(psoc);
331 	if (!fwol_obj) {
332 		fwol_err("Failed to get FWOL obj");
333 		return QDF_STATUS_E_FAILURE;
334 	}
335 
336 	*pcie_config = fwol_obj->cfg.pcie_config;
337 	return QDF_STATUS_SUCCESS;
338 }
339 
ucfg_fwol_get_ilp_config(struct wlan_objmgr_psoc * psoc,uint32_t * enable_ilp)340 static QDF_STATUS ucfg_fwol_get_ilp_config(struct wlan_objmgr_psoc *psoc,
341 					   uint32_t *enable_ilp)
342 {
343 	struct wlan_fwol_psoc_obj *fwol_obj;
344 
345 	fwol_obj = fwol_get_psoc_obj(psoc);
346 	if (!fwol_obj) {
347 		fwol_err("Failed to get FWOL obj");
348 		return QDF_STATUS_E_FAILURE;
349 	}
350 
351 	*enable_ilp = fwol_obj->cfg.enable_ilp;
352 	return QDF_STATUS_SUCCESS;
353 }
354 
ucfg_fwol_get_sap_sho(struct wlan_objmgr_psoc * psoc,uint32_t * sap_sho)355 static QDF_STATUS ucfg_fwol_get_sap_sho(struct wlan_objmgr_psoc *psoc,
356 					uint32_t *sap_sho)
357 {
358 	struct wlan_fwol_psoc_obj *fwol_obj;
359 
360 	fwol_obj = fwol_get_psoc_obj(psoc);
361 	if (!fwol_obj) {
362 		fwol_err("Failed to get FWOL obj");
363 		return QDF_STATUS_E_FAILURE;
364 	}
365 
366 	*sap_sho = fwol_obj->cfg.sap_sho;
367 	return QDF_STATUS_SUCCESS;
368 }
369 
ucfg_fwol_get_hw_assist_config(struct wlan_objmgr_psoc * psoc,bool * disable_hw_assist)370 static QDF_STATUS ucfg_fwol_get_hw_assist_config(struct wlan_objmgr_psoc *psoc,
371 						 bool *disable_hw_assist)
372 {
373 	struct wlan_fwol_psoc_obj *fwol_obj;
374 
375 	fwol_obj = fwol_get_psoc_obj(psoc);
376 	if (!fwol_obj) {
377 		fwol_err("Failed to get FWOL obj");
378 		return QDF_STATUS_E_FAILURE;
379 	}
380 
381 	*disable_hw_assist = fwol_obj->cfg.disable_hw_assist;
382 	return QDF_STATUS_SUCCESS;
383 }
384 
ucfg_get_enable_rts_sifsbursting(struct wlan_objmgr_psoc * psoc,bool * enable_rts_sifsbursting)385 QDF_STATUS ucfg_get_enable_rts_sifsbursting(struct wlan_objmgr_psoc *psoc,
386 					    bool *enable_rts_sifsbursting)
387 {
388 	struct wlan_fwol_psoc_obj *fwol_obj;
389 
390 	fwol_obj = fwol_get_psoc_obj(psoc);
391 	if (!fwol_obj) {
392 		fwol_err("Failed to get FWOL obj");
393 		return QDF_STATUS_E_FAILURE;
394 	}
395 
396 	*enable_rts_sifsbursting = fwol_obj->cfg.enable_rts_sifsbursting;
397 	return QDF_STATUS_SUCCESS;
398 }
399 
ucfg_get_enable_sifs_burst(struct wlan_objmgr_psoc * psoc,uint8_t * enable_sifs_burst)400 QDF_STATUS ucfg_get_enable_sifs_burst(struct wlan_objmgr_psoc *psoc,
401 				      uint8_t *enable_sifs_burst)
402 {
403 	struct wlan_fwol_psoc_obj *fwol_obj;
404 
405 	fwol_obj = fwol_get_psoc_obj(psoc);
406 	if (!fwol_obj) {
407 		fwol_err("Failed to get FWOL obj");
408 		return QDF_STATUS_E_FAILURE;
409 	}
410 
411 	*enable_sifs_burst = fwol_obj->cfg.enable_sifs_burst;
412 	return QDF_STATUS_SUCCESS;
413 }
414 
ucfg_get_max_mpdus_inampdu(struct wlan_objmgr_psoc * psoc,uint8_t * max_mpdus_inampdu)415 QDF_STATUS ucfg_get_max_mpdus_inampdu(struct wlan_objmgr_psoc *psoc,
416 				      uint8_t *max_mpdus_inampdu)
417 {
418 	struct wlan_fwol_psoc_obj *fwol_obj;
419 
420 	fwol_obj = fwol_get_psoc_obj(psoc);
421 	if (!fwol_obj) {
422 		fwol_err("Failed to get FWOL obj");
423 		return QDF_STATUS_E_FAILURE;
424 	}
425 
426 	*max_mpdus_inampdu = fwol_obj->cfg.max_mpdus_inampdu;
427 	return QDF_STATUS_SUCCESS;
428 }
429 
ucfg_get_enable_phy_reg_retention(struct wlan_objmgr_psoc * psoc,uint8_t * enable_phy_reg_retention)430 QDF_STATUS ucfg_get_enable_phy_reg_retention(struct wlan_objmgr_psoc *psoc,
431 					     uint8_t *enable_phy_reg_retention)
432 {
433 	struct wlan_fwol_psoc_obj *fwol_obj;
434 
435 	fwol_obj = fwol_get_psoc_obj(psoc);
436 	if (!fwol_obj) {
437 		fwol_err("Failed to get FWOL obj");
438 		return QDF_STATUS_E_FAILURE;
439 	}
440 
441 	*enable_phy_reg_retention = fwol_obj->cfg.enable_phy_reg_retention;
442 	return QDF_STATUS_SUCCESS;
443 }
444 
445 QDF_STATUS
ucfg_fwol_get_all_allowlist_params(struct wlan_objmgr_psoc * psoc,struct wlan_fwol_ie_allowlist * allowlist)446 ucfg_fwol_get_all_allowlist_params(struct wlan_objmgr_psoc *psoc,
447 				   struct wlan_fwol_ie_allowlist *allowlist)
448 {
449 	struct wlan_fwol_psoc_obj *fwol_obj;
450 
451 	fwol_obj = fwol_get_psoc_obj(psoc);
452 	if (!fwol_obj) {
453 		fwol_err("Failed to get fwol obj");
454 		return QDF_STATUS_E_FAILURE;
455 	}
456 
457 	*allowlist = fwol_obj->cfg.ie_allowlist_cfg;
458 	return QDF_STATUS_SUCCESS;
459 }
460 
ucfg_get_upper_brssi_thresh(struct wlan_objmgr_psoc * psoc,uint16_t * upper_brssi_thresh)461 QDF_STATUS ucfg_get_upper_brssi_thresh(struct wlan_objmgr_psoc *psoc,
462 				       uint16_t *upper_brssi_thresh)
463 {
464 	struct wlan_fwol_psoc_obj *fwol_obj;
465 
466 	fwol_obj = fwol_get_psoc_obj(psoc);
467 	if (!fwol_obj) {
468 		fwol_err("Failed to get FWOL obj");
469 		return QDF_STATUS_E_FAILURE;
470 	}
471 
472 	*upper_brssi_thresh = fwol_obj->cfg.upper_brssi_thresh;
473 	return QDF_STATUS_SUCCESS;
474 }
475 
ucfg_get_lower_brssi_thresh(struct wlan_objmgr_psoc * psoc,uint16_t * lower_brssi_thresh)476 QDF_STATUS ucfg_get_lower_brssi_thresh(struct wlan_objmgr_psoc *psoc,
477 				       uint16_t *lower_brssi_thresh)
478 {
479 	struct wlan_fwol_psoc_obj *fwol_obj;
480 
481 	fwol_obj = fwol_get_psoc_obj(psoc);
482 	if (!fwol_obj) {
483 		fwol_err("Failed to get FWOL obj");
484 		return QDF_STATUS_E_FAILURE;
485 	}
486 
487 	*lower_brssi_thresh = fwol_obj->cfg.lower_brssi_thresh;
488 	return QDF_STATUS_SUCCESS;
489 }
490 
ucfg_get_enable_dtim_1chrx(struct wlan_objmgr_psoc * psoc,bool * enable_dtim_1chrx)491 QDF_STATUS ucfg_get_enable_dtim_1chrx(struct wlan_objmgr_psoc *psoc,
492 				      bool *enable_dtim_1chrx)
493 {
494 	struct wlan_fwol_psoc_obj *fwol_obj;
495 
496 	fwol_obj = fwol_get_psoc_obj(psoc);
497 	if (!fwol_obj) {
498 		fwol_err("Failed to get FWOL obj");
499 		return QDF_STATUS_E_FAILURE;
500 	}
501 
502 	*enable_dtim_1chrx = fwol_obj->cfg.enable_dtim_1chrx;
503 	return QDF_STATUS_SUCCESS;
504 }
505 
506 QDF_STATUS
ucfg_get_alternative_chainmask_enabled(struct wlan_objmgr_psoc * psoc,bool * alternative_chainmask_enabled)507 ucfg_get_alternative_chainmask_enabled(struct wlan_objmgr_psoc *psoc,
508 				       bool *alternative_chainmask_enabled)
509 {
510 	struct wlan_fwol_psoc_obj *fwol_obj;
511 
512 	fwol_obj = fwol_get_psoc_obj(psoc);
513 	if (!fwol_obj) {
514 		fwol_err("Failed to get fwol obj");
515 		return QDF_STATUS_E_FAILURE;
516 	}
517 
518 	*alternative_chainmask_enabled =
519 				fwol_obj->cfg.alternative_chainmask_enabled;
520 	return QDF_STATUS_SUCCESS;
521 }
522 
ucfg_get_smart_chainmask_enabled(struct wlan_objmgr_psoc * psoc,bool * smart_chainmask_enabled)523 QDF_STATUS ucfg_get_smart_chainmask_enabled(struct wlan_objmgr_psoc *psoc,
524 					    bool *smart_chainmask_enabled)
525 {
526 	struct wlan_fwol_psoc_obj *fwol_obj;
527 
528 	fwol_obj = fwol_get_psoc_obj(psoc);
529 	if (!fwol_obj) {
530 		fwol_err("Failed to get FWOL obj");
531 		return QDF_STATUS_E_FAILURE;
532 	}
533 
534 	*smart_chainmask_enabled =
535 				fwol_obj->cfg.smart_chainmask_enabled;
536 	return QDF_STATUS_SUCCESS;
537 }
538 
ucfg_fwol_get_rts_profile(struct wlan_objmgr_psoc * psoc,uint16_t * get_rts_profile)539 QDF_STATUS ucfg_fwol_get_rts_profile(struct wlan_objmgr_psoc *psoc,
540 				     uint16_t *get_rts_profile)
541 {
542 	struct wlan_fwol_psoc_obj *fwol_obj;
543 
544 	fwol_obj = fwol_get_psoc_obj(psoc);
545 	if (!fwol_obj) {
546 		fwol_err("Failed to get FWOL obj");
547 		return QDF_STATUS_E_FAILURE;
548 	}
549 
550 	*get_rts_profile = fwol_obj->cfg.get_rts_profile;
551 	return QDF_STATUS_SUCCESS;
552 }
553 
ucfg_fwol_get_enable_fw_log_level(struct wlan_objmgr_psoc * psoc,uint16_t * enable_fw_log_level)554 QDF_STATUS ucfg_fwol_get_enable_fw_log_level(struct wlan_objmgr_psoc *psoc,
555 					     uint16_t *enable_fw_log_level)
556 {
557 	struct wlan_fwol_psoc_obj *fwol_obj;
558 
559 	fwol_obj = fwol_get_psoc_obj(psoc);
560 	if (!fwol_obj) {
561 		fwol_err("Failed to get FWOL obj");
562 		return QDF_STATUS_E_FAILURE;
563 	}
564 
565 	*enable_fw_log_level = fwol_obj->cfg.enable_fw_log_level;
566 	return QDF_STATUS_SUCCESS;
567 }
568 
ucfg_fwol_get_enable_fw_log_type(struct wlan_objmgr_psoc * psoc,uint16_t * enable_fw_log_type)569 QDF_STATUS ucfg_fwol_get_enable_fw_log_type(struct wlan_objmgr_psoc *psoc,
570 					    uint16_t *enable_fw_log_type)
571 {
572 	struct wlan_fwol_psoc_obj *fwol_obj;
573 
574 	fwol_obj = fwol_get_psoc_obj(psoc);
575 	if (!fwol_obj) {
576 		fwol_err("Failed to get FWOL obj");
577 		return QDF_STATUS_E_FAILURE;
578 	}
579 
580 	*enable_fw_log_type = fwol_obj->cfg.enable_fw_log_type;
581 	return QDF_STATUS_SUCCESS;
582 }
583 
ucfg_fwol_get_enable_fw_module_log_level(struct wlan_objmgr_psoc * psoc,uint8_t ** enable_fw_module_log_level,uint8_t * enable_fw_module_log_level_num)584 QDF_STATUS ucfg_fwol_get_enable_fw_module_log_level(
585 				struct wlan_objmgr_psoc *psoc,
586 				uint8_t **enable_fw_module_log_level,
587 				uint8_t *enable_fw_module_log_level_num)
588 {
589 	struct wlan_fwol_psoc_obj *fwol_obj;
590 
591 	fwol_obj = fwol_get_psoc_obj(psoc);
592 	if (!fwol_obj) {
593 		fwol_err("Failed to get FWOL obj");
594 		return QDF_STATUS_E_FAILURE;
595 	}
596 
597 	*enable_fw_module_log_level = fwol_obj->cfg.enable_fw_module_log_level;
598 	*enable_fw_module_log_level_num =
599 				fwol_obj->cfg.enable_fw_module_log_level_num;
600 	return QDF_STATUS_SUCCESS;
601 }
602 
ucfg_fwol_wow_get_enable_fw_module_log_level(struct wlan_objmgr_psoc * psoc,uint8_t ** enable_fw_wow_module_log_level,uint8_t * enable_fw_wow_module_log_level_num)603 QDF_STATUS ucfg_fwol_wow_get_enable_fw_module_log_level(
604 				struct wlan_objmgr_psoc *psoc,
605 				uint8_t **enable_fw_wow_module_log_level,
606 				uint8_t *enable_fw_wow_module_log_level_num)
607 {
608 	struct wlan_fwol_psoc_obj *fwol_obj;
609 
610 	fwol_obj = fwol_get_psoc_obj(psoc);
611 	if (!fwol_obj) {
612 		fwol_err("Failed to get FWOL obj");
613 		return QDF_STATUS_E_FAILURE;
614 	}
615 
616 	*enable_fw_wow_module_log_level =
617 				fwol_obj->cfg.enable_fw_mod_wow_log_level;
618 	*enable_fw_wow_module_log_level_num =
619 				fwol_obj->cfg.enable_fw_mod_wow_log_level_num;
620 	return QDF_STATUS_SUCCESS;
621 }
622 
ucfg_fwol_get_sap_xlna_bypass(struct wlan_objmgr_psoc * psoc,bool * sap_xlna_bypass)623 QDF_STATUS ucfg_fwol_get_sap_xlna_bypass(struct wlan_objmgr_psoc *psoc,
624 					 bool *sap_xlna_bypass)
625 {
626 	struct wlan_fwol_psoc_obj *fwol_obj;
627 
628 	fwol_obj = fwol_get_psoc_obj(psoc);
629 	if (!fwol_obj) {
630 		fwol_err("Failed to get FWOL obj");
631 		return QDF_STATUS_E_FAILURE;
632 	}
633 
634 	*sap_xlna_bypass = fwol_obj->cfg.sap_xlna_bypass;
635 	return QDF_STATUS_SUCCESS;
636 }
637 
638 #ifdef FEATURE_WLAN_RA_FILTERING
ucfg_fwol_set_is_rate_limit_enabled(struct wlan_objmgr_psoc * psoc,bool is_rate_limit_enabled)639 QDF_STATUS ucfg_fwol_set_is_rate_limit_enabled(struct wlan_objmgr_psoc *psoc,
640 					       bool is_rate_limit_enabled)
641 {
642 	struct wlan_fwol_psoc_obj *fwol_obj;
643 
644 	fwol_obj = fwol_get_psoc_obj(psoc);
645 	if (!fwol_obj) {
646 		fwol_err("Failed to get FWOL obj");
647 		return QDF_STATUS_E_FAILURE;
648 	}
649 
650 	fwol_obj->cfg.is_rate_limit_enabled = is_rate_limit_enabled;
651 	return QDF_STATUS_SUCCESS;
652 }
653 
ucfg_fwol_get_is_rate_limit_enabled(struct wlan_objmgr_psoc * psoc,bool * is_rate_limit_enabled)654 QDF_STATUS ucfg_fwol_get_is_rate_limit_enabled(struct wlan_objmgr_psoc *psoc,
655 					       bool *is_rate_limit_enabled)
656 {
657 	struct wlan_fwol_psoc_obj *fwol_obj;
658 
659 	fwol_obj = fwol_get_psoc_obj(psoc);
660 	if (!fwol_obj) {
661 		fwol_err("Failed to get FWOL obj");
662 		return QDF_STATUS_E_FAILURE;
663 	}
664 
665 	*is_rate_limit_enabled = fwol_obj->cfg.is_rate_limit_enabled;
666 	return QDF_STATUS_SUCCESS;
667 }
668 #endif
669 
670 #ifdef WLAN_FEATURE_TSF
ucfg_fwol_get_tsf_gpio_pin(struct wlan_objmgr_psoc * psoc,uint32_t * tsf_gpio_pin)671 QDF_STATUS ucfg_fwol_get_tsf_gpio_pin(struct wlan_objmgr_psoc *psoc,
672 				      uint32_t *tsf_gpio_pin)
673 {
674 	struct wlan_fwol_psoc_obj *fwol_obj;
675 
676 	fwol_obj = fwol_get_psoc_obj(psoc);
677 	if (!fwol_obj) {
678 		fwol_err("Failed to get FWOL obj");
679 		*tsf_gpio_pin = cfg_default(CFG_SET_TSF_GPIO_PIN);
680 		return QDF_STATUS_E_FAILURE;
681 	}
682 
683 	*tsf_gpio_pin = fwol_obj->cfg.tsf_gpio_pin;
684 	return QDF_STATUS_SUCCESS;
685 }
686 
687 #ifdef WLAN_FEATURE_TSF_PLUS
ucfg_fwol_get_tsf_ptp_options(struct wlan_objmgr_psoc * psoc,uint32_t * tsf_ptp_options)688 QDF_STATUS ucfg_fwol_get_tsf_ptp_options(struct wlan_objmgr_psoc *psoc,
689 					 uint32_t *tsf_ptp_options)
690 {
691 	struct wlan_fwol_psoc_obj *fwol_obj;
692 
693 	fwol_obj = fwol_get_psoc_obj(psoc);
694 	if (!fwol_obj) {
695 		fwol_err("Failed to get FWOL obj");
696 		*tsf_ptp_options = cfg_default(CFG_SET_TSF_PTP_OPT);
697 		return QDF_STATUS_E_FAILURE;
698 	}
699 
700 	*tsf_ptp_options = fwol_obj->cfg.tsf_ptp_options;
701 	return QDF_STATUS_SUCCESS;
702 }
703 
ucfg_fwol_get_tsf_sync_enable(struct wlan_objmgr_psoc * psoc,bool * tsf_sync_enable)704 QDF_STATUS ucfg_fwol_get_tsf_sync_enable(struct wlan_objmgr_psoc *psoc,
705 					 bool *tsf_sync_enable)
706 {
707 	struct wlan_fwol_psoc_obj *fwol_obj;
708 
709 	fwol_obj = fwol_get_psoc_obj(psoc);
710 	if (!fwol_obj) {
711 		fwol_err("Failed to get FWOL obj");
712 		*tsf_sync_enable = cfg_default(CFG_TSF_SYNC_ENABLE);
713 		return QDF_STATUS_E_FAILURE;
714 	}
715 
716 	*tsf_sync_enable = fwol_obj->cfg.tsf_sync_enable;
717 	return QDF_STATUS_SUCCESS;
718 }
719 
720 #ifdef WLAN_FEATURE_TSF_ACCURACY
ucfg_fwol_get_tsf_accuracy_configs(struct wlan_objmgr_psoc * psoc,struct wlan_fwol_tsf_accuracy_configs ** config)721 QDF_STATUS ucfg_fwol_get_tsf_accuracy_configs(struct wlan_objmgr_psoc *psoc,
722 					      struct wlan_fwol_tsf_accuracy_configs **config)
723 {
724 	struct wlan_fwol_psoc_obj *fwol_obj;
725 
726 	fwol_obj = fwol_get_psoc_obj(psoc);
727 	if (!fwol_obj) {
728 		fwol_err("Failed to get FWOL obj");
729 		return QDF_STATUS_E_FAILURE;
730 	}
731 
732 	*config = &fwol_obj->cfg.tsf_accuracy_configs;
733 	return QDF_STATUS_SUCCESS;
734 }
735 #endif
736 
737 #ifdef WLAN_FEATURE_TSF_PLUS_EXT_GPIO_IRQ
738 QDF_STATUS
ucfg_fwol_get_tsf_irq_host_gpio_pin(struct wlan_objmgr_psoc * psoc,uint32_t * tsf_irq_host_gpio_pin)739 ucfg_fwol_get_tsf_irq_host_gpio_pin(struct wlan_objmgr_psoc *psoc,
740 				    uint32_t *tsf_irq_host_gpio_pin)
741 {
742 	struct wlan_fwol_psoc_obj *fwol_obj;
743 
744 	fwol_obj = fwol_get_psoc_obj(psoc);
745 	if (!fwol_obj) {
746 		fwol_err("Failed to get FWOL obj");
747 		*tsf_irq_host_gpio_pin =
748 			cfg_default(CFG_SET_TSF_IRQ_HOST_GPIO_PIN);
749 		return QDF_STATUS_E_FAILURE;
750 	}
751 
752 	*tsf_irq_host_gpio_pin = fwol_obj->cfg.tsf_irq_host_gpio_pin;
753 	return QDF_STATUS_SUCCESS;
754 }
755 
756 #endif
757 
758 #ifdef WLAN_FEATURE_TSF_PLUS_EXT_GPIO_SYNC
759 QDF_STATUS
ucfg_fwol_get_tsf_sync_host_gpio_pin(struct wlan_objmgr_psoc * psoc,uint32_t * tsf_sync_host_gpio_pin)760 ucfg_fwol_get_tsf_sync_host_gpio_pin(struct wlan_objmgr_psoc *psoc,
761 				     uint32_t *tsf_sync_host_gpio_pin)
762 {
763 	struct wlan_fwol_psoc_obj *fwol_obj;
764 
765 	fwol_obj = fwol_get_psoc_obj(psoc);
766 	if (!fwol_obj) {
767 		fwol_err("Failed to get FWOL obj");
768 		*tsf_sync_host_gpio_pin =
769 			cfg_default(CFG_SET_TSF_SYNC_HOST_GPIO_PIN);
770 		return QDF_STATUS_E_FAILURE;
771 	}
772 
773 	*tsf_sync_host_gpio_pin = fwol_obj->cfg.tsf_sync_host_gpio_pin;
774 	return QDF_STATUS_SUCCESS;
775 }
776 
777 #endif
778 #endif
779 #else
ucfg_fwol_get_tsf_gpio_pin(struct wlan_objmgr_psoc * psoc,uint32_t * tsf_gpio_pin)780 QDF_STATUS ucfg_fwol_get_tsf_gpio_pin(struct wlan_objmgr_psoc *psoc,
781 				      uint32_t *tsf_gpio_pin)
782 {
783 	return QDF_STATUS_SUCCESS;
784 }
785 
ucfg_fwol_get_tsf_ptp_options(struct wlan_objmgr_psoc * psoc,uint32_t * tsf_ptp_options)786 QDF_STATUS ucfg_fwol_get_tsf_ptp_options(struct wlan_objmgr_psoc *psoc,
787 					 uint32_t *tsf_ptp_options)
788 {
789 	return QDF_STATUS_E_NOSUPPORT;
790 }
791 
792 #endif
793 
794 #ifdef WLAN_FEATURE_SAE
ucfg_fwol_get_sae_enable(struct wlan_objmgr_psoc * psoc)795 bool ucfg_fwol_get_sae_enable(struct wlan_objmgr_psoc *psoc)
796 {
797 	return cfg_get(psoc, CFG_IS_SAE_ENABLED);
798 }
799 
800 #else
ucfg_fwol_get_sae_enable(struct wlan_objmgr_psoc * psoc)801 bool ucfg_fwol_get_sae_enable(struct wlan_objmgr_psoc *psoc)
802 {
803 	return false;
804 }
805 #endif
806 
ucfg_fwol_get_gcmp_enable(struct wlan_objmgr_psoc * psoc)807 bool ucfg_fwol_get_gcmp_enable(struct wlan_objmgr_psoc *psoc)
808 {
809 	return cfg_get(psoc, CFG_ENABLE_GCMP);
810 }
811 
ucfg_fwol_get_enable_tx_sch_delay(struct wlan_objmgr_psoc * psoc,uint8_t * enable_tx_sch_delay)812 QDF_STATUS ucfg_fwol_get_enable_tx_sch_delay(struct wlan_objmgr_psoc *psoc,
813 					     uint8_t *enable_tx_sch_delay)
814 {
815 	struct wlan_fwol_psoc_obj *fwol_obj;
816 
817 	fwol_obj = fwol_get_psoc_obj(psoc);
818 	if (!fwol_obj) {
819 		fwol_err("Failed to get FWOL obj");
820 		*enable_tx_sch_delay = cfg_default(CFG_TX_SCH_DELAY);
821 		return QDF_STATUS_E_FAILURE;
822 	}
823 
824 	*enable_tx_sch_delay = fwol_obj->cfg.enable_tx_sch_delay;
825 	return QDF_STATUS_SUCCESS;
826 }
827 
828 #ifdef WLAN_FEATURE_OFDM_SCRAMBLER_SEED
ucfg_fwol_get_ofdm_scrambler_seed(struct wlan_objmgr_psoc * psoc,bool * enable_ofdm_scrambler_seed)829 QDF_STATUS ucfg_fwol_get_ofdm_scrambler_seed(struct wlan_objmgr_psoc *psoc,
830 					     bool *enable_ofdm_scrambler_seed)
831 {
832 	struct wlan_fwol_psoc_obj *fwol_obj;
833 
834 	fwol_obj = fwol_get_psoc_obj(psoc);
835 	if (!fwol_obj) {
836 		*enable_ofdm_scrambler_seed =
837 				cfg_default(CFG_ENABLE_OFDM_SCRAMBLER_SEED);
838 		return QDF_STATUS_E_FAILURE;
839 	}
840 
841 	*enable_ofdm_scrambler_seed =
842 				fwol_obj->cfg.enable_ofdm_scrambler_seed;
843 
844 	return QDF_STATUS_SUCCESS;
845 }
846 #endif
847 
ucfg_fwol_get_enable_secondary_rate(struct wlan_objmgr_psoc * psoc,uint32_t * enable_secondary_rate)848 QDF_STATUS ucfg_fwol_get_enable_secondary_rate(struct wlan_objmgr_psoc *psoc,
849 					       uint32_t *enable_secondary_rate)
850 {
851 	struct wlan_fwol_psoc_obj *fwol_obj;
852 
853 	fwol_obj = fwol_get_psoc_obj(psoc);
854 	if (!fwol_obj) {
855 		fwol_err("Failed to get FWOL obj");
856 		*enable_secondary_rate = cfg_default(CFG_ENABLE_SECONDARY_RATE);
857 		return QDF_STATUS_E_FAILURE;
858 	}
859 
860 	*enable_secondary_rate = fwol_obj->cfg.enable_secondary_rate;
861 	return QDF_STATUS_SUCCESS;
862 }
863 
864 #ifdef DHCP_SERVER_OFFLOAD
865 QDF_STATUS
ucfg_fwol_get_enable_dhcp_server_offload(struct wlan_objmgr_psoc * psoc,bool * enable_dhcp_server_offload)866 ucfg_fwol_get_enable_dhcp_server_offload(struct wlan_objmgr_psoc *psoc,
867 					 bool *enable_dhcp_server_offload)
868 {
869 	struct wlan_fwol_psoc_obj *fwol_obj;
870 
871 	fwol_obj = fwol_get_psoc_obj(psoc);
872 	if (!fwol_obj) {
873 		fwol_err("Failed to get FWOL obj");
874 		return QDF_STATUS_E_FAILURE;
875 	}
876 
877 	*enable_dhcp_server_offload = fwol_obj->cfg.enable_dhcp_server_offload;
878 	return QDF_STATUS_SUCCESS;
879 }
880 
ucfg_fwol_get_dhcp_max_num_clients(struct wlan_objmgr_psoc * psoc,uint32_t * dhcp_max_num_clients)881 QDF_STATUS ucfg_fwol_get_dhcp_max_num_clients(struct wlan_objmgr_psoc *psoc,
882 					      uint32_t *dhcp_max_num_clients)
883 {
884 	struct wlan_fwol_psoc_obj *fwol_obj;
885 
886 	fwol_obj = fwol_get_psoc_obj(psoc);
887 	if (!fwol_obj) {
888 		fwol_err("Failed to get FWOL obj");
889 		return QDF_STATUS_E_FAILURE;
890 	}
891 
892 	*dhcp_max_num_clients = fwol_obj->cfg.dhcp_max_num_clients;
893 	return QDF_STATUS_SUCCESS;
894 }
895 
896 #endif
897 
898 QDF_STATUS
ucfg_fwol_get_all_adaptive_dwelltime_params(struct wlan_objmgr_psoc * psoc,struct adaptive_dwelltime_params * dwelltime_params)899 ucfg_fwol_get_all_adaptive_dwelltime_params(
900 			struct wlan_objmgr_psoc *psoc,
901 			struct adaptive_dwelltime_params *dwelltime_params)
902 {
903 	struct wlan_fwol_psoc_obj *fwol_obj;
904 
905 	fwol_obj = fwol_get_psoc_obj(psoc);
906 	if (!fwol_obj) {
907 		fwol_err("Failed to get fwol obj");
908 		return QDF_STATUS_E_FAILURE;
909 	}
910 
911 	*dwelltime_params = fwol_obj->cfg.dwelltime_params;
912 	return QDF_STATUS_SUCCESS;
913 }
914 
915 QDF_STATUS
ucfg_fwol_get_adaptive_dwell_mode_enabled(struct wlan_objmgr_psoc * psoc,bool * adaptive_dwell_mode_enabled)916 ucfg_fwol_get_adaptive_dwell_mode_enabled(
917 				struct wlan_objmgr_psoc *psoc,
918 				bool *adaptive_dwell_mode_enabled)
919 {
920 	struct wlan_fwol_psoc_obj *fwol_obj;
921 
922 	fwol_obj = fwol_get_psoc_obj(psoc);
923 	if (!fwol_obj) {
924 		fwol_err("Failed to get FWOL obj");
925 		return QDF_STATUS_E_FAILURE;
926 	}
927 
928 	*adaptive_dwell_mode_enabled =
929 			fwol_obj->cfg.dwelltime_params.is_enabled;
930 	return QDF_STATUS_SUCCESS;
931 }
932 
933 QDF_STATUS
ucfg_fwol_get_global_adapt_dwelltime_mode(struct wlan_objmgr_psoc * psoc,uint8_t * global_adapt_dwelltime_mode)934 ucfg_fwol_get_global_adapt_dwelltime_mode(struct wlan_objmgr_psoc *psoc,
935 					  uint8_t *global_adapt_dwelltime_mode)
936 {
937 	struct wlan_fwol_psoc_obj *fwol_obj;
938 
939 	fwol_obj = fwol_get_psoc_obj(psoc);
940 	if (!fwol_obj) {
941 		fwol_err("Failed to get FWOL obj");
942 		return QDF_STATUS_E_FAILURE;
943 	}
944 
945 	*global_adapt_dwelltime_mode =
946 			fwol_obj->cfg.dwelltime_params.dwelltime_mode;
947 	return QDF_STATUS_SUCCESS;
948 }
949 
950 QDF_STATUS
ucfg_fwol_get_adapt_dwell_lpf_weight(struct wlan_objmgr_psoc * psoc,uint8_t * adapt_dwell_lpf_weight)951 ucfg_fwol_get_adapt_dwell_lpf_weight(struct wlan_objmgr_psoc *psoc,
952 				     uint8_t *adapt_dwell_lpf_weight)
953 {
954 	struct wlan_fwol_psoc_obj *fwol_obj;
955 
956 	fwol_obj = fwol_get_psoc_obj(psoc);
957 	if (!fwol_obj) {
958 		fwol_err("Failed to get FWOL obj");
959 		return QDF_STATUS_E_FAILURE;
960 	}
961 
962 	*adapt_dwell_lpf_weight = fwol_obj->cfg.dwelltime_params.lpf_weight;
963 	return QDF_STATUS_SUCCESS;
964 }
965 
ucfg_fwol_get_adapt_dwell_passive_mon_intval(struct wlan_objmgr_psoc * psoc,uint8_t * adapt_dwell_passive_mon_intval)966 QDF_STATUS ucfg_fwol_get_adapt_dwell_passive_mon_intval(
967 				struct wlan_objmgr_psoc *psoc,
968 				uint8_t *adapt_dwell_passive_mon_intval)
969 {
970 	struct wlan_fwol_psoc_obj *fwol_obj;
971 
972 	fwol_obj = fwol_get_psoc_obj(psoc);
973 	if (!fwol_obj) {
974 		fwol_err("Failed to get FWOL obj");
975 		return QDF_STATUS_E_FAILURE;
976 	}
977 
978 	*adapt_dwell_passive_mon_intval =
979 			fwol_obj->cfg.dwelltime_params.passive_mon_intval;
980 	return QDF_STATUS_SUCCESS;
981 }
982 
ucfg_fwol_get_adapt_dwell_wifi_act_threshold(struct wlan_objmgr_psoc * psoc,uint8_t * adapt_dwell_wifi_act_threshold)983 QDF_STATUS ucfg_fwol_get_adapt_dwell_wifi_act_threshold(
984 				struct wlan_objmgr_psoc *psoc,
985 				uint8_t *adapt_dwell_wifi_act_threshold)
986 {
987 	struct wlan_fwol_psoc_obj *fwol_obj;
988 
989 	fwol_obj = fwol_get_psoc_obj(psoc);
990 	if (!fwol_obj) {
991 		fwol_err("Failed to get FWOL obj");
992 		return QDF_STATUS_E_FAILURE;
993 	}
994 
995 	*adapt_dwell_wifi_act_threshold =
996 			fwol_obj->cfg.dwelltime_params.wifi_act_threshold;
997 	return QDF_STATUS_SUCCESS;
998 }
999 
1000 #ifdef WLAN_FEATURE_ELNA
ucfg_fwol_set_elna_bypass(struct wlan_objmgr_vdev * vdev,struct set_elna_bypass_request * req)1001 QDF_STATUS ucfg_fwol_set_elna_bypass(struct wlan_objmgr_vdev *vdev,
1002 				     struct set_elna_bypass_request *req)
1003 {
1004 	QDF_STATUS status;
1005 	struct wlan_objmgr_psoc *psoc;
1006 	struct wlan_fwol_psoc_obj *fwol_obj;
1007 	struct wlan_fwol_tx_ops *tx_ops;
1008 
1009 	psoc = wlan_vdev_get_psoc(vdev);
1010 	if (!psoc) {
1011 		fwol_err("NULL pointer for psoc");
1012 		return QDF_STATUS_E_INVAL;
1013 	}
1014 
1015 	fwol_obj = fwol_get_psoc_obj(psoc);
1016 	if (!fwol_obj) {
1017 		fwol_err("Failed to get FWOL Obj");
1018 		return QDF_STATUS_E_INVAL;
1019 	}
1020 
1021 	tx_ops = &fwol_obj->tx_ops;
1022 	if (tx_ops->set_elna_bypass)
1023 		status = tx_ops->set_elna_bypass(psoc, req);
1024 	else
1025 		status = QDF_STATUS_E_IO;
1026 
1027 	return status;
1028 }
1029 
ucfg_fwol_get_elna_bypass(struct wlan_objmgr_vdev * vdev,struct get_elna_bypass_request * req,void (* callback)(void * context,struct get_elna_bypass_response * response),void * context)1030 QDF_STATUS ucfg_fwol_get_elna_bypass(struct wlan_objmgr_vdev *vdev,
1031 				     struct get_elna_bypass_request *req,
1032 				     void (*callback)(void *context,
1033 				     struct get_elna_bypass_response *response),
1034 				     void *context)
1035 {
1036 	QDF_STATUS status;
1037 	struct wlan_objmgr_psoc *psoc;
1038 	struct wlan_fwol_psoc_obj *fwol_obj;
1039 	struct wlan_fwol_tx_ops *tx_ops;
1040 	struct wlan_fwol_callbacks *cbs;
1041 
1042 	psoc = wlan_vdev_get_psoc(vdev);
1043 	if (!psoc) {
1044 		fwol_err("NULL pointer for psoc");
1045 		return QDF_STATUS_E_INVAL;
1046 	}
1047 
1048 	fwol_obj = fwol_get_psoc_obj(psoc);
1049 	if (!fwol_obj) {
1050 		fwol_err("Failed to get FWOL Obj");
1051 		return QDF_STATUS_E_INVAL;
1052 	}
1053 
1054 	cbs = &fwol_obj->cbs;
1055 	cbs->get_elna_bypass_callback = callback;
1056 	cbs->get_elna_bypass_context = context;
1057 
1058 	tx_ops = &fwol_obj->tx_ops;
1059 	if (tx_ops->get_elna_bypass)
1060 		status = tx_ops->get_elna_bypass(psoc, req);
1061 	else
1062 		status = QDF_STATUS_E_IO;
1063 
1064 	return status;
1065 }
1066 #endif /* WLAN_FEATURE_ELNA */
1067 
1068 #ifdef WLAN_SEND_DSCP_UP_MAP_TO_FW
ucfg_fwol_send_dscp_up_map_to_fw(struct wlan_objmgr_vdev * vdev,uint32_t * dscp_to_up_map)1069 QDF_STATUS ucfg_fwol_send_dscp_up_map_to_fw(struct wlan_objmgr_vdev *vdev,
1070 					   uint32_t *dscp_to_up_map)
1071 {
1072 	QDF_STATUS status;
1073 	struct wlan_objmgr_psoc *psoc;
1074 	struct wlan_fwol_psoc_obj *fwol_obj;
1075 	struct wlan_fwol_tx_ops *tx_ops;
1076 
1077 	psoc = wlan_vdev_get_psoc(vdev);
1078 	if (!psoc) {
1079 		fwol_err("NULL pointer for psoc");
1080 		return QDF_STATUS_E_INVAL;
1081 	}
1082 
1083 	fwol_obj = fwol_get_psoc_obj(psoc);
1084 	if (!fwol_obj) {
1085 		fwol_err("Failed to get FWOL Obj");
1086 		return QDF_STATUS_E_INVAL;
1087 	}
1088 
1089 	tx_ops = &fwol_obj->tx_ops;
1090 	if (tx_ops && tx_ops->send_dscp_up_map_to_fw)
1091 		status = tx_ops->send_dscp_up_map_to_fw(psoc, dscp_to_up_map);
1092 	else
1093 		status = QDF_STATUS_E_IO;
1094 
1095 	return status;
1096 }
1097 #endif /* WLAN_SEND_DSCP_UP_MAP_TO_FW */
1098 
1099 #ifdef WLAN_FEATURE_MDNS_OFFLOAD
ucfg_fwol_set_mdns_config(struct wlan_objmgr_psoc * psoc,struct mdns_config_info * mdns_info)1100 QDF_STATUS ucfg_fwol_set_mdns_config(struct wlan_objmgr_psoc *psoc,
1101 				     struct mdns_config_info *mdns_info)
1102 {
1103 	QDF_STATUS status;
1104 	struct wlan_fwol_psoc_obj *fwol_obj;
1105 	struct wlan_fwol_tx_ops *tx_ops;
1106 
1107 	if (!psoc) {
1108 		fwol_err("NULL pointer for psoc");
1109 		return QDF_STATUS_E_INVAL;
1110 	}
1111 
1112 	fwol_obj = fwol_get_psoc_obj(psoc);
1113 	if (!fwol_obj) {
1114 		fwol_err("Failed to get FWOL Obj");
1115 		return QDF_STATUS_E_INVAL;
1116 	}
1117 
1118 	tx_ops = &fwol_obj->tx_ops;
1119 	if (tx_ops->set_mdns_config)
1120 		status = tx_ops->set_mdns_config(psoc, mdns_info);
1121 	else
1122 		status = QDF_STATUS_E_IO;
1123 
1124 	return status;
1125 }
1126 #endif /* WLAN_FEATURE_MDNS_OFFLOAD */
1127 
ucfg_fwol_update_fw_cap_info(struct wlan_objmgr_psoc * psoc,struct wlan_fwol_capability_info * caps)1128 void ucfg_fwol_update_fw_cap_info(struct wlan_objmgr_psoc *psoc,
1129 				  struct wlan_fwol_capability_info *caps)
1130 {
1131 	struct wlan_fwol_psoc_obj *fwol_obj;
1132 
1133 	fwol_obj = fwol_get_psoc_obj(psoc);
1134 	if (!fwol_obj) {
1135 		fwol_err("Failed to get fwol obj");
1136 		return;
1137 	}
1138 
1139 	qdf_mem_copy(&fwol_obj->capability_info, caps,
1140 		     sizeof(fwol_obj->capability_info));
1141 }
1142 
1143 #ifdef THERMAL_STATS_SUPPORT
1144 static QDF_STATUS
ucfg_fwol_get_cap(struct wlan_objmgr_psoc * psoc,struct wlan_fwol_capability_info * cap_info)1145 ucfg_fwol_get_cap(struct wlan_objmgr_psoc *psoc,
1146 		  struct wlan_fwol_capability_info *cap_info)
1147 {
1148 	struct wlan_fwol_psoc_obj *fwol_obj;
1149 
1150 	fwol_obj = fwol_get_psoc_obj(psoc);
1151 	if (!fwol_obj) {
1152 		fwol_err("Failed to get fwol obj");
1153 		return QDF_STATUS_E_FAILURE;
1154 	}
1155 
1156 	if (!cap_info) {
1157 		fwol_err("Failed to get fwol obj");
1158 		return QDF_STATUS_E_FAILURE;
1159 	}
1160 	*cap_info = fwol_obj->capability_info;
1161 
1162 	return QDF_STATUS_SUCCESS;
1163 }
1164 
ucfg_fwol_send_get_thermal_stats_cmd(struct wlan_objmgr_psoc * psoc,enum thermal_stats_request_type req_type,void (* callback)(void * context,struct thermal_throttle_info * response),void * context)1165 QDF_STATUS ucfg_fwol_send_get_thermal_stats_cmd(struct wlan_objmgr_psoc *psoc,
1166 				       enum thermal_stats_request_type req_type,
1167 				       void (*callback)(void *context,
1168 				       struct thermal_throttle_info *response),
1169 				       void *context)
1170 {
1171 	QDF_STATUS status;
1172 	struct wlan_fwol_psoc_obj *fwol_obj;
1173 	struct wlan_fwol_tx_ops *tx_ops;
1174 	struct wlan_fwol_thermal_temp thermal_temp = {0};
1175 	struct wlan_fwol_capability_info cap_info;
1176 	struct wlan_fwol_callbacks *cbs;
1177 
1178 	fwol_obj = fwol_get_psoc_obj(psoc);
1179 	if (!fwol_obj) {
1180 		fwol_err("Failed to get FWOL Obj");
1181 		return QDF_STATUS_E_INVAL;
1182 	}
1183 
1184 	status = ucfg_fwol_get_thermal_temp(psoc, &thermal_temp);
1185 	if (QDF_IS_STATUS_ERROR(status))
1186 		return QDF_STATUS_E_INVAL;
1187 
1188 	status = ucfg_fwol_get_cap(psoc, &cap_info);
1189 	if (QDF_IS_STATUS_ERROR(status))
1190 		return QDF_STATUS_E_INVAL;
1191 
1192 	if (!thermal_temp.therm_stats_offset ||
1193 	    !cap_info.fw_thermal_stats_cap) {
1194 		fwol_err("Command Disabled in Ini gThermalStatsTempOffset %d or not enabled in FW %d",
1195 			 thermal_temp.therm_stats_offset,
1196 			 cap_info.fw_thermal_stats_cap);
1197 		return QDF_STATUS_E_INVAL;
1198 	}
1199 
1200 	/* Registering Callback for the Request command */
1201 	if (callback && context) {
1202 		cbs = &fwol_obj->cbs;
1203 		cbs->get_thermal_stats_callback = callback;
1204 		cbs->get_thermal_stats_context = context;
1205 	}
1206 
1207 	tx_ops = &fwol_obj->tx_ops;
1208 	if (tx_ops && tx_ops->get_thermal_stats)
1209 		status = tx_ops->get_thermal_stats(psoc, req_type,
1210 					thermal_temp.therm_stats_offset);
1211 	else
1212 		status = QDF_STATUS_E_INVAL;
1213 
1214 	return status;
1215 }
1216 #endif /* THERMAL_STATS_SUPPORT */
1217 
ucfg_fwol_configure_global_params(struct wlan_objmgr_psoc * psoc,struct wlan_objmgr_pdev * pdev)1218 QDF_STATUS ucfg_fwol_configure_global_params(struct wlan_objmgr_psoc *psoc,
1219 					     struct wlan_objmgr_pdev *pdev)
1220 {
1221 	QDF_STATUS status;
1222 	uint32_t enable_ilp;
1223 	bool value;
1224 
1225 	/* Configure ILP feature in FW */
1226 	status = ucfg_fwol_get_ilp_config(psoc, &enable_ilp);
1227 	if (QDF_IS_STATUS_ERROR(status))
1228 		return status;
1229 	status = fwol_set_ilp_config(pdev, enable_ilp);
1230 	if (QDF_IS_STATUS_ERROR(status))
1231 		return status;
1232 
1233 	/* Configure HW assist feature in FW */
1234 	status = ucfg_fwol_get_hw_assist_config(psoc, &value);
1235 	if (QDF_IS_STATUS_ERROR(status))
1236 		return status;
1237 	status = fwol_configure_hw_assist(pdev, value);
1238 	if (QDF_IS_STATUS_ERROR(status))
1239 		return status;
1240 
1241 	return status;
1242 }
1243 
ucfg_fwol_set_ilp_config(struct wlan_objmgr_psoc * psoc,struct wlan_objmgr_pdev * pdev,uint32_t enable_ilp)1244 QDF_STATUS ucfg_fwol_set_ilp_config(struct wlan_objmgr_psoc *psoc,
1245 				    struct wlan_objmgr_pdev *pdev,
1246 				    uint32_t enable_ilp)
1247 {
1248 	return fwol_set_ilp_config(pdev, enable_ilp);
1249 }
1250 
ucfg_fwol_configure_vdev_params(struct wlan_objmgr_psoc * psoc,struct wlan_objmgr_vdev * vdev)1251 QDF_STATUS ucfg_fwol_configure_vdev_params(struct wlan_objmgr_psoc *psoc,
1252 					   struct wlan_objmgr_vdev *vdev)
1253 {
1254 	uint32_t value;
1255 	QDF_STATUS status;
1256 	uint8_t vdev_id = wlan_vdev_get_id(vdev);
1257 
1258 	switch (wlan_vdev_mlme_get_opmode(vdev)) {
1259 	case QDF_SAP_MODE:
1260 		status = ucfg_fwol_get_sap_sho(psoc, &value);
1261 		if (QDF_IS_STATUS_ERROR(status))
1262 			break;
1263 
1264 		status = fwol_set_sap_sho(psoc, vdev_id, value);
1265 		if (QDF_IS_STATUS_ERROR(status))
1266 			break;
1267 
1268 		status = fwol_set_sap_wds_config(psoc, vdev_id);
1269 		break;
1270 	default:
1271 		status = QDF_STATUS_SUCCESS;
1272 		break;
1273 	}
1274 
1275 	return status;
1276 }
1277