1 /*
2 * Copyright (c) 2017-2020 The Linux Foundation. All rights reserved.
3 * Copyright (c) 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 static configuration on vdev attach
21 */
22
23 #ifndef _WLAN_PMO_STATIC_CONFIG_H_
24 #define _WLAN_PMO_STATIC_CONFIG_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_register_wow_wakeup_events() - register vdev specific wake events with fw
33 * @vdev: objmgr vdev
34 *
35 * WoW wake up event rule is following:
36 * 1) STA mode and P2P CLI mode wake up events are same
37 * 2) SAP mode and P2P GO mode wake up events are same
38 * 3) IBSS mode wake events are same as STA mode plus WOW_BEACON_EVENT
39 *
40 * Return: none
41 */
42 void pmo_register_wow_wakeup_events(struct wlan_objmgr_vdev *vdev);
43
44 /**
45 * pmo_register_wow_default_patterns() - register default wow patterns with fw
46 * @vdev: objmgr vdev
47 *
48 * WoW default wake up pattern rule is:
49 * - For STA & P2P CLI mode register for same STA specific wow patterns
50 * - For SAP/P2P GO & IBSS mode register for same SAP specific wow patterns
51 *
52 * Return: none
53 */
54 void pmo_register_wow_default_patterns(struct wlan_objmgr_vdev *vdev);
55
56 /**
57 * pmo_register_action_frame_patterns() - register action frame map to fw
58 * @vdev: objmgr vdev
59 * @suspend_type: suspend mode runtime pm suspend or normal suspend.
60 *
61 * This is called to push action frames wow patterns from local
62 * cache to firmware.
63 *
64 * Return: QDF_STATUS
65 */
66 QDF_STATUS
67 pmo_register_action_frame_patterns(struct wlan_objmgr_vdev *vdev,
68 enum qdf_suspend_type suspend_type);
69
70 /**
71 * pmo_clear_action_frame_patterns() - clear the action frame
72 * pattern bitmap in firmware
73 * @vdev: objmgr vdev
74 *
75 * Return: QDF_STATUS
76 */
77 QDF_STATUS pmo_clear_action_frame_patterns(struct wlan_objmgr_vdev *vdev);
78
79 /**
80 * pmo_set_wow_event_bitmap() - Assign bitmask with wow event
81 * @event: wow event
82 * @wow_bitmap_size: wow bitmask size
83 * @bitmask: wow bitmask field
84 *
85 * Return: none
86 */
87 void pmo_set_wow_event_bitmap(WOW_WAKE_EVENT_TYPE event,
88 uint32_t wow_bitmap_size,
89 uint32_t *bitmask);
90
91 /**
92 * pmo_set_sta_wow_bitmask() - set predefined STA wow wakeup events
93 * @bitmask: bitmask field
94 * @wow_bitmask_size: bitmask field size
95 *
96 * Return: none
97 */
98 void pmo_set_sta_wow_bitmask(uint32_t *bitmask, uint32_t wow_bitmask_size);
99
100 /**
101 * pmo_set_sap_wow_bitmask() - set predefined SAP wow wakeup events
102 * @bitmask: bitmask field
103 * @wow_bitmask_size: bitmask field size
104 *
105 * Return: none
106 */
107 void pmo_set_sap_wow_bitmask(uint32_t *bitmask, uint32_t wow_bitmask_size);
108
109 /**
110 * pmo_core_vdev_set_ps_params() - set vdev ps_params
111 * @vdev: objmgr vdev handle
112 * @ps_params: vdev OPM parameters
113 *
114 * Return: None
115 */
116 static inline
pmo_core_vdev_set_ps_params(struct wlan_objmgr_vdev * vdev,struct pmo_ps_params * ps_params)117 void pmo_core_vdev_set_ps_params(struct wlan_objmgr_vdev *vdev,
118 struct pmo_ps_params *ps_params)
119 {
120 struct pmo_vdev_priv_obj *vdev_ctx;
121
122 vdev_ctx = pmo_vdev_get_priv(vdev);
123 qdf_spin_lock_bh(&vdev_ctx->pmo_vdev_lock);
124 vdev_ctx->ps_params = *ps_params;
125 qdf_spin_unlock_bh(&vdev_ctx->pmo_vdev_lock);
126 }
127
128 /**
129 * pmo_core_vdev_get_ps_params() - get vdev ps_params
130 * @vdev: objmgr vdev handle
131 * @ps_params: pointer to get vdev ps_params
132 *
133 * Return: QDF_STATUS
134 */
135 static inline
pmo_core_vdev_get_ps_params(struct wlan_objmgr_vdev * vdev,struct pmo_ps_params * ps_params)136 QDF_STATUS pmo_core_vdev_get_ps_params(struct wlan_objmgr_vdev *vdev,
137 struct pmo_ps_params *ps_params)
138 {
139 struct pmo_vdev_priv_obj *vdev_ctx;
140
141 vdev_ctx = pmo_vdev_get_priv(vdev);
142 if (!vdev_ctx)
143 return QDF_STATUS_E_NULL_VALUE;
144
145 qdf_spin_lock_bh(&vdev_ctx->pmo_vdev_lock);
146 *ps_params = vdev_ctx->ps_params;
147 qdf_spin_unlock_bh(&vdev_ctx->pmo_vdev_lock);
148 return QDF_STATUS_SUCCESS;
149 }
150
151 /**
152 * pmo_vdev_set_ps_opm_mode() - set OPM mode
153 * @vdev: objmgr vdev handle
154 * @opm_mode: OPM mode
155 *
156 * Return: QDF_STATUS
157 */
158 static inline
pmo_vdev_set_ps_opm_mode(struct wlan_objmgr_vdev * vdev,enum powersave_mode opm_mode)159 QDF_STATUS pmo_vdev_set_ps_opm_mode(struct wlan_objmgr_vdev *vdev,
160 enum powersave_mode opm_mode)
161 {
162 struct pmo_vdev_priv_obj *vdev_ctx;
163
164 vdev_ctx = pmo_vdev_get_priv(vdev);
165 if (!vdev_ctx) {
166 pmo_err("vdev ctx is null");
167 return QDF_STATUS_E_NULL_VALUE;
168 }
169
170 qdf_spin_lock_bh(&vdev_ctx->pmo_vdev_lock);
171 vdev_ctx->ps_params.opm_mode = opm_mode;
172 qdf_spin_unlock_bh(&vdev_ctx->pmo_vdev_lock);
173
174 return QDF_STATUS_SUCCESS;
175 }
176
177 /**
178 * pmo_vdev_get_ps_opm_mode() - get OPM mode
179 * @vdev: objmgr vdev handle
180 * @opm_mode: OPM mode
181 *
182 * Return: QDF_STATUS
183 */
184 static inline
pmo_vdev_get_ps_opm_mode(struct wlan_objmgr_vdev * vdev,enum powersave_mode * opm_mode)185 QDF_STATUS pmo_vdev_get_ps_opm_mode(struct wlan_objmgr_vdev *vdev,
186 enum powersave_mode *opm_mode)
187 {
188 struct pmo_vdev_priv_obj *vdev_ctx;
189
190 vdev_ctx = pmo_vdev_get_priv(vdev);
191 if (!vdev_ctx)
192 return QDF_STATUS_E_NULL_VALUE;
193
194 qdf_spin_lock_bh(&vdev_ctx->pmo_vdev_lock);
195 *opm_mode = vdev_ctx->ps_params.opm_mode;
196 qdf_spin_unlock_bh(&vdev_ctx->pmo_vdev_lock);
197 return QDF_STATUS_SUCCESS;
198 }
199
200 #ifdef WLAN_FEATURE_NAN
201 /**
202 * pmo_set_ndp_wow_bitmask() - set predefined NDP wow wakeup events
203 * @bitmask: bitmask field
204 * @wow_bitmask_size: bitmask field size
205 *
206 * Return: none
207 */
208 void pmo_set_ndp_wow_bitmask(uint32_t *bitmask, uint32_t wow_bitmask_size);
209 #else
210 static inline
pmo_set_ndp_wow_bitmask(uint32_t * bitmask,uint32_t wow_bitmask_size)211 void pmo_set_ndp_wow_bitmask(uint32_t *bitmask, uint32_t wow_bitmask_size)
212 {
213 }
214 #endif
215
216 #endif /* WLAN_POWER_MANAGEMENT_OFFLOAD */
217
218 #endif /* end of _WLAN_PMO_STATIC_CONFIG_H_ */
219