1 /*
2  * Copyright (c) 2017-2019 The Linux Foundation. All rights reserved.
3  * Copyright (c) 2023-2024 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 various api which shall be used by
21  * pmo user configuration and target interface
22  */
23 
24 #ifndef _WLAN_PMO_MAIN_H_
25 #define _WLAN_PMO_MAIN_H_
26 
27 #ifdef WLAN_POWER_MANAGEMENT_OFFLOAD
28 
29 #include "wlan_pmo_common_public_struct.h"
30 #include "wlan_pmo_obj_mgmt_public_struct.h"
31 #include "wlan_pmo_priv.h"
32 #include "wlan_pmo_objmgr.h"
33 
34 #define pmo_fatal(params...) QDF_TRACE_FATAL(QDF_MODULE_ID_PMO, params)
35 #define pmo_err(params...) QDF_TRACE_ERROR(QDF_MODULE_ID_PMO, params)
36 #define pmo_warn(params...) QDF_TRACE_WARN(QDF_MODULE_ID_PMO, params)
37 #define pmo_info(params...) QDF_TRACE_INFO(QDF_MODULE_ID_PMO, params)
38 #define pmo_debug(params...) QDF_TRACE_DEBUG(QDF_MODULE_ID_PMO, params)
39 
40 #define pmo_nofl_fatal(params...) \
41 	QDF_TRACE_FATAL_NO_FL(QDF_MODULE_ID_PMO, params)
42 #define pmo_nofl_err(params...) \
43 	QDF_TRACE_ERROR_NO_FL(QDF_MODULE_ID_PMO, params)
44 #define pmo_nofl_warn(params...) \
45 	QDF_TRACE_WARN_NO_FL(QDF_MODULE_ID_PMO, params)
46 #define pmo_nofl_info(params...) \
47 	QDF_TRACE_INFO_NO_FL(QDF_MODULE_ID_PMO, params)
48 #define pmo_nofl_debug(params...) \
49 	QDF_TRACE_DEBUG_NO_FL(QDF_MODULE_ID_PMO, params)
50 
51 #define pmo_enter() QDF_TRACE_ENTER(QDF_MODULE_ID_PMO, "enter")
52 #define pmo_exit() QDF_TRACE_EXIT(QDF_MODULE_ID_PMO, "exit")
53 
54 #define PMO_VDEV_IN_STA_MODE(mode) \
55 	((mode) == QDF_STA_MODE || (mode) == QDF_P2P_CLIENT_MODE ? 1 : 0)
56 
pmo_get_vdev_opmode(struct wlan_objmgr_vdev * vdev)57 static inline enum QDF_OPMODE pmo_get_vdev_opmode(struct wlan_objmgr_vdev *vdev)
58 {
59 	return wlan_vdev_mlme_get_opmode(vdev);
60 }
61 
62 /**
63  * pmo_allocate_ctx() - Api to allocate pmo ctx
64  *
65  * Helper function to allocate pmo ctx
66  *
67  * Return: Success or failure.
68  */
69 QDF_STATUS pmo_allocate_ctx(void);
70 
71 /**
72  * pmo_free_ctx() - to free pmo context
73  *
74  * Helper function to free pmo context
75  *
76  * Return: None.
77  */
78 void pmo_free_ctx(void);
79 
80 /**
81  * pmo_get_context() - to get pmo context
82  *
83  * Helper function to get pmo context
84  *
85  * Return: pmo context.
86  */
87 struct wlan_pmo_ctx *pmo_get_context(void);
88 
89 /**
90  * pmo_psoc_open() - pmo psoc object open
91  * @psoc: objmgr vdev
92  *.
93  * This function used to open pmo psoc object
94  *
95  * Return: Success or failure
96  */
97 QDF_STATUS pmo_psoc_open(struct wlan_objmgr_psoc *psoc);
98 
99 /**
100  * pmo_psoc_close() - pmo psoc object close
101  * @psoc: objmgr vdev
102  *.
103  * This function used to close pmo psoc object
104  *
105  * Return: Success or failure
106  */
107 QDF_STATUS pmo_psoc_close(struct wlan_objmgr_psoc *psoc);
108 
109 /**
110  * pmo_get_vdev_bss_peer_mac_addr() - API to get bss peer mac address
111  * @vdev: objmgr vdev
112  * @bss_peer_mac_address: bss peer mac address
113  *
114  * Helper function to  get bss peer mac address
115  *
116  * Return: if success pmo vdev ctx else NULL
117  */
118 QDF_STATUS pmo_get_vdev_bss_peer_mac_addr(struct wlan_objmgr_vdev *vdev,
119 		struct qdf_mac_addr *bss_peer_mac_address);
120 
121 /**
122  * pmo_is_vdev_in_beaconning_mode() - check if vdev is in a beaconning mode
123  * @vdev_opmode: vdev opmode
124  *
125  * Helper function to know whether given vdev
126  * is in a beaconning mode or not.
127  *
128  * Return: True if vdev needs to beacon.
129  */
130 bool pmo_is_vdev_in_beaconning_mode(enum QDF_OPMODE vdev_opmode);
131 
132 /**
133  * pmo_core_is_ap_mode_supports_arp_ns() - To check ap mode supports arp/ns
134  * @psoc: objmgr psoc handle
135  * @vdev_opmode: vdev opmode
136  *
137  * API to check if ap mode supports arp/ns offload
138  *
139  * Return: True  if ap mode supports arp/ns offload
140  */
141 
142 bool pmo_core_is_ap_mode_supports_arp_ns(struct wlan_objmgr_psoc *psoc,
143 	enum QDF_OPMODE vdev_opmode);
144 
145 /**
146  * pmo_core_is_vdev_supports_offload() - Check offload is supported on vdev
147  * @vdev: objmgr vdev
148  *
149  * Return: true in case success else false
150  */
151 bool pmo_core_is_vdev_supports_offload(struct wlan_objmgr_vdev *vdev);
152 
153 /**
154  * pmo_core_get_psoc_config(): API to get the psoc user configurations of pmo
155  * @psoc: objmgr psoc handle
156  * @psoc_cfg: fill the current psoc user configurations.
157  *
158  * Return pmo psoc configurations
159  */
160 QDF_STATUS pmo_core_get_psoc_config(struct wlan_objmgr_psoc *psoc,
161 		struct pmo_psoc_cfg *psoc_cfg);
162 
163 /**
164  * pmo_core_update_psoc_config(): API to update the psoc user configurations
165  * @psoc: objmgr psoc handle
166  * @psoc_cfg: pmo psoc configurations
167  *
168  * This api shall be used for soc config initialization as well update.
169  * In case of update caller must first call pmo_get_psoc_cfg to get
170  * current config and then apply changes on top of current config.
171  *
172  * Return QDF_STATUS -in case of success else return error
173  */
174 QDF_STATUS pmo_core_update_psoc_config(struct wlan_objmgr_psoc *psoc,
175 		struct pmo_psoc_cfg *psoc_cfg);
176 
177 /**
178  * pmo_psoc_set_caps() - overwrite configured device capability flags
179  * @psoc: the psoc for which the capabilities apply
180  * @caps: the cabability information to configure
181  *
182  * Return: None
183  */
184 void pmo_psoc_set_caps(struct wlan_objmgr_psoc *psoc,
185 		       struct pmo_device_caps *caps);
186 
187 /**
188  * pmo_core_get_vdev_op_mode(): API to get the vdev operation mode
189  * @vdev: objmgr vdev handle
190  *
191  * API to get the vdev operation mode
192  *
193  * Return QDF_MAX_NO_OF_MODE - in case of error else return vdev opmode
194  */
pmo_core_get_vdev_op_mode(struct wlan_objmgr_vdev * vdev)195 static inline enum QDF_OPMODE pmo_core_get_vdev_op_mode(
196 					struct wlan_objmgr_vdev *vdev)
197 {
198 	enum QDF_OPMODE op_mode = QDF_MAX_NO_OF_MODE;
199 
200 	if (!vdev)
201 		return op_mode;
202 	op_mode = wlan_vdev_mlme_get_opmode(vdev);
203 
204 	return op_mode;
205 }
206 
207 /**
208  * pmo_core_psoc_update_dp_handle() - update psoc data path handle
209  * @psoc: objmgr psoc handle
210  * @dp_hdl: psoc data path handle
211  *
212  * Return: None
213  */
214 static inline void
pmo_core_psoc_update_dp_handle(struct wlan_objmgr_psoc * psoc,void * dp_hdl)215 pmo_core_psoc_update_dp_handle(struct wlan_objmgr_psoc *psoc, void *dp_hdl)
216 {
217 	struct pmo_psoc_priv_obj *psoc_ctx;
218 
219 	pmo_psoc_with_ctx(psoc, psoc_ctx) {
220 		psoc_ctx->dp_hdl = dp_hdl;
221 	}
222 }
223 
224 /**
225  * pmo_core_psoc_get_dp_handle() - Get psoc data path handle
226  * @psoc: objmgr psoc handle
227  *
228  * Return: psoc data path handle
229  */
pmo_core_psoc_get_dp_handle(struct wlan_objmgr_psoc * psoc)230 static inline void *pmo_core_psoc_get_dp_handle(struct wlan_objmgr_psoc *psoc)
231 {
232 	void *dp_hdl = NULL;
233 	struct pmo_psoc_priv_obj *psoc_ctx;
234 
235 	pmo_psoc_with_ctx(psoc, psoc_ctx) {
236 		dp_hdl = psoc_ctx->dp_hdl;
237 	}
238 
239 	return dp_hdl;
240 }
241 
242 /**
243  * pmo_core_vdev_get_dp_handle() - Get vdev data path handle
244  * @psoc_ctx: pmo psoc private context
245  * @vdev_id: vdev id config to get data path handle
246  *
247  * Return: Vdev data path handle
248  */
249 static inline
pmo_core_vdev_get_dp_handle(struct pmo_psoc_priv_obj * psoc_ctx,uint8_t vdev_id)250 struct cdp_vdev *pmo_core_vdev_get_dp_handle(struct pmo_psoc_priv_obj *psoc_ctx,
251 					     uint8_t vdev_id)
252 {
253 	struct cdp_vdev *dp_hdl = NULL;
254 	pmo_get_vdev_dp_handle handler;
255 
256 	qdf_spin_lock_bh(&psoc_ctx->lock);
257 	handler = psoc_ctx->get_vdev_dp_handle;
258 	qdf_spin_unlock_bh(&psoc_ctx->lock);
259 
260 	if (handler)
261 		dp_hdl = handler(vdev_id);
262 
263 	return dp_hdl;
264 }
265 
266 /**
267  * pmo_core_psoc_update_htc_handle() - update psoc htc layer handle
268  * @psoc: objmgr psoc handle
269  * @htc_hdl: psoc htc layer handle
270  *
271  * Return: None
272  */
273 static inline void
pmo_core_psoc_update_htc_handle(struct wlan_objmgr_psoc * psoc,void * htc_hdl)274 pmo_core_psoc_update_htc_handle(struct wlan_objmgr_psoc *psoc, void *htc_hdl)
275 {
276 	struct pmo_psoc_priv_obj *psoc_ctx;
277 
278 	pmo_psoc_with_ctx(psoc, psoc_ctx) {
279 		psoc_ctx->htc_hdl = htc_hdl;
280 	}
281 }
282 
283 /**
284  * pmo_core_psoc_get_htc_handle() - Get psoc htc layer handle
285  * @psoc: objmgr psoc handle
286  *
287  * Return: psoc htc layer handle
288  */
pmo_core_psoc_get_htc_handle(struct wlan_objmgr_psoc * psoc)289 static inline void *pmo_core_psoc_get_htc_handle(struct wlan_objmgr_psoc *psoc)
290 {
291 	void *htc_hdl = NULL;
292 	struct pmo_psoc_priv_obj *psoc_ctx;
293 
294 	pmo_psoc_with_ctx(psoc, psoc_ctx) {
295 		htc_hdl = psoc_ctx->htc_hdl;
296 	}
297 
298 	return htc_hdl;
299 }
300 
301 /**
302  * pmo_core_psoc_set_hif_handle() - update psoc hif layer handle
303  * @psoc: objmgr psoc handle
304  * @hif_hdl: hif context handle
305  *
306  * Return: None
307  */
308 void pmo_core_psoc_set_hif_handle(struct wlan_objmgr_psoc *psoc,
309 				  void *hif_hdl);
310 
311 /**
312  * pmo_core_psoc_get_hif_handle() - Get psoc hif layer handle
313  * @psoc: objmgr psoc handle
314  *
315  * Return: psoc hif layer handle
316  */
317 void *pmo_core_psoc_get_hif_handle(struct wlan_objmgr_psoc *psoc);
318 
319 /**
320  * pmo_core_psoc_set_txrx_pdev_id() - update psoc pdev txrx layer handle
321  * @psoc: objmgr psoc handle
322  * @txrx_pdev_id: txrx pdev identifier
323  *
324  * Return: None
325  */
326 void pmo_core_psoc_set_txrx_pdev_id(struct wlan_objmgr_psoc *psoc,
327 				    uint8_t txrx_pdev_id);
328 
329 /**
330  * pmo_core_psoc_get_txrx_handle() - Get psoc pdev txrx handle
331  * @psoc: objmgr psoc handle
332  *
333  * Return: txrx pdev identifier
334  */
335 uint8_t pmo_core_psoc_get_txrx_handle(struct wlan_objmgr_psoc *psoc);
336 
337 /**
338  * pmo_intersect_arp_ns_offload() - intersect config and firmware capability for
339  *	the ARP/NS Offload feature
340  * @psoc_ctx: A PMO psoc context
341  *
342  * Note: The caller is expected to grab the PMO context lock.
343  *
344  * Return: True if firmware supports and configuration has enabled the feature
345  */
346 static inline bool
pmo_intersect_arp_ns_offload(struct pmo_psoc_priv_obj * psoc_ctx)347 pmo_intersect_arp_ns_offload(struct pmo_psoc_priv_obj *psoc_ctx)
348 {
349 	struct pmo_psoc_cfg *cfg = &psoc_ctx->psoc_cfg;
350 	bool arp_ns_enabled =
351 		cfg->ns_offload_enable_static ||
352 		cfg->ns_offload_enable_dynamic ||
353 		cfg->arp_offload_enable;
354 
355 	return arp_ns_enabled && psoc_ctx->caps.arp_ns_offload;
356 }
357 
358 /**
359  * pmo_intersect_apf() - intersect config and firmware capability for
360  *	the APF feature
361  * @psoc_ctx: A PMO psoc context
362  *
363  * Note: The caller is expected to grab the PMO context lock.
364  *
365  * Return: True if firmware supports and configuration has enabled the feature
366  */
pmo_intersect_apf(struct pmo_psoc_priv_obj * psoc_ctx)367 static inline bool pmo_intersect_apf(struct pmo_psoc_priv_obj *psoc_ctx)
368 {
369 	return psoc_ctx->psoc_cfg.apf_enable && psoc_ctx->caps.apf;
370 }
371 
372 /**
373  * pmo_intersect_packet_filter() - intersect config and firmware capability for
374  *	the APF feature
375  * @psoc_ctx: A PMO psoc context
376  *
377  * Note: The caller is expected to grab the PMO context lock.
378  *
379  * Return: True if firmware supports and configuration has enabled the feature
380  */
381 static inline bool
pmo_intersect_packet_filter(struct pmo_psoc_priv_obj * psoc_ctx)382 pmo_intersect_packet_filter(struct pmo_psoc_priv_obj *psoc_ctx)
383 {
384 	return psoc_ctx->psoc_cfg.packet_filter_enabled &&
385 		psoc_ctx->caps.packet_filter;
386 }
387 
388 /*
389  * pmo_host_action_on_page_fault() - Returns action host will take on page fault
390  * @psoc: PSOC object manager pointer.
391  *
392  * Returns: Host action on page fault event
393  */
394 enum pmo_page_fault_action
395 pmo_host_action_on_page_fault(struct wlan_objmgr_psoc *psoc);
396 
397 #define pmo_is_host_pagefault_action(_psoc, _action) \
398 		(pmo_host_action_on_page_fault(_psoc) == (_action))
399 
pmo_no_op_on_page_fault(struct wlan_objmgr_psoc * psoc)400 static inline bool pmo_no_op_on_page_fault(struct wlan_objmgr_psoc *psoc)
401 {
402 	return pmo_is_host_pagefault_action(psoc, PMO_PF_HOST_ACTION_NO_OP);
403 }
404 
pmo_enable_ssr_on_page_fault(struct wlan_objmgr_psoc * psoc)405 static inline bool pmo_enable_ssr_on_page_fault(struct wlan_objmgr_psoc *psoc)
406 {
407 	return pmo_is_host_pagefault_action(psoc, PMO_PF_HOST_ACTION_TRIGGER_SSR);
408 }
409 
410 /*
411  * pmo_get_min_pagefault_wakeups_for_action() - get pagefault wakeups for host
412  * to initiate action
413  * @psoc: objmgr psoc
414  *
415  * Return: Min wakeups interval for host action on pagefault
416  */
417 uint8_t
418 pmo_get_min_pagefault_wakeups_for_action(struct wlan_objmgr_psoc *psoc);
419 
420 /*
421  * pmo_get_interval_for_pagefault_wakeup_counts: get ssr interval for pagefault
422  * @psoc: objmgr psoc
423  *
424  * Return: SSR interval for pagefault
425  */
426 uint32_t
427 pmo_get_interval_for_pagefault_wakeup_counts(struct wlan_objmgr_psoc *psoc);
428 
429 /*
430  * pmo_get_ssr_frequency_on_pagefault: get ssr frequency on pagefault
431  * @psoc: objmgr psoc
432  *
433  * Return: SSR frequency on pagefault
434  */
435 uint32_t pmo_get_ssr_frequency_on_pagefault(struct wlan_objmgr_psoc *psoc);
436 
437 /**
438  * pmo_get_vdev_bridge_addr() - API to get Bridge mac address
439  * @vdev: vdev object
440  * @bridgeaddr: Bridge mac address
441  *
442  * Helper function to get Bridge mac address
443  *
444  * Return: if success pmo vdev ctx else NULL
445  */
446 QDF_STATUS pmo_get_vdev_bridge_addr(struct wlan_objmgr_vdev *vdev,
447 				    struct qdf_mac_addr *bridgeaddr);
448 
449 /**
450  * pmo_set_vdev_bridge_addr() - API to set Bridge mac address
451  * @vdev: vdev object
452  * @bridgeaddr: Bridge mac address
453  *
454  * API to set the Bridge MAC address
455  *
456  * Return: if success pmo vdev ctx else NULL
457  */
458 QDF_STATUS pmo_set_vdev_bridge_addr(struct wlan_objmgr_vdev *vdev,
459 				    struct qdf_mac_addr *bridgeaddr);
460 
461 #endif /* WLAN_POWER_MANAGEMENT_OFFLOAD */
462 
463 /**
464  * pmo_core_get_listen_interval() - function to get configured
465  * listen interval
466  * @vdev: vdev objmgr vdev
467  * @listen_interval: Pointer variable to return listen interval
468  *
469  * This function allows get configured listen interval
470  *
471  * Return: QDF_STATUS
472  */
473 QDF_STATUS pmo_core_get_listen_interval(struct wlan_objmgr_vdev *vdev,
474 					uint32_t *listen_interval);
475 
476 #endif /* end  of _WLAN_PMO_MAIN_H_ */
477