1 /*
2  * Copyright (c) 2017-2018, 2020-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: Declare suspend / resume related API's
21  */
22 
23 #ifndef _WLAN_PMO_SUSPEND_RESUME_H_
24 #define _WLAN_PMO_SUSPEND_RESUME_H_
25 
26 #ifdef WLAN_POWER_MANAGEMENT_OFFLOAD
27 
28 #include "wlan_pmo_common_public_struct.h"
29 #include "wlan_pmo_wow.h"
30 
31 /**
32  * pmo_core_configure_dynamic_wake_events(): configure dynamic wake events
33  * @psoc: objmgr psoc handle
34  *
35  * Some wake events need to be enabled dynamically. Control those here.
36  *
37  * Return: none
38  */
39 void pmo_core_configure_dynamic_wake_events(struct wlan_objmgr_psoc *psoc);
40 
41 /**
42  * pmo_core_get_wow_bus_suspend(): API to get wow bus is suspended or not
43  * @psoc: objmgr psoc handle
44  *
45  * Return: True if bus suspende else false
46  */
pmo_core_get_wow_bus_suspend(struct wlan_objmgr_psoc * psoc)47 static inline bool pmo_core_get_wow_bus_suspend(struct wlan_objmgr_psoc *psoc)
48 {
49 	bool value = false;
50 	struct pmo_psoc_priv_obj *psoc_ctx;
51 
52 	pmo_psoc_with_ctx(psoc, psoc_ctx) {
53 		value = psoc_ctx->wow.is_wow_bus_suspended;
54 	}
55 
56 	return value;
57 }
58 
59 /**
60  * pmo_core_psoc_user_space_suspend_req() -  Core handle user space suspend req
61  * @psoc: objmgr psoc handle
62  * @type: type of suspend
63  *
64  * Pmo core Handles user space suspend request for psoc
65  *
66  * Return: QDF status
67  */
68 QDF_STATUS pmo_core_psoc_user_space_suspend_req(struct wlan_objmgr_psoc *psoc,
69 		enum qdf_suspend_type type);
70 
71 /**
72  * pmo_core_psoc_user_space_resume_req() - Core handle user space resume req
73  * @psoc: objmgr psoc handle
74  * @type: type of suspend from resume required
75  *
76  * Pmo core Handles user space resume request for psoc
77  *
78  * Return: QDF status
79  */
80 QDF_STATUS pmo_core_psoc_user_space_resume_req(struct wlan_objmgr_psoc *psoc,
81 		enum qdf_suspend_type type);
82 
83 /**
84  * pmo_core_psoc_bus_suspend_req(): handles bus suspend for psoc
85  * @psoc: objmgr psoc
86  * @type: is this suspend part of runtime suspend or system suspend?
87  * @wow_params: collection of wow enable override parameters
88  *
89  * Bails if a scan is in progress.
90  * Calls the appropriate handlers based on configuration and event.
91  *
92  * Return: QDF_STATUS_SUCCESS for success or error code
93  */
94 QDF_STATUS pmo_core_psoc_bus_suspend_req(struct wlan_objmgr_psoc *psoc,
95 		enum qdf_suspend_type type,
96 		struct pmo_wow_enable_params *wow_params);
97 
98 #ifdef FEATURE_RUNTIME_PM
99 /**
100  * pmo_core_psoc_bus_runtime_suspend(): handles bus runtime suspend
101  * @psoc: objmgr psoc
102  * @pld_cb: callback to do link auto suspend
103  *
104  * Suspend the wlan bus without apps suspend.
105  *
106  * Return: QDF_STATUS_SUCCESS for success or error code
107  */
108 QDF_STATUS pmo_core_psoc_bus_runtime_suspend(struct wlan_objmgr_psoc *psoc,
109 					     pmo_pld_auto_suspend_cb pld_cb);
110 
111 /**
112  * pmo_core_psoc_bus_runtime_resume(): handles bus runtime resume
113  * @psoc: objmgr psoc
114  * @pld_cb: callback to do link auto resume
115  *
116  * Resume the wlan bus from runtime suspend.
117  *
118  * Return: QDF_STATUS_SUCCESS for success or error code
119  */
120 QDF_STATUS pmo_core_psoc_bus_runtime_resume(struct wlan_objmgr_psoc *psoc,
121 					     pmo_pld_auto_resume_cb pld_cb);
122 #endif
123 
124 /**
125  * pmo_core_psoc_suspend_target() -Send suspend target command
126  * @psoc: objmgr psoc handle
127  * @disable_target_intr: disable target interrupt
128  *
129  * Return: QDF_STATUS_SUCCESS for success or error code
130  */
131 QDF_STATUS pmo_core_psoc_suspend_target(struct wlan_objmgr_psoc *psoc,
132 		int disable_target_intr);
133 
134 /**
135  * pmo_core_psoc_bus_resume_req() - handle bus resume request for psoc
136  * @psoc: objmgr psoc handle
137  * @type: is this suspend part of runtime suspend or system suspend?
138  *
139  * Return:QDF_STATUS_SUCCESS on success else error code
140  */
141 QDF_STATUS pmo_core_psoc_bus_resume_req(struct wlan_objmgr_psoc *psoc,
142 		enum qdf_suspend_type type);
143 
144 /**
145  * pmo_core_vdev_set_restore_dtim() - vdev dtim restore setting value
146  * @vdev: objmgr vdev handle
147  * @value: dtim restore policy value
148  *
149  * Return: None
150  */
151 static inline
pmo_core_vdev_set_restore_dtim(struct wlan_objmgr_vdev * vdev,bool value)152 void pmo_core_vdev_set_restore_dtim(struct wlan_objmgr_vdev *vdev,
153 				    bool value)
154 {
155 	struct pmo_vdev_priv_obj *vdev_ctx;
156 
157 	vdev_ctx = pmo_vdev_get_priv(vdev);
158 	qdf_spin_lock_bh(&vdev_ctx->pmo_vdev_lock);
159 	vdev_ctx->restore_dtim_setting = value;
160 	qdf_spin_unlock_bh(&vdev_ctx->pmo_vdev_lock);
161 }
162 
163 /**
164  * pmo_core_vdev_get_restore_dtim() - Get vdev restore dtim setting
165  * @vdev: objmgr vdev handle
166  *
167  * Return: dtim restore policy
168  */
169 static inline
pmo_core_vdev_get_restore_dtim(struct wlan_objmgr_vdev * vdev)170 bool pmo_core_vdev_get_restore_dtim(struct wlan_objmgr_vdev *vdev)
171 {
172 	bool value;
173 	struct pmo_vdev_priv_obj *vdev_ctx;
174 
175 	vdev_ctx = pmo_vdev_get_priv(vdev);
176 	qdf_spin_lock_bh(&vdev_ctx->pmo_vdev_lock);
177 	value = vdev_ctx->restore_dtim_setting;
178 	qdf_spin_unlock_bh(&vdev_ctx->pmo_vdev_lock);
179 
180 	return value;
181 }
182 
183 #ifdef FEATURE_WLAN_DYNAMIC_ARP_NS_OFFLOAD
184 /**
185  * pmo_core_dynamic_arp_ns_offload_enable() - Enable vdev arp/ns offload
186  * @vdev: objmgr vdev handle
187  *
188  * Return: QDF_STATUS_E_ALREADY if arp/ns offload already enable
189  */
190 static inline QDF_STATUS
pmo_core_dynamic_arp_ns_offload_enable(struct wlan_objmgr_vdev * vdev)191 pmo_core_dynamic_arp_ns_offload_enable(struct wlan_objmgr_vdev *vdev)
192 {
193 	bool value;
194 	QDF_STATUS status = QDF_STATUS_SUCCESS;
195 	struct pmo_vdev_priv_obj *vdev_ctx;
196 
197 	vdev_ctx = pmo_vdev_get_priv(vdev);
198 	qdf_spin_lock_bh(&vdev_ctx->pmo_vdev_lock);
199 	value = vdev_ctx->dyn_arp_ns_offload_disable;
200 	if (!value)
201 		status = QDF_STATUS_E_ALREADY;
202 	else
203 		vdev_ctx->dyn_arp_ns_offload_disable = false;
204 	qdf_spin_unlock_bh(&vdev_ctx->pmo_vdev_lock);
205 
206 	return status;
207 }
208 
209 /**
210  * pmo_core_dynamic_arp_ns_offload_disable() - Disable vdev arp/ns offload
211  * @vdev: objmgr vdev handle
212  *
213  * Return: QDF_STATUS_E_ALREADY if arp/ns offload already disable
214  */
215 static inline QDF_STATUS
pmo_core_dynamic_arp_ns_offload_disable(struct wlan_objmgr_vdev * vdev)216 pmo_core_dynamic_arp_ns_offload_disable(struct wlan_objmgr_vdev *vdev)
217 {
218 	bool value;
219 	QDF_STATUS status = QDF_STATUS_SUCCESS;
220 	struct pmo_vdev_priv_obj *vdev_ctx;
221 
222 	vdev_ctx = pmo_vdev_get_priv(vdev);
223 	qdf_spin_lock_bh(&vdev_ctx->pmo_vdev_lock);
224 	value = vdev_ctx->dyn_arp_ns_offload_disable;
225 	if (value)
226 		status = QDF_STATUS_E_ALREADY;
227 	else
228 		vdev_ctx->dyn_arp_ns_offload_disable = true;
229 	qdf_spin_unlock_bh(&vdev_ctx->pmo_vdev_lock);
230 
231 	return status;
232 }
233 
234 /**
235  * pmo_core_get_dynamic_arp_ns_offload_disable() - Get arp/ns offload state
236  * @vdev: objmgr vdev handle
237  *
238  * Return: true if vdev arp/ns offload is disable
239  */
240 static inline bool
pmo_core_get_dynamic_arp_ns_offload_disable(struct wlan_objmgr_vdev * vdev)241 pmo_core_get_dynamic_arp_ns_offload_disable(struct wlan_objmgr_vdev *vdev)
242 {
243 	bool value;
244 	struct pmo_vdev_priv_obj *vdev_ctx;
245 
246 	vdev_ctx = pmo_vdev_get_priv(vdev);
247 	qdf_spin_lock_bh(&vdev_ctx->pmo_vdev_lock);
248 	value = vdev_ctx->dyn_arp_ns_offload_disable;
249 	qdf_spin_unlock_bh(&vdev_ctx->pmo_vdev_lock);
250 
251 	return value;
252 }
253 
254 /**
255  * pmo_core_dynamic_arp_ns_offload_runtime_prevent() - Prevent runtime suspend
256  * @vdev: objmgr vdev handle
257  *
258  * API to prevent runtime suspend happen when arp/ns offload is disable
259  *
260  * Return: None
261  */
262 static inline void
pmo_core_dynamic_arp_ns_offload_runtime_prevent(struct wlan_objmgr_vdev * vdev)263 pmo_core_dynamic_arp_ns_offload_runtime_prevent(struct wlan_objmgr_vdev *vdev)
264 {
265 	struct pmo_vdev_priv_obj *vdev_ctx;
266 
267 	vdev_ctx = pmo_vdev_get_priv(vdev);
268 	qdf_runtime_pm_prevent_suspend(&vdev_ctx->dyn_arp_ns_offload_rt_lock);
269 }
270 
271 /**
272  * pmo_core_dynamic_arp_ns_offload_runtime_allow() - Allow runtime suspend
273  * @vdev: objmgr vdev handle
274  *
275  * API to allow runtime suspend happen when arp/ns offload is enable
276  *
277  * Return: None
278  */
279 static inline void
pmo_core_dynamic_arp_ns_offload_runtime_allow(struct wlan_objmgr_vdev * vdev)280 pmo_core_dynamic_arp_ns_offload_runtime_allow(struct wlan_objmgr_vdev *vdev)
281 {
282 	struct pmo_vdev_priv_obj *vdev_ctx;
283 
284 	vdev_ctx = pmo_vdev_get_priv(vdev);
285 	qdf_runtime_pm_allow_suspend(&vdev_ctx->dyn_arp_ns_offload_rt_lock);
286 }
287 #endif
288 
289 /**
290  * pmo_core_psoc_update_power_save_mode() - update power save mode
291  * @psoc: objmgr psoc handle
292  * @value:describe vdev power save mode
293  *
294  * Return: None
295  */
296 static inline void
pmo_core_psoc_update_power_save_mode(struct wlan_objmgr_psoc * psoc,uint8_t value)297 pmo_core_psoc_update_power_save_mode(struct wlan_objmgr_psoc *psoc,
298 				     uint8_t value)
299 {
300 	struct pmo_psoc_priv_obj *psoc_ctx;
301 
302 	pmo_psoc_with_ctx(psoc, psoc_ctx) {
303 		psoc_ctx->psoc_cfg.power_save_mode = value;
304 	}
305 }
306 
307 /**
308  * pmo_core_psoc_get_power_save_mode() - Get psoc power save mode
309  * @psoc: objmgr psoc handle
310  *
311  * Return: vdev psoc power save mode value
312  */
313 static inline uint8_t
pmo_core_psoc_get_power_save_mode(struct wlan_objmgr_psoc * psoc)314 pmo_core_psoc_get_power_save_mode(struct wlan_objmgr_psoc *psoc)
315 {
316 	uint8_t value = 0;
317 	struct pmo_psoc_priv_obj *psoc_ctx;
318 
319 	pmo_psoc_with_ctx(psoc, psoc_ctx) {
320 		value = psoc_ctx->psoc_cfg.power_save_mode;
321 	}
322 
323 	return value;
324 }
325 
326 /**
327  * pmo_core_vdev_get_pause_bitmap() - Get vdev pause bitmap
328  * @psoc_ctx: psoc priv ctx
329  * @vdev_id: vdev id
330  *
331  * Return: vdev pause bitmap
332  */
333 static inline
pmo_core_vdev_get_pause_bitmap(struct pmo_psoc_priv_obj * psoc_ctx,uint8_t vdev_id)334 uint16_t pmo_core_vdev_get_pause_bitmap(struct pmo_psoc_priv_obj *psoc_ctx,
335 		uint8_t vdev_id)
336 {
337 	uint16_t value = 0;
338 	pmo_get_pause_bitmap handler;
339 
340 	qdf_spin_lock_bh(&psoc_ctx->lock);
341 	handler = psoc_ctx->get_pause_bitmap;
342 	qdf_spin_unlock_bh(&psoc_ctx->lock);
343 
344 	if (handler)
345 		value = handler(vdev_id);
346 
347 	return value;
348 }
349 
350 /**
351  * pmo_is_vdev_in_ap_mode() - check that vdev is in ap mode or not
352  * @vdev: objmgr vdev handle
353  *
354  * Helper function to know whether given vdev is in AP mode or not.
355  *
356  * Return: True/False
357  */
358 static inline
pmo_is_vdev_in_ap_mode(struct wlan_objmgr_vdev * vdev)359 bool pmo_is_vdev_in_ap_mode(struct wlan_objmgr_vdev *vdev)
360 {
361 	enum QDF_OPMODE mode;
362 
363 	mode = pmo_get_vdev_opmode(vdev);
364 
365 	return (mode == QDF_SAP_MODE || mode == QDF_P2P_GO_MODE) == 1 ? 1 : 0;
366 }
367 
368 /**
369  * pmo_core_psoc_handle_initial_wake_up() - handle initial wake up
370  * @cb_ctx: callback context
371  *
372  * Return: None
373  */
374 void pmo_core_psoc_handle_initial_wake_up(void *cb_ctx);
375 
376 /**
377  * pmo_core_psoc_is_target_wake_up_received() - check for initial wake up
378  * @psoc: objmgr psoc handle
379  *
380  * Check if target initial wake up is received and fail PM suspend gracefully
381  *
382  * Return: -EAGAIN if initial wake up is received else 0
383  */
384 int pmo_core_psoc_is_target_wake_up_received(struct wlan_objmgr_psoc *psoc);
385 
386 /**
387  * pmo_core_psoc_clear_target_wake_up() - clear initial wake up
388  * @psoc: objmgr psoc handle
389  *
390  * Clear target initial wake up reason
391  *
392  * Return: 0 for success and negative error code for failure
393  */
394 int pmo_core_psoc_clear_target_wake_up(struct wlan_objmgr_psoc *psoc);
395 
396 /**
397  * pmo_core_psoc_target_suspend_acknowledge() - update target susspend status
398  * @context: HTC_INIT_INFO->context
399  * @wow_nack: true when wow is rejected
400  * @reason_code : WoW status reason code
401  *
402  * Return: none
403  */
404 void pmo_core_psoc_target_suspend_acknowledge(void *context, bool wow_nack,
405 					      uint16_t reason_code);
406 
407 /**
408  * pmo_core_psoc_wakeup_host_event_received() - received host wake up event
409  * @psoc: objmgr psoc handle
410  *
411  * Return: None
412  */
413 void pmo_core_psoc_wakeup_host_event_received(struct wlan_objmgr_psoc *psoc);
414 
415 /**
416  * pmo_core_config_listen_interval() - function to dynamically configure
417  * listen interval
418  * @vdev: objmgr vdev
419  * @listen_interval: new listen interval passed by user
420  *
421  * This function allows user to configure listen interval dynamically
422  *
423  * Return: QDF_STATUS
424  */
425 QDF_STATUS pmo_core_config_listen_interval(struct wlan_objmgr_vdev *vdev,
426 					   uint32_t listen_interval);
427 
428 /**
429  * pmo_core_config_modulated_dtim() - function to configure modulated dtim
430  * @vdev: objmgr vdev handle
431  * @mod_dtim: New modulated dtim value passed by user
432  *
433  * This function configures the modulated dtim in firmware
434  *
435  * Return: QDF_STATUS
436  */
437 QDF_STATUS pmo_core_config_modulated_dtim(struct wlan_objmgr_vdev *vdev,
438 					  uint32_t mod_dtim);
439 
440 /**
441  * pmo_core_txrx_suspend() - suspends TXRX
442  * @psoc: objmgr psoc handle
443  *
444  * This function disables the EXT grp irqs and drains the TX/RX pipes;
445  * this essentially suspends the TXRX activity
446  *
447  * Return: QDF_STATUS
448  */
449 QDF_STATUS pmo_core_txrx_suspend(struct wlan_objmgr_psoc *psoc);
450 
451 /**
452  * pmo_core_txrx_resume() - resumes TXRX
453  * @psoc: objmgr psoc handle
454  *
455  * This function enables the EXT grp irqs, which inturn resumes
456  * the TXRX activity
457  *
458  * Return: QDF_STATUS
459  */
460 QDF_STATUS pmo_core_txrx_resume(struct wlan_objmgr_psoc *psoc);
461 
462 /**
463  * pmo_core_config_forced_dtim() - function to configure forced dtim
464  * @vdev: objmgr vdev handle
465  * @dynamic_dtim: dynamic dtim value passed by user
466  *
467  * This function configures the forced modulated dtim in firmware
468  *
469  * Return: QDF_STATUS
470  */
471 QDF_STATUS pmo_core_config_forced_dtim(struct wlan_objmgr_vdev *vdev,
472 				       uint32_t dynamic_dtim);
473 
474 #ifdef SYSTEM_PM_CHECK
475 /**
476  * pmo_core_system_resume() - function to handle system resume notification
477  * @psoc: objmgr psoc handle
478  *
479  * Return: None
480  */
481 void pmo_core_system_resume(struct wlan_objmgr_psoc *psoc);
482 #else
pmo_core_system_resume(struct wlan_objmgr_psoc * psoc)483 static inline void pmo_core_system_resume(struct wlan_objmgr_psoc *psoc)
484 {}
485 #endif
486 #ifdef WLAN_FEATURE_IGMP_OFFLOAD
487 /**
488  * pmo_core_enable_igmp_offload() - function to offload igmp
489  * @vdev: objmgr vdev handle
490  * @pmo_igmp_req: igmp req
491  *
492  * This function to offload igmp to fw
493  *
494  * Return: QDF_STATUS
495  */
496 QDF_STATUS
497 pmo_core_enable_igmp_offload(struct wlan_objmgr_vdev *vdev,
498 			     struct pmo_igmp_offload_req *pmo_igmp_req);
499 #else
500 static inline QDF_STATUS
pmo_core_enable_igmp_offload(struct wlan_objmgr_vdev * vdev,struct pmo_igmp_offload_req * pmo_igmp_req)501 pmo_core_enable_igmp_offload(struct wlan_objmgr_vdev *vdev,
502 			     struct pmo_igmp_offload_req *pmo_igmp_req)
503 {
504 	return QDF_STATUS_SUCCESS;
505 }
506 #endif
507 
508 /**
509  * pmo_core_vdev_get_moddtim_user_enabled() - Get vdev if mod dtim set
510  * by user
511  * @vdev: objmgr vdev handle
512  *
513  * Return: mod dtim set by user or not
514  */
515 static inline
pmo_core_vdev_get_moddtim_user_enabled(struct wlan_objmgr_vdev * vdev)516 bool pmo_core_vdev_get_moddtim_user_enabled(struct wlan_objmgr_vdev *vdev)
517 {
518 	bool value;
519 	struct pmo_vdev_priv_obj *vdev_ctx;
520 
521 	vdev_ctx = pmo_vdev_get_priv(vdev);
522 	qdf_spin_lock_bh(&vdev_ctx->pmo_vdev_lock);
523 	value = vdev_ctx->dyn_modulated_dtim_enabled;
524 	qdf_spin_unlock_bh(&vdev_ctx->pmo_vdev_lock);
525 
526 	return value;
527 }
528 
529 /**
530  * pmo_core_vdev_set_moddtim_user_enabled() - vdev moddtim user enable setting
531  * @vdev: objmgr vdev handle
532  * @value: vdev moddtim user enable or not
533  *
534  * Return: None
535  */
536 static inline
pmo_core_vdev_set_moddtim_user_enabled(struct wlan_objmgr_vdev * vdev,bool value)537 void pmo_core_vdev_set_moddtim_user_enabled(struct wlan_objmgr_vdev *vdev,
538 					    bool value)
539 {
540 	struct pmo_vdev_priv_obj *vdev_ctx;
541 
542 	vdev_ctx = pmo_vdev_get_priv(vdev);
543 	qdf_spin_lock_bh(&vdev_ctx->pmo_vdev_lock);
544 	vdev_ctx->dyn_modulated_dtim_enabled = value;
545 	qdf_spin_unlock_bh(&vdev_ctx->pmo_vdev_lock);
546 }
547 
548 /**
549  * pmo_core_vdev_get_moddtim_user_active() - Get vdev if moddtim user is
550  * sent to fw
551  * @vdev: objmgr vdev handle
552  *
553  * Return: moddtim user is sent to fw or not
554  */
555 static inline
pmo_core_vdev_get_moddtim_user_active(struct wlan_objmgr_vdev * vdev)556 bool pmo_core_vdev_get_moddtim_user_active(struct wlan_objmgr_vdev *vdev)
557 {
558 	bool retval;
559 	struct pmo_vdev_priv_obj *vdev_ctx;
560 
561 	vdev_ctx = pmo_vdev_get_priv(vdev);
562 	qdf_spin_lock_bh(&vdev_ctx->pmo_vdev_lock);
563 	retval = vdev_ctx->is_dyn_modulated_dtim_activated;
564 	qdf_spin_unlock_bh(&vdev_ctx->pmo_vdev_lock);
565 
566 	return retval;
567 }
568 
569 /**
570  * pmo_core_vdev_set_moddtim_user_active() - vdev moddtim user active setting
571  * @vdev: objmgr vdev handle
572  * @value: vdev moddtim user active or not
573  *
574  * Return: None
575  */
576 static inline
pmo_core_vdev_set_moddtim_user_active(struct wlan_objmgr_vdev * vdev,bool value)577 void pmo_core_vdev_set_moddtim_user_active(struct wlan_objmgr_vdev *vdev,
578 					   bool value)
579 {
580 	struct pmo_vdev_priv_obj *vdev_ctx;
581 
582 	vdev_ctx = pmo_vdev_get_priv(vdev);
583 	qdf_spin_lock_bh(&vdev_ctx->pmo_vdev_lock);
584 	vdev_ctx->is_dyn_modulated_dtim_activated = value;
585 	qdf_spin_unlock_bh(&vdev_ctx->pmo_vdev_lock);
586 }
587 
588 /**
589  * pmo_core_vdev_get_moddtim_user() - Get vdev moddtim set by user
590  * @vdev: objmgr vdev handle
591  *
592  * Return: moddtim value set by user
593  */
594 static inline
pmo_core_vdev_get_moddtim_user(struct wlan_objmgr_vdev * vdev)595 uint32_t pmo_core_vdev_get_moddtim_user(struct wlan_objmgr_vdev *vdev)
596 {
597 	uint32_t value;
598 	struct pmo_vdev_priv_obj *vdev_ctx;
599 
600 	vdev_ctx = pmo_vdev_get_priv(vdev);
601 	qdf_spin_lock_bh(&vdev_ctx->pmo_vdev_lock);
602 	value = vdev_ctx->dyn_modulated_dtim;
603 	qdf_spin_unlock_bh(&vdev_ctx->pmo_vdev_lock);
604 
605 	return value;
606 }
607 
608 /**
609  * pmo_core_vdev_set_moddtim_user() - vdev moddtim user value setting
610  * @vdev: objmgr vdev handle
611  * @value: vdev moddtim value set by user
612  *
613  * Return: None
614  */
615 static inline
pmo_core_vdev_set_moddtim_user(struct wlan_objmgr_vdev * vdev,uint32_t value)616 void pmo_core_vdev_set_moddtim_user(struct wlan_objmgr_vdev *vdev,
617 				    uint32_t value)
618 {
619 	struct pmo_vdev_priv_obj *vdev_ctx;
620 
621 	vdev_ctx = pmo_vdev_get_priv(vdev);
622 	qdf_spin_lock_bh(&vdev_ctx->pmo_vdev_lock);
623 	vdev_ctx->dyn_modulated_dtim = value;
624 	qdf_spin_unlock_bh(&vdev_ctx->pmo_vdev_lock);
625 }
626 #endif /* WLAN_POWER_MANAGEMENT_OFFLOAD */
627 
628 #endif /* end  of _WLAN_PMO_SUSPEND_RESUME_H_ */
629