1 /*
2  * Copyright (c) 2013-2021 The Linux Foundation. All rights reserved.
3  * Copyright (c) 2021-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 #ifndef _WLAN_IPA_CORE_H_
21 #define _WLAN_IPA_CORE_H_
22 
23 #ifdef IPA_OFFLOAD
24 
25 #include "wlan_ipa_priv.h"
26 #include "wlan_ipa_public_struct.h"
27 
28 #define WLAN_IPA_NBUF_CB_PEER_ID_OFFSET		5
29 /**
30  * wlan_ipa_is_enabled() - Is IPA enabled?
31  * @ipa_cfg: IPA config
32  *
33  * Return: true if IPA is enabled, false otherwise
34  */
wlan_ipa_is_enabled(struct wlan_ipa_config * ipa_cfg)35 static inline bool wlan_ipa_is_enabled(struct wlan_ipa_config *ipa_cfg)
36 {
37 	return WLAN_IPA_IS_CONFIG_ENABLED(ipa_cfg, WLAN_IPA_ENABLE_MASK);
38 }
39 
40 /**
41  * wlan_ipa_uc_is_enabled() - Is IPA UC enabled?
42  * @ipa_cfg: IPA config
43  *
44  * Return: true if IPA UC is enabled, false otherwise
45  */
wlan_ipa_uc_is_enabled(struct wlan_ipa_config * ipa_cfg)46 static inline bool wlan_ipa_uc_is_enabled(struct wlan_ipa_config *ipa_cfg)
47 {
48 	return WLAN_IPA_IS_CONFIG_ENABLED(ipa_cfg, WLAN_IPA_UC_ENABLE_MASK);
49 }
50 
51 /**
52  * wlan_ipa_is_opt_wifi_dp_enabled() - Is optional wifi dp enabled from WLAN
53  * @ipa_cfg: IPA config
54  *
55  * Return: true if IPA opt wifi dp is enabled, false otherwise
56  */
wlan_ipa_is_opt_wifi_dp_enabled(struct wlan_ipa_config * ipa_cfg)57 static inline bool wlan_ipa_is_opt_wifi_dp_enabled(
58 						struct wlan_ipa_config *ipa_cfg)
59 {
60 	return WLAN_IPA_IS_CONFIG_ENABLED(ipa_cfg, WLAN_IPA_OPT_WIFI_DP);
61 }
62 
63 /**
64  * wlan_ipa_is_rt_debugging_enabled() - Is IPA RT debugging enabled?
65  * @ipa_cfg: IPA config
66  *
67  * Return: true if IPA RT debugging is enabled, false otherwise
68  */
69 static inline
wlan_ipa_is_rt_debugging_enabled(struct wlan_ipa_config * ipa_cfg)70 bool wlan_ipa_is_rt_debugging_enabled(struct wlan_ipa_config *ipa_cfg)
71 {
72 	return WLAN_IPA_IS_CONFIG_ENABLED(ipa_cfg,
73 					  WLAN_IPA_REAL_TIME_DEBUGGING);
74 }
75 
76 /**
77  * wlan_ipa_setup - IPA initialize and setup
78  * @ipa_ctx: IPA priv obj
79  * @ipa_cfg: IPA config
80  *
81  * Return: QDF_STATUS
82  */
83 QDF_STATUS wlan_ipa_setup(struct wlan_ipa_priv *ipa_ctx,
84 			  struct wlan_ipa_config *ipa_cfg);
85 
86 /**
87  * wlan_ipa_get_obj_context - Get IPA OBJ context
88  *
89  * Return: IPA context
90  */
91 struct wlan_ipa_priv *wlan_ipa_get_obj_context(void);
92 
93 /**
94  * wlan_ipa_cleanup - IPA cleanup
95  * @ipa_ctx: IPA priv obj
96  *
97  * Return: QDF_STATUS
98  */
99 QDF_STATUS wlan_ipa_cleanup(struct wlan_ipa_priv *ipa_ctx);
100 
101 /**
102  * wlan_ipa_uc_enable_pipes() - Enable IPA uC pipes
103  * @ipa_ctx: IPA context
104  *
105  * Return: QDF_STATUS
106  */
107 QDF_STATUS wlan_ipa_uc_enable_pipes(struct wlan_ipa_priv *ipa_ctx);
108 
109 /**
110  * wlan_ipa_uc_disable_pipes() - Disable IPA uC pipes
111  * @ipa_ctx: IPA context
112  * @force_disable: If true, immediately disable IPA pipes. If false, wait for
113  *		   pending IPA WLAN TX completions
114  *
115  * Return: QDF_STATUS
116  */
117 QDF_STATUS wlan_ipa_uc_disable_pipes(struct wlan_ipa_priv *ipa_ctx,
118 				     bool force_disable);
119 
120 /**
121  * wlan_ipa_is_tx_pending() - Check if IPA TX Completions are pending
122  * @ipa_ctx: IPA context
123  *
124  * Return: bool
125  */
126 bool wlan_ipa_is_tx_pending(struct wlan_ipa_priv *ipa_ctx);
127 
128 /**
129  * wlan_ipa_set_perf_level() - Set IPA performance level
130  * @ipa_ctx: IPA context
131  * @tx_packets: Number of packets transmitted in the last sample period
132  * @rx_packets: Number of packets received in the last sample period
133  *
134  * Return: QDF STATUS
135  */
136 QDF_STATUS wlan_ipa_set_perf_level(struct wlan_ipa_priv *ipa_ctx,
137 				   uint64_t tx_packets, uint64_t rx_packets);
138 
139 /**
140  * wlan_ipa_init_perf_level() - Initialize IPA performance level
141  * @ipa_ctx: IPA context
142  *
143  * If IPA clock scaling is disabled, initialize perf level to maximum.
144  * Else set the lowest level to start with.
145  *
146  * Return: QDF STATUS
147  */
148 QDF_STATUS wlan_ipa_init_perf_level(struct wlan_ipa_priv *ipa_ctx);
149 
150 /**
151  * wlan_ipa_get_iface() - Get IPA interface
152  * @ipa_ctx: IPA context
153  * @mode: Interface device mode
154  *
155  * Return: IPA interface address
156  */
157 struct wlan_ipa_iface_context
158 *wlan_ipa_get_iface(struct wlan_ipa_priv *ipa_ctx, uint8_t mode);
159 
160 /**
161  * wlan_ipa_check_iface_netdev_sessid() - Check IPA interface using netdev
162  * and session id
163  *
164  * @ipa_iface: IPA iface
165  * @net_dev: net dev
166  * @session_id: vdev id
167  *
168  * Return: Result if iface is matching or not
169  */
170 int wlan_ipa_check_iface_netdev_sessid(struct wlan_ipa_iface_context *ipa_iface,
171 				       qdf_netdev_t net_dev,
172 				       uint8_t session_id);
173 
174 /**
175  * wlan_ipa_get_iface_by_mode_netdev() - Get IPA interface
176  * @ipa_ctx: IPA context
177  * @ndev: Interface netdev pointer
178  * @mode: Interface device mode
179  * @session_id: vdev id
180  *
181  * Return: IPA interface address
182  */
183 struct wlan_ipa_iface_context *
184 wlan_ipa_get_iface_by_mode_netdev(struct wlan_ipa_priv *ipa_ctx,
185 				  qdf_netdev_t ndev, uint8_t mode,
186 				  uint8_t session_id);
187 
188 #if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 10, 0)) && \
189 	!defined(CONFIG_IPA_WDI_UNIFIED_API)
190 
191 /**
192  * wlan_ipa_is_rm_enabled() - Is IPA RM enabled?
193  * @ipa_cfg: IPA config
194  *
195  * Return: true if IPA RM is enabled, false otherwise
196  */
wlan_ipa_is_rm_enabled(struct wlan_ipa_config * ipa_cfg)197 static inline bool wlan_ipa_is_rm_enabled(struct wlan_ipa_config *ipa_cfg)
198 {
199 	return WLAN_IPA_IS_CONFIG_ENABLED(ipa_cfg, WLAN_IPA_RM_ENABLE_MASK);
200 }
201 
202 /**
203  * wlan_ipa_is_clk_scaling_enabled() - Is IPA clock scaling enabled?
204  * @ipa_cfg: IPA config
205  *
206  * Return: true if IPA clock scaling is enabled, false otherwise
207  */
208 static inline
wlan_ipa_is_clk_scaling_enabled(struct wlan_ipa_config * ipa_cfg)209 bool wlan_ipa_is_clk_scaling_enabled(struct wlan_ipa_config *ipa_cfg)
210 {
211 	return WLAN_IPA_IS_CONFIG_ENABLED(ipa_cfg,
212 					  WLAN_IPA_CLK_SCALING_ENABLE_MASK |
213 					  WLAN_IPA_RM_ENABLE_MASK);
214 }
215 
216 /**
217  * wlan_ipa_wdi_rm_request_resource() - IPA WDI request resource
218  * @ipa_ctx: IPA context
219  * @res_name: IPA RM resource name
220  *
221  * Return: 0 on success, negative errno on error
222  */
223 static inline
wlan_ipa_wdi_rm_request_resource(struct wlan_ipa_priv * ipa_ctx,qdf_ipa_rm_resource_name_t res_name)224 int wlan_ipa_wdi_rm_request_resource(struct wlan_ipa_priv *ipa_ctx,
225 				     qdf_ipa_rm_resource_name_t res_name)
226 {
227 	return qdf_ipa_rm_request_resource(res_name);
228 }
229 
230 /**
231  * wlan_ipa_wdi_rm_release_resource() - IPA WDI release resource
232  * @ipa_ctx: IPA context
233  * @res_name: IPA RM resource name
234  *
235  * Return: 0 on success, negative errno on error
236  */
237 static inline
wlan_ipa_wdi_rm_release_resource(struct wlan_ipa_priv * ipa_ctx,qdf_ipa_rm_resource_name_t res_name)238 int wlan_ipa_wdi_rm_release_resource(struct wlan_ipa_priv *ipa_ctx,
239 				     qdf_ipa_rm_resource_name_t res_name)
240 {
241 	return qdf_ipa_rm_release_resource(res_name);
242 }
243 
244 /**
245  * wlan_ipa_wdi_rm_request() - Request resource from IPA
246  * @ipa_ctx: IPA context
247  *
248  * Return: QDF_STATUS
249  */
250 QDF_STATUS wlan_ipa_wdi_rm_request(struct wlan_ipa_priv *ipa_ctx);
251 
252 /**
253  * wlan_ipa_wdi_rm_try_release() - Attempt to release IPA resource
254  * @ipa_ctx: IPA context
255  *
256  * Return: QDF_STATUS
257  */
258 QDF_STATUS wlan_ipa_wdi_rm_try_release(struct wlan_ipa_priv *ipa_ctx);
259 
260 /**
261  * wlan_ipa_wdi_setup_rm() - Setup IPA resource management
262  * @ipa_ctx: IPA context
263  *
264  * Return: QDF_STATUS
265  */
266 QDF_STATUS wlan_ipa_wdi_setup_rm(struct wlan_ipa_priv *ipa_ctx);
267 
268 /**
269  * wlan_ipa_wdi_destroy_rm() - Destroy IPA resources
270  * @ipa_ctx: IPA context
271  *
272  * Destroys all resources associated with the IPA resource manager
273  *
274  * Return: None
275  */
276 void wlan_ipa_wdi_destroy_rm(struct wlan_ipa_priv *ipa_ctx);
277 
278 static inline
wlan_ipa_wdi_rm_notify_completion(qdf_ipa_rm_event_t event,qdf_ipa_rm_resource_name_t res_name)279 int wlan_ipa_wdi_rm_notify_completion(qdf_ipa_rm_event_t event,
280 				      qdf_ipa_rm_resource_name_t res_name)
281 {
282 	return qdf_ipa_rm_notify_completion(event, res_name);
283 }
284 
285 static inline
wlan_ipa_wdi_rm_inactivity_timer_destroy(qdf_ipa_rm_resource_name_t res_name)286 int wlan_ipa_wdi_rm_inactivity_timer_destroy(
287 					qdf_ipa_rm_resource_name_t res_name)
288 {
289 	return qdf_ipa_rm_inactivity_timer_destroy(res_name);
290 }
291 
292 bool wlan_ipa_is_rm_released(struct wlan_ipa_priv *ipa_ctx);
293 
294 #else /* CONFIG_IPA_WDI_UNIFIED_API */
295 
296 /**
297  * wlan_ipa_is_rm_enabled() - Is IPA RM enabled?
298  * @ipa_cfg: IPA config
299  *
300  * IPA RM is deprecated and IPA PM is involved. WLAN driver
301  * has no control over IPA PM and thus we could regard IPA
302  * RM as always enabled for power efficiency.
303  *
304  * Return: true
305  */
wlan_ipa_is_rm_enabled(struct wlan_ipa_config * ipa_cfg)306 static inline bool wlan_ipa_is_rm_enabled(struct wlan_ipa_config *ipa_cfg)
307 {
308 	return true;
309 }
310 
311 /**
312  * wlan_ipa_is_clk_scaling_enabled() - Is IPA clock scaling enabled?
313  * @ipa_cfg: IPA config
314  *
315  * Return: true if IPA clock scaling is enabled, false otherwise
316  */
317 static inline
wlan_ipa_is_clk_scaling_enabled(struct wlan_ipa_config * ipa_cfg)318 bool wlan_ipa_is_clk_scaling_enabled(struct wlan_ipa_config *ipa_cfg)
319 {
320 	return WLAN_IPA_IS_CONFIG_ENABLED(ipa_cfg,
321 					  WLAN_IPA_CLK_SCALING_ENABLE_MASK);
322 }
323 
wlan_ipa_wdi_rm_request_resource(struct wlan_ipa_priv * ipa_ctx,qdf_ipa_rm_resource_name_t res_name)324 static inline int wlan_ipa_wdi_rm_request_resource(
325 			struct wlan_ipa_priv *ipa_ctx,
326 			qdf_ipa_rm_resource_name_t res_name)
327 {
328 	return 0;
329 }
330 
wlan_ipa_wdi_rm_release_resource(struct wlan_ipa_priv * ipa_ctx,qdf_ipa_rm_resource_name_t res_name)331 static inline int wlan_ipa_wdi_rm_release_resource(
332 			struct wlan_ipa_priv *ipa_ctx,
333 			qdf_ipa_rm_resource_name_t res_name)
334 {
335 	return 0;
336 }
337 
wlan_ipa_wdi_setup_rm(struct wlan_ipa_priv * ipa_ctx)338 static inline QDF_STATUS wlan_ipa_wdi_setup_rm(struct wlan_ipa_priv *ipa_ctx)
339 {
340 	return 0;
341 }
342 
wlan_ipa_wdi_destroy_rm(struct wlan_ipa_priv * ipa_ctx)343 static inline int wlan_ipa_wdi_destroy_rm(struct wlan_ipa_priv *ipa_ctx)
344 {
345 	return 0;
346 }
347 
wlan_ipa_wdi_rm_request(struct wlan_ipa_priv * ipa_ctx)348 static inline QDF_STATUS wlan_ipa_wdi_rm_request(struct wlan_ipa_priv *ipa_ctx)
349 {
350 	return QDF_STATUS_SUCCESS;
351 }
352 
wlan_ipa_wdi_rm_try_release(struct wlan_ipa_priv * ipa_ctx)353 static inline QDF_STATUS wlan_ipa_wdi_rm_try_release(struct wlan_ipa_priv
354 						     *ipa_ctx)
355 {
356 	return QDF_STATUS_SUCCESS;
357 }
358 
359 static inline
wlan_ipa_wdi_rm_notify_completion(qdf_ipa_rm_event_t event,qdf_ipa_rm_resource_name_t res_name)360 int wlan_ipa_wdi_rm_notify_completion(qdf_ipa_rm_event_t event,
361 				      qdf_ipa_rm_resource_name_t res_name)
362 {
363 	return 0;
364 }
365 
366 static inline
wlan_ipa_wdi_rm_inactivity_timer_destroy(qdf_ipa_rm_resource_name_t res_name)367 int wlan_ipa_wdi_rm_inactivity_timer_destroy(
368 					qdf_ipa_rm_resource_name_t res_name)
369 {
370 	return 0;
371 }
372 
373 static inline
wlan_ipa_is_rm_released(struct wlan_ipa_priv * ipa_ctx)374 bool wlan_ipa_is_rm_released(struct wlan_ipa_priv *ipa_ctx)
375 {
376 	return true;
377 }
378 
379 #endif /* CONFIG_IPA_WDI_UNIFIED_API */
380 
381 #ifdef FEATURE_METERING
382 
383 #ifndef WDI3_STATS_UPDATE
384 /**
385  * wlan_ipa_uc_op_metering() - IPA uC operation for stats and quota limit
386  * @ipa_ctx: IPA context
387  * @op_msg: operation message received from firmware
388  *
389  * Return: QDF_STATUS enumeration
390  */
391 QDF_STATUS wlan_ipa_uc_op_metering(struct wlan_ipa_priv *ipa_ctx,
392 				   struct op_msg_type *op_msg);
393 #else
394 static inline
wlan_ipa_uc_op_metering(struct wlan_ipa_priv * ipa_ctx,struct op_msg_type * op_msg)395 QDF_STATUS wlan_ipa_uc_op_metering(struct wlan_ipa_priv *ipa_ctx,
396 				   struct op_msg_type *op_msg)
397 {
398 	return QDF_STATUS_SUCCESS;
399 }
400 #endif
401 
402 /**
403  * wlan_ipa_wdi_meter_notifier_cb() - SSR wrapper for
404  * __wlan_ipa_wdi_meter_notifier_cb
405  * @evt: the IPA event which triggered the callback
406  * @data: data associated with the event
407  *
408  * Return: None
409  */
410 void wlan_ipa_wdi_meter_notifier_cb(qdf_ipa_wdi_meter_evt_type_t evt,
411 				    void *data);
412 
413 /**
414  * wlan_ipa_init_metering() - IPA metering stats completion event reset
415  * @ipa_ctx: IPA context
416  *
417  * Return: QDF_STATUS enumeration
418  */
419 void wlan_ipa_init_metering(struct wlan_ipa_priv *ipa_ctx);
420 
421 #ifdef WDI3_STATS_UPDATE
422 /**
423  * wlan_ipa_update_tx_stats() - send embedded tx traffic in bytes to IPA
424  * @ipa_ctx: IPA context
425  * @sta_tx: tx in bytes on sta interface
426  * @sap_tx: tx in bytes on sap interface
427  *
428  * Return: void
429  */
430 void wlan_ipa_update_tx_stats(struct wlan_ipa_priv *ipa_ctx, uint64_t sta_tx,
431 			      uint64_t sap_tx);
432 #else
wlan_ipa_update_tx_stats(struct wlan_ipa_priv * ipa_ctx,uint64_t sta_tx,uint64_t sap_tx)433 static inline void wlan_ipa_update_tx_stats(struct wlan_ipa_priv *ipa_ctx,
434 					    uint64_t sta_tx, uint64_t sap_tx)
435 {
436 }
437 #endif /* WDI3_STATS_UPDATE */
438 
439 #else
440 
441 static inline
wlan_ipa_uc_op_metering(struct wlan_ipa_priv * ipa_ctx,struct op_msg_type * op_msg)442 QDF_STATUS wlan_ipa_uc_op_metering(struct wlan_ipa_priv *ipa_ctx,
443 				   struct op_msg_type *op_msg)
444 {
445 	return QDF_STATUS_SUCCESS;
446 }
447 
wlan_ipa_wdi_meter_notifier_cb(void)448 static inline void wlan_ipa_wdi_meter_notifier_cb(void)
449 {
450 }
451 
wlan_ipa_init_metering(struct wlan_ipa_priv * ipa_ctx)452 static inline void wlan_ipa_init_metering(struct wlan_ipa_priv *ipa_ctx)
453 {
454 }
455 
wlan_ipa_update_tx_stats(struct wlan_ipa_priv * ipa_ctx,uint64_t sta_tx,uint64_t sap_tx)456 static inline void wlan_ipa_update_tx_stats(struct wlan_ipa_priv *ipa_ctx,
457 					    uint64_t sta_tx, uint64_t sap_tx)
458 {
459 }
460 #endif /* FEATURE_METERING */
461 
462 #ifdef IPA_OPT_WIFI_DP
463 /*
464  * wlan_ipa_add_rem_flt_cb_event() - Set event to get notified when cce
465  * super rule filter is added/removed
466  * @ipa_ctx: IPA context
467  *
468  * Return: None
469  */
470 void wlan_ipa_add_rem_flt_cb_event(struct wlan_ipa_priv *ipa_ctx);
471 #else
wlan_ipa_add_rem_flt_cb_event(struct wlan_ipa_priv * ipa_ctx)472 static inline void wlan_ipa_add_rem_flt_cb_event(struct wlan_ipa_priv *ipa_ctx)
473 {
474 }
475 #endif /* IPA_OPT_WIFI_DP */
476 
477 /*
478  * wlan_ipa_uc_stat() - Print IPA uC stats
479  * @ipa_ctx: IPA context
480  *
481  * Return: None
482  */
483 void wlan_ipa_uc_stat(struct wlan_ipa_priv *ipa_ctx);
484 
485 /**
486  * wlan_ipa_uc_info() - Print IPA uC resource and session information
487  * @ipa_ctx: IPA context
488  *
489  * Return: None
490  */
491 void wlan_ipa_uc_info(struct wlan_ipa_priv *ipa_ctx);
492 
493 /**
494  * wlan_ipa_print_fw_wdi_stats() - Print FW IPA WDI stats
495  * @ipa_ctx: IPA context
496  * @uc_fw_stat: stats to print
497  *
498  * Return: None
499  */
500 void wlan_ipa_print_fw_wdi_stats(struct wlan_ipa_priv *ipa_ctx,
501 				 struct ipa_uc_fw_stats *uc_fw_stat);
502 
503 /**
504  * wlan_ipa_uc_stat_request() - Get IPA stats from IPA
505  * @ipa_ctx: IPA context
506  * @reason: STAT REQ Reason
507  *
508  * Return: None
509  */
510 void wlan_ipa_uc_stat_request(struct wlan_ipa_priv *ipa_ctx, uint8_t reason);
511 
512 /**
513  * wlan_ipa_uc_stat_query() - Query the IPA stats
514  * @ipa_ctx: IPA context
515  * @ipa_tx_diff: tx packet count diff from previous tx packet count
516  * @ipa_rx_diff: rx packet count diff from previous rx packet count
517  *
518  * Return: None
519  */
520 void wlan_ipa_uc_stat_query(struct wlan_ipa_priv *ipa_ctx,
521 			    uint32_t *ipa_tx_diff, uint32_t *ipa_rx_diff);
522 
523 /**
524  * wlan_ipa_dump_info() - dump IPA IPA struct
525  * @ipa_ctx: IPA context
526  *
527  * Dump entire struct ipa_ctx
528  *
529  * Return: none
530  */
531 void wlan_ipa_dump_info(struct wlan_ipa_priv *ipa_ctx);
532 
533 /**
534  * wlan_ipa_uc_rt_debug_host_dump - dump rt debug buffer
535  * @ipa_ctx: IPA context
536  *
537  * If rt debug enabled, dump debug buffer contents based on requirement
538  *
539  * Return: none
540  */
541 void wlan_ipa_uc_rt_debug_host_dump(struct wlan_ipa_priv *ipa_ctx);
542 
543 /**
544  * wlan_ipa_uc_rt_debug_destructor() - called by data packet free
545  * @nbuff: packet pointer
546  *
547  * when free data packet, will be invoked by wlan client and will increase
548  * free counter
549  *
550  * Return: none
551  */
552 void wlan_ipa_uc_rt_debug_destructor(qdf_nbuf_t nbuff);
553 
554 /**
555  * wlan_ipa_uc_rt_debug_deinit() - remove resources to handle rt debugging
556  * @ipa_ctx: IPA context
557  *
558  * free all rt debugging resources
559  *
560  * Return: none
561  */
562 void wlan_ipa_uc_rt_debug_deinit(struct wlan_ipa_priv *ipa_ctx);
563 
564 /**
565  * wlan_ipa_uc_rt_debug_init() - initialize resources to handle rt debugging
566  * @ipa_ctx: IPA context
567  *
568  * alloc and initialize all rt debugging resources
569  *
570  * Return: none
571  */
572 void wlan_ipa_uc_rt_debug_init(struct wlan_ipa_priv *ipa_ctx);
573 
574 /**
575  * wlan_ipa_reg_sap_xmit_cb() - Register upper layer SAP cb to transmit
576  * @ipa_ctx: IPA context
577  * @cb: callback
578  *
579  * Return: None
580  */
581 static inline
wlan_ipa_reg_sap_xmit_cb(struct wlan_ipa_priv * ipa_ctx,wlan_ipa_softap_xmit cb)582 void wlan_ipa_reg_sap_xmit_cb(struct wlan_ipa_priv *ipa_ctx,
583 			      wlan_ipa_softap_xmit cb)
584 {
585 	ipa_ctx->softap_xmit = cb;
586 }
587 
588 /**
589  * wlan_ipa_reg_is_driver_unloading_cb() - Register cb to check if driver
590  * is unloading
591  * @ipa_ctx: IPA context
592  * @cb: callback
593  *
594  * Return: None
595  */
596 static inline
wlan_ipa_reg_is_driver_unloading_cb(struct wlan_ipa_priv * ipa_ctx,wlan_ipa_driver_unloading cb)597 void wlan_ipa_reg_is_driver_unloading_cb(struct wlan_ipa_priv *ipa_ctx,
598 					 wlan_ipa_driver_unloading cb)
599 {
600 	ipa_ctx->driver_is_unloading = cb;
601 }
602 
603 /**
604  * wlan_ipa_reg_send_to_nw_cb() - Register cb to send IPA Rx packet to network
605  * @ipa_ctx: IPA context
606  * @cb: callback
607  *
608  * Return: None
609  */
610 static inline
wlan_ipa_reg_send_to_nw_cb(struct wlan_ipa_priv * ipa_ctx,wlan_ipa_send_to_nw cb)611 void wlan_ipa_reg_send_to_nw_cb(struct wlan_ipa_priv *ipa_ctx,
612 				wlan_ipa_send_to_nw cb)
613 {
614 	ipa_ctx->send_to_nw = cb;
615 }
616 
617 #if defined(QCA_CONFIG_RPS) && !defined(MDM_PLATFORM)
618 /**
619  * wlan_ipa_reg_rps_enable_cb() - Register callback to enable RPS
620  * @ipa_ctx: IPA context
621  * @cb: callback
622  *
623  * Return: None
624  */
625 static inline
wlan_ipa_reg_rps_enable_cb(struct wlan_ipa_priv * ipa_ctx,wlan_ipa_rps_enable cb)626 void wlan_ipa_reg_rps_enable_cb(struct wlan_ipa_priv *ipa_ctx,
627 				wlan_ipa_rps_enable cb)
628 {
629 	ipa_ctx->rps_enable = cb;
630 }
631 
632 /**
633  * ipa_set_rps_per_vdev(): Enable/disable RPS for a specific vdev
634  * @ipa_ctx: IPA context
635  * @vdev_id: vdev id for which RPS needs to be enabled
636  * @enable: Set true to enable RPS
637  *
638  * Return: None
639  */
640 static inline
ipa_set_rps_per_vdev(struct wlan_ipa_priv * ipa_ctx,uint8_t vdev_id,bool enable)641 void ipa_set_rps_per_vdev(struct wlan_ipa_priv *ipa_ctx, uint8_t vdev_id,
642 			  bool enable)
643 {
644 	if (ipa_ctx->rps_enable)
645 		ipa_ctx->rps_enable(vdev_id, enable);
646 }
647 
648 #else
649 static inline
ipa_set_rps_per_vdev(struct wlan_ipa_priv * ipa_ctx,uint8_t vdev_id,bool enable)650 void ipa_set_rps_per_vdev(struct wlan_ipa_priv *ipa_ctx, uint8_t vdev_id,
651 			  bool enable)
652 {
653 }
654 #endif
655 
656 /**
657  * wlan_ipa_set_mcc_mode() - Set MCC mode
658  * @ipa_ctx: IPA context
659  * @mcc_mode: 1=MCC/0=SCC
660  *
661  * Return: void
662  */
663 void wlan_ipa_set_mcc_mode(struct wlan_ipa_priv *ipa_ctx, bool mcc_mode);
664 
665 /**
666  * wlan_ipa_set_dfs_cac_tx() - Set DFS cac tx block
667  * @ipa_ctx: IPA context
668  * @tx_block: dfs cac tx block
669  *
670  * Return: void
671  */
672 static inline
wlan_ipa_set_dfs_cac_tx(struct wlan_ipa_priv * ipa_ctx,bool tx_block)673 void wlan_ipa_set_dfs_cac_tx(struct wlan_ipa_priv *ipa_ctx, bool tx_block)
674 {
675 	ipa_ctx->dfs_cac_block_tx = tx_block;
676 }
677 
678 /**
679  * wlan_ipa_set_ap_ibss_fwd() - Set AP intra bss forward
680  * @ipa_ctx: IPA context
681  * @session_id: vdev id
682  * @intra_bss: 1 to disable ap intra bss forward and 0 to enable ap intra bss
683  *	       forward
684  *
685  * Return: void
686  */
687 static inline
wlan_ipa_set_ap_ibss_fwd(struct wlan_ipa_priv * ipa_ctx,uint8_t session_id,bool intra_bss)688 void wlan_ipa_set_ap_ibss_fwd(struct wlan_ipa_priv *ipa_ctx, uint8_t session_id,
689 			      bool intra_bss)
690 {
691 	if (session_id >= WLAN_IPA_MAX_SESSION)
692 		return;
693 
694 	ipa_ctx->disable_intrabss_fwd[session_id] = intra_bss;
695 }
696 
697 /**
698  * wlan_ipa_uc_ol_init() - Initialize IPA uC offload
699  * @ipa_ctx: IPA context
700  * @osdev: Parent device instance
701  *
702  * This function is called to update IPA pipe configuration with resources
703  * allocated by wlan driver (cds_pre_enable) before enabling it in FW
704  *
705  * Return: QDF_STATUS
706  */
707 QDF_STATUS wlan_ipa_uc_ol_init(struct wlan_ipa_priv *ipa_ctx,
708 			       qdf_device_t osdev);
709 
710 /**
711  * wlan_ipa_uc_ol_deinit() - Disconnect IPA TX and RX pipes
712  * @ipa_ctx: IPA context
713  *
714  * Return: QDF_STATUS
715  */
716 QDF_STATUS wlan_ipa_uc_ol_deinit(struct wlan_ipa_priv *ipa_ctx);
717 
718 /**
719  * wlan_ipa_flush() - flush IPA exception path SKB's
720  * @ipa_ctx: IPA context
721  *
722  * Return: None
723  */
724 void wlan_ipa_flush(struct wlan_ipa_priv *ipa_ctx);
725 
726 /**
727  * wlan_ipa_suspend() - Suspend IPA
728  * @ipa_ctx: IPA context
729  *
730  * Return: QDF STATUS
731  */
732 QDF_STATUS wlan_ipa_suspend(struct wlan_ipa_priv *ipa_ctx);
733 
734 /**
735  * wlan_ipa_resume() - Resume IPA
736  * @ipa_ctx: IPA context
737  *
738  * Return: QDF STATUS
739  */
740 QDF_STATUS wlan_ipa_resume(struct wlan_ipa_priv *ipa_ctx);
741 
742 #if !defined(QCA_LL_TX_FLOW_CONTROL_V2) && !defined(QCA_IPA_LL_TX_FLOW_CONTROL)
743 /**
744  * wlan_ipa_send_mcc_scc_msg() - Send IPA WLAN_SWITCH_TO_MCC/SCC message
745  * @ipa_ctx: IPA context
746  * @mcc_mode: 0=MCC/1=SCC
747  *
748  * Return: QDF STATUS
749  */
750 QDF_STATUS wlan_ipa_send_mcc_scc_msg(struct wlan_ipa_priv *ipa_ctx,
751 				     bool mcc_mode);
752 #else
753 static inline
wlan_ipa_send_mcc_scc_msg(struct wlan_ipa_priv * ipa_ctx,bool mcc_mode)754 QDF_STATUS wlan_ipa_send_mcc_scc_msg(struct wlan_ipa_priv *ipa_ctx,
755 				     bool mcc_mode)
756 {
757 	return QDF_STATUS_SUCCESS;
758 }
759 
wlan_ipa_mcc_work_handler(void * data)760 static inline void wlan_ipa_mcc_work_handler(void *data)
761 {
762 }
763 #endif
764 
765 /**
766  * wlan_ipa_wlan_evt() - IPA event handler
767  * @net_dev: Interface net device
768  * @device_mode: Net interface device mode
769  * @session_id: session id for the event
770  * @ipa_event_type: event enum of type ipa_wlan_event
771  * @mac_addr: MAC address associated with the event
772  * @is_2g_iface: true if interface is operating on 2G band, otherwise false
773  * @ipa_obj: IPA context
774  *
775  * Return: QDF_STATUS
776  */
777 QDF_STATUS wlan_ipa_wlan_evt(qdf_netdev_t net_dev, uint8_t device_mode,
778 			     uint8_t session_id,
779 			     enum wlan_ipa_wlan_event ipa_event_type,
780 			     const uint8_t *mac_addr, bool is_2g_iface,
781 			     struct wlan_ipa_priv *ipa_obj);
782 
783 /**
784  * wlan_ipa_uc_smmu_map() - Map / Unmap DMA buffer to IPA UC
785  * @map: Map / unmap operation
786  * @num_buf: Number of buffers in array
787  * @buf_arr: Buffer array of DMA mem mapping info
788  *
789  * This API maps/unmaps WLAN-IPA buffers if SMMU S1 translation
790  * is enabled.
791  *
792  * Return: Status of map operation
793  */
794 int wlan_ipa_uc_smmu_map(bool map, uint32_t num_buf, qdf_mem_info_t *buf_arr);
795 
796 /**
797  * wlan_ipa_is_fw_wdi_activated() - Is FW WDI activated?
798  * @ipa_ctx: IPA context
799  *
800  * Return: true if FW WDI activated, false otherwise
801  */
802 bool wlan_ipa_is_fw_wdi_activated(struct wlan_ipa_priv *ipa_ctx);
803 
804 /**
805  * wlan_ipa_uc_cleanup_sta - disconnect and cleanup sta iface
806  * @ipa_ctx: IPA context
807  * @net_dev: Interface net device
808  * @session_id: vdev id
809  *
810  * Send disconnect sta event to IPA driver and cleanup IPA iface
811  * if not yet done
812  *
813  * Return: void
814  */
815 void wlan_ipa_uc_cleanup_sta(struct wlan_ipa_priv *ipa_ctx,
816 			     qdf_netdev_t net_dev, uint8_t session_id);
817 
818 /**
819  * wlan_ipa_uc_disconnect_ap() - send ap disconnect event
820  * @ipa_ctx: IPA context
821  * @net_dev: Interface net device
822  *
823  * Send disconnect ap event to IPA driver
824  *
825  * Return: QDF_STATUS
826  */
827 QDF_STATUS wlan_ipa_uc_disconnect_ap(struct wlan_ipa_priv *ipa_ctx,
828 				     qdf_netdev_t net_dev);
829 
830 /**
831  * wlan_ipa_cleanup_dev_iface() - Clean up net dev IPA interface
832  * @ipa_ctx: IPA context
833  * @net_dev: Interface net device
834  * @session_id: vdev id
835  *
836  * Return: None
837  */
838 void wlan_ipa_cleanup_dev_iface(struct wlan_ipa_priv *ipa_ctx,
839 				qdf_netdev_t net_dev, uint8_t session_id);
840 
841 /**
842  * wlan_ipa_uc_ssr_cleanup() - handle IPA UC clean up during SSR
843  * @ipa_ctx: IPA context
844  *
845  * Return: None
846  */
847 void wlan_ipa_uc_ssr_cleanup(struct wlan_ipa_priv *ipa_ctx);
848 
849 /**
850  * wlan_ipa_fw_rejuvenate_send_msg() - send fw rejuvenate message to IPA driver
851  * @ipa_ctx: IPA context
852  *
853  * Return: void
854  */
855 void wlan_ipa_fw_rejuvenate_send_msg(struct wlan_ipa_priv *ipa_ctx);
856 
857 /**
858  * wlan_ipa_flush_pending_vdev_events() - flush pending vdev ipa events
859  * @ipa_ctx: IPA context
860  * @vdev_id: vdev id
861  *
862  * This function is to flush vdev wlan ipa pending events
863  *
864  * Return: None
865  */
866 void wlan_ipa_flush_pending_vdev_events(struct wlan_ipa_priv *ipa_ctx,
867 					uint8_t vdev_id);
868 
869 /**
870  * wlan_ipa_set_perf_level_bw_enabled - Get bandwidth based IPA perf voting
871  *					status
872  * @ipa_ctx: IPA context
873  *
874  * This function returns true or false for bandwidth based IPA perf level
875  * voting.
876  *
877  * Return: true - bandwidth based IPA perf voting is enabld. Otherwise false.
878  */
879 bool wlan_ipa_set_perf_level_bw_enabled(struct wlan_ipa_priv *ipa_ctx);
880 
881 /**
882  * wlan_ipa_set_perf_level_bw() - Set IPA perf level based on BW
883  * @ipa_ctx: IPA context
884  * @lvl: enum wlan_ipa_bw_level
885  *
886  * This function is to set IPA perf level based on bw level
887  *
888  * Return: None
889  */
890 void wlan_ipa_set_perf_level_bw(struct wlan_ipa_priv *ipa_ctx,
891 				enum wlan_ipa_bw_level lvl);
892 
893 #ifdef IPA_OPT_WIFI_DP
894 /**
895  * wlan_ipa_wdi_opt_dpath_flt_rsrv_cb() - reserve cce super rules for Rx filter
896  * @ipa_ctx: ipa_context
897  * @out_params: filter reservation params
898  *
899  * Return:int 0 on success, negative on failure
900  *
901  */
902 int wlan_ipa_wdi_opt_dpath_flt_rsrv_cb(
903 		       void *ipa_ctx,
904 		       struct ipa_wdi_opt_dpath_flt_rsrv_cb_params *out_params);
905 
906 /**
907  * wlan_ipa_wdi_opt_dpath_notify_flt_rsvd() - notify filter reservation
908  * response to IPA
909  * @is_success: result of filter reservation
910  *
911  * Return: None
912  */
913 void wlan_ipa_wdi_opt_dpath_notify_flt_rsvd(bool is_success);
914 
915 /**
916  * wlan_ipa_wdi_opt_dpath_flt_add_cb - Add rx filter tuple to cce filter
917  * @ipa_ctx: IPA context
918  * @in_out: filter tuple info
919  *
920  * Return: 0 on success, negative on failure
921  */
922 int wlan_ipa_wdi_opt_dpath_flt_add_cb(
923 			    void *ipa_ctx,
924 			    struct ipa_wdi_opt_dpath_flt_add_cb_params *in_out);
925 
926 /**
927  * wlan_ipa_wdi_opt_dpath_flt_rem_cb() - Remove rx filter tuple from cce filter
928  * @ipa_ctx: IPA context
929  * @in: filter tuple info
930  *
931  * Return: 0 on success, negative on failure
932  */
933 int wlan_ipa_wdi_opt_dpath_flt_rem_cb(
934 			      void *ipa_ctx,
935 			      struct ipa_wdi_opt_dpath_flt_rem_cb_params *in);
936 
937 /**
938  * wlan_ipa_wdi_opt_dpath_notify_flt_add_rem_cb() - notify filter add/remove
939  * result to IPA
940  * @result0: result of add/remove filter0
941  * @result1: result of add/remove filter1
942  *
943  * Return: void
944  */
945 void wlan_ipa_wdi_opt_dpath_notify_flt_add_rem_cb(int result0, int result1);
946 
947 /**
948  * wlan_ipa_wdi_opt_dpath_flt_rsrv_rel_cb() - cb to release cce super rules
949  * @ipa_ctx: IPA context
950  *
951  * Return: 0 on success, negative on failure
952  *
953  */
954 int wlan_ipa_wdi_opt_dpath_flt_rsrv_rel_cb(void *ipa_ctx);
955 
956 /**
957  * wlan_ipa_wdi_opt_dpath_notify_flt_rlsd() - notify filter release
958  * response to IPA
959  * @result0: result of filter0 release
960  * @result1: result of filter1 release
961  *
962  * Return: void
963  */
964 void wlan_ipa_wdi_opt_dpath_notify_flt_rlsd(int result0, int result1);
965 
966 #endif /* IPA_OPT_WIFI_DP */
967 
968 #ifdef IPA_WDI3_TX_TWO_PIPES
969 /**
970  * wlan_ipa_get_alt_pipe() - Get alt_pipe for vdev_id
971  * @ipa_ctx: IPA context
972  * @vdev_id: vdev_id of the target interface
973  * @alt_pipe: Boolean output to indicate if interface with @vdev_id
974  *	      is using alternate TX pipe or not.
975  *
976  * Return: QDF_STATUS
977  */
978 QDF_STATUS wlan_ipa_get_alt_pipe(struct wlan_ipa_priv *ipa_ctx,
979 				 uint8_t vdev_id,
980 				 bool *alt_pipe);
981 #else /* !IPA_WDI3_TX_TWO_PIPES */
982 static inline
wlan_ipa_get_alt_pipe(struct wlan_ipa_priv * ipa_ctx,uint8_t vdev_id,bool * alt_pipe)983 QDF_STATUS wlan_ipa_get_alt_pipe(struct wlan_ipa_priv *ipa_ctx,
984 				 uint8_t vdev_id,
985 				 bool *alt_pipe)
986 {
987 	return QDF_STATUS_E_INVAL;
988 }
989 #endif /* IPA_WDI3_TX_TWO_PIPES */
990 
991 #endif /* IPA_OFFLOAD */
992 #endif /* _WLAN_IPA_CORE_H_ */
993