1  /*
2   * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved.
3   * Copyright (c) 2021-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  /**
21   * DOC: contains ipa component main function definitions
22   */
23  
24  #include "wlan_ipa_main.h"
25  #include "wlan_ipa_core.h"
26  #include "wlan_ipa_tgt_api.h"
27  #include "cfg_ucfg_api.h"
28  #include "wlan_ipa_obj_mgmt_api.h"
29  
30  static struct wlan_ipa_config *g_ipa_config;
31  static bool g_ipa_hw_support;
32  static bool g_ipa_pld_enable = true;
33  static bool g_ipa_cap_offload = true;
34  
ipa_set_cap_offload(bool flag)35  void ipa_set_cap_offload(bool flag)
36  {
37  	g_ipa_cap_offload = flag;
38  }
39  
ipa_set_pld_enable(bool flag)40  void ipa_set_pld_enable(bool flag)
41  {
42  	g_ipa_pld_enable = flag;
43  }
44  
ipa_get_pld_enable(void)45  bool ipa_get_pld_enable(void)
46  {
47  	return (g_ipa_pld_enable && g_ipa_cap_offload);
48  }
49  
ipa_check_hw_present(void)50  bool ipa_check_hw_present(void)
51  {
52  	/* Check if ipa hw is enabled */
53  	if (qdf_ipa_uc_reg_rdyCB(NULL) != -EPERM) {
54  		g_ipa_hw_support = true;
55  		return true;
56  	} else {
57  		return false;
58  	}
59  }
60  
ipa_config_mem_alloc(void)61  QDF_STATUS ipa_config_mem_alloc(void)
62  {
63  	struct wlan_ipa_config *ipa_cfg;
64  
65  	if (g_ipa_config)
66  		return QDF_STATUS_SUCCESS;
67  
68  	ipa_cfg = qdf_mem_malloc(sizeof(*ipa_cfg));
69  	if (!ipa_cfg)
70  		return QDF_STATUS_E_NOMEM;
71  
72  	g_ipa_config = ipa_cfg;
73  
74  	return QDF_STATUS_SUCCESS;
75  }
76  
ipa_config_mem_free(void)77  void ipa_config_mem_free(void)
78  {
79  	if (!g_instances_added) {
80  		if (!g_ipa_config) {
81  			ipa_err("IPA config already freed");
82  			return;
83  		}
84  
85  		qdf_mem_free(g_ipa_config);
86  		g_ipa_config = NULL;
87  	}
88  }
89  
ipa_is_hw_support(void)90  bool ipa_is_hw_support(void)
91  {
92  	return g_ipa_hw_support;
93  }
94  
ipa_config_is_enabled(void)95  bool ipa_config_is_enabled(void)
96  {
97  	return g_ipa_config ? wlan_ipa_is_enabled(g_ipa_config) : 0;
98  }
99  
ipa_config_is_uc_enabled(void)100  bool ipa_config_is_uc_enabled(void)
101  {
102  	return g_ipa_config ? wlan_ipa_uc_is_enabled(g_ipa_config) : 0;
103  }
104  
ipa_config_is_opt_wifi_dp_enabled(void)105  bool ipa_config_is_opt_wifi_dp_enabled(void)
106  {
107  	return g_ipa_config ? wlan_ipa_is_opt_wifi_dp_enabled(g_ipa_config) : 0;
108  }
109  
ipa_config_is_vlan_enabled(void)110  bool ipa_config_is_vlan_enabled(void)
111  {
112  	if (!ipa_config_is_enabled())
113  		return false;
114  
115  	return g_ipa_config ? g_ipa_config->ipa_vlan_support : 0;
116  }
117  
ipa_obj_setup(struct wlan_ipa_priv * ipa_ctx)118  QDF_STATUS ipa_obj_setup(struct wlan_ipa_priv *ipa_ctx)
119  {
120  	return wlan_ipa_setup(ipa_ctx, g_ipa_config);
121  }
122  
ipa_obj_cleanup(struct wlan_ipa_priv * ipa_ctx)123  QDF_STATUS ipa_obj_cleanup(struct wlan_ipa_priv *ipa_ctx)
124  {
125  	return wlan_ipa_cleanup(ipa_ctx);
126  }
127  
ipa_send_uc_offload_enable_disable(struct wlan_objmgr_pdev * pdev,struct ipa_uc_offload_control_params * req)128  QDF_STATUS ipa_send_uc_offload_enable_disable(struct wlan_objmgr_pdev *pdev,
129  				struct ipa_uc_offload_control_params *req)
130  {
131  	return tgt_ipa_uc_offload_enable_disable(pdev, req);
132  }
133  
134  QDF_STATUS
ipa_send_intrabss_enable_disable(struct wlan_objmgr_pdev * pdev,struct ipa_intrabss_control_params * req)135  ipa_send_intrabss_enable_disable(struct wlan_objmgr_pdev *pdev,
136  				 struct ipa_intrabss_control_params *req)
137  {
138  	return tgt_ipa_intrabss_enable_disable(pdev, req);
139  }
140  
ipa_set_dp_handle(struct wlan_objmgr_psoc * psoc,void * dp_soc)141  void ipa_set_dp_handle(struct wlan_objmgr_psoc *psoc, void *dp_soc)
142  {
143  	struct wlan_objmgr_pdev *pdev;
144  	struct wlan_ipa_priv *ipa_obj;
145  
146  	if (!ipa_config_is_enabled()) {
147  		ipa_debug("ipa is disabled");
148  		return;
149  	}
150  
151  	pdev = wlan_objmgr_get_pdev_by_id(psoc, 0,
152  					  WLAN_IPA_ID);
153  
154  	if (!pdev) {
155  		ipa_err("Failed to get pdev handle");
156  		return;
157  	}
158  
159  	ipa_obj = ipa_pdev_get_priv_obj(pdev);
160  	if (!ipa_obj) {
161  		ipa_err("IPA object is NULL");
162  		wlan_objmgr_pdev_release_ref(pdev, WLAN_IPA_ID);
163  		return;
164  	}
165  
166  	ipa_obj->dp_soc = dp_soc;
167  	wlan_objmgr_pdev_release_ref(pdev, WLAN_IPA_ID);
168  }
169  
ipa_set_pdev_id(struct wlan_objmgr_psoc * psoc,uint8_t pdev_id)170  void ipa_set_pdev_id(struct wlan_objmgr_psoc *psoc, uint8_t pdev_id)
171  {
172  	struct wlan_objmgr_pdev *pdev;
173  	struct wlan_ipa_priv *ipa_obj;
174  
175  	if (!ipa_config_is_enabled()) {
176  		ipa_debug("ipa is disabled");
177  		return;
178  	}
179  
180  	pdev = wlan_objmgr_get_pdev_by_id(psoc, 0,
181  					  WLAN_IPA_ID);
182  
183  	if (!pdev) {
184  		ipa_err("Failed to get pdev handle");
185  		return;
186  	}
187  
188  	ipa_obj = ipa_pdev_get_priv_obj(pdev);
189  	if (!ipa_obj) {
190  		ipa_err("IPA object is NULL");
191  		wlan_objmgr_pdev_release_ref(pdev, WLAN_IPA_ID);
192  		return;
193  	}
194  
195  	ipa_obj->dp_pdev_id = pdev_id;
196  	wlan_objmgr_pdev_release_ref(pdev, WLAN_IPA_ID);
197  }
198  
ipa_rm_set_perf_level(struct wlan_objmgr_pdev * pdev,uint64_t tx_packets,uint64_t rx_packets)199  QDF_STATUS ipa_rm_set_perf_level(struct wlan_objmgr_pdev *pdev,
200  				 uint64_t tx_packets, uint64_t rx_packets)
201  {
202  	struct wlan_ipa_priv *ipa_obj;
203  
204  	if (!ipa_config_is_enabled()) {
205  		ipa_debug("ipa is disabled");
206  		return QDF_STATUS_SUCCESS;
207  	}
208  
209  	if (!ipa_cb_is_ready())
210  		return QDF_STATUS_SUCCESS;
211  
212  	ipa_obj = ipa_pdev_get_priv_obj(pdev);
213  	if (!ipa_obj) {
214  		ipa_err("IPA object is NULL");
215  		return QDF_STATUS_E_FAILURE;
216  	}
217  
218  	return wlan_ipa_set_perf_level(ipa_obj, tx_packets, rx_packets);
219  }
220  
ipa_uc_info(struct wlan_objmgr_pdev * pdev)221  void ipa_uc_info(struct wlan_objmgr_pdev *pdev)
222  {
223  	struct wlan_ipa_priv *ipa_obj;
224  
225  	if (!ipa_config_is_enabled()) {
226  		ipa_debug("ipa is disabled");
227  		return;
228  	}
229  
230  	if (!ipa_cb_is_ready())
231  		return;
232  
233  	ipa_obj = ipa_pdev_get_priv_obj(pdev);
234  	if (!ipa_obj) {
235  		ipa_err("IPA object is NULL");
236  		return;
237  	}
238  
239  	return wlan_ipa_uc_info(ipa_obj);
240  }
241  
ipa_uc_stat(struct wlan_objmgr_pdev * pdev)242  void ipa_uc_stat(struct wlan_objmgr_pdev *pdev)
243  {
244  	struct wlan_ipa_priv *ipa_obj;
245  
246  	if (!ipa_config_is_enabled()) {
247  		ipa_debug("ipa is disabled");
248  		return;
249  	}
250  
251  	if (!ipa_cb_is_ready())
252  		return;
253  
254  	ipa_obj = ipa_pdev_get_priv_obj(pdev);
255  	if (!ipa_obj) {
256  		ipa_err("IPA object is NULL");
257  		return;
258  	}
259  
260  	return wlan_ipa_uc_stat(ipa_obj);
261  }
262  
ipa_uc_rt_debug_host_dump(struct wlan_objmgr_pdev * pdev)263  void ipa_uc_rt_debug_host_dump(struct wlan_objmgr_pdev *pdev)
264  {
265  	struct wlan_ipa_priv *ipa_obj;
266  
267  	if (!ipa_config_is_enabled()) {
268  		ipa_debug("ipa is disabled");
269  		return;
270  	}
271  
272  	if (!ipa_cb_is_ready())
273  		return;
274  
275  	ipa_obj = ipa_pdev_get_priv_obj(pdev);
276  	if (!ipa_obj) {
277  		ipa_err("IPA object is NULL");
278  		return;
279  	}
280  
281  	return wlan_ipa_uc_rt_debug_host_dump(ipa_obj);
282  }
283  
ipa_dump_info(struct wlan_objmgr_pdev * pdev)284  void ipa_dump_info(struct wlan_objmgr_pdev *pdev)
285  {
286  	struct wlan_ipa_priv *ipa_obj;
287  
288  	if (!ipa_config_is_enabled()) {
289  		ipa_debug("ipa is disabled");
290  		return;
291  	}
292  
293  	if (!ipa_cb_is_ready())
294  		return;
295  
296  	ipa_obj = ipa_pdev_get_priv_obj(pdev);
297  	if (!ipa_obj) {
298  		ipa_err("IPA object is NULL");
299  		return;
300  	}
301  
302  	return wlan_ipa_dump_info(ipa_obj);
303  }
304  
ipa_uc_stat_request(struct wlan_objmgr_pdev * pdev,uint8_t reason)305  void ipa_uc_stat_request(struct wlan_objmgr_pdev *pdev, uint8_t reason)
306  {
307  	struct wlan_ipa_priv *ipa_obj;
308  
309  	if (!ipa_config_is_enabled()) {
310  		ipa_debug("ipa is disabled");
311  		return;
312  	}
313  
314  	if (!ipa_cb_is_ready())
315  		return;
316  
317  	ipa_obj = ipa_pdev_get_priv_obj(pdev);
318  	if (!ipa_obj) {
319  		ipa_err("IPA object is NULL");
320  		return;
321  	}
322  
323  	return wlan_ipa_uc_stat_request(ipa_obj, reason);
324  }
325  
ipa_uc_stat_query(struct wlan_objmgr_pdev * pdev,uint32_t * ipa_tx_diff,uint32_t * ipa_rx_diff)326  void ipa_uc_stat_query(struct wlan_objmgr_pdev *pdev,
327  		       uint32_t *ipa_tx_diff, uint32_t *ipa_rx_diff)
328  {
329  	struct wlan_ipa_priv *ipa_obj;
330  
331  	if (!ipa_config_is_enabled()) {
332  		ipa_debug("ipa is disabled");
333  		return;
334  	}
335  
336  	if (!ipa_cb_is_ready())
337  		return;
338  
339  	ipa_obj = ipa_pdev_get_priv_obj(pdev);
340  	if (!ipa_obj) {
341  		ipa_err("IPA object is NULL");
342  		return;
343  	}
344  
345  	return wlan_ipa_uc_stat_query(ipa_obj, ipa_tx_diff, ipa_rx_diff);
346  }
347  
ipa_reg_sap_xmit_cb(struct wlan_objmgr_pdev * pdev,wlan_ipa_softap_xmit cb)348  void ipa_reg_sap_xmit_cb(struct wlan_objmgr_pdev *pdev, wlan_ipa_softap_xmit cb)
349  {
350  	struct wlan_ipa_priv *ipa_obj;
351  
352  	if (!ipa_config_is_enabled()) {
353  		ipa_debug("ipa is disabled");
354  		return;
355  	}
356  
357  	if (!ipa_cb_is_ready())
358  		return;
359  
360  	ipa_obj = ipa_pdev_get_priv_obj(pdev);
361  	if (!ipa_obj) {
362  		ipa_err("IPA object is NULL");
363  		return;
364  	}
365  
366  	return wlan_ipa_reg_sap_xmit_cb(ipa_obj, cb);
367  }
368  
ipa_reg_send_to_nw_cb(struct wlan_objmgr_pdev * pdev,wlan_ipa_send_to_nw cb)369  void ipa_reg_send_to_nw_cb(struct wlan_objmgr_pdev *pdev,
370  			   wlan_ipa_send_to_nw cb)
371  {
372  	struct wlan_ipa_priv *ipa_obj;
373  
374  	if (!ipa_config_is_enabled()) {
375  		ipa_debug("ipa is disabled");
376  		return;
377  	}
378  
379  	if (!ipa_cb_is_ready())
380  		return;
381  
382  	ipa_obj = ipa_pdev_get_priv_obj(pdev);
383  	if (!ipa_obj) {
384  		ipa_err("IPA object is NULL");
385  		return;
386  	}
387  
388  	return wlan_ipa_reg_send_to_nw_cb(ipa_obj, cb);
389  }
390  
391  #if defined(QCA_CONFIG_RPS) && !defined(MDM_PLATFORM)
ipa_reg_rps_enable_cb(struct wlan_objmgr_pdev * pdev,wlan_ipa_rps_enable cb)392  void ipa_reg_rps_enable_cb(struct wlan_objmgr_pdev *pdev,
393  			   wlan_ipa_rps_enable cb)
394  {
395  	struct wlan_ipa_priv *ipa_obj;
396  
397  	if (!ipa_config_is_enabled()) {
398  		ipa_debug("ipa is disabled");
399  		return;
400  	}
401  
402  	if (!ipa_cb_is_ready())
403  		return;
404  
405  	ipa_obj = ipa_pdev_get_priv_obj(pdev);
406  	if (!ipa_obj) {
407  		ipa_err("IPA object is NULL");
408  		return;
409  	}
410  
411  	return wlan_ipa_reg_rps_enable_cb(ipa_obj, cb);
412  }
413  #endif
414  
ipa_reg_is_driver_unloading_cb(struct wlan_objmgr_pdev * pdev,wlan_ipa_driver_unloading cb)415  void ipa_reg_is_driver_unloading_cb(struct wlan_objmgr_pdev *pdev,
416  				    wlan_ipa_driver_unloading cb)
417  {
418  	struct wlan_ipa_priv *ipa_obj;
419  
420  	if (!ipa_config_is_enabled()) {
421  		ipa_debug("ipa is disabled");
422  		return;
423  	}
424  
425  	if (!ipa_cb_is_ready())
426  		return;
427  
428  	ipa_obj = ipa_pdev_get_priv_obj(pdev);
429  	if (!ipa_obj) {
430  		ipa_err("IPA object is NULL");
431  		return;
432  	}
433  
434  	return wlan_ipa_reg_is_driver_unloading_cb(ipa_obj, cb);
435  }
436  
ipa_set_mcc_mode(struct wlan_objmgr_pdev * pdev,bool mcc_mode)437  void ipa_set_mcc_mode(struct wlan_objmgr_pdev *pdev, bool mcc_mode)
438  {
439  	struct wlan_ipa_priv *ipa_obj;
440  
441  	if (!ipa_config_is_enabled()) {
442  		ipa_debug("ipa is disabled");
443  		return;
444  	}
445  
446  	if (!ipa_cb_is_ready())
447  		return;
448  
449  	ipa_obj = ipa_pdev_get_priv_obj(pdev);
450  	if (!ipa_obj) {
451  		ipa_err("IPA object is NULL");
452  		return;
453  	}
454  
455  	return wlan_ipa_set_mcc_mode(ipa_obj, mcc_mode);
456  }
457  
ipa_set_dfs_cac_tx(struct wlan_objmgr_pdev * pdev,bool tx_block)458  void ipa_set_dfs_cac_tx(struct wlan_objmgr_pdev *pdev, bool tx_block)
459  {
460  	struct wlan_ipa_priv *ipa_obj;
461  
462  	if (!ipa_config_is_enabled()) {
463  		ipa_debug("ipa is disabled");
464  		return;
465  	}
466  
467  	if (!ipa_cb_is_ready())
468  		return;
469  
470  	ipa_obj = ipa_pdev_get_priv_obj(pdev);
471  	if (!ipa_obj) {
472  		ipa_err("IPA object is NULL");
473  		return;
474  	}
475  
476  	return wlan_ipa_set_dfs_cac_tx(ipa_obj, tx_block);
477  }
478  
ipa_set_ap_ibss_fwd(struct wlan_objmgr_pdev * pdev,uint8_t session_id,bool intra_bss)479  void ipa_set_ap_ibss_fwd(struct wlan_objmgr_pdev *pdev, uint8_t session_id,
480  			 bool intra_bss)
481  {
482  	struct wlan_ipa_priv *ipa_obj;
483  
484  	if (!ipa_config_is_enabled()) {
485  		ipa_debug("ipa is disabled");
486  		return;
487  	}
488  
489  	if (!ipa_cb_is_ready())
490  		return;
491  
492  	ipa_obj = ipa_pdev_get_priv_obj(pdev);
493  	if (!ipa_obj) {
494  		ipa_err("IPA object is NULL");
495  		return;
496  	}
497  
498  	return wlan_ipa_set_ap_ibss_fwd(ipa_obj, session_id, intra_bss);
499  }
500  
ipa_uc_force_pipe_shutdown(struct wlan_objmgr_pdev * pdev)501  void ipa_uc_force_pipe_shutdown(struct wlan_objmgr_pdev *pdev)
502  {
503  	struct wlan_ipa_priv *ipa_obj;
504  
505  	if (!pdev) {
506  		ipa_debug("objmgr pdev is null!");
507  		return;
508  	}
509  
510  	if (!ipa_config_is_enabled()) {
511  		ipa_debug("ipa is disabled");
512  		return;
513  	}
514  
515  	if (!ipa_cb_is_ready())
516  		return;
517  
518  	ipa_obj = ipa_pdev_get_priv_obj(pdev);
519  	if (!ipa_obj) {
520  		ipa_err("IPA object is NULL");
521  		return;
522  	}
523  
524  	wlan_ipa_uc_disable_pipes(ipa_obj, true);
525  }
526  
ipa_flush(struct wlan_objmgr_pdev * pdev)527  void ipa_flush(struct wlan_objmgr_pdev *pdev)
528  {
529  	struct wlan_ipa_priv *ipa_obj;
530  
531  	if (!ipa_config_is_enabled()) {
532  		ipa_debug("ipa is disabled");
533  		return;
534  	}
535  
536  	if (!ipa_cb_is_ready())
537  		return;
538  
539  	ipa_obj = ipa_pdev_get_priv_obj(pdev);
540  	if (!ipa_obj) {
541  		ipa_err("IPA object is NULL");
542  		return;
543  	}
544  
545  	return wlan_ipa_flush(ipa_obj);
546  }
547  
ipa_suspend(struct wlan_objmgr_pdev * pdev)548  QDF_STATUS ipa_suspend(struct wlan_objmgr_pdev *pdev)
549  {
550  	struct wlan_ipa_priv *ipa_obj;
551  
552  	if (!ipa_config_is_enabled()) {
553  		ipa_debug("ipa is disabled");
554  		return QDF_STATUS_SUCCESS;
555  	}
556  
557  	if (!ipa_cb_is_ready())
558  		return QDF_STATUS_SUCCESS;
559  
560  	ipa_obj = ipa_pdev_get_priv_obj(pdev);
561  	if (!ipa_obj) {
562  		ipa_err("IPA object is NULL");
563  		return QDF_STATUS_E_FAILURE;
564  	}
565  
566  	return wlan_ipa_suspend(ipa_obj);
567  }
568  
ipa_resume(struct wlan_objmgr_pdev * pdev)569  QDF_STATUS ipa_resume(struct wlan_objmgr_pdev *pdev)
570  {
571  	struct wlan_ipa_priv *ipa_obj;
572  
573  	if (!ipa_config_is_enabled()) {
574  		ipa_debug("ipa is disabled");
575  		return QDF_STATUS_SUCCESS;
576  	}
577  
578  	if (!ipa_cb_is_ready())
579  		return QDF_STATUS_SUCCESS;
580  
581  	ipa_obj = ipa_pdev_get_priv_obj(pdev);
582  	if (!ipa_obj) {
583  		ipa_err("IPA object is NULL");
584  		return QDF_STATUS_E_FAILURE;
585  	}
586  
587  	return wlan_ipa_resume(ipa_obj);
588  }
589  
ipa_uc_ol_init(struct wlan_objmgr_pdev * pdev,qdf_device_t osdev)590  QDF_STATUS ipa_uc_ol_init(struct wlan_objmgr_pdev *pdev,
591  			  qdf_device_t osdev)
592  {
593  	struct wlan_ipa_priv *ipa_obj;
594  
595  	if (!ipa_config_is_enabled()) {
596  		ipa_debug("ipa is disabled");
597  		return QDF_STATUS_SUCCESS;
598  	}
599  
600  	if (!ipa_cb_is_ready())
601  		return QDF_STATUS_SUCCESS;
602  
603  	ipa_obj = ipa_pdev_get_priv_obj(pdev);
604  	if (!ipa_obj) {
605  		ipa_err("IPA object is NULL");
606  		return QDF_STATUS_E_FAILURE;
607  	}
608  
609  	return wlan_ipa_uc_ol_init(ipa_obj, osdev);
610  }
611  
ipa_is_tx_pending(struct wlan_objmgr_pdev * pdev)612  bool ipa_is_tx_pending(struct wlan_objmgr_pdev *pdev)
613  {
614  	struct wlan_ipa_priv *ipa_obj;
615  
616  	if (!ipa_config_is_enabled()) {
617  		ipa_debug("ipa is disabled");
618  		return QDF_STATUS_SUCCESS;
619  	}
620  
621  	if (!ipa_cb_is_ready())
622  		return QDF_STATUS_SUCCESS;
623  
624  	ipa_obj = ipa_pdev_get_priv_obj(pdev);
625  
626  	return wlan_ipa_is_tx_pending(ipa_obj);
627  }
628  
ipa_uc_ol_deinit(struct wlan_objmgr_pdev * pdev)629  QDF_STATUS ipa_uc_ol_deinit(struct wlan_objmgr_pdev *pdev)
630  {
631  	struct wlan_ipa_priv *ipa_obj;
632  	QDF_STATUS status;
633  
634  	if (!ipa_config_is_enabled()) {
635  		ipa_debug("ipa is disabled");
636  		return QDF_STATUS_SUCCESS;
637  	}
638  
639  	ipa_init_deinit_lock();
640  
641  	if (!ipa_cb_is_ready()) {
642  		ipa_debug("ipa is not ready");
643  		status = QDF_STATUS_SUCCESS;
644  		goto out;
645  	}
646  
647  	ipa_obj = ipa_pdev_get_priv_obj(pdev);
648  	if (!ipa_obj) {
649  		ipa_err("IPA object is NULL");
650  		status = QDF_STATUS_E_FAILURE;
651  		goto out;
652  	}
653  
654  	if (!(ipa_obj->handle_initialized)) {
655  		ipa_debug("IPA is already deinit for hdl:%d", ipa_obj->hdl);
656  		status = QDF_STATUS_SUCCESS;
657  		goto out;
658  	}
659  
660  	status = wlan_ipa_uc_ol_deinit(ipa_obj);
661  	ipa_obj_cleanup(ipa_obj);
662  
663  out:
664  	if (g_instances_added)
665  		g_instances_added--;
666  
667  	if (!g_instances_added)
668  		ipa_disable_register_cb();
669  
670  	ipa_init_deinit_unlock();
671  	return status;
672  }
673  
ipa_send_mcc_scc_msg(struct wlan_objmgr_pdev * pdev,bool mcc_mode)674  QDF_STATUS ipa_send_mcc_scc_msg(struct wlan_objmgr_pdev *pdev,
675  				bool mcc_mode)
676  {
677  	struct wlan_ipa_priv *ipa_obj;
678  
679  	if (!ipa_config_is_enabled()) {
680  		ipa_debug("ipa is disabled");
681  		return QDF_STATUS_SUCCESS;
682  	}
683  
684  	if (!ipa_cb_is_ready())
685  		return QDF_STATUS_SUCCESS;
686  
687  	ipa_obj = ipa_pdev_get_priv_obj(pdev);
688  	if (!ipa_obj) {
689  		ipa_err("IPA object is NULL");
690  		return QDF_STATUS_E_FAILURE;
691  	}
692  
693  	return wlan_ipa_send_mcc_scc_msg(ipa_obj, mcc_mode);
694  }
695  
ipa_wlan_evt(struct wlan_objmgr_pdev * pdev,qdf_netdev_t net_dev,uint8_t device_mode,uint8_t session_id,enum wlan_ipa_wlan_event ipa_event_type,const uint8_t * mac_addr,bool is_2g_iface)696  QDF_STATUS ipa_wlan_evt(struct wlan_objmgr_pdev *pdev, qdf_netdev_t net_dev,
697  			uint8_t device_mode, uint8_t session_id,
698  			enum wlan_ipa_wlan_event ipa_event_type,
699  			const uint8_t *mac_addr, bool is_2g_iface)
700  {
701  	struct wlan_ipa_priv *ipa_obj;
702  
703  	if (!ipa_cb_is_ready())
704  		return QDF_STATUS_SUCCESS;
705  
706  	ipa_obj = ipa_pdev_get_priv_obj(pdev);
707  	if (!ipa_obj) {
708  		ipa_err("IPA object is NULL");
709  		return QDF_STATUS_E_FAILURE;
710  	}
711  
712  	return wlan_ipa_wlan_evt(net_dev, device_mode, session_id,
713  				 ipa_event_type, mac_addr, is_2g_iface,
714  				 ipa_obj);
715  }
716  
ipa_uc_smmu_map(bool map,uint32_t num_buf,qdf_mem_info_t * buf_arr)717  int ipa_uc_smmu_map(bool map, uint32_t num_buf, qdf_mem_info_t *buf_arr)
718  {
719  	return wlan_ipa_uc_smmu_map(map, num_buf, buf_arr);
720  }
721  
ipa_is_fw_wdi_activated(struct wlan_objmgr_pdev * pdev)722  bool ipa_is_fw_wdi_activated(struct wlan_objmgr_pdev *pdev)
723  {
724  	struct wlan_ipa_priv *ipa_obj;
725  
726  	if (!ipa_config_is_enabled()) {
727  		ipa_debug_rl("ipa is disabled");
728  		return false;
729  	}
730  
731  	if (!ipa_cb_is_ready()) {
732  		ipa_debug("ipa is not ready");
733  		return false;
734  	}
735  
736  	ipa_obj = ipa_pdev_get_priv_obj(pdev);
737  	if (!ipa_obj) {
738  		ipa_err_rl("IPA object is NULL");
739  		return false;
740  	}
741  
742  	return wlan_ipa_is_fw_wdi_activated(ipa_obj);
743  }
744  
ipa_uc_cleanup_sta(struct wlan_objmgr_pdev * pdev,qdf_netdev_t net_dev,uint8_t session_id)745  void ipa_uc_cleanup_sta(struct wlan_objmgr_pdev *pdev,
746  			qdf_netdev_t net_dev, uint8_t session_id)
747  {
748  	struct wlan_ipa_priv *ipa_obj;
749  
750  	if (!ipa_cb_is_ready()) {
751  		ipa_debug("ipa is not ready");
752  		return;
753  	}
754  
755  	ipa_obj = ipa_pdev_get_priv_obj(pdev);
756  	if (!ipa_obj) {
757  		ipa_err("IPA object is NULL");
758  		return;
759  	}
760  
761  	return wlan_ipa_uc_cleanup_sta(ipa_obj, net_dev, session_id);
762  }
763  
ipa_uc_disconnect_ap(struct wlan_objmgr_pdev * pdev,qdf_netdev_t net_dev)764  QDF_STATUS ipa_uc_disconnect_ap(struct wlan_objmgr_pdev *pdev,
765  				qdf_netdev_t net_dev)
766  {
767  	struct wlan_ipa_priv *ipa_obj;
768  
769  	if (!ipa_cb_is_ready())
770  		return QDF_STATUS_SUCCESS;
771  
772  	ipa_obj = ipa_pdev_get_priv_obj(pdev);
773  	if (!ipa_obj) {
774  		ipa_err("IPA object is NULL");
775  		return QDF_STATUS_E_FAILURE;
776  	}
777  
778  	return wlan_ipa_uc_disconnect_ap(ipa_obj, net_dev);
779  }
780  
ipa_cleanup_dev_iface(struct wlan_objmgr_pdev * pdev,qdf_netdev_t net_dev,uint8_t session_id)781  void ipa_cleanup_dev_iface(struct wlan_objmgr_pdev *pdev,
782  			   qdf_netdev_t net_dev, uint8_t session_id)
783  {
784  	struct wlan_ipa_priv *ipa_obj;
785  
786  	if (!ipa_cb_is_ready())
787  		return;
788  
789  	ipa_obj = ipa_pdev_get_priv_obj(pdev);
790  	if (!ipa_obj) {
791  		ipa_err("IPA object is NULL");
792  		return;
793  	}
794  
795  	return wlan_ipa_cleanup_dev_iface(ipa_obj, net_dev, session_id);
796  }
797  
ipa_uc_ssr_cleanup(struct wlan_objmgr_pdev * pdev)798  void ipa_uc_ssr_cleanup(struct wlan_objmgr_pdev *pdev)
799  {
800  	struct wlan_ipa_priv *ipa_obj;
801  
802  	if (!ipa_cb_is_ready())
803  		return;
804  
805  	ipa_obj = ipa_pdev_get_priv_obj(pdev);
806  	if (!ipa_obj) {
807  		ipa_err("IPA object is NULL");
808  		return;
809  	}
810  
811  	return wlan_ipa_uc_ssr_cleanup(ipa_obj);
812  }
813  
ipa_fw_rejuvenate_send_msg(struct wlan_objmgr_pdev * pdev)814  void ipa_fw_rejuvenate_send_msg(struct wlan_objmgr_pdev *pdev)
815  {
816  	struct wlan_ipa_priv *ipa_obj;
817  
818  	if (!pdev) {
819  		ipa_debug("objmgr pdev is null!");
820  		return;
821  	}
822  
823  	ipa_obj = ipa_pdev_get_priv_obj(pdev);
824  	if (!ipa_obj) {
825  		ipa_err("IPA object is NULL");
826  		return;
827  	}
828  
829  	return wlan_ipa_fw_rejuvenate_send_msg(ipa_obj);
830  }
831  
832  #ifdef IPA_OPT_WIFI_DP
get_ipa_config(struct wlan_objmgr_psoc * psoc)833  uint32_t get_ipa_config(struct wlan_objmgr_psoc *psoc)
834  {
835  	uint32_t val = cfg_get(psoc, CFG_DP_IPA_OFFLOAD_CONFIG);
836  
837  	if (val == INTRL_MODE_DISABLE) {
838  		val = 0;
839  	} else {
840  		if (val == IPA_OFFLOAD_CFG)
841  			ipa_err("Invalid IPA Config 0x%x", val);
842  		val = INTRL_MODE_ENABLE;
843  	}
844  	return val;
845  }
846  #else
get_ipa_config(struct wlan_objmgr_psoc * psoc)847  uint32_t get_ipa_config(struct wlan_objmgr_psoc *psoc)
848  {
849  	uint32_t val = cfg_get(psoc, CFG_DP_IPA_OFFLOAD_CONFIG);
850  
851  	if (val & WLAN_IPA_OPT_WIFI_DP) {
852  		val &= ~WLAN_IPA_OPT_WIFI_DP;
853  		ipa_info("Resetting IPAConfig val to 0x%x", val);
854  	}
855  	return val;
856  }
857  #endif
858  
ipa_component_config_update(struct wlan_objmgr_psoc * psoc)859  void ipa_component_config_update(struct wlan_objmgr_psoc *psoc)
860  {
861  	QDF_STATUS status;
862  
863  	status = ipa_config_mem_alloc();
864  	if (QDF_IS_STATUS_ERROR(status)) {
865  		ipa_err("Failed to alloc g_ipa_config");
866  		return;
867  	}
868  
869  	if (g_ipa_pld_enable && g_ipa_cap_offload) {
870  		g_ipa_config->ipa_config = get_ipa_config(psoc);
871  		ipa_debug("IPA ini configuration: 0x%x",
872  			  g_ipa_config->ipa_config);
873  	} else {
874  		g_ipa_config->ipa_config = 0;
875  		ipa_info("IPA disabled from platform driver");
876  	}
877  
878  	g_ipa_config->desc_size =
879  		cfg_get(psoc, CFG_DP_IPA_DESC_SIZE);
880  	g_ipa_config->txbuf_count =
881  		qdf_rounddown_pow_of_two(cfg_get(psoc,
882  						 CFG_DP_IPA_UC_TX_BUF_COUNT));
883  	g_ipa_config->ipa_bw_high =
884  		cfg_get(psoc, CFG_DP_IPA_HIGH_BANDWIDTH_MBPS);
885  	g_ipa_config->ipa_bw_medium =
886  		cfg_get(psoc, CFG_DP_IPA_MEDIUM_BANDWIDTH_MBPS);
887  	g_ipa_config->ipa_bw_low =
888  		cfg_get(psoc, CFG_DP_IPA_LOW_BANDWIDTH_MBPS);
889  	g_ipa_config->bus_bw_high =
890  		cfg_get(psoc, CFG_DP_BUS_BANDWIDTH_HIGH_THRESHOLD);
891  	g_ipa_config->bus_bw_medium =
892  		cfg_get(psoc, CFG_DP_BUS_BANDWIDTH_MEDIUM_THRESHOLD);
893  	g_ipa_config->bus_bw_low =
894  		cfg_get(psoc, CFG_DP_BUS_BANDWIDTH_LOW_THRESHOLD);
895  	g_ipa_config->ipa_force_voting =
896  		cfg_get(psoc, CFG_DP_IPA_ENABLE_FORCE_VOTING);
897  	g_ipa_config->ipa_wds =
898  		cfg_get(psoc, CFG_DP_IPA_WDS_STATUS);
899  	g_ipa_config->ipa_vlan_support =
900  		cfg_get(psoc, CFG_DP_IPA_ENABLE_VLAN_SUPPORT);
901  }
902  
ipa_component_config_free(void)903  void ipa_component_config_free(void)
904  {
905  	ipa_info("Free the IPA config memory");
906  	ipa_config_mem_free();
907  }
908  
ipa_get_tx_buf_count(void)909  uint32_t ipa_get_tx_buf_count(void)
910  {
911  	return g_ipa_config ? g_ipa_config->txbuf_count : 0;
912  }
913  
ipa_update_tx_stats(struct wlan_objmgr_pdev * pdev,uint64_t sta_tx,uint64_t ap_tx)914  void ipa_update_tx_stats(struct wlan_objmgr_pdev *pdev, uint64_t sta_tx,
915  			 uint64_t ap_tx)
916  {
917  	struct wlan_ipa_priv *ipa_obj;
918  
919  	if (!ipa_config_is_enabled())
920  		return;
921  
922  	ipa_obj = ipa_pdev_get_priv_obj(pdev);
923  	if (!ipa_obj) {
924  		ipa_err("IPA object is NULL");
925  		return;
926  	}
927  
928  	wlan_ipa_update_tx_stats(ipa_obj, sta_tx, ap_tx);
929  }
930  
ipa_flush_pending_vdev_events(struct wlan_objmgr_pdev * pdev,uint8_t vdev_id)931  void ipa_flush_pending_vdev_events(struct wlan_objmgr_pdev *pdev,
932  				   uint8_t vdev_id)
933  {
934  	struct wlan_ipa_priv *ipa_obj;
935  
936  	if (!ipa_config_is_enabled())
937  		return;
938  
939  	if (!ipa_cb_is_ready())
940  		return;
941  
942  	ipa_obj = ipa_pdev_get_priv_obj(pdev);
943  	if (!ipa_obj) {
944  		ipa_err("IPA object is NULL");
945  		return;
946  	}
947  
948  	wlan_ipa_flush_pending_vdev_events(ipa_obj, vdev_id);
949  }
950  
ipa_is_wds_enabled(void)951  bool ipa_is_wds_enabled(void)
952  {
953  	return g_ipa_config ? g_ipa_config->ipa_wds : 0;
954  }
955  
ipa_get_alt_pipe(struct wlan_objmgr_pdev * pdev,uint8_t vdev_id,bool * alt_pipe)956  QDF_STATUS ipa_get_alt_pipe(struct wlan_objmgr_pdev *pdev,
957  			    uint8_t vdev_id,
958  			    bool *alt_pipe)
959  {
960  	struct wlan_ipa_priv *ipa_obj;
961  
962  	if (!ipa_config_is_enabled())
963  		return QDF_STATUS_E_INVAL;
964  
965  	if (!ipa_cb_is_ready())
966  		return QDF_STATUS_E_INVAL;
967  
968  	ipa_obj = ipa_pdev_get_priv_obj(pdev);
969  	if (!ipa_obj) {
970  		ipa_err("IPA object is NULL");
971  		return QDF_STATUS_E_INVAL;
972  	}
973  
974  	return wlan_ipa_get_alt_pipe(ipa_obj, vdev_id, alt_pipe);
975  }
976  
ipa_set_perf_level_bw_enabled(struct wlan_objmgr_pdev * pdev)977  bool ipa_set_perf_level_bw_enabled(struct wlan_objmgr_pdev *pdev)
978  {
979  	struct wlan_ipa_priv *ipa_obj;
980  
981  	if (!ipa_config_is_enabled())
982  		return false;
983  
984  	if (!ipa_cb_is_ready())
985  		return false;
986  
987  	ipa_obj = ipa_pdev_get_priv_obj(pdev);
988  	if (!ipa_obj) {
989  		ipa_err("IPA object is NULL");
990  		return false;
991  	}
992  
993  	return wlan_ipa_set_perf_level_bw_enabled(ipa_obj);
994  }
995  
ipa_set_perf_level_bw(struct wlan_objmgr_pdev * pdev,enum wlan_ipa_bw_level lvl)996  void ipa_set_perf_level_bw(struct wlan_objmgr_pdev *pdev,
997  			   enum wlan_ipa_bw_level lvl)
998  {
999  	struct wlan_ipa_priv *ipa_obj;
1000  
1001  	if (!ipa_config_is_enabled())
1002  		return;
1003  
1004  	if (!ipa_cb_is_ready())
1005  		return;
1006  
1007  	ipa_obj = ipa_pdev_get_priv_obj(pdev);
1008  	if (!ipa_obj) {
1009  		ipa_err("IPA object is NULL");
1010  		return;
1011  	}
1012  
1013  	wlan_ipa_set_perf_level_bw(ipa_obj, lvl);
1014  }
1015  
1016