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