xref: /wlan-dirver/qca-wifi-host-cmn/ipa/core/inc/wlan_ipa_main.h (revision 8b3dca18206e1a0461492f082fa6e270b092c035)
1 /*
2  * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved.
3  * Copyright (c) 2021-2022 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  * IPA user configuration and target interface
22  */
23 
24 #ifndef _WLAN_IPA_MAIN_H_
25 #define _WLAN_IPA_MAIN_H_
26 
27 #ifdef IPA_OFFLOAD
28 
29 #include <wlan_objmgr_psoc_obj.h>
30 #include <wlan_objmgr_pdev_obj.h>
31 #include <wlan_ipa_public_struct.h>
32 #include <wlan_ipa_priv.h>
33 
34 /* Declare a variable for IPA instancess added based on pdev */
35 extern uint8_t g_instances_added;
36 #define IPA_INVALID_HDL 0xFF
37 #define ipa_fatal(params...) \
38 	QDF_TRACE_FATAL(QDF_MODULE_ID_IPA, params)
39 #define ipa_err(params...) \
40 	QDF_TRACE_ERROR(QDF_MODULE_ID_IPA, params)
41 #define ipa_warn(params...) \
42 	QDF_TRACE_WARN(QDF_MODULE_ID_IPA, params)
43 #define ipa_info(params...) \
44 	QDF_TRACE_INFO(QDF_MODULE_ID_IPA, params)
45 #define ipa_debug(params...) \
46 	QDF_TRACE_DEBUG(QDF_MODULE_ID_IPA, params)
47 
48 #define ipa_nofl_fatal(params...) \
49 	QDF_TRACE_FATAL_NO_FL(QDF_MODULE_ID_IPA, params)
50 #define ipa_nofl_err(params...) \
51 	QDF_TRACE_ERROR_NO_FL(QDF_MODULE_ID_IPA, params)
52 #define ipa_nofl_warn(params...) \
53 	QDF_TRACE_WARN_NO_FL(QDF_MODULE_ID_IPA, params)
54 #define ipa_nofl_info(params...) \
55 	QDF_TRACE_INFO_NO_FL(QDF_MODULE_ID_IPA, params)
56 #define ipa_nofl_debug(params...) \
57 	QDF_TRACE_DEBUG_NO_FL(QDF_MODULE_ID_IPA, params)
58 
59 #define ipa_fatal_rl(params...) QDF_TRACE_FATAL_RL(QDF_MODULE_ID_IPA, params)
60 #define ipa_err_rl(params...) QDF_TRACE_ERROR_RL(QDF_MODULE_ID_IPA, params)
61 #define ipa_warn_rl(params...) QDF_TRACE_WARN_RL(QDF_MODULE_ID_IPA, params)
62 #define ipa_info_rl(params...) QDF_TRACE_INFO_RL(QDF_MODULE_ID_IPA, params)
63 #define ipa_debug_rl(params...) QDF_TRACE_DEBUG_RL(QDF_MODULE_ID_IPA, params)
64 
65 #define IPA_ENTER() \
66 	QDF_TRACE_ENTER(QDF_MODULE_ID_IPA, "enter")
67 #define IPA_EXIT() \
68 	QDF_TRACE_EXIT(QDF_MODULE_ID_IPA, "exit")
69 
70 /**
71  * ipa_set_pld_enable() - set g_ipa_pld_enable
72  * @flag: flag to set g_ipa_pld_enable
73  *
74  * Return: None
75  */
76 void ipa_set_pld_enable(bool flag);
77 
78 /**
79  * ipa_get_pld_enable() - check if IPA is disabled in pld
80  *
81  * Return: g_ipa_pld_enable
82  */
83 bool ipa_get_pld_enable(void);
84 
85 /**
86  * ipa_check_hw_present() - get IPA hw status
87  *
88  * ipa_uc_reg_rdyCB is not directly designed to check
89  * ipa hw status. This is an undocumented function which
90  * has confirmed with IPA team.
91  *
92  * Return: true - ipa hw present
93  *         false - ipa hw not present
94  */
95 bool ipa_check_hw_present(void);
96 
97 /**
98  * wlan_get_pdev_ipa_obj() - private API to get ipa pdev object
99  * @pdev: pdev object
100  *
101  * Return: ipa object
102  */
103 static inline struct wlan_ipa_priv *
104 ipa_pdev_get_priv_obj(struct wlan_objmgr_pdev *pdev)
105 {
106 	struct wlan_ipa_priv *pdev_obj;
107 
108 	pdev_obj = (struct wlan_ipa_priv *)
109 		wlan_objmgr_pdev_get_comp_private_obj(pdev,
110 				WLAN_UMAC_COMP_IPA);
111 
112 	return pdev_obj;
113 }
114 
115 /**
116  * ipa_priv_obj_get_pdev() - API to get pdev from IPA object
117  * @ipa_obj: IPA object
118  *
119  * Return: pdev object
120  */
121 static inline struct wlan_objmgr_pdev *
122 ipa_priv_obj_get_pdev(struct wlan_ipa_priv *ipa_obj)
123 {
124 	return ipa_obj->pdev;
125 }
126 
127 /**
128  * ipa_is_hw_support() - Is IPA HW support?
129  *
130  * Return: true if IPA HW  is present or false otherwise
131  */
132 bool ipa_is_hw_support(void);
133 
134 /**
135  * ipa_config_mem_alloc() - IPA config allocation
136  *
137  * Return: QDF_STATUS_SUCCESS on success
138  */
139 QDF_STATUS ipa_config_mem_alloc(void);
140 
141 /**
142  * ipa_config_mem_free() - IPA config mem free
143  *
144  * Return: None
145  */
146 void ipa_config_mem_free(void);
147 
148 /**
149  * ipa_config_is_enabled() - Is IPA config enabled?
150  *
151  * Return: true if IPA is enabled in IPA config
152  */
153 bool ipa_config_is_enabled(void);
154 
155 /**
156  * ipa_config_is_uc_enabled() - Is IPA uC config enabled?
157  *
158  * Return: true if IPA uC is enabled in IPA config
159  */
160 bool ipa_config_is_uc_enabled(void);
161 
162 /**
163  * ipa_config_is_vlan_enabled() - Is IPA vlan config enabled?
164  *
165  * Return: true if IPA clan support is enabled in IPA config
166  */
167 bool ipa_config_is_vlan_enabled(void);
168 
169 /**
170  * ipa_obj_setup() - IPA obj initialization and setup
171  * @ipa_ctx: IPA obj context
172  *
173  * Return: QDF_STATUS_SUCCESS on success
174  */
175 QDF_STATUS ipa_obj_setup(struct wlan_ipa_priv *ipa_ctx);
176 
177 /**
178  * ipa_obj_cleanup() - IPA obj cleanup
179  * @ipa_ctx: IPA obj context
180  *
181  * Return: QDF_STATUS_SUCCESS on success
182  */
183 QDF_STATUS ipa_obj_cleanup(struct wlan_ipa_priv *ipa_ctx);
184 
185 /**
186  * ipa_send_uc_offload_enable_disable() - wdi enable/disable notify to fw
187  * @pdev: objmgr pdev object
188  * @req: ipa offload control request
189  *
190  * Return: QDF status success or failure
191  */
192 QDF_STATUS ipa_send_uc_offload_enable_disable(struct wlan_objmgr_pdev *pdev,
193 				struct ipa_uc_offload_control_params *req);
194 
195 /**
196  * ipa_send_intrabss_enable_disable() - wdi intrabss enable/disable notify to fw
197  * @pdev: objmgr pdev object
198  * @req: ipa intrabss control request
199  *
200  * Return: QDF status success or failure
201  */
202 QDF_STATUS
203 ipa_send_intrabss_enable_disable(struct wlan_objmgr_pdev *pdev,
204 				 struct ipa_intrabss_control_params *req);
205 
206 /**
207  * ipa_set_dp_handle() - set dp soc handle
208  * @psoc: psoc handle
209  * @dp_soc: dp soc handle
210  *
211  * Return: None
212  */
213 void ipa_set_dp_handle(struct wlan_objmgr_psoc *psoc, void *dp_soc);
214 
215 /**
216  * ipa_set_pdev_id() - set dp pdev id
217  * @psoc: psoc handle
218  * @pdev_id: dp txrx physical device id
219  *
220  * Return: None
221  */
222 void ipa_set_pdev_id(struct wlan_objmgr_psoc *psoc, uint8_t pdev_id);
223 
224 /**
225  * ipa_rm_set_perf_level() - set ipa rm perf level
226  * @pdev: pdev handle
227  * @tx_packets: packets transmitted in the last sample period
228  * @rx_packets: packets received in the last sample period
229  *
230  * Return: QDF_STATUS
231  */
232 QDF_STATUS ipa_rm_set_perf_level(struct wlan_objmgr_pdev *pdev,
233 				 uint64_t tx_packets, uint64_t rx_packets);
234 
235 /**
236  * ipa_uc_info() - Print IPA uC resource and session information
237  * @pdev: pdev obj
238  *
239  * Return: None
240  */
241 void ipa_uc_info(struct wlan_objmgr_pdev *pdev);
242 
243 /**
244  * ipa_uc_stat() - Print IPA uC stats
245  * @pdev: pdev obj
246  *
247  * Return: None
248  */
249 void ipa_uc_stat(struct wlan_objmgr_pdev *pdev);
250 
251 /**
252  * ipa_uc_rt_debug_host_dump() - IPA rt debug host dump
253  * @pdev: pdev obj
254  *
255  * Return: None
256  */
257 void ipa_uc_rt_debug_host_dump(struct wlan_objmgr_pdev *pdev);
258 
259 /**
260  * ipa_dump_info() - Dump IPA context information
261  * @pdev: pdev obj
262  *
263  * Return: None
264  */
265 void ipa_dump_info(struct wlan_objmgr_pdev *pdev);
266 
267 /**
268  * ipa_uc_stat_request() - Get IPA stats from IPA.
269  * @pdev: pdev obj
270  * @reason: STAT REQ Reason
271  *
272  * Return: None
273  */
274 void ipa_uc_stat_request(struct wlan_objmgr_pdev *pdev,
275 			 uint8_t reason);
276 
277 /**
278  * ipa_uc_stat_query() - Query the IPA stats
279  * @pdev: pdev obj
280  * @ipa_tx_diff: tx packet count diff from previous tx packet count
281  * @ipa_rx_diff: rx packet count diff from previous rx packet count
282  *
283  * Return: None
284  */
285 void ipa_uc_stat_query(struct wlan_objmgr_pdev *pdev,
286 		       uint32_t *ipa_tx_diff, uint32_t *ipa_rx_diff);
287 
288 /**
289  * ipa_reg_sap_xmit_cb() - Register upper layer SAP cb to transmit
290  * @pdev: pdev obj
291  * @cb: callback
292  *
293  * Return: None
294  */
295 void ipa_reg_sap_xmit_cb(struct wlan_objmgr_pdev *pdev,
296 			 wlan_ipa_softap_xmit cb);
297 
298 /**
299  * ipa_reg_send_to_nw_cb() - Register cb to send IPA Rx packet to network
300  * @pdev: pdev obj
301  * @cb: callback
302  *
303  * Return: None
304  */
305 void ipa_reg_send_to_nw_cb(struct wlan_objmgr_pdev *pdev,
306 			   wlan_ipa_send_to_nw cb);
307 
308 #ifdef QCA_CONFIG_RPS
309 /**
310  * ipa_reg_rps_enable_cb() - Register cb to enable RPS
311  * @pdev: pdev obj
312  * @cb: callback
313  *
314  * Return: None
315  */
316 void ipa_reg_rps_enable_cb(struct wlan_objmgr_pdev *pdev,
317 			   wlan_ipa_rps_enable cb);
318 #endif
319 
320 /**
321  * ipa_reg_is_driver_unloading_cb() - Register cb to check if driver is
322  *                                    unloading
323  * @pdev: pdev obj
324  * @cb: callback
325  *
326  * Return: None
327  */
328 void ipa_reg_is_driver_unloading_cb(struct wlan_objmgr_pdev *pdev,
329 				    wlan_ipa_driver_unloading cb);
330 /**
331  * ipa_set_mcc_mode() - Set MCC mode
332  * @pdev: pdev obj
333  * @mcc_mode: 0=MCC/1=SCC
334  *
335  * Return: void
336  */
337 void ipa_set_mcc_mode(struct wlan_objmgr_pdev *pdev, bool mcc_mode);
338 
339 /**
340  * ipa_set_dfs_cac_tx() - Set DFS cac tx block
341  * @pdev: pdev obj
342  * @tx_block: dfs cac tx block
343  *
344  * Return: void
345  */
346 void ipa_set_dfs_cac_tx(struct wlan_objmgr_pdev *pdev, bool tx_block);
347 
348 /**
349  * ipa_set_ap_ibss_fwd() - Set AP intra bss forward
350  * @pdev: pdev obj
351  * @session_id: vdev id
352  * @intra_bss: enable or disable ap intra bss forward
353  *
354  * Return: void
355  */
356 void ipa_set_ap_ibss_fwd(struct wlan_objmgr_pdev *pdev, uint8_t session_id,
357 			 bool intra_bss);
358 
359 /**
360  * ipa_uc_force_pipe_shutdown() - Force IPA pipe shutdown
361  * @pdev: pdev obj
362  *
363  * Return: void
364  */
365 void ipa_uc_force_pipe_shutdown(struct wlan_objmgr_pdev *pdev);
366 
367 /**
368  * ipa_flush() - flush IPA exception path SKB's
369  * @pdev: pdev obj
370  *
371  * Return: None
372  */
373 void ipa_flush(struct wlan_objmgr_pdev *pdev);
374 
375 /**
376  * ipa_suspend() - Suspend IPA
377  * @pdev: pdev obj
378  *
379  * Return: QDF STATUS
380  */
381 QDF_STATUS ipa_suspend(struct wlan_objmgr_pdev *pdev);
382 
383 /**
384  * ipa_resume() - Resume IPA
385  * @pdev: pdev obj
386  *
387  * Return: None
388  */
389 QDF_STATUS ipa_resume(struct wlan_objmgr_pdev *pdev);
390 
391 /**
392  * ucfg_ipa_uc_ol_init() - Initialize IPA uC offload
393  * @pdev: pdev obj
394  * @osdev: OS dev
395  *
396  * Return: QDF STATUS
397  */
398 QDF_STATUS ipa_uc_ol_init(struct wlan_objmgr_pdev *pdev,
399 			  qdf_device_t osdev);
400 
401 /**
402  * ucfg_ipa_uc_ol_deinit() - Deinitialize IPA uC offload
403  * @pdev: pdev obj
404  *
405  * Return: QDF STATUS
406  */
407 QDF_STATUS ipa_uc_ol_deinit(struct wlan_objmgr_pdev *pdev);
408 
409 /**
410  * ipa_is_tx_pending() - Check if IPA WLAN TX completions are pending
411  * @pdev: pdev obj
412  *
413  * Return: bool if pending TX for IPA.
414  */
415 bool ipa_is_tx_pending(struct wlan_objmgr_pdev *pdev);
416 
417 /**
418  * ipa_send_mcc_scc_msg() - Send IPA WLAN_SWITCH_TO_MCC/SCC message
419  * @pdev: pdev obj
420  * @mcc_mode: 0=MCC/1=SCC
421  *
422  * Return: QDF STATUS
423  */
424 QDF_STATUS ipa_send_mcc_scc_msg(struct wlan_objmgr_pdev *pdev,
425 				bool mcc_mode);
426 
427 /**
428  * ipa_wlan_evt() - IPA event handler
429  * @pdev: pdev obj
430  * @net_dev: Interface net device
431  * @device_mode: Net interface device mode
432  * @session_id: session id for the event
433  * @type: event enum of type ipa_wlan_event
434  * @mac_address: MAC address associated with the event
435  * @is_2g_iface: true if interface is operating on 2G band, otherwise false
436  *
437  * Return: QDF_STATUS
438  */
439 QDF_STATUS ipa_wlan_evt(struct wlan_objmgr_pdev *pdev, qdf_netdev_t net_dev,
440 			uint8_t device_mode, uint8_t session_id,
441 			enum wlan_ipa_wlan_event ipa_event_type,
442 			const uint8_t *mac_addr, bool is_2g_iface);
443 
444 /**
445  * ipa_uc_smmu_map() - Map / Unmap DMA buffer to IPA UC
446  * @map: Map / unmap operation
447  * @num_buf: Number of buffers in array
448  * @buf_arr: Buffer array of DMA mem mapping info
449  *
450  * Return: Status of map operation
451  */
452 int ipa_uc_smmu_map(bool map, uint32_t num_buf, qdf_mem_info_t *buf_arr);
453 
454 /**
455  * ipa_is_fw_wdi_activated - Is FW WDI activated?
456  * @pdev: pdev obj
457  *
458  * Return: true if FW WDI activated, false otherwise
459  */
460 bool ipa_is_fw_wdi_activated(struct wlan_objmgr_pdev *pdev);
461 
462 /**
463  * ipa_uc_cleanup_sta() - disconnect and cleanup sta iface
464  * @pdev: pdev obj
465  * @net_dev: Interface net device
466  *
467  * Send disconnect sta event to IPA driver and cleanup IPA iface,
468  * if not yet done
469  *
470  * Return: void
471  */
472 void ipa_uc_cleanup_sta(struct wlan_objmgr_pdev *pdev,
473 			qdf_netdev_t net_dev);
474 
475 /**
476  * ipa_uc_disconnect_ap() - send ap disconnect event
477  * @pdev: pdev obj
478  * @net_dev: Interface net device
479  *
480  * Send disconnect ap event to IPA driver
481  *
482  * Return: QDF_STATUS
483  */
484 QDF_STATUS ipa_uc_disconnect_ap(struct wlan_objmgr_pdev *pdev,
485 				qdf_netdev_t net_dev);
486 
487 /**
488  * ipa_cleanup_dev_iface() - Clean up net dev IPA interface
489  * @pdev: pdev obj
490  * @net_dev: Interface net device
491  *
492  * Return: None
493  */
494 void ipa_cleanup_dev_iface(struct wlan_objmgr_pdev *pdev,
495 			   qdf_netdev_t net_dev);
496 
497 /**
498  * ipa_uc_ssr_cleanup() - handle IPA UC cleanup during SSR
499  * @pdev: pdev obj
500  *
501  * Return: None
502  */
503 void ipa_uc_ssr_cleanup(struct wlan_objmgr_pdev *pdev);
504 
505 /**
506  * ipa_fw_rejuvenate_send_msg() - send fw rejuvenate message to IPA driver
507  * @pdev: pdev obj
508  *
509  * Return: None
510  */
511 void ipa_fw_rejuvenate_send_msg(struct wlan_objmgr_pdev *pdev);
512 
513 /**
514  * ipa_component_config_update() - update ipa config from psoc
515  * @psoc: psoc obj
516  *
517  * Return: None
518  */
519 void ipa_component_config_update(struct wlan_objmgr_psoc *psoc);
520 
521 /**
522  * ipa_component_config_free() - Free ipa config
523  *
524  * Return: None
525  */
526 void ipa_component_config_free(void);
527 
528 /**
529  * ipa_get_tx_buf_count() - get IPA config tx buffer count
530  *
531  * Return: IPA config tx buffer count
532  */
533 uint32_t ipa_get_tx_buf_count(void);
534 
535 /**
536  * ipa_update_tx_stats() - Update embedded tx traffic in bytes to IPA
537  * @pdev: pdev obj
538  * @sta_tx: tx in bytes on sta vdev
539  * @ap_tx: tx in bytes on sap vdev
540  *
541  * Return: None
542  */
543 void ipa_update_tx_stats(struct wlan_objmgr_pdev *pdev, uint64_t sta_tx,
544 			 uint64_t ap_tx);
545 
546 /**
547  * ipa_flush_pending_vdev_events() - flush pending vdev wlan ipa events
548  * @pdev: pdev obj
549  * @vdev_id: vdev id
550  *
551  * Return: None
552  */
553 void ipa_flush_pending_vdev_events(struct wlan_objmgr_pdev *pdev,
554 				   uint8_t vdev_id);
555 
556 /**
557  * ipa_cb_is_ready() - Is IPA register callback is invoked
558  *
559  * Return: true if IPA register callback is invoked or false
560  * otherwise
561  */
562 bool ipa_cb_is_ready(void);
563 
564 /**
565  * ipa_init_deinit_lock() - lock ipa init deinit lock
566  *
567  * Return: None
568  */
569 void ipa_init_deinit_lock(void);
570 
571 /**
572  * ipa_init_deinit_unlock() - unlock ipa init deinit lock
573  *
574  * Return: None
575  */
576 void ipa_init_deinit_unlock(void);
577 
578 /**
579  * ipa_is_wds_enabled() - IPA wds status
580  *
581  * Return: true if WDS is enabled otherwise false
582  */
583 bool ipa_is_wds_enabled(void);
584 
585 #else /* Not IPA_OFFLOAD */
586 typedef QDF_STATUS (*wlan_ipa_softap_xmit)(qdf_nbuf_t nbuf, qdf_netdev_t dev);
587 typedef void (*wlan_ipa_send_to_nw)(qdf_nbuf_t nbuf, qdf_netdev_t dev);
588 typedef void (*wlan_ipa_rps_enable)(uint8_t vdev_id, bool enable);
589 typedef bool (*wlan_ipa_driver_unloading)(void);
590 
591 #endif /* IPA_OFFLOAD */
592 #endif /* end  of _WLAN_IPA_MAIN_H_ */
593