xref: /wlan-driver/qcacld-3.0/components/pmo/dispatcher/src/wlan_pmo_obj_mgmt_api.c (revision 5113495b16420b49004c444715d2daae2066e7dc)
1*5113495bSYour Name /*
2*5113495bSYour Name  * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved.
3*5113495bSYour Name  * Copyright (c) 2023-2024 Qualcomm Innovation Center, Inc. All rights reserved.
4*5113495bSYour Name  *
5*5113495bSYour Name  * Permission to use, copy, modify, and/or distribute this software for
6*5113495bSYour Name  * any purpose with or without fee is hereby granted, provided that the
7*5113495bSYour Name  * above copyright notice and this permission notice appear in all
8*5113495bSYour Name  * copies.
9*5113495bSYour Name  *
10*5113495bSYour Name  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11*5113495bSYour Name  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12*5113495bSYour Name  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13*5113495bSYour Name  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14*5113495bSYour Name  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15*5113495bSYour Name  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16*5113495bSYour Name  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17*5113495bSYour Name  * PERFORMANCE OF THIS SOFTWARE.
18*5113495bSYour Name  */
19*5113495bSYour Name /**
20*5113495bSYour Name  * DOC: define utility API related to the pmo component
21*5113495bSYour Name  * called by other components
22*5113495bSYour Name  */
23*5113495bSYour Name 
24*5113495bSYour Name #include "wlan_pmo_obj_mgmt_api.h"
25*5113495bSYour Name #include "wlan_pmo_tgt_api.h"
26*5113495bSYour Name #include "wlan_pmo_static_config.h"
27*5113495bSYour Name #include "wlan_pmo_main.h"
28*5113495bSYour Name #include "target_if_pmo.h"
29*5113495bSYour Name 
pmo_init(void)30*5113495bSYour Name QDF_STATUS pmo_init(void)
31*5113495bSYour Name {
32*5113495bSYour Name 	QDF_STATUS status;
33*5113495bSYour Name 	struct wlan_pmo_ctx *pmo_ctx;
34*5113495bSYour Name 
35*5113495bSYour Name 	pmo_enter();
36*5113495bSYour Name 	if (pmo_allocate_ctx() != QDF_STATUS_SUCCESS) {
37*5113495bSYour Name 		pmo_err("unable to allocate psoc ctx");
38*5113495bSYour Name 		status = QDF_STATUS_E_FAULT;
39*5113495bSYour Name 		goto out;
40*5113495bSYour Name 	}
41*5113495bSYour Name 
42*5113495bSYour Name 	pmo_ctx = pmo_get_context();
43*5113495bSYour Name 	if (!pmo_ctx) {
44*5113495bSYour Name 		pmo_err("unable to get pmo ctx");
45*5113495bSYour Name 		status = QDF_STATUS_E_INVAL;
46*5113495bSYour Name 		goto out;
47*5113495bSYour Name 	}
48*5113495bSYour Name 
49*5113495bSYour Name 	status = wlan_objmgr_register_psoc_create_handler(
50*5113495bSYour Name 			WLAN_UMAC_COMP_PMO,
51*5113495bSYour Name 			pmo_psoc_object_created_notification,
52*5113495bSYour Name 			(void *)pmo_ctx);
53*5113495bSYour Name 	if (status != QDF_STATUS_SUCCESS) {
54*5113495bSYour Name 		pmo_err("unable to register psoc create handle");
55*5113495bSYour Name 		goto out;
56*5113495bSYour Name 	}
57*5113495bSYour Name 
58*5113495bSYour Name 	status = wlan_objmgr_register_psoc_destroy_handler(
59*5113495bSYour Name 			WLAN_UMAC_COMP_PMO,
60*5113495bSYour Name 			 pmo_psoc_object_destroyed_notification,
61*5113495bSYour Name 			(void *)pmo_ctx);
62*5113495bSYour Name 	if (status != QDF_STATUS_SUCCESS) {
63*5113495bSYour Name 		pmo_err("unable to register psoc create handle");
64*5113495bSYour Name 		goto out;
65*5113495bSYour Name 	}
66*5113495bSYour Name 
67*5113495bSYour Name 	status = wlan_objmgr_register_vdev_create_handler(
68*5113495bSYour Name 			WLAN_UMAC_COMP_PMO,
69*5113495bSYour Name 			pmo_vdev_object_created_notification,
70*5113495bSYour Name 			(void *)pmo_ctx);
71*5113495bSYour Name 	if (status != QDF_STATUS_SUCCESS) {
72*5113495bSYour Name 		pmo_err("unable to register vdev create handle");
73*5113495bSYour Name 		goto out;
74*5113495bSYour Name 	}
75*5113495bSYour Name 
76*5113495bSYour Name 	status = wlan_objmgr_register_vdev_destroy_handler(
77*5113495bSYour Name 			WLAN_UMAC_COMP_PMO,
78*5113495bSYour Name 			pmo_vdev_object_destroyed_notification,
79*5113495bSYour Name 			(void *)pmo_ctx);
80*5113495bSYour Name 	if (status != QDF_STATUS_SUCCESS)
81*5113495bSYour Name 		pmo_err("unable to register vdev create handle");
82*5113495bSYour Name out:
83*5113495bSYour Name 	pmo_exit();
84*5113495bSYour Name 
85*5113495bSYour Name 	return status;
86*5113495bSYour Name }
87*5113495bSYour Name 
pmo_deinit(void)88*5113495bSYour Name QDF_STATUS pmo_deinit(void)
89*5113495bSYour Name {
90*5113495bSYour Name 	QDF_STATUS status;
91*5113495bSYour Name 	struct wlan_pmo_ctx *pmo_ctx;
92*5113495bSYour Name 
93*5113495bSYour Name 	pmo_enter();
94*5113495bSYour Name 	pmo_ctx = pmo_get_context();
95*5113495bSYour Name 	if (!pmo_ctx) {
96*5113495bSYour Name 		pmo_err("unable to get pmo ctx");
97*5113495bSYour Name 		status =  QDF_STATUS_E_FAILURE;
98*5113495bSYour Name 		goto out;
99*5113495bSYour Name 	}
100*5113495bSYour Name 
101*5113495bSYour Name 	status = wlan_objmgr_unregister_psoc_create_handler(
102*5113495bSYour Name 			WLAN_UMAC_COMP_PMO,
103*5113495bSYour Name 			pmo_psoc_object_created_notification,
104*5113495bSYour Name 			(void *)pmo_ctx);
105*5113495bSYour Name 	if (status != QDF_STATUS_SUCCESS) {
106*5113495bSYour Name 		pmo_err("unable to unregister psoc create handle");
107*5113495bSYour Name 		goto out;
108*5113495bSYour Name 	}
109*5113495bSYour Name 
110*5113495bSYour Name 	status = wlan_objmgr_unregister_psoc_destroy_handler(
111*5113495bSYour Name 			WLAN_UMAC_COMP_PMO,
112*5113495bSYour Name 			 pmo_psoc_object_destroyed_notification,
113*5113495bSYour Name 			(void *)pmo_ctx);
114*5113495bSYour Name 	if (status != QDF_STATUS_SUCCESS) {
115*5113495bSYour Name 		pmo_err("unable to unregister psoc create handle");
116*5113495bSYour Name 		goto out;
117*5113495bSYour Name 	}
118*5113495bSYour Name 
119*5113495bSYour Name 	status = wlan_objmgr_unregister_vdev_create_handler(
120*5113495bSYour Name 			WLAN_UMAC_COMP_PMO,
121*5113495bSYour Name 			pmo_vdev_object_created_notification,
122*5113495bSYour Name 			(void *)pmo_ctx);
123*5113495bSYour Name 	if (status != QDF_STATUS_SUCCESS) {
124*5113495bSYour Name 		pmo_err("unable to unregister vdev create handle");
125*5113495bSYour Name 		goto out;
126*5113495bSYour Name 	}
127*5113495bSYour Name 
128*5113495bSYour Name 	status = wlan_objmgr_unregister_vdev_destroy_handler(
129*5113495bSYour Name 			WLAN_UMAC_COMP_PMO,
130*5113495bSYour Name 			pmo_vdev_object_destroyed_notification,
131*5113495bSYour Name 			(void *)pmo_ctx);
132*5113495bSYour Name 	if (status != QDF_STATUS_SUCCESS) {
133*5113495bSYour Name 		pmo_err("unable to unregister vdev create handle");
134*5113495bSYour Name 		goto out;
135*5113495bSYour Name 	}
136*5113495bSYour Name 
137*5113495bSYour Name out:
138*5113495bSYour Name 	pmo_free_ctx();
139*5113495bSYour Name 	pmo_exit();
140*5113495bSYour Name 
141*5113495bSYour Name 	return status;
142*5113495bSYour Name }
143*5113495bSYour Name 
pmo_psoc_object_created_notification(struct wlan_objmgr_psoc * psoc,void * arg)144*5113495bSYour Name QDF_STATUS pmo_psoc_object_created_notification(
145*5113495bSYour Name 		struct wlan_objmgr_psoc *psoc, void *arg)
146*5113495bSYour Name {
147*5113495bSYour Name 	struct pmo_psoc_priv_obj *psoc_ctx = NULL;
148*5113495bSYour Name 	QDF_STATUS status;
149*5113495bSYour Name 	struct wlan_pmo_ctx *pmo_ctx;
150*5113495bSYour Name 
151*5113495bSYour Name 	pmo_enter();
152*5113495bSYour Name 	pmo_ctx = pmo_get_context();
153*5113495bSYour Name 	if (!pmo_ctx) {
154*5113495bSYour Name 		QDF_ASSERT(0);
155*5113495bSYour Name 		pmo_err("unable to get pmo ctx");
156*5113495bSYour Name 		status = QDF_STATUS_E_FAILURE;
157*5113495bSYour Name 		goto out;
158*5113495bSYour Name 	}
159*5113495bSYour Name 
160*5113495bSYour Name 	psoc_ctx = qdf_mem_malloc(sizeof(*psoc_ctx));
161*5113495bSYour Name 	if (!psoc_ctx) {
162*5113495bSYour Name 		status = QDF_STATUS_E_NOMEM;
163*5113495bSYour Name 		goto out;
164*5113495bSYour Name 	}
165*5113495bSYour Name 
166*5113495bSYour Name 	status = wlan_objmgr_psoc_component_obj_attach(psoc,
167*5113495bSYour Name 			WLAN_UMAC_COMP_PMO,
168*5113495bSYour Name 			psoc_ctx,
169*5113495bSYour Name 			QDF_STATUS_SUCCESS);
170*5113495bSYour Name 	if (status != QDF_STATUS_SUCCESS) {
171*5113495bSYour Name 		pmo_err("Failed to attach psoc_ctx with psoc");
172*5113495bSYour Name 		qdf_mem_free(psoc_ctx);
173*5113495bSYour Name 		status = QDF_STATUS_E_FAILURE;
174*5113495bSYour Name 		goto out;
175*5113495bSYour Name 	}
176*5113495bSYour Name 	qdf_spinlock_create(&psoc_ctx->lock);
177*5113495bSYour Name 	qdf_wake_lock_create(&psoc_ctx->wow.wow_wake_lock, "pmo_wow_wl");
178*5113495bSYour Name 	status = qdf_event_create(&psoc_ctx->wow.target_suspend);
179*5113495bSYour Name 	if (status != QDF_STATUS_SUCCESS) {
180*5113495bSYour Name 		pmo_err("target suspend event initialization failed");
181*5113495bSYour Name 		status = QDF_STATUS_E_FAILURE;
182*5113495bSYour Name 		goto out;
183*5113495bSYour Name 	}
184*5113495bSYour Name 	status = qdf_event_create(&psoc_ctx->wow.target_resume);
185*5113495bSYour Name 	if (status != QDF_STATUS_SUCCESS) {
186*5113495bSYour Name 		pmo_err("target resume event initialization failed");
187*5113495bSYour Name 		status = QDF_STATUS_E_FAILURE;
188*5113495bSYour Name 		goto out;
189*5113495bSYour Name 	}
190*5113495bSYour Name 
191*5113495bSYour Name 	qdf_atomic_init(&psoc_ctx->wow.wow_initial_wake_up);
192*5113495bSYour Name 	/* Register PMO tx ops*/
193*5113495bSYour Name 	target_if_pmo_register_tx_ops(&psoc_ctx->pmo_tx_ops);
194*5113495bSYour Name out:
195*5113495bSYour Name 	pmo_exit();
196*5113495bSYour Name 
197*5113495bSYour Name 	return status;
198*5113495bSYour Name }
199*5113495bSYour Name 
pmo_psoc_object_destroyed_notification(struct wlan_objmgr_psoc * psoc,void * arg)200*5113495bSYour Name QDF_STATUS pmo_psoc_object_destroyed_notification(
201*5113495bSYour Name 		struct wlan_objmgr_psoc *psoc, void *arg)
202*5113495bSYour Name {
203*5113495bSYour Name 	struct pmo_psoc_priv_obj *psoc_ctx = NULL;
204*5113495bSYour Name 	QDF_STATUS status;
205*5113495bSYour Name 
206*5113495bSYour Name 	pmo_enter();
207*5113495bSYour Name 
208*5113495bSYour Name 	psoc_ctx = pmo_psoc_get_priv(psoc);
209*5113495bSYour Name 
210*5113495bSYour Name 	status = wlan_objmgr_psoc_component_obj_detach(psoc,
211*5113495bSYour Name 			WLAN_UMAC_COMP_PMO,
212*5113495bSYour Name 			psoc_ctx);
213*5113495bSYour Name 	if (status != QDF_STATUS_SUCCESS) {
214*5113495bSYour Name 		pmo_err("Failed to detach psoc_ctx from psoc");
215*5113495bSYour Name 		status = QDF_STATUS_E_FAILURE;
216*5113495bSYour Name 		goto out;
217*5113495bSYour Name 	}
218*5113495bSYour Name 
219*5113495bSYour Name 	qdf_spinlock_destroy(&psoc_ctx->lock);
220*5113495bSYour Name 	qdf_event_destroy(&psoc_ctx->wow.target_suspend);
221*5113495bSYour Name 	qdf_event_destroy(&psoc_ctx->wow.target_resume);
222*5113495bSYour Name 	qdf_wake_lock_destroy(&psoc_ctx->wow.wow_wake_lock);
223*5113495bSYour Name 	qdf_mem_zero(psoc_ctx, sizeof(*psoc_ctx));
224*5113495bSYour Name 	qdf_mem_free(psoc_ctx);
225*5113495bSYour Name out:
226*5113495bSYour Name 	pmo_exit();
227*5113495bSYour Name 
228*5113495bSYour Name 	return status;
229*5113495bSYour Name }
230*5113495bSYour Name 
231*5113495bSYour Name #ifdef FEATURE_WLAN_DYNAMIC_ARP_NS_OFFLOAD
232*5113495bSYour Name static inline void
pmo_vdev_dynamic_arp_ns_offload_init(struct pmo_vdev_priv_obj * vdev_ctx)233*5113495bSYour Name pmo_vdev_dynamic_arp_ns_offload_init(struct pmo_vdev_priv_obj *vdev_ctx)
234*5113495bSYour Name {
235*5113495bSYour Name 	qdf_runtime_lock_init(&vdev_ctx->dyn_arp_ns_offload_rt_lock);
236*5113495bSYour Name }
237*5113495bSYour Name 
238*5113495bSYour Name static inline void
pmo_vdev_dynamic_arp_ns_offload_deinit(struct pmo_vdev_priv_obj * vdev_ctx)239*5113495bSYour Name pmo_vdev_dynamic_arp_ns_offload_deinit(struct pmo_vdev_priv_obj *vdev_ctx)
240*5113495bSYour Name {
241*5113495bSYour Name 	qdf_runtime_lock_deinit(&vdev_ctx->dyn_arp_ns_offload_rt_lock);
242*5113495bSYour Name }
243*5113495bSYour Name #else
244*5113495bSYour Name static inline void
pmo_vdev_dynamic_arp_ns_offload_init(struct pmo_vdev_priv_obj * vdev_ctx)245*5113495bSYour Name pmo_vdev_dynamic_arp_ns_offload_init(struct pmo_vdev_priv_obj *vdev_ctx) {}
246*5113495bSYour Name 
247*5113495bSYour Name static inline void
pmo_vdev_dynamic_arp_ns_offload_deinit(struct pmo_vdev_priv_obj * vdev_ctx)248*5113495bSYour Name pmo_vdev_dynamic_arp_ns_offload_deinit(struct pmo_vdev_priv_obj *vdev_ctx) {}
249*5113495bSYour Name #endif
250*5113495bSYour Name 
pmo_vdev_object_created_notification(struct wlan_objmgr_vdev * vdev,void * arg)251*5113495bSYour Name QDF_STATUS pmo_vdev_object_created_notification(
252*5113495bSYour Name 		struct wlan_objmgr_vdev *vdev, void *arg)
253*5113495bSYour Name {
254*5113495bSYour Name 	struct pmo_psoc_priv_obj *psoc_ctx = NULL;
255*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc;
256*5113495bSYour Name 	struct pmo_vdev_priv_obj *vdev_ctx;
257*5113495bSYour Name 	QDF_STATUS status;
258*5113495bSYour Name 
259*5113495bSYour Name 	pmo_enter();
260*5113495bSYour Name 
261*5113495bSYour Name 	psoc = pmo_vdev_get_psoc(vdev);
262*5113495bSYour Name 
263*5113495bSYour Name 	psoc_ctx = pmo_psoc_get_priv(psoc);
264*5113495bSYour Name 
265*5113495bSYour Name 	vdev_ctx = qdf_mem_malloc(sizeof(*vdev_ctx));
266*5113495bSYour Name 	if (!vdev_ctx) {
267*5113495bSYour Name 		status = QDF_STATUS_E_NOMEM;
268*5113495bSYour Name 		goto out;
269*5113495bSYour Name 	}
270*5113495bSYour Name 
271*5113495bSYour Name 	status = wlan_objmgr_vdev_component_obj_attach(vdev,
272*5113495bSYour Name 			 WLAN_UMAC_COMP_PMO,
273*5113495bSYour Name 			(void *)vdev_ctx, QDF_STATUS_SUCCESS);
274*5113495bSYour Name 	if (status != QDF_STATUS_SUCCESS) {
275*5113495bSYour Name 		pmo_err("Failed to attach vdev_ctx with vdev");
276*5113495bSYour Name 		qdf_mem_free(vdev_ctx);
277*5113495bSYour Name 		goto out;
278*5113495bSYour Name 	}
279*5113495bSYour Name 
280*5113495bSYour Name 	qdf_spinlock_create(&vdev_ctx->pmo_vdev_lock);
281*5113495bSYour Name 	vdev_ctx->magic_ptrn_enable =
282*5113495bSYour Name 		psoc_ctx->psoc_cfg.magic_ptrn_enable;
283*5113495bSYour Name 	vdev_ctx->ptrn_match_enable =
284*5113495bSYour Name 		psoc_ctx->psoc_cfg.ptrn_match_enable_all_vdev;
285*5113495bSYour Name 	vdev_ctx->pmo_psoc_ctx = psoc_ctx;
286*5113495bSYour Name 	qdf_atomic_init(&vdev_ctx->gtk_err_enable);
287*5113495bSYour Name 	pmo_vdev_dynamic_arp_ns_offload_init(vdev_ctx);
288*5113495bSYour Name 	/*
289*5113495bSYour Name 	 * Update Powersave mode
290*5113495bSYour Name 	 * 0 - PMO_PS_ADVANCED_POWER_SAVE_DISABLE
291*5113495bSYour Name 	 * 1 - PMO_PS_ADVANCED_POWER_SAVE_ENABLE
292*5113495bSYour Name 	 * 2 - PMO_PS_ADVANCED_POWER_SAVE_USER_DEFINED
293*5113495bSYour Name 	 */
294*5113495bSYour Name 	vdev_ctx->ps_params.opm_mode = psoc_ctx->psoc_cfg.power_save_mode;
295*5113495bSYour Name 	vdev_ctx->ps_params.ps_ito = PMO_PS_DATA_INACTIVITY_TIMEOUT;
296*5113495bSYour Name 	vdev_ctx->ps_params.spec_wake = PMO_PS_DATA_SPEC_WAKE;
297*5113495bSYour Name 
298*5113495bSYour Name out:
299*5113495bSYour Name 	pmo_exit();
300*5113495bSYour Name 
301*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
302*5113495bSYour Name }
303*5113495bSYour Name 
pmo_vdev_ready(struct wlan_objmgr_vdev * vdev,struct qdf_mac_addr * bridgeaddr)304*5113495bSYour Name QDF_STATUS pmo_vdev_ready(struct wlan_objmgr_vdev *vdev,
305*5113495bSYour Name 			  struct qdf_mac_addr *bridgeaddr)
306*5113495bSYour Name {
307*5113495bSYour Name 	QDF_STATUS status;
308*5113495bSYour Name 
309*5113495bSYour Name 	status = pmo_vdev_get_ref(vdev);
310*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status))
311*5113495bSYour Name 		return status;
312*5113495bSYour Name 
313*5113495bSYour Name 	/* Set Bridge MAC address */
314*5113495bSYour Name 	pmo_set_vdev_bridge_addr(vdev, bridgeaddr);
315*5113495bSYour Name 
316*5113495bSYour Name 	/* Register static configuration with firmware */
317*5113495bSYour Name 	pmo_register_wow_wakeup_events(vdev);
318*5113495bSYour Name 
319*5113495bSYour Name 	/* Register default wow patterns with firmware */
320*5113495bSYour Name 	pmo_register_wow_default_patterns(vdev);
321*5113495bSYour Name 
322*5113495bSYour Name 	wlan_objmgr_vdev_release_ref(vdev, WLAN_PMO_ID);
323*5113495bSYour Name 
324*5113495bSYour Name 	/*
325*5113495bSYour Name 	 * The above APIs should return a status but don't.
326*5113495bSYour Name 	 * Just return success for now.
327*5113495bSYour Name 	 */
328*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
329*5113495bSYour Name }
330*5113495bSYour Name 
pmo_vdev_object_destroyed_notification(struct wlan_objmgr_vdev * vdev,void * arg)331*5113495bSYour Name QDF_STATUS pmo_vdev_object_destroyed_notification(
332*5113495bSYour Name 		struct wlan_objmgr_vdev *vdev, void *arg)
333*5113495bSYour Name {
334*5113495bSYour Name 	struct pmo_vdev_priv_obj *vdev_ctx = NULL;
335*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_SUCCESS;
336*5113495bSYour Name 
337*5113495bSYour Name 	vdev_ctx = pmo_vdev_get_priv(vdev);
338*5113495bSYour Name 
339*5113495bSYour Name 	status = wlan_objmgr_vdev_component_obj_detach(vdev,
340*5113495bSYour Name 			 WLAN_UMAC_COMP_PMO,
341*5113495bSYour Name 			(void *)vdev_ctx);
342*5113495bSYour Name 	if (status != QDF_STATUS_SUCCESS)
343*5113495bSYour Name 		pmo_err("Failed to detach vdev_ctx with vdev");
344*5113495bSYour Name 
345*5113495bSYour Name 	qdf_spinlock_destroy(&vdev_ctx->pmo_vdev_lock);
346*5113495bSYour Name 	pmo_vdev_dynamic_arp_ns_offload_deinit(vdev_ctx);
347*5113495bSYour Name 	qdf_mem_free(vdev_ctx);
348*5113495bSYour Name 
349*5113495bSYour Name 	return status;
350*5113495bSYour Name }
351*5113495bSYour Name 
pmo_register_suspend_handler(enum wlan_umac_comp_id id,pmo_psoc_suspend_handler handler,void * arg)352*5113495bSYour Name QDF_STATUS pmo_register_suspend_handler(
353*5113495bSYour Name 		enum wlan_umac_comp_id id,
354*5113495bSYour Name 		pmo_psoc_suspend_handler handler,
355*5113495bSYour Name 		void *arg)
356*5113495bSYour Name {
357*5113495bSYour Name 	struct wlan_pmo_ctx *pmo_ctx;
358*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_SUCCESS;
359*5113495bSYour Name 
360*5113495bSYour Name 	pmo_enter();
361*5113495bSYour Name 	pmo_ctx = pmo_get_context();
362*5113495bSYour Name 	if (!pmo_ctx) {
363*5113495bSYour Name 		QDF_ASSERT(0);
364*5113495bSYour Name 		pmo_err("unable to get pmo ctx");
365*5113495bSYour Name 		status = QDF_STATUS_E_FAILURE;
366*5113495bSYour Name 		goto out;
367*5113495bSYour Name 	}
368*5113495bSYour Name 
369*5113495bSYour Name 	if (id < 0 || id >= WLAN_UMAC_MAX_COMPONENTS) {
370*5113495bSYour Name 		pmo_err("component id: %d is %s then valid components id",
371*5113495bSYour Name 			id, id < 0 ? "Less" : "More");
372*5113495bSYour Name 		status = QDF_STATUS_E_FAILURE;
373*5113495bSYour Name 		goto out;
374*5113495bSYour Name 	}
375*5113495bSYour Name 
376*5113495bSYour Name 	qdf_spin_lock_bh(&pmo_ctx->lock);
377*5113495bSYour Name 	pmo_ctx->pmo_suspend_handler[id] = handler;
378*5113495bSYour Name 	pmo_ctx->pmo_suspend_handler_arg[id] = arg;
379*5113495bSYour Name 	qdf_spin_unlock_bh(&pmo_ctx->lock);
380*5113495bSYour Name out:
381*5113495bSYour Name 	pmo_exit();
382*5113495bSYour Name 
383*5113495bSYour Name 	return status;
384*5113495bSYour Name }
385*5113495bSYour Name 
pmo_unregister_suspend_handler(enum wlan_umac_comp_id id,pmo_psoc_suspend_handler handler)386*5113495bSYour Name QDF_STATUS pmo_unregister_suspend_handler(
387*5113495bSYour Name 		enum wlan_umac_comp_id id,
388*5113495bSYour Name 		pmo_psoc_suspend_handler handler)
389*5113495bSYour Name {
390*5113495bSYour Name 	struct wlan_pmo_ctx *pmo_ctx;
391*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_SUCCESS;
392*5113495bSYour Name 
393*5113495bSYour Name 	pmo_enter();
394*5113495bSYour Name 	pmo_ctx = pmo_get_context();
395*5113495bSYour Name 	if (!pmo_ctx) {
396*5113495bSYour Name 		QDF_ASSERT(0);
397*5113495bSYour Name 		pmo_err("unable to get pmo ctx");
398*5113495bSYour Name 		status = QDF_STATUS_E_FAILURE;
399*5113495bSYour Name 		goto out;
400*5113495bSYour Name 	}
401*5113495bSYour Name 
402*5113495bSYour Name 	if (id < 0 || id >= WLAN_UMAC_MAX_COMPONENTS) {
403*5113495bSYour Name 		pmo_err("component id: %d is %s then valid components id",
404*5113495bSYour Name 			id, id < 0 ? "Less" : "More");
405*5113495bSYour Name 		status = QDF_STATUS_E_FAILURE;
406*5113495bSYour Name 		goto out;
407*5113495bSYour Name 	}
408*5113495bSYour Name 
409*5113495bSYour Name 	qdf_spin_lock_bh(&pmo_ctx->lock);
410*5113495bSYour Name 	if (pmo_ctx->pmo_suspend_handler[id] == handler) {
411*5113495bSYour Name 		pmo_ctx->pmo_suspend_handler[id] = NULL;
412*5113495bSYour Name 		pmo_ctx->pmo_suspend_handler_arg[id] = NULL;
413*5113495bSYour Name 		qdf_spin_unlock_bh(&pmo_ctx->lock);
414*5113495bSYour Name 	} else {
415*5113495bSYour Name 		qdf_spin_unlock_bh(&pmo_ctx->lock);
416*5113495bSYour Name 		pmo_err("can't find suspend handler for component id: %d ", id);
417*5113495bSYour Name 		status = QDF_STATUS_E_FAILURE;
418*5113495bSYour Name 	}
419*5113495bSYour Name out:
420*5113495bSYour Name 	pmo_exit();
421*5113495bSYour Name 
422*5113495bSYour Name 	return status;
423*5113495bSYour Name }
424*5113495bSYour Name 
pmo_register_resume_handler(enum wlan_umac_comp_id id,pmo_psoc_resume_handler handler,void * arg)425*5113495bSYour Name QDF_STATUS pmo_register_resume_handler(
426*5113495bSYour Name 		enum wlan_umac_comp_id id,
427*5113495bSYour Name 		pmo_psoc_resume_handler handler,
428*5113495bSYour Name 		void *arg)
429*5113495bSYour Name {
430*5113495bSYour Name 	struct wlan_pmo_ctx *pmo_ctx;
431*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_SUCCESS;
432*5113495bSYour Name 
433*5113495bSYour Name 	pmo_enter();
434*5113495bSYour Name 	pmo_ctx = pmo_get_context();
435*5113495bSYour Name 	if (!pmo_ctx) {
436*5113495bSYour Name 		pmo_err("unable to get pmo ctx");
437*5113495bSYour Name 		status = QDF_STATUS_E_FAILURE;
438*5113495bSYour Name 		goto out;
439*5113495bSYour Name 	}
440*5113495bSYour Name 
441*5113495bSYour Name 	if (id < 0 || id >= WLAN_UMAC_MAX_COMPONENTS) {
442*5113495bSYour Name 		pmo_err("component id: %d is %s then valid components id",
443*5113495bSYour Name 			id, id < 0 ? "Less" : "More");
444*5113495bSYour Name 		status = QDF_STATUS_E_FAILURE;
445*5113495bSYour Name 		goto out;
446*5113495bSYour Name 	}
447*5113495bSYour Name 
448*5113495bSYour Name 	qdf_spin_lock_bh(&pmo_ctx->lock);
449*5113495bSYour Name 	pmo_ctx->pmo_resume_handler[id] = handler;
450*5113495bSYour Name 	pmo_ctx->pmo_resume_handler_arg[id] = arg;
451*5113495bSYour Name 	qdf_spin_unlock_bh(&pmo_ctx->lock);
452*5113495bSYour Name out:
453*5113495bSYour Name 	pmo_exit();
454*5113495bSYour Name 
455*5113495bSYour Name 	return status;
456*5113495bSYour Name }
457*5113495bSYour Name 
pmo_unregister_resume_handler(enum wlan_umac_comp_id id,pmo_psoc_resume_handler handler)458*5113495bSYour Name QDF_STATUS pmo_unregister_resume_handler(
459*5113495bSYour Name 		enum wlan_umac_comp_id id,
460*5113495bSYour Name 		pmo_psoc_resume_handler handler)
461*5113495bSYour Name {
462*5113495bSYour Name 	struct wlan_pmo_ctx *pmo_ctx;
463*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_SUCCESS;
464*5113495bSYour Name 
465*5113495bSYour Name 	pmo_enter();
466*5113495bSYour Name 	pmo_ctx = pmo_get_context();
467*5113495bSYour Name 	if (!pmo_ctx) {
468*5113495bSYour Name 		pmo_err("unable to get pmo ctx");
469*5113495bSYour Name 		status = QDF_STATUS_E_FAILURE;
470*5113495bSYour Name 		goto out;
471*5113495bSYour Name 	}
472*5113495bSYour Name 
473*5113495bSYour Name 	if (id < 0 || id >= WLAN_UMAC_MAX_COMPONENTS) {
474*5113495bSYour Name 		pmo_err("component id: %d is %s then valid components id",
475*5113495bSYour Name 			id, id < 0 ? "Less" : "More");
476*5113495bSYour Name 		status = QDF_STATUS_E_FAILURE;
477*5113495bSYour Name 		goto out;
478*5113495bSYour Name 	}
479*5113495bSYour Name 
480*5113495bSYour Name 	qdf_spin_lock_bh(&pmo_ctx->lock);
481*5113495bSYour Name 	if (pmo_ctx->pmo_resume_handler[id] == handler) {
482*5113495bSYour Name 		pmo_ctx->pmo_resume_handler[id] = NULL;
483*5113495bSYour Name 		pmo_ctx->pmo_resume_handler_arg[id] = NULL;
484*5113495bSYour Name 		qdf_spin_unlock_bh(&pmo_ctx->lock);
485*5113495bSYour Name 	} else {
486*5113495bSYour Name 		qdf_spin_unlock_bh(&pmo_ctx->lock);
487*5113495bSYour Name 		pmo_err("can't find resume handler for component id: %d ", id);
488*5113495bSYour Name 		status = QDF_STATUS_E_FAILURE;
489*5113495bSYour Name 	}
490*5113495bSYour Name out:
491*5113495bSYour Name 	pmo_exit();
492*5113495bSYour Name 
493*5113495bSYour Name 	return status;
494*5113495bSYour Name }
495*5113495bSYour Name 
pmo_suspend_all_components(struct wlan_objmgr_psoc * psoc,enum qdf_suspend_type suspend_type)496*5113495bSYour Name QDF_STATUS pmo_suspend_all_components(struct wlan_objmgr_psoc *psoc,
497*5113495bSYour Name 				      enum qdf_suspend_type suspend_type)
498*5113495bSYour Name {
499*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_SUCCESS;
500*5113495bSYour Name 	QDF_STATUS resume_status;
501*5113495bSYour Name 	struct wlan_pmo_ctx *pmo_ctx;
502*5113495bSYour Name 	int i;
503*5113495bSYour Name 	pmo_psoc_suspend_handler handler;
504*5113495bSYour Name 	void *arg;
505*5113495bSYour Name 
506*5113495bSYour Name 	pmo_ctx = pmo_get_context();
507*5113495bSYour Name 	if (!pmo_ctx) {
508*5113495bSYour Name 		pmo_err("unable to get pmo ctx");
509*5113495bSYour Name 		status = QDF_STATUS_E_FAILURE;
510*5113495bSYour Name 		goto exit_with_status;
511*5113495bSYour Name 	}
512*5113495bSYour Name 
513*5113495bSYour Name 	/* call each component's suspend handler */
514*5113495bSYour Name 	for (i = 0; i < WLAN_UMAC_MAX_COMPONENTS; i++) {
515*5113495bSYour Name 		qdf_spin_lock_bh(&pmo_ctx->lock);
516*5113495bSYour Name 		handler = pmo_ctx->pmo_suspend_handler[i];
517*5113495bSYour Name 		arg = pmo_ctx->pmo_suspend_handler_arg[i];
518*5113495bSYour Name 		qdf_spin_unlock_bh(&pmo_ctx->lock);
519*5113495bSYour Name 
520*5113495bSYour Name 		if (!handler)
521*5113495bSYour Name 			continue;
522*5113495bSYour Name 
523*5113495bSYour Name 		status = handler(psoc, arg);
524*5113495bSYour Name 		if (QDF_IS_STATUS_ERROR(status)) {
525*5113495bSYour Name 			pmo_err("component %d failed to suspend; status: %d",
526*5113495bSYour Name 				i, status);
527*5113495bSYour Name 			goto suspend_recovery;
528*5113495bSYour Name 		}
529*5113495bSYour Name 	}
530*5113495bSYour Name 
531*5113495bSYour Name 	goto exit_with_status;
532*5113495bSYour Name 
533*5113495bSYour Name suspend_recovery:
534*5113495bSYour Name 	/* resume, starting with the last successfully suspended component */
535*5113495bSYour Name 	for (i -= 1; i >= 0; i--) {
536*5113495bSYour Name 		qdf_spin_lock_bh(&pmo_ctx->lock);
537*5113495bSYour Name 		handler = pmo_ctx->pmo_resume_handler[i];
538*5113495bSYour Name 		arg = pmo_ctx->pmo_resume_handler_arg[i];
539*5113495bSYour Name 		qdf_spin_unlock_bh(&pmo_ctx->lock);
540*5113495bSYour Name 
541*5113495bSYour Name 		if (!handler)
542*5113495bSYour Name 			continue;
543*5113495bSYour Name 
544*5113495bSYour Name 		resume_status = handler(psoc, arg);
545*5113495bSYour Name 		if (QDF_IS_STATUS_ERROR(resume_status))
546*5113495bSYour Name 			QDF_DEBUG_PANIC("component %d failed resume; status:%d",
547*5113495bSYour Name 					i, resume_status);
548*5113495bSYour Name 	}
549*5113495bSYour Name 
550*5113495bSYour Name exit_with_status:
551*5113495bSYour Name 	return status;
552*5113495bSYour Name }
553*5113495bSYour Name 
pmo_resume_all_components(struct wlan_objmgr_psoc * psoc,enum qdf_suspend_type suspend_type)554*5113495bSYour Name QDF_STATUS pmo_resume_all_components(struct wlan_objmgr_psoc *psoc,
555*5113495bSYour Name 				     enum qdf_suspend_type suspend_type)
556*5113495bSYour Name {
557*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_SUCCESS;
558*5113495bSYour Name 	struct wlan_pmo_ctx *pmo_ctx;
559*5113495bSYour Name 	uint8_t i;
560*5113495bSYour Name 	pmo_psoc_suspend_handler handler;
561*5113495bSYour Name 	void *arg;
562*5113495bSYour Name 
563*5113495bSYour Name 	pmo_ctx = pmo_get_context();
564*5113495bSYour Name 	if (!pmo_ctx) {
565*5113495bSYour Name 		pmo_err("unable to get pmo ctx");
566*5113495bSYour Name 		QDF_ASSERT(0);
567*5113495bSYour Name 		status = QDF_STATUS_E_FAILURE;
568*5113495bSYour Name 		goto exit_with_status;
569*5113495bSYour Name 	}
570*5113495bSYour Name 
571*5113495bSYour Name 	/* call each component's resume handler */
572*5113495bSYour Name 	for (i = 0; i < WLAN_UMAC_MAX_COMPONENTS; i++) {
573*5113495bSYour Name 		qdf_spin_lock_bh(&pmo_ctx->lock);
574*5113495bSYour Name 		handler = pmo_ctx->pmo_resume_handler[i];
575*5113495bSYour Name 		arg = pmo_ctx->pmo_resume_handler_arg[i];
576*5113495bSYour Name 		qdf_spin_unlock_bh(&pmo_ctx->lock);
577*5113495bSYour Name 
578*5113495bSYour Name 		if (!handler)
579*5113495bSYour Name 			continue;
580*5113495bSYour Name 
581*5113495bSYour Name 		status = handler(psoc, arg);
582*5113495bSYour Name 		if (QDF_IS_STATUS_ERROR(status)) {
583*5113495bSYour Name 			pmo_fatal("Non-recoverable failure occurred!");
584*5113495bSYour Name 			pmo_fatal("component %d failed to resume; status: %d",
585*5113495bSYour Name 				  i, status);
586*5113495bSYour Name 			QDF_BUG(0);
587*5113495bSYour Name 		}
588*5113495bSYour Name 	}
589*5113495bSYour Name 
590*5113495bSYour Name exit_with_status:
591*5113495bSYour Name 	return status;
592*5113495bSYour Name }
593*5113495bSYour Name 
pmo_register_pause_bitmap_notifier(struct wlan_objmgr_psoc * psoc,pmo_notify_pause_bitmap handler)594*5113495bSYour Name QDF_STATUS pmo_register_pause_bitmap_notifier(struct wlan_objmgr_psoc *psoc,
595*5113495bSYour Name 		pmo_notify_pause_bitmap handler)
596*5113495bSYour Name {
597*5113495bSYour Name 	struct pmo_psoc_priv_obj *psoc_ctx;
598*5113495bSYour Name 	QDF_STATUS status;
599*5113495bSYour Name 
600*5113495bSYour Name 	if (!psoc) {
601*5113495bSYour Name 		pmo_err("psoc is null");
602*5113495bSYour Name 		return QDF_STATUS_E_NULL_VALUE;
603*5113495bSYour Name 	}
604*5113495bSYour Name 
605*5113495bSYour Name 	if (!handler) {
606*5113495bSYour Name 		pmo_err("pmo_notify_vdev_pause_bitmap is null");
607*5113495bSYour Name 		return QDF_STATUS_E_NULL_VALUE;
608*5113495bSYour Name 	}
609*5113495bSYour Name 
610*5113495bSYour Name 	status = pmo_psoc_get_ref(psoc);
611*5113495bSYour Name 	if (status != QDF_STATUS_SUCCESS) {
612*5113495bSYour Name 		pmo_err("pmo cannot get the reference out of psoc");
613*5113495bSYour Name 		return status;
614*5113495bSYour Name 	}
615*5113495bSYour Name 
616*5113495bSYour Name 	pmo_psoc_with_ctx(psoc, psoc_ctx) {
617*5113495bSYour Name 		psoc_ctx->pause_bitmap_notifier = handler;
618*5113495bSYour Name 	}
619*5113495bSYour Name 
620*5113495bSYour Name 	pmo_psoc_put_ref(psoc);
621*5113495bSYour Name 
622*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
623*5113495bSYour Name }
624*5113495bSYour Name 
pmo_unregister_pause_bitmap_notifier(struct wlan_objmgr_psoc * psoc)625*5113495bSYour Name QDF_STATUS pmo_unregister_pause_bitmap_notifier(struct wlan_objmgr_psoc *psoc)
626*5113495bSYour Name {
627*5113495bSYour Name 	struct pmo_psoc_priv_obj *psoc_ctx;
628*5113495bSYour Name 	QDF_STATUS status;
629*5113495bSYour Name 
630*5113495bSYour Name 	if (!psoc) {
631*5113495bSYour Name 		pmo_err("psoc is null");
632*5113495bSYour Name 		return QDF_STATUS_E_NULL_VALUE;
633*5113495bSYour Name 	}
634*5113495bSYour Name 
635*5113495bSYour Name 	status = pmo_psoc_get_ref(psoc);
636*5113495bSYour Name 	if (status != QDF_STATUS_SUCCESS) {
637*5113495bSYour Name 		pmo_err("pmo cannot get the reference out of psoc");
638*5113495bSYour Name 		return status;
639*5113495bSYour Name 	}
640*5113495bSYour Name 
641*5113495bSYour Name 	pmo_psoc_with_ctx(psoc, psoc_ctx) {
642*5113495bSYour Name 		psoc_ctx->pause_bitmap_notifier = NULL;
643*5113495bSYour Name 	}
644*5113495bSYour Name 
645*5113495bSYour Name 	pmo_psoc_put_ref(psoc);
646*5113495bSYour Name 
647*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
648*5113495bSYour Name }
649*5113495bSYour Name 
pmo_register_get_pause_bitmap(struct wlan_objmgr_psoc * psoc,pmo_get_pause_bitmap handler)650*5113495bSYour Name QDF_STATUS pmo_register_get_pause_bitmap(struct wlan_objmgr_psoc *psoc,
651*5113495bSYour Name 		pmo_get_pause_bitmap handler)
652*5113495bSYour Name {
653*5113495bSYour Name 	struct pmo_psoc_priv_obj *psoc_ctx;
654*5113495bSYour Name 	QDF_STATUS status;
655*5113495bSYour Name 
656*5113495bSYour Name 	if (!psoc) {
657*5113495bSYour Name 		pmo_err("psoc is null");
658*5113495bSYour Name 		return QDF_STATUS_E_NULL_VALUE;
659*5113495bSYour Name 	}
660*5113495bSYour Name 
661*5113495bSYour Name 	if (!handler) {
662*5113495bSYour Name 		pmo_err("pmo_get_pause_bitmap is null");
663*5113495bSYour Name 		return QDF_STATUS_E_NULL_VALUE;
664*5113495bSYour Name 	}
665*5113495bSYour Name 
666*5113495bSYour Name 	status = pmo_psoc_get_ref(psoc);
667*5113495bSYour Name 	if (status != QDF_STATUS_SUCCESS) {
668*5113495bSYour Name 		pmo_err("pmo cannot get the reference out of psoc");
669*5113495bSYour Name 		return status;
670*5113495bSYour Name 	}
671*5113495bSYour Name 
672*5113495bSYour Name 	pmo_psoc_with_ctx(psoc, psoc_ctx) {
673*5113495bSYour Name 		psoc_ctx->get_pause_bitmap = handler;
674*5113495bSYour Name 	}
675*5113495bSYour Name 
676*5113495bSYour Name 	pmo_psoc_put_ref(psoc);
677*5113495bSYour Name 
678*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
679*5113495bSYour Name }
680*5113495bSYour Name 
pmo_unregister_get_pause_bitmap(struct wlan_objmgr_psoc * psoc)681*5113495bSYour Name QDF_STATUS pmo_unregister_get_pause_bitmap(struct wlan_objmgr_psoc *psoc)
682*5113495bSYour Name {
683*5113495bSYour Name 	struct pmo_psoc_priv_obj *psoc_ctx;
684*5113495bSYour Name 	QDF_STATUS status;
685*5113495bSYour Name 
686*5113495bSYour Name 	if (!psoc) {
687*5113495bSYour Name 		pmo_err("psoc is null");
688*5113495bSYour Name 		return QDF_STATUS_E_NULL_VALUE;
689*5113495bSYour Name 	}
690*5113495bSYour Name 
691*5113495bSYour Name 	status = pmo_psoc_get_ref(psoc);
692*5113495bSYour Name 	if (status != QDF_STATUS_SUCCESS) {
693*5113495bSYour Name 		pmo_err("pmo cannot get the reference out of psoc");
694*5113495bSYour Name 		return status;
695*5113495bSYour Name 	}
696*5113495bSYour Name 
697*5113495bSYour Name 	pmo_psoc_with_ctx(psoc, psoc_ctx) {
698*5113495bSYour Name 		psoc_ctx->get_pause_bitmap = NULL;
699*5113495bSYour Name 	}
700*5113495bSYour Name 
701*5113495bSYour Name 	pmo_psoc_put_ref(psoc);
702*5113495bSYour Name 
703*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
704*5113495bSYour Name }
705*5113495bSYour Name 
pmo_register_is_device_in_low_pwr_mode(struct wlan_objmgr_psoc * psoc,pmo_is_device_in_low_pwr_mode handler)706*5113495bSYour Name QDF_STATUS pmo_register_is_device_in_low_pwr_mode(struct wlan_objmgr_psoc *psoc,
707*5113495bSYour Name 		pmo_is_device_in_low_pwr_mode handler)
708*5113495bSYour Name {
709*5113495bSYour Name 	struct pmo_psoc_priv_obj *psoc_ctx;
710*5113495bSYour Name 	QDF_STATUS status;
711*5113495bSYour Name 
712*5113495bSYour Name 	if (!psoc) {
713*5113495bSYour Name 		pmo_err("psoc is null");
714*5113495bSYour Name 		return QDF_STATUS_E_NULL_VALUE;
715*5113495bSYour Name 	}
716*5113495bSYour Name 
717*5113495bSYour Name 	if (!handler) {
718*5113495bSYour Name 		pmo_err("pmo_get_pause_bitmap is null");
719*5113495bSYour Name 		return QDF_STATUS_E_NULL_VALUE;
720*5113495bSYour Name 	}
721*5113495bSYour Name 
722*5113495bSYour Name 	status = pmo_psoc_get_ref(psoc);
723*5113495bSYour Name 	if (status != QDF_STATUS_SUCCESS) {
724*5113495bSYour Name 		pmo_err("pmo cannot get the reference out of psoc");
725*5113495bSYour Name 		return status;
726*5113495bSYour Name 	}
727*5113495bSYour Name 
728*5113495bSYour Name 	pmo_psoc_with_ctx(psoc, psoc_ctx) {
729*5113495bSYour Name 		psoc_ctx->is_device_in_low_pwr_mode = handler;
730*5113495bSYour Name 	}
731*5113495bSYour Name 
732*5113495bSYour Name 	pmo_psoc_put_ref(psoc);
733*5113495bSYour Name 
734*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
735*5113495bSYour Name }
736*5113495bSYour Name 
737*5113495bSYour Name QDF_STATUS
pmo_unregister_is_device_in_low_pwr_mode(struct wlan_objmgr_psoc * psoc)738*5113495bSYour Name pmo_unregister_is_device_in_low_pwr_mode(struct wlan_objmgr_psoc *psoc)
739*5113495bSYour Name {
740*5113495bSYour Name 	struct pmo_psoc_priv_obj *psoc_ctx;
741*5113495bSYour Name 	QDF_STATUS status;
742*5113495bSYour Name 
743*5113495bSYour Name 	if (!psoc) {
744*5113495bSYour Name 		pmo_err("psoc is null");
745*5113495bSYour Name 		return QDF_STATUS_E_NULL_VALUE;
746*5113495bSYour Name 	}
747*5113495bSYour Name 
748*5113495bSYour Name 	status = pmo_psoc_get_ref(psoc);
749*5113495bSYour Name 	if (status != QDF_STATUS_SUCCESS) {
750*5113495bSYour Name 		pmo_err("pmo cannot get the reference out of psoc");
751*5113495bSYour Name 		return status;
752*5113495bSYour Name 	}
753*5113495bSYour Name 
754*5113495bSYour Name 	pmo_psoc_with_ctx(psoc, psoc_ctx) {
755*5113495bSYour Name 		psoc_ctx->is_device_in_low_pwr_mode = NULL;
756*5113495bSYour Name 	}
757*5113495bSYour Name 
758*5113495bSYour Name 	pmo_psoc_put_ref(psoc);
759*5113495bSYour Name 
760*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
761*5113495bSYour Name }
762*5113495bSYour Name 
pmo_register_get_dtim_period_callback(struct wlan_objmgr_psoc * psoc,pmo_get_dtim_period handler)763*5113495bSYour Name QDF_STATUS pmo_register_get_dtim_period_callback(struct wlan_objmgr_psoc *psoc,
764*5113495bSYour Name 						 pmo_get_dtim_period handler)
765*5113495bSYour Name {
766*5113495bSYour Name 	struct pmo_psoc_priv_obj *psoc_ctx;
767*5113495bSYour Name 	QDF_STATUS status;
768*5113495bSYour Name 
769*5113495bSYour Name 	if (!psoc) {
770*5113495bSYour Name 		pmo_err("psoc is null");
771*5113495bSYour Name 		return QDF_STATUS_E_NULL_VALUE;
772*5113495bSYour Name 	}
773*5113495bSYour Name 
774*5113495bSYour Name 	if (!handler) {
775*5113495bSYour Name 		pmo_err("pmo_get_dtim_period is null");
776*5113495bSYour Name 		return QDF_STATUS_E_NULL_VALUE;
777*5113495bSYour Name 	}
778*5113495bSYour Name 
779*5113495bSYour Name 	status = pmo_psoc_get_ref(psoc);
780*5113495bSYour Name 	if (status != QDF_STATUS_SUCCESS) {
781*5113495bSYour Name 		pmo_err("pmo cannot get the reference out of psoc");
782*5113495bSYour Name 		return status;
783*5113495bSYour Name 	}
784*5113495bSYour Name 
785*5113495bSYour Name 	pmo_psoc_with_ctx(psoc, psoc_ctx) {
786*5113495bSYour Name 		psoc_ctx->get_dtim_period = handler;
787*5113495bSYour Name 	}
788*5113495bSYour Name 	pmo_psoc_put_ref(psoc);
789*5113495bSYour Name 
790*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
791*5113495bSYour Name }
792*5113495bSYour Name 
793*5113495bSYour Name QDF_STATUS
pmo_unregister_get_dtim_period_callback(struct wlan_objmgr_psoc * psoc)794*5113495bSYour Name pmo_unregister_get_dtim_period_callback(struct wlan_objmgr_psoc *psoc)
795*5113495bSYour Name {
796*5113495bSYour Name 	struct pmo_psoc_priv_obj *psoc_ctx;
797*5113495bSYour Name 	QDF_STATUS status;
798*5113495bSYour Name 
799*5113495bSYour Name 	if (!psoc) {
800*5113495bSYour Name 		pmo_err("psoc is null");
801*5113495bSYour Name 		return QDF_STATUS_E_NULL_VALUE;
802*5113495bSYour Name 	}
803*5113495bSYour Name 
804*5113495bSYour Name 	status = pmo_psoc_get_ref(psoc);
805*5113495bSYour Name 	if (status != QDF_STATUS_SUCCESS) {
806*5113495bSYour Name 		pmo_err("pmo cannot get the reference out of psoc");
807*5113495bSYour Name 		return status;
808*5113495bSYour Name 	}
809*5113495bSYour Name 
810*5113495bSYour Name 	pmo_psoc_with_ctx(psoc, psoc_ctx) {
811*5113495bSYour Name 		psoc_ctx->get_dtim_period = NULL;
812*5113495bSYour Name 	}
813*5113495bSYour Name 	pmo_psoc_put_ref(psoc);
814*5113495bSYour Name 
815*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
816*5113495bSYour Name }
817*5113495bSYour Name 
818*5113495bSYour Name QDF_STATUS
pmo_register_get_beacon_interval_callback(struct wlan_objmgr_psoc * psoc,pmo_get_beacon_interval handler)819*5113495bSYour Name pmo_register_get_beacon_interval_callback(struct wlan_objmgr_psoc *psoc,
820*5113495bSYour Name 					  pmo_get_beacon_interval handler)
821*5113495bSYour Name {
822*5113495bSYour Name 	struct pmo_psoc_priv_obj *psoc_ctx;
823*5113495bSYour Name 	QDF_STATUS status;
824*5113495bSYour Name 
825*5113495bSYour Name 	if (!psoc) {
826*5113495bSYour Name 		pmo_err("psoc is null");
827*5113495bSYour Name 		return QDF_STATUS_E_NULL_VALUE;
828*5113495bSYour Name 	}
829*5113495bSYour Name 
830*5113495bSYour Name 	if (!handler) {
831*5113495bSYour Name 		pmo_err("pmo_get_beacon_interval is null");
832*5113495bSYour Name 		return QDF_STATUS_E_NULL_VALUE;
833*5113495bSYour Name 	}
834*5113495bSYour Name 
835*5113495bSYour Name 	status = pmo_psoc_get_ref(psoc);
836*5113495bSYour Name 	if (status != QDF_STATUS_SUCCESS) {
837*5113495bSYour Name 		pmo_err("pmo cannot get the reference out of psoc");
838*5113495bSYour Name 		return status;
839*5113495bSYour Name 	}
840*5113495bSYour Name 
841*5113495bSYour Name 	pmo_psoc_with_ctx(psoc, psoc_ctx) {
842*5113495bSYour Name 		psoc_ctx->get_beacon_interval = handler;
843*5113495bSYour Name 	}
844*5113495bSYour Name 	pmo_psoc_put_ref(psoc);
845*5113495bSYour Name 
846*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
847*5113495bSYour Name }
848*5113495bSYour Name 
849*5113495bSYour Name QDF_STATUS
pmo_unregister_get_beacon_interval_callback(struct wlan_objmgr_psoc * psoc)850*5113495bSYour Name pmo_unregister_get_beacon_interval_callback(struct wlan_objmgr_psoc *psoc)
851*5113495bSYour Name {
852*5113495bSYour Name 	struct pmo_psoc_priv_obj *psoc_ctx;
853*5113495bSYour Name 	QDF_STATUS status;
854*5113495bSYour Name 
855*5113495bSYour Name 	if (!psoc) {
856*5113495bSYour Name 		pmo_err("psoc is null");
857*5113495bSYour Name 		return QDF_STATUS_E_NULL_VALUE;
858*5113495bSYour Name 	}
859*5113495bSYour Name 
860*5113495bSYour Name 	status = pmo_psoc_get_ref(psoc);
861*5113495bSYour Name 	if (status != QDF_STATUS_SUCCESS) {
862*5113495bSYour Name 		pmo_err("pmo cannot get the reference out of psoc");
863*5113495bSYour Name 		return status;
864*5113495bSYour Name 	}
865*5113495bSYour Name 
866*5113495bSYour Name 	pmo_psoc_with_ctx(psoc, psoc_ctx) {
867*5113495bSYour Name 		psoc_ctx->get_beacon_interval = NULL;
868*5113495bSYour Name 	}
869*5113495bSYour Name 	pmo_psoc_put_ref(psoc);
870*5113495bSYour Name 
871*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
872*5113495bSYour Name }
873*5113495bSYour Name 
874*5113495bSYour Name bool
wlan_pmo_get_sap_mode_bus_suspend(struct wlan_objmgr_psoc * psoc)875*5113495bSYour Name wlan_pmo_get_sap_mode_bus_suspend(struct wlan_objmgr_psoc *psoc)
876*5113495bSYour Name {
877*5113495bSYour Name 	struct pmo_psoc_priv_obj *pmo_psoc_ctx = pmo_psoc_get_priv(psoc);
878*5113495bSYour Name 
879*5113495bSYour Name 	if (!pmo_psoc_ctx)
880*5113495bSYour Name 		return false;
881*5113495bSYour Name 
882*5113495bSYour Name 	return pmo_psoc_ctx->psoc_cfg.is_bus_suspend_enabled_in_sap_mode;
883*5113495bSYour Name }
884*5113495bSYour Name 
885*5113495bSYour Name bool
wlan_pmo_get_go_mode_bus_suspend(struct wlan_objmgr_psoc * psoc)886*5113495bSYour Name wlan_pmo_get_go_mode_bus_suspend(struct wlan_objmgr_psoc *psoc)
887*5113495bSYour Name {
888*5113495bSYour Name 	struct pmo_psoc_priv_obj *pmo_psoc_ctx = pmo_psoc_get_priv(psoc);
889*5113495bSYour Name 
890*5113495bSYour Name 	if (!pmo_psoc_ctx)
891*5113495bSYour Name 		return false;
892*5113495bSYour Name 
893*5113495bSYour Name 	return pmo_psoc_ctx->psoc_cfg.is_bus_suspend_enabled_in_go_mode;
894*5113495bSYour Name }
895*5113495bSYour Name 
wlan_pmo_no_op_on_page_fault(struct wlan_objmgr_psoc * psoc)896*5113495bSYour Name bool wlan_pmo_no_op_on_page_fault(struct wlan_objmgr_psoc *psoc)
897*5113495bSYour Name {
898*5113495bSYour Name 	return pmo_no_op_on_page_fault(psoc);
899*5113495bSYour Name }
900*5113495bSYour Name 
wlan_pmo_enable_ssr_on_page_fault(struct wlan_objmgr_psoc * psoc)901*5113495bSYour Name bool wlan_pmo_enable_ssr_on_page_fault(struct wlan_objmgr_psoc *psoc)
902*5113495bSYour Name {
903*5113495bSYour Name 	return pmo_enable_ssr_on_page_fault(psoc);
904*5113495bSYour Name }
905*5113495bSYour Name 
906*5113495bSYour Name uint8_t
wlan_pmo_get_min_pagefault_wakeups_for_action(struct wlan_objmgr_psoc * psoc)907*5113495bSYour Name wlan_pmo_get_min_pagefault_wakeups_for_action(struct wlan_objmgr_psoc *psoc)
908*5113495bSYour Name {
909*5113495bSYour Name 	return pmo_get_min_pagefault_wakeups_for_action(psoc);
910*5113495bSYour Name }
911*5113495bSYour Name 
912*5113495bSYour Name uint32_t
wlan_pmo_get_interval_for_pagefault_wakeup_counts(struct wlan_objmgr_psoc * psoc)913*5113495bSYour Name wlan_pmo_get_interval_for_pagefault_wakeup_counts(struct wlan_objmgr_psoc *psoc)
914*5113495bSYour Name {
915*5113495bSYour Name 	return pmo_get_interval_for_pagefault_wakeup_counts(psoc);
916*5113495bSYour Name }
917*5113495bSYour Name 
wlan_pmo_get_listen_interval(struct wlan_objmgr_vdev * vdev,uint32_t * listen_interval)918*5113495bSYour Name QDF_STATUS wlan_pmo_get_listen_interval(struct wlan_objmgr_vdev *vdev,
919*5113495bSYour Name 					uint32_t *listen_interval)
920*5113495bSYour Name {
921*5113495bSYour Name 	return pmo_core_get_listen_interval(vdev, listen_interval);
922*5113495bSYour Name }
923*5113495bSYour Name 
wlan_pmo_set_ps_params(struct wlan_objmgr_vdev * vdev,struct pmo_ps_params * ps_params)924*5113495bSYour Name void wlan_pmo_set_ps_params(struct wlan_objmgr_vdev *vdev,
925*5113495bSYour Name 			    struct pmo_ps_params *ps_params)
926*5113495bSYour Name {
927*5113495bSYour Name 	pmo_core_vdev_set_ps_params(vdev, ps_params);
928*5113495bSYour Name }
929*5113495bSYour Name 
wlan_pmo_get_ps_params(struct wlan_objmgr_vdev * vdev,struct pmo_ps_params * ps_params)930*5113495bSYour Name QDF_STATUS wlan_pmo_get_ps_params(struct wlan_objmgr_vdev *vdev,
931*5113495bSYour Name 				  struct pmo_ps_params *ps_params)
932*5113495bSYour Name {
933*5113495bSYour Name 	return pmo_core_vdev_get_ps_params(vdev, ps_params);
934*5113495bSYour Name }
935