xref: /wlan-driver/qcacld-3.0/components/dp/dispatcher/src/wlan_dp_ucfg_api.c (revision 5113495b16420b49004c444715d2daae2066e7dc)
1*5113495bSYour Name /*
2*5113495bSYour Name  * Copyright (c) 2022-2024 Qualcomm Innovation Center, Inc. All rights reserved.
3*5113495bSYour Name  *
4*5113495bSYour Name  * Permission to use, copy, modify, and/or distribute this software for
5*5113495bSYour Name  * any purpose with or without fee is hereby granted, provided that the
6*5113495bSYour Name  * above copyright notice and this permission notice appear in all
7*5113495bSYour Name  * copies.
8*5113495bSYour Name  *
9*5113495bSYour Name  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
10*5113495bSYour Name  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
11*5113495bSYour Name  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
12*5113495bSYour Name  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
13*5113495bSYour Name  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
14*5113495bSYour Name  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
15*5113495bSYour Name  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
16*5113495bSYour Name  * PERFORMANCE OF THIS SOFTWARE.
17*5113495bSYour Name  */
18*5113495bSYour Name 
19*5113495bSYour Name /**
20*5113495bSYour Name  * DOC: public API related to the DP called by north bound HDD/OSIF
21*5113495bSYour Name  */
22*5113495bSYour Name 
23*5113495bSYour Name #include "wlan_dp_ucfg_api.h"
24*5113495bSYour Name #include "wlan_ipa_ucfg_api.h"
25*5113495bSYour Name #include "wlan_dp_main.h"
26*5113495bSYour Name #include "wlan_dp_objmgr.h"
27*5113495bSYour Name #include "wlan_pmo_obj_mgmt_api.h"
28*5113495bSYour Name #include "cdp_txrx_cmn.h"
29*5113495bSYour Name #include "cfg_ucfg_api.h"
30*5113495bSYour Name #include "wlan_pmo_obj_mgmt_api.h"
31*5113495bSYour Name #include "wlan_dp_objmgr.h"
32*5113495bSYour Name #include "wlan_dp_bus_bandwidth.h"
33*5113495bSYour Name #include "wlan_dp_periodic_sta_stats.h"
34*5113495bSYour Name #include "wlan_dp_nud_tracking.h"
35*5113495bSYour Name #include "wlan_dp_txrx.h"
36*5113495bSYour Name #include "wlan_nlink_common.h"
37*5113495bSYour Name #include "wlan_pkt_capture_api.h"
38*5113495bSYour Name #include <cdp_txrx_ctrl.h>
39*5113495bSYour Name #include <qdf_net_stats.h>
40*5113495bSYour Name #include "wlan_dp_prealloc.h"
41*5113495bSYour Name #include "wlan_dp_rx_thread.h"
42*5113495bSYour Name #include <cdp_txrx_host_stats.h>
43*5113495bSYour Name #ifdef WLAN_FEATURE_11BE_MLO
44*5113495bSYour Name #include "wlan_mlo_mgr_public_api.h"
45*5113495bSYour Name #endif
46*5113495bSYour Name #include "cdp_txrx_ctrl.h"
47*5113495bSYour Name 
48*5113495bSYour Name #ifdef FEATURE_DIRECT_LINK
49*5113495bSYour Name /**
50*5113495bSYour Name  * wlan_dp_set_vdev_direct_link_cfg() - Set direct link config in DP vdev
51*5113495bSYour Name  * @psoc: objmgr psoc handle
52*5113495bSYour Name  * @dp_intf: pointer to DP component interface handle
53*5113495bSYour Name  *
54*5113495bSYour Name  * Return: direct link configuration
55*5113495bSYour Name  */
56*5113495bSYour Name static inline
wlan_dp_set_vdev_direct_link_cfg(struct wlan_objmgr_psoc * psoc,struct wlan_dp_intf * dp_intf)57*5113495bSYour Name QDF_STATUS wlan_dp_set_vdev_direct_link_cfg(struct wlan_objmgr_psoc *psoc,
58*5113495bSYour Name 					    struct wlan_dp_intf *dp_intf)
59*5113495bSYour Name {
60*5113495bSYour Name 	struct wlan_dp_link *dp_link, *dp_link_next;
61*5113495bSYour Name 	cdp_config_param_type vdev_param = {0};
62*5113495bSYour Name 	QDF_STATUS status;
63*5113495bSYour Name 
64*5113495bSYour Name 	if (dp_intf->device_mode != QDF_SAP_MODE ||
65*5113495bSYour Name 	    !dp_intf->dp_ctx->dp_direct_link_ctx)
66*5113495bSYour Name 		return QDF_STATUS_SUCCESS;
67*5113495bSYour Name 
68*5113495bSYour Name 	dp_for_each_link_held_safe(dp_intf, dp_link, dp_link_next) {
69*5113495bSYour Name 		vdev_param.cdp_vdev_tx_to_fw =
70*5113495bSYour Name 					dp_intf->direct_link_config.config_set;
71*5113495bSYour Name 		status = cdp_txrx_set_vdev_param(wlan_psoc_get_dp_handle(psoc),
72*5113495bSYour Name 						 dp_link->link_id,
73*5113495bSYour Name 						 CDP_VDEV_TX_TO_FW, vdev_param);
74*5113495bSYour Name 		if (QDF_IS_STATUS_ERROR(status))
75*5113495bSYour Name 			break;
76*5113495bSYour Name 	}
77*5113495bSYour Name 
78*5113495bSYour Name 	return status;
79*5113495bSYour Name }
80*5113495bSYour Name #else
81*5113495bSYour Name static inline
wlan_dp_set_vdev_direct_link_cfg(struct wlan_objmgr_psoc * psoc,struct wlan_dp_intf * dp_intf)82*5113495bSYour Name QDF_STATUS wlan_dp_set_vdev_direct_link_cfg(struct wlan_objmgr_psoc *psoc,
83*5113495bSYour Name 					    struct wlan_dp_intf *dp_intf)
84*5113495bSYour Name {
85*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
86*5113495bSYour Name }
87*5113495bSYour Name #endif
88*5113495bSYour Name 
89*5113495bSYour Name #ifdef WLAN_FEATURE_11BE_MLO
90*5113495bSYour Name static inline
wlan_dp_update_vdev_mac_addr(struct wlan_dp_psoc_context * dp_ctx,struct wlan_dp_link * dp_link,struct qdf_mac_addr * new_mac_addr)91*5113495bSYour Name QDF_STATUS wlan_dp_update_vdev_mac_addr(struct wlan_dp_psoc_context *dp_ctx,
92*5113495bSYour Name 					struct wlan_dp_link *dp_link,
93*5113495bSYour Name 					struct qdf_mac_addr *new_mac_addr)
94*5113495bSYour Name {
95*5113495bSYour Name 	cdp_config_param_type vdev_param = {0};
96*5113495bSYour Name 
97*5113495bSYour Name 	qdf_mem_copy(&vdev_param.mac_addr, new_mac_addr, QDF_MAC_ADDR_SIZE);
98*5113495bSYour Name 
99*5113495bSYour Name 	/* CDP API to change the mac address */
100*5113495bSYour Name 	return cdp_txrx_set_vdev_param(dp_ctx->cdp_soc, dp_link->link_id,
101*5113495bSYour Name 				       CDP_VDEV_SET_MAC_ADDR, vdev_param);
102*5113495bSYour Name }
103*5113495bSYour Name 
wlan_dp_register_link_switch_notifier(void)104*5113495bSYour Name static QDF_STATUS wlan_dp_register_link_switch_notifier(void)
105*5113495bSYour Name {
106*5113495bSYour Name 	return wlan_mlo_mgr_register_link_switch_notifier(
107*5113495bSYour Name 					WLAN_COMP_DP,
108*5113495bSYour Name 					dp_link_switch_notification);
109*5113495bSYour Name }
110*5113495bSYour Name 
wlan_dp_unregister_link_switch_notifier(void)111*5113495bSYour Name static QDF_STATUS wlan_dp_unregister_link_switch_notifier(void)
112*5113495bSYour Name {
113*5113495bSYour Name 	return wlan_mlo_mgr_unregister_link_switch_notifier(WLAN_COMP_DP);
114*5113495bSYour Name }
115*5113495bSYour Name #else
116*5113495bSYour Name static inline
wlan_dp_update_vdev_mac_addr(struct wlan_dp_psoc_context * dp_ctx,struct wlan_dp_link * dp_link,struct qdf_mac_addr * new_mac_addr)117*5113495bSYour Name QDF_STATUS wlan_dp_update_vdev_mac_addr(struct wlan_dp_psoc_context *dp_ctx,
118*5113495bSYour Name 					struct wlan_dp_link *dp_link,
119*5113495bSYour Name 					struct qdf_mac_addr *new_mac_addr)
120*5113495bSYour Name {
121*5113495bSYour Name 	/* Link switch should be done only for 802.11BE */
122*5113495bSYour Name 	qdf_assert(0);
123*5113495bSYour Name 	return QDF_STATUS_E_NOSUPPORT;
124*5113495bSYour Name }
125*5113495bSYour Name 
wlan_dp_register_link_switch_notifier(void)126*5113495bSYour Name static inline QDF_STATUS wlan_dp_register_link_switch_notifier(void)
127*5113495bSYour Name {
128*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
129*5113495bSYour Name }
130*5113495bSYour Name 
wlan_dp_unregister_link_switch_notifier(void)131*5113495bSYour Name static inline QDF_STATUS wlan_dp_unregister_link_switch_notifier(void)
132*5113495bSYour Name {
133*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
134*5113495bSYour Name }
135*5113495bSYour Name #endif
136*5113495bSYour Name 
137*5113495bSYour Name /** Add sanity for multiple link switches in parallel */
ucfg_dp_update_link_mac_addr(struct wlan_objmgr_vdev * vdev,struct qdf_mac_addr * new_mac_addr,bool is_link_switch)138*5113495bSYour Name QDF_STATUS ucfg_dp_update_link_mac_addr(struct wlan_objmgr_vdev *vdev,
139*5113495bSYour Name 					struct qdf_mac_addr *new_mac_addr,
140*5113495bSYour Name 					bool is_link_switch)
141*5113495bSYour Name {
142*5113495bSYour Name 	struct wlan_dp_psoc_context *dp_ctx;
143*5113495bSYour Name 	struct wlan_dp_link *dp_link;
144*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_SUCCESS;
145*5113495bSYour Name 
146*5113495bSYour Name 	dp_ctx = dp_get_context();
147*5113495bSYour Name 
148*5113495bSYour Name 	dp_link = dp_get_vdev_priv_obj(vdev);
149*5113495bSYour Name 	if (!is_dp_link_valid(dp_link)) {
150*5113495bSYour Name 		dp_err("dp_link from vdev %pK is invalid", vdev);
151*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
152*5113495bSYour Name 	}
153*5113495bSYour Name 
154*5113495bSYour Name 	qdf_copy_macaddr(&dp_link->mac_addr, new_mac_addr);
155*5113495bSYour Name 
156*5113495bSYour Name 	if (is_link_switch)
157*5113495bSYour Name 		status = wlan_dp_update_vdev_mac_addr(dp_ctx, dp_link,
158*5113495bSYour Name 						      new_mac_addr);
159*5113495bSYour Name 
160*5113495bSYour Name 	return status;
161*5113495bSYour Name }
162*5113495bSYour Name 
ucfg_dp_update_def_link(struct wlan_objmgr_psoc * psoc,struct qdf_mac_addr * intf_mac,struct wlan_objmgr_vdev * vdev)163*5113495bSYour Name void ucfg_dp_update_def_link(struct wlan_objmgr_psoc *psoc,
164*5113495bSYour Name 			     struct qdf_mac_addr *intf_mac,
165*5113495bSYour Name 			     struct wlan_objmgr_vdev *vdev)
166*5113495bSYour Name 
167*5113495bSYour Name {
168*5113495bSYour Name 	__wlan_dp_update_def_link(psoc, intf_mac, vdev);
169*5113495bSYour Name }
170*5113495bSYour Name 
ucfg_dp_update_intf_mac(struct wlan_objmgr_psoc * psoc,struct qdf_mac_addr * cur_mac,struct qdf_mac_addr * new_mac,struct wlan_objmgr_vdev * vdev)171*5113495bSYour Name void ucfg_dp_update_intf_mac(struct wlan_objmgr_psoc *psoc,
172*5113495bSYour Name 			     struct qdf_mac_addr *cur_mac,
173*5113495bSYour Name 			     struct qdf_mac_addr *new_mac,
174*5113495bSYour Name 			     struct wlan_objmgr_vdev *vdev)
175*5113495bSYour Name {
176*5113495bSYour Name 	struct wlan_dp_intf *dp_intf;
177*5113495bSYour Name 	struct wlan_dp_link *dp_link;
178*5113495bSYour Name 	struct wlan_dp_psoc_context *dp_ctx;
179*5113495bSYour Name 
180*5113495bSYour Name 	dp_ctx =  dp_psoc_get_priv(psoc);
181*5113495bSYour Name 
182*5113495bSYour Name 	dp_intf = dp_get_intf_by_macaddr(dp_ctx, cur_mac);
183*5113495bSYour Name 	if (!dp_intf) {
184*5113495bSYour Name 		dp_err("DP interface not found addr:" QDF_MAC_ADDR_FMT,
185*5113495bSYour Name 		       QDF_MAC_ADDR_REF(cur_mac->bytes));
186*5113495bSYour Name 		QDF_BUG(0);
187*5113495bSYour Name 		return;
188*5113495bSYour Name 	}
189*5113495bSYour Name 
190*5113495bSYour Name 	dp_info("MAC update from " QDF_MAC_ADDR_FMT " to " QDF_MAC_ADDR_FMT "",
191*5113495bSYour Name 		QDF_MAC_ADDR_REF(cur_mac->bytes),
192*5113495bSYour Name 		QDF_MAC_ADDR_REF(new_mac->bytes));
193*5113495bSYour Name 
194*5113495bSYour Name 	qdf_copy_macaddr(&dp_intf->mac_addr, new_mac);
195*5113495bSYour Name 
196*5113495bSYour Name 	/*
197*5113495bSYour Name 	 * update of dp_intf mac address happens only during dynamic mac
198*5113495bSYour Name 	 * address update. This is a special case, where the connection
199*5113495bSYour Name 	 * can change without vdevs getting deleted.
200*5113495bSYour Name 	 * Hence its expected to reset the def_link in dp_intf to the
201*5113495bSYour Name 	 * def_link used by UMAC, for the next connection.
202*5113495bSYour Name 	 */
203*5113495bSYour Name 	dp_link = dp_get_vdev_priv_obj(vdev);
204*5113495bSYour Name 	dp_info("Try def_link update for dp_intf %pK from %pK to %pK (intf %pK id %d)",
205*5113495bSYour Name 		dp_intf, dp_intf->def_link, dp_link,
206*5113495bSYour Name 		dp_link ? dp_link->dp_intf : NULL,
207*5113495bSYour Name 		dp_link ? dp_link->link_id : 255);
208*5113495bSYour Name 	if (dp_link && dp_link->dp_intf == dp_intf)
209*5113495bSYour Name 		dp_intf->def_link = dp_link;
210*5113495bSYour Name 
211*5113495bSYour Name 	wlan_dp_set_vdev_direct_link_cfg(psoc, dp_intf);
212*5113495bSYour Name }
213*5113495bSYour Name 
214*5113495bSYour Name QDF_STATUS
ucfg_dp_create_intf(struct wlan_objmgr_psoc * psoc,struct qdf_mac_addr * intf_addr,qdf_netdev_t ndev)215*5113495bSYour Name ucfg_dp_create_intf(struct wlan_objmgr_psoc *psoc,
216*5113495bSYour Name 		    struct qdf_mac_addr *intf_addr,
217*5113495bSYour Name 		    qdf_netdev_t ndev)
218*5113495bSYour Name {
219*5113495bSYour Name 	struct wlan_dp_intf *dp_intf;
220*5113495bSYour Name 	struct wlan_dp_psoc_context *dp_ctx;
221*5113495bSYour Name 
222*5113495bSYour Name 	dp_ctx =  dp_get_context();
223*5113495bSYour Name 
224*5113495bSYour Name 	dp_info("DP interface create addr:" QDF_MAC_ADDR_FMT,
225*5113495bSYour Name 		QDF_MAC_ADDR_REF(intf_addr->bytes));
226*5113495bSYour Name 
227*5113495bSYour Name 	dp_intf = __qdf_mem_malloc(sizeof(*dp_intf), __func__, __LINE__);
228*5113495bSYour Name 	if (!dp_intf) {
229*5113495bSYour Name 		dp_err("DP intf memory alloc failed addr:" QDF_MAC_ADDR_FMT,
230*5113495bSYour Name 		       QDF_MAC_ADDR_REF(intf_addr->bytes));
231*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
232*5113495bSYour Name 	}
233*5113495bSYour Name 
234*5113495bSYour Name 	dp_intf->def_link = NULL;
235*5113495bSYour Name 	dp_intf->dp_ctx = dp_ctx;
236*5113495bSYour Name 	dp_intf->dev = ndev;
237*5113495bSYour Name 	qdf_copy_macaddr(&dp_intf->mac_addr, intf_addr);
238*5113495bSYour Name 
239*5113495bSYour Name 	qdf_spin_lock_bh(&dp_ctx->intf_list_lock);
240*5113495bSYour Name 	qdf_list_insert_front(&dp_ctx->intf_list, &dp_intf->node);
241*5113495bSYour Name 	qdf_spin_unlock_bh(&dp_ctx->intf_list_lock);
242*5113495bSYour Name 
243*5113495bSYour Name 	qdf_spinlock_create(&dp_intf->dp_link_list_lock);
244*5113495bSYour Name 	qdf_list_create(&dp_intf->dp_link_list, 0);
245*5113495bSYour Name 
246*5113495bSYour Name 	dp_periodic_sta_stats_init(dp_intf);
247*5113495bSYour Name 	dp_periodic_sta_stats_mutex_create(dp_intf);
248*5113495bSYour Name 	dp_nud_init_tracking(dp_intf);
249*5113495bSYour Name 	dp_mic_init_work(dp_intf);
250*5113495bSYour Name 	qdf_atomic_init(&dp_ctx->num_latency_critical_clients);
251*5113495bSYour Name 	qdf_atomic_init(&dp_intf->gro_disallowed);
252*5113495bSYour Name 
253*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
254*5113495bSYour Name }
255*5113495bSYour Name 
256*5113495bSYour Name QDF_STATUS
ucfg_dp_destroy_intf(struct wlan_objmgr_psoc * psoc,struct qdf_mac_addr * intf_addr)257*5113495bSYour Name ucfg_dp_destroy_intf(struct wlan_objmgr_psoc *psoc,
258*5113495bSYour Name 		     struct qdf_mac_addr *intf_addr)
259*5113495bSYour Name {
260*5113495bSYour Name 	struct wlan_dp_intf *dp_intf;
261*5113495bSYour Name 	struct wlan_dp_psoc_context *dp_ctx;
262*5113495bSYour Name 
263*5113495bSYour Name 	dp_ctx =  dp_get_context();
264*5113495bSYour Name 
265*5113495bSYour Name 	dp_info("DP interface destroy addr:" QDF_MAC_ADDR_FMT,
266*5113495bSYour Name 		QDF_MAC_ADDR_REF(intf_addr->bytes));
267*5113495bSYour Name 
268*5113495bSYour Name 	dp_intf = dp_get_intf_by_macaddr(dp_ctx, intf_addr);
269*5113495bSYour Name 	if (!dp_intf) {
270*5113495bSYour Name 		dp_err("DP interface not found addr:" QDF_MAC_ADDR_FMT,
271*5113495bSYour Name 		       QDF_MAC_ADDR_REF(intf_addr->bytes));
272*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
273*5113495bSYour Name 	}
274*5113495bSYour Name 
275*5113495bSYour Name 	if (dp_intf->device_mode == QDF_SAP_MODE)
276*5113495bSYour Name 		dp_config_direct_link(dp_intf, false, false);
277*5113495bSYour Name 
278*5113495bSYour Name 	dp_periodic_sta_stats_mutex_destroy(dp_intf);
279*5113495bSYour Name 	dp_nud_deinit_tracking(dp_intf);
280*5113495bSYour Name 	dp_mic_deinit_work(dp_intf);
281*5113495bSYour Name 
282*5113495bSYour Name 	qdf_spinlock_destroy(&dp_intf->dp_link_list_lock);
283*5113495bSYour Name 	qdf_list_destroy(&dp_intf->dp_link_list);
284*5113495bSYour Name 
285*5113495bSYour Name 	qdf_spin_lock_bh(&dp_ctx->intf_list_lock);
286*5113495bSYour Name 	qdf_list_remove_node(&dp_ctx->intf_list, &dp_intf->node);
287*5113495bSYour Name 	qdf_spin_unlock_bh(&dp_ctx->intf_list_lock);
288*5113495bSYour Name 
289*5113495bSYour Name 	__qdf_mem_free(dp_intf);
290*5113495bSYour Name 
291*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
292*5113495bSYour Name }
293*5113495bSYour Name 
ucfg_dp_set_cmn_dp_handle(struct wlan_objmgr_psoc * psoc,ol_txrx_soc_handle soc)294*5113495bSYour Name void ucfg_dp_set_cmn_dp_handle(struct wlan_objmgr_psoc *psoc,
295*5113495bSYour Name 			       ol_txrx_soc_handle soc)
296*5113495bSYour Name {
297*5113495bSYour Name 	struct wlan_dp_psoc_context *dp_ctx;
298*5113495bSYour Name 	cdp_config_param_type soc_param;
299*5113495bSYour Name 	QDF_STATUS status;
300*5113495bSYour Name 
301*5113495bSYour Name 	dp_ctx = dp_psoc_get_priv(psoc);
302*5113495bSYour Name 
303*5113495bSYour Name 	if (!dp_ctx) {
304*5113495bSYour Name 		dp_err("Unable to get DP context");
305*5113495bSYour Name 		return;
306*5113495bSYour Name 	}
307*5113495bSYour Name 
308*5113495bSYour Name 	dp_ctx->cdp_soc = soc;
309*5113495bSYour Name 
310*5113495bSYour Name 	soc_param.hal_soc_hdl = NULL;
311*5113495bSYour Name 	status = cdp_txrx_get_psoc_param(dp_ctx->cdp_soc, CDP_TXRX_HAL_SOC_HDL,
312*5113495bSYour Name 					 &soc_param);
313*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
314*5113495bSYour Name 		dp_err("Unable to fetch hal soc handle");
315*5113495bSYour Name 		return;
316*5113495bSYour Name 	}
317*5113495bSYour Name 
318*5113495bSYour Name 	dp_ctx->hal_soc = soc_param.hal_soc_hdl;
319*5113495bSYour Name }
320*5113495bSYour Name 
ucfg_dp_set_hif_handle(struct wlan_objmgr_psoc * psoc,struct hif_opaque_softc * hif_handle)321*5113495bSYour Name void ucfg_dp_set_hif_handle(struct wlan_objmgr_psoc *psoc,
322*5113495bSYour Name 			    struct hif_opaque_softc *hif_handle)
323*5113495bSYour Name {
324*5113495bSYour Name 	struct wlan_dp_psoc_context *dp_ctx;
325*5113495bSYour Name 
326*5113495bSYour Name 	dp_ctx = dp_psoc_get_priv(psoc);
327*5113495bSYour Name 	if (!dp_ctx) {
328*5113495bSYour Name 		dp_err("Unable to get DP context");
329*5113495bSYour Name 		return;
330*5113495bSYour Name 	}
331*5113495bSYour Name 
332*5113495bSYour Name 	dp_ctx->hif_handle = hif_handle;
333*5113495bSYour Name }
334*5113495bSYour Name 
ucfg_dp_init(void)335*5113495bSYour Name QDF_STATUS ucfg_dp_init(void)
336*5113495bSYour Name {
337*5113495bSYour Name 	QDF_STATUS status;
338*5113495bSYour Name 
339*5113495bSYour Name 	dp_info("DP module dispatcher init");
340*5113495bSYour Name 
341*5113495bSYour Name 	if (dp_allocate_ctx() != QDF_STATUS_SUCCESS) {
342*5113495bSYour Name 		dp_err("DP ctx allocation failed");
343*5113495bSYour Name 		return QDF_STATUS_E_FAULT;
344*5113495bSYour Name 	}
345*5113495bSYour Name 
346*5113495bSYour Name 	status = wlan_objmgr_register_psoc_create_handler(
347*5113495bSYour Name 			WLAN_COMP_DP,
348*5113495bSYour Name 			dp_psoc_obj_create_notification, NULL);
349*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
350*5113495bSYour Name 		dp_err("Failed to register psoc create handler for DP");
351*5113495bSYour Name 		return status;
352*5113495bSYour Name 	}
353*5113495bSYour Name 
354*5113495bSYour Name 	status = wlan_objmgr_register_psoc_destroy_handler(
355*5113495bSYour Name 			WLAN_COMP_DP,
356*5113495bSYour Name 			dp_psoc_obj_destroy_notification, NULL);
357*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
358*5113495bSYour Name 		dp_err("Failed to register psoc destroy handler for DP");
359*5113495bSYour Name 		goto fail_destroy_psoc;
360*5113495bSYour Name 	}
361*5113495bSYour Name 
362*5113495bSYour Name 	status = wlan_objmgr_register_pdev_create_handler(
363*5113495bSYour Name 			WLAN_COMP_DP,
364*5113495bSYour Name 			dp_pdev_obj_create_notification, NULL);
365*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
366*5113495bSYour Name 		dp_err("Failed to register pdev create handler for DP");
367*5113495bSYour Name 		goto fail_create_pdev;
368*5113495bSYour Name 	}
369*5113495bSYour Name 
370*5113495bSYour Name 	status = wlan_objmgr_register_pdev_destroy_handler(
371*5113495bSYour Name 			WLAN_COMP_DP,
372*5113495bSYour Name 			dp_pdev_obj_destroy_notification, NULL);
373*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
374*5113495bSYour Name 		dp_err("Failed to register pdev destroy handler for DP");
375*5113495bSYour Name 		goto fail_destroy_pdev;
376*5113495bSYour Name 	}
377*5113495bSYour Name 
378*5113495bSYour Name 	status = wlan_objmgr_register_vdev_create_handler(
379*5113495bSYour Name 			WLAN_COMP_DP,
380*5113495bSYour Name 			dp_vdev_obj_create_notification, NULL);
381*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
382*5113495bSYour Name 		dp_err("Failed to register vdev create handler");
383*5113495bSYour Name 		goto fail_create_vdev;
384*5113495bSYour Name 	}
385*5113495bSYour Name 
386*5113495bSYour Name 	status = wlan_objmgr_register_vdev_destroy_handler(
387*5113495bSYour Name 			WLAN_COMP_DP,
388*5113495bSYour Name 			dp_vdev_obj_destroy_notification, NULL);
389*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
390*5113495bSYour Name 		dp_err("Failed to register vdev destroy handler");
391*5113495bSYour Name 		goto fail_destroy_vdev;
392*5113495bSYour Name 	}
393*5113495bSYour Name 
394*5113495bSYour Name 	status = wlan_objmgr_register_peer_create_handler(
395*5113495bSYour Name 		WLAN_COMP_DP,
396*5113495bSYour Name 		dp_peer_obj_create_notification,
397*5113495bSYour Name 		NULL);
398*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
399*5113495bSYour Name 		dp_err("wlan_objmgr_register_peer_create_handler failed");
400*5113495bSYour Name 		goto fail_create_peer;
401*5113495bSYour Name 	}
402*5113495bSYour Name 
403*5113495bSYour Name 	status = wlan_objmgr_register_peer_destroy_handler(
404*5113495bSYour Name 		WLAN_COMP_DP,
405*5113495bSYour Name 		dp_peer_obj_destroy_notification,
406*5113495bSYour Name 		NULL);
407*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
408*5113495bSYour Name 		dp_err("wlan_objmgr_register_peer_destroy_handler failed");
409*5113495bSYour Name 		goto fail_destroy_peer;
410*5113495bSYour Name 	}
411*5113495bSYour Name 
412*5113495bSYour Name 	status = wlan_dp_register_link_switch_notifier();
413*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
414*5113495bSYour Name 		dp_err("wlan_mlomgr_register_link_switch_handler failed");
415*5113495bSYour Name 		goto fail_link_switch;
416*5113495bSYour Name 	}
417*5113495bSYour Name 
418*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
419*5113495bSYour Name 
420*5113495bSYour Name fail_link_switch:
421*5113495bSYour Name 	wlan_objmgr_unregister_peer_destroy_handler(
422*5113495bSYour Name 			WLAN_COMP_DP, dp_peer_obj_destroy_notification,
423*5113495bSYour Name 			NULL);
424*5113495bSYour Name 
425*5113495bSYour Name fail_destroy_peer:
426*5113495bSYour Name 	wlan_objmgr_unregister_peer_create_handler(WLAN_COMP_DP,
427*5113495bSYour Name 					dp_peer_obj_create_notification,
428*5113495bSYour Name 					NULL);
429*5113495bSYour Name 
430*5113495bSYour Name fail_create_peer:
431*5113495bSYour Name 	wlan_objmgr_unregister_vdev_destroy_handler(WLAN_COMP_DP,
432*5113495bSYour Name 					dp_vdev_obj_destroy_notification,
433*5113495bSYour Name 					NULL);
434*5113495bSYour Name 
435*5113495bSYour Name fail_destroy_vdev:
436*5113495bSYour Name 	wlan_objmgr_unregister_vdev_create_handler(
437*5113495bSYour Name 				WLAN_COMP_DP,
438*5113495bSYour Name 				dp_vdev_obj_create_notification, NULL);
439*5113495bSYour Name 
440*5113495bSYour Name fail_create_vdev:
441*5113495bSYour Name 	wlan_objmgr_unregister_pdev_destroy_handler(
442*5113495bSYour Name 				WLAN_COMP_DP,
443*5113495bSYour Name 				dp_pdev_obj_destroy_notification, NULL);
444*5113495bSYour Name 
445*5113495bSYour Name fail_destroy_pdev:
446*5113495bSYour Name 	wlan_objmgr_unregister_pdev_create_handler(
447*5113495bSYour Name 				WLAN_COMP_DP,
448*5113495bSYour Name 				dp_pdev_obj_create_notification, NULL);
449*5113495bSYour Name 
450*5113495bSYour Name fail_create_pdev:
451*5113495bSYour Name 	wlan_objmgr_unregister_psoc_destroy_handler(
452*5113495bSYour Name 				WLAN_COMP_DP,
453*5113495bSYour Name 				dp_psoc_obj_destroy_notification, NULL);
454*5113495bSYour Name fail_destroy_psoc:
455*5113495bSYour Name 	wlan_objmgr_unregister_psoc_create_handler(
456*5113495bSYour Name 				WLAN_COMP_DP,
457*5113495bSYour Name 				dp_psoc_obj_create_notification, NULL);
458*5113495bSYour Name 
459*5113495bSYour Name 	dp_free_ctx();
460*5113495bSYour Name 	return status;
461*5113495bSYour Name }
462*5113495bSYour Name 
ucfg_dp_deinit(void)463*5113495bSYour Name QDF_STATUS ucfg_dp_deinit(void)
464*5113495bSYour Name {
465*5113495bSYour Name 	QDF_STATUS status;
466*5113495bSYour Name 
467*5113495bSYour Name 	dp_info("DP module dispatcher deinit");
468*5113495bSYour Name 
469*5113495bSYour Name 	/* de-register link switch handler */
470*5113495bSYour Name 	wlan_dp_unregister_link_switch_notifier();
471*5113495bSYour Name 
472*5113495bSYour Name 	/* de-register peer delete handler functions. */
473*5113495bSYour Name 	status = wlan_objmgr_unregister_peer_destroy_handler(
474*5113495bSYour Name 				WLAN_COMP_DP,
475*5113495bSYour Name 				dp_peer_obj_destroy_notification, NULL);
476*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status))
477*5113495bSYour Name 		dp_err("Failed to unregister DP peer destroy handler: %d", status);
478*5113495bSYour Name 
479*5113495bSYour Name 	/* de-register peer create handler functions. */
480*5113495bSYour Name 	status = wlan_objmgr_unregister_peer_create_handler(
481*5113495bSYour Name 				WLAN_COMP_DP,
482*5113495bSYour Name 				dp_peer_obj_create_notification, NULL);
483*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status))
484*5113495bSYour Name 		dp_err("Failed to unregister DP peer create handler: %d", status);
485*5113495bSYour Name 
486*5113495bSYour Name 	status = wlan_objmgr_unregister_vdev_destroy_handler(
487*5113495bSYour Name 				WLAN_COMP_DP,
488*5113495bSYour Name 				dp_vdev_obj_destroy_notification,
489*5113495bSYour Name 				NULL);
490*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status))
491*5113495bSYour Name 		dp_err("Failed to unregister vdev delete handler:%d", status);
492*5113495bSYour Name 
493*5113495bSYour Name 	status = wlan_objmgr_unregister_vdev_create_handler(
494*5113495bSYour Name 				WLAN_COMP_DP,
495*5113495bSYour Name 				dp_vdev_obj_create_notification, NULL);
496*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status))
497*5113495bSYour Name 		dp_err("Failed to unregister vdev create handler:%d", status);
498*5113495bSYour Name 
499*5113495bSYour Name 	status = wlan_objmgr_unregister_pdev_destroy_handler(
500*5113495bSYour Name 				WLAN_COMP_DP,
501*5113495bSYour Name 				dp_pdev_obj_destroy_notification, NULL);
502*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status))
503*5113495bSYour Name 		dp_err("Failed to unregister pdev destroy handler:%d", status);
504*5113495bSYour Name 
505*5113495bSYour Name 	status = wlan_objmgr_unregister_pdev_create_handler(
506*5113495bSYour Name 				WLAN_COMP_DP,
507*5113495bSYour Name 				dp_pdev_obj_create_notification, NULL);
508*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status))
509*5113495bSYour Name 		dp_err("Failed to unregister pdev create handler:%d", status);
510*5113495bSYour Name 
511*5113495bSYour Name 	status = wlan_objmgr_unregister_psoc_destroy_handler(
512*5113495bSYour Name 				WLAN_COMP_DP,
513*5113495bSYour Name 				dp_psoc_obj_destroy_notification, NULL);
514*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status))
515*5113495bSYour Name 		dp_err("Failed to unregister DP psoc delete handle:%d", status);
516*5113495bSYour Name 
517*5113495bSYour Name 	status = wlan_objmgr_unregister_psoc_create_handler(
518*5113495bSYour Name 				WLAN_COMP_DP,
519*5113495bSYour Name 				dp_psoc_obj_create_notification, NULL);
520*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status))
521*5113495bSYour Name 		dp_err("Failed to unregister DP psoc create handle:%d", status);
522*5113495bSYour Name 
523*5113495bSYour Name 	dp_free_ctx();
524*5113495bSYour Name 
525*5113495bSYour Name 	return status;
526*5113495bSYour Name }
527*5113495bSYour Name 
528*5113495bSYour Name /**
529*5113495bSYour Name  * ucfg_dp_suspend_handler() - suspend handler registered with PMO component
530*5113495bSYour Name  * @psoc: psoc handle
531*5113495bSYour Name  * @arg: Arguments passed by the suspend handler.
532*5113495bSYour Name  *
533*5113495bSYour Name  * This handler is used to update the wiphy suspend state in DP context
534*5113495bSYour Name  *
535*5113495bSYour Name  * Return: QDF_STATUS status -in case of success else return error
536*5113495bSYour Name  */
537*5113495bSYour Name static QDF_STATUS
ucfg_dp_suspend_handler(struct wlan_objmgr_psoc * psoc,void * arg)538*5113495bSYour Name ucfg_dp_suspend_handler(struct wlan_objmgr_psoc *psoc, void *arg)
539*5113495bSYour Name {
540*5113495bSYour Name 	struct wlan_dp_psoc_context *dp_ctx;
541*5113495bSYour Name 	struct wlan_dp_intf *dp_intf, *dp_intf_next = NULL;
542*5113495bSYour Name 	void *soc = cds_get_context(QDF_MODULE_ID_SOC);
543*5113495bSYour Name 	QDF_STATUS status;
544*5113495bSYour Name 
545*5113495bSYour Name 	dp_ctx = dp_psoc_get_priv(psoc);
546*5113495bSYour Name 	if (!dp_ctx) {
547*5113495bSYour Name 		dp_err("DP context not found");
548*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
549*5113495bSYour Name 	}
550*5113495bSYour Name 	if (dp_ctx->enable_dp_rx_threads) {
551*5113495bSYour Name 		status = dp_txrx_suspend(cds_get_context(QDF_MODULE_ID_SOC));
552*5113495bSYour Name 
553*5113495bSYour Name 		if (status != QDF_STATUS_SUCCESS) {
554*5113495bSYour Name 			dp_txrx_resume(cds_get_context(QDF_MODULE_ID_SOC));
555*5113495bSYour Name 			return status;
556*5113495bSYour Name 			}
557*5113495bSYour Name 	}
558*5113495bSYour Name 	dp_ctx->is_suspend = true;
559*5113495bSYour Name 	cdp_set_tx_pause(soc, true);
560*5113495bSYour Name 	dp_for_each_intf_held_safe(dp_ctx, dp_intf, dp_intf_next) {
561*5113495bSYour Name 		dp_intf->sap_tx_block_mask |= WLAN_DP_SUSPEND;
562*5113495bSYour Name 	}
563*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
564*5113495bSYour Name }
565*5113495bSYour Name 
566*5113495bSYour Name /**
567*5113495bSYour Name  * ucfg_dp_resume_handler() - resume handler registered with PMO component
568*5113495bSYour Name  * @psoc: psoc handle
569*5113495bSYour Name  * @arg: Arguments passed by the resume handler.
570*5113495bSYour Name  *
571*5113495bSYour Name  * This handler is used to update the wiphy resume state in DP context
572*5113495bSYour Name  *
573*5113495bSYour Name  * Return: QDF_STATUS status -in case of success else return error
574*5113495bSYour Name  */
575*5113495bSYour Name static QDF_STATUS
ucfg_dp_resume_handler(struct wlan_objmgr_psoc * psoc,void * arg)576*5113495bSYour Name ucfg_dp_resume_handler(struct wlan_objmgr_psoc *psoc, void *arg)
577*5113495bSYour Name {
578*5113495bSYour Name 	struct wlan_dp_psoc_context *dp_ctx;
579*5113495bSYour Name 	struct wlan_dp_intf *dp_intf, *dp_intf_next = NULL;
580*5113495bSYour Name 	void *soc = cds_get_context(QDF_MODULE_ID_SOC);
581*5113495bSYour Name 
582*5113495bSYour Name 	dp_ctx = dp_psoc_get_priv(psoc);
583*5113495bSYour Name 	if (!dp_ctx) {
584*5113495bSYour Name 		dp_err("DP context not found");
585*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
586*5113495bSYour Name 	}
587*5113495bSYour Name 
588*5113495bSYour Name 	dp_ctx->is_suspend = false;
589*5113495bSYour Name 	cdp_set_tx_pause(soc, false);
590*5113495bSYour Name 	dp_for_each_intf_held_safe(dp_ctx, dp_intf, dp_intf_next) {
591*5113495bSYour Name 		dp_intf->sap_tx_block_mask &= ~WLAN_DP_SUSPEND;
592*5113495bSYour Name 	}
593*5113495bSYour Name 	if (dp_ctx->enable_dp_rx_threads)
594*5113495bSYour Name 		dp_txrx_resume(cds_get_context(QDF_MODULE_ID_SOC));
595*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
596*5113495bSYour Name }
597*5113495bSYour Name 
598*5113495bSYour Name /**
599*5113495bSYour Name  * dp_register_pmo_handler() - register suspend and resume handler
600*5113495bSYour Name  * with PMO component
601*5113495bSYour Name  *
602*5113495bSYour Name  * Return: None
603*5113495bSYour Name  */
dp_register_pmo_handler(void)604*5113495bSYour Name static inline void dp_register_pmo_handler(void)
605*5113495bSYour Name {
606*5113495bSYour Name 	pmo_register_suspend_handler(WLAN_COMP_DP,
607*5113495bSYour Name 				     ucfg_dp_suspend_handler, NULL);
608*5113495bSYour Name 
609*5113495bSYour Name 	pmo_register_resume_handler(WLAN_COMP_DP,
610*5113495bSYour Name 				    ucfg_dp_resume_handler, NULL);
611*5113495bSYour Name }
612*5113495bSYour Name 
613*5113495bSYour Name /**
614*5113495bSYour Name  * dp_unregister_pmo_handler() - unregister suspend and resume handler
615*5113495bSYour Name  * with PMO component
616*5113495bSYour Name  *
617*5113495bSYour Name  * Return: None
618*5113495bSYour Name  */
dp_unregister_pmo_handler(void)619*5113495bSYour Name static inline void dp_unregister_pmo_handler(void)
620*5113495bSYour Name {
621*5113495bSYour Name 	pmo_unregister_suspend_handler(WLAN_COMP_DP, ucfg_dp_suspend_handler);
622*5113495bSYour Name 
623*5113495bSYour Name 	pmo_unregister_resume_handler(WLAN_COMP_DP, ucfg_dp_resume_handler);
624*5113495bSYour Name }
625*5113495bSYour Name 
626*5113495bSYour Name /**
627*5113495bSYour Name  * ucfg_dp_store_qdf_dev() - Store qdf device instance in DP component
628*5113495bSYour Name  * @psoc: psoc handle
629*5113495bSYour Name  *
630*5113495bSYour Name  * Return: QDF_STATUS status -in case of success else return error
631*5113495bSYour Name  */
632*5113495bSYour Name static inline QDF_STATUS
ucfg_dp_store_qdf_dev(struct wlan_objmgr_psoc * psoc)633*5113495bSYour Name ucfg_dp_store_qdf_dev(struct wlan_objmgr_psoc *psoc)
634*5113495bSYour Name {
635*5113495bSYour Name 	struct wlan_dp_psoc_context *dp_ctx;
636*5113495bSYour Name 
637*5113495bSYour Name 	dp_ctx = dp_psoc_get_priv(psoc);
638*5113495bSYour Name 	if (!dp_ctx) {
639*5113495bSYour Name 		dp_err("DP context not found");
640*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
641*5113495bSYour Name 	}
642*5113495bSYour Name 
643*5113495bSYour Name 	dp_ctx->qdf_dev = wlan_psoc_get_qdf_dev(psoc);
644*5113495bSYour Name 	if (!dp_ctx->qdf_dev) {
645*5113495bSYour Name 		dp_err("QDF_DEV is NULL");
646*5113495bSYour Name 		QDF_BUG(0);
647*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
648*5113495bSYour Name 	}
649*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
650*5113495bSYour Name }
651*5113495bSYour Name 
ucfg_dp_psoc_open(struct wlan_objmgr_psoc * psoc)652*5113495bSYour Name QDF_STATUS ucfg_dp_psoc_open(struct wlan_objmgr_psoc *psoc)
653*5113495bSYour Name {
654*5113495bSYour Name 	struct wlan_dp_psoc_context *dp_ctx;
655*5113495bSYour Name 
656*5113495bSYour Name 	dp_ctx = dp_psoc_get_priv(psoc);
657*5113495bSYour Name 	if (!dp_ctx) {
658*5113495bSYour Name 		dp_err("DP context not found");
659*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
660*5113495bSYour Name 	}
661*5113495bSYour Name 
662*5113495bSYour Name 	ucfg_dp_store_qdf_dev(psoc);
663*5113495bSYour Name 	dp_rtpm_tput_policy_init(psoc);
664*5113495bSYour Name 	dp_register_pmo_handler();
665*5113495bSYour Name 	dp_trace_init(psoc);
666*5113495bSYour Name 	dp_bus_bandwidth_init(psoc);
667*5113495bSYour Name 	qdf_wake_lock_create(&dp_ctx->rx_wake_lock, "qcom_rx_wakelock");
668*5113495bSYour Name 
669*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
670*5113495bSYour Name }
671*5113495bSYour Name 
ucfg_dp_psoc_close(struct wlan_objmgr_psoc * psoc)672*5113495bSYour Name QDF_STATUS ucfg_dp_psoc_close(struct wlan_objmgr_psoc *psoc)
673*5113495bSYour Name {
674*5113495bSYour Name 	struct wlan_dp_psoc_context *dp_ctx;
675*5113495bSYour Name 
676*5113495bSYour Name 	dp_ctx = dp_psoc_get_priv(psoc);
677*5113495bSYour Name 	if (!dp_ctx) {
678*5113495bSYour Name 		dp_err("DP context not found");
679*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
680*5113495bSYour Name 	}
681*5113495bSYour Name 
682*5113495bSYour Name 	dp_rtpm_tput_policy_deinit(psoc);
683*5113495bSYour Name 	dp_unregister_pmo_handler();
684*5113495bSYour Name 	dp_bus_bandwidth_deinit(psoc);
685*5113495bSYour Name 	qdf_wake_lock_destroy(&dp_ctx->rx_wake_lock);
686*5113495bSYour Name 
687*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
688*5113495bSYour Name }
689*5113495bSYour Name 
ucfg_dp_suspend_wlan(struct wlan_objmgr_psoc * psoc)690*5113495bSYour Name void ucfg_dp_suspend_wlan(struct wlan_objmgr_psoc *psoc)
691*5113495bSYour Name {
692*5113495bSYour Name 	struct wlan_dp_psoc_context *dp_ctx;
693*5113495bSYour Name 
694*5113495bSYour Name 	dp_ctx = dp_psoc_get_priv(psoc);
695*5113495bSYour Name 	if (!dp_ctx) {
696*5113495bSYour Name 		dp_err("DP context not found");
697*5113495bSYour Name 		return;
698*5113495bSYour Name 	}
699*5113495bSYour Name 
700*5113495bSYour Name 	dp_ctx->is_wiphy_suspended = true;
701*5113495bSYour Name }
702*5113495bSYour Name 
ucfg_dp_resume_wlan(struct wlan_objmgr_psoc * psoc)703*5113495bSYour Name void ucfg_dp_resume_wlan(struct wlan_objmgr_psoc *psoc)
704*5113495bSYour Name {
705*5113495bSYour Name 	struct wlan_dp_psoc_context *dp_ctx;
706*5113495bSYour Name 
707*5113495bSYour Name 	dp_ctx = dp_psoc_get_priv(psoc);
708*5113495bSYour Name 	if (!dp_ctx) {
709*5113495bSYour Name 		dp_err("DP context not found");
710*5113495bSYour Name 		return;
711*5113495bSYour Name 	}
712*5113495bSYour Name 
713*5113495bSYour Name 	dp_ctx->is_wiphy_suspended = false;
714*5113495bSYour Name }
715*5113495bSYour Name 
ucfg_dp_wait_complete_tasks(void)716*5113495bSYour Name void ucfg_dp_wait_complete_tasks(void)
717*5113495bSYour Name {
718*5113495bSYour Name 	struct wlan_dp_psoc_context *dp_ctx;
719*5113495bSYour Name 
720*5113495bSYour Name 	dp_ctx =  dp_get_context();
721*5113495bSYour Name 	dp_wait_complete_tasks(dp_ctx);
722*5113495bSYour Name }
723*5113495bSYour Name 
724*5113495bSYour Name /*
725*5113495bSYour Name  * During connect/disconnect this needs to be updated
726*5113495bSYour Name  */
727*5113495bSYour Name 
ucfg_dp_remove_conn_info(struct wlan_objmgr_vdev * vdev)728*5113495bSYour Name void ucfg_dp_remove_conn_info(struct wlan_objmgr_vdev *vdev)
729*5113495bSYour Name {
730*5113495bSYour Name 	struct wlan_dp_link *dp_link;
731*5113495bSYour Name 
732*5113495bSYour Name 	dp_link = dp_get_vdev_priv_obj(vdev);
733*5113495bSYour Name 	if (unlikely(!dp_link)) {
734*5113495bSYour Name 		dp_err("DP link not found");
735*5113495bSYour Name 		return;
736*5113495bSYour Name 	}
737*5113495bSYour Name 
738*5113495bSYour Name 	qdf_mem_zero(&dp_link->conn_info,
739*5113495bSYour Name 		     sizeof(struct wlan_dp_conn_info));
740*5113495bSYour Name }
741*5113495bSYour Name 
ucfg_dp_conn_info_set_bssid(struct wlan_objmgr_vdev * vdev,struct qdf_mac_addr * bssid)742*5113495bSYour Name void ucfg_dp_conn_info_set_bssid(struct wlan_objmgr_vdev *vdev,
743*5113495bSYour Name 				 struct qdf_mac_addr *bssid)
744*5113495bSYour Name {
745*5113495bSYour Name 	struct wlan_dp_link *dp_link;
746*5113495bSYour Name 
747*5113495bSYour Name 	dp_link = dp_get_vdev_priv_obj(vdev);
748*5113495bSYour Name 	if (unlikely(!dp_link)) {
749*5113495bSYour Name 		dp_err("DP link not found");
750*5113495bSYour Name 		return;
751*5113495bSYour Name 	}
752*5113495bSYour Name 
753*5113495bSYour Name 	qdf_copy_macaddr(&dp_link->conn_info.bssid, bssid);
754*5113495bSYour Name }
755*5113495bSYour Name 
ucfg_dp_conn_info_set_arp_service(struct wlan_objmgr_vdev * vdev,uint8_t proxy_arp_service)756*5113495bSYour Name void ucfg_dp_conn_info_set_arp_service(struct wlan_objmgr_vdev *vdev,
757*5113495bSYour Name 				       uint8_t proxy_arp_service)
758*5113495bSYour Name {
759*5113495bSYour Name 	struct wlan_dp_link *dp_link;
760*5113495bSYour Name 
761*5113495bSYour Name 	dp_link = dp_get_vdev_priv_obj(vdev);
762*5113495bSYour Name 	if (unlikely(!dp_link)) {
763*5113495bSYour Name 		dp_err("DP link not found");
764*5113495bSYour Name 		return;
765*5113495bSYour Name 	}
766*5113495bSYour Name 
767*5113495bSYour Name 	dp_link->conn_info.proxy_arp_service = proxy_arp_service;
768*5113495bSYour Name }
769*5113495bSYour Name 
ucfg_dp_conn_info_set_peer_authenticate(struct wlan_objmgr_vdev * vdev,uint8_t is_authenticated)770*5113495bSYour Name void ucfg_dp_conn_info_set_peer_authenticate(struct wlan_objmgr_vdev *vdev,
771*5113495bSYour Name 					     uint8_t is_authenticated)
772*5113495bSYour Name {
773*5113495bSYour Name 	struct wlan_dp_link *dp_link;
774*5113495bSYour Name 
775*5113495bSYour Name 	dp_link = dp_get_vdev_priv_obj(vdev);
776*5113495bSYour Name 	if (unlikely(!dp_link)) {
777*5113495bSYour Name 		dp_err("DP link not found");
778*5113495bSYour Name 		return;
779*5113495bSYour Name 	}
780*5113495bSYour Name 
781*5113495bSYour Name 	dp_link->conn_info.is_authenticated = is_authenticated;
782*5113495bSYour Name }
783*5113495bSYour Name 
ucfg_dp_conn_info_set_peer_mac(struct wlan_objmgr_vdev * vdev,struct qdf_mac_addr * peer_mac)784*5113495bSYour Name void ucfg_dp_conn_info_set_peer_mac(struct wlan_objmgr_vdev *vdev,
785*5113495bSYour Name 				    struct qdf_mac_addr *peer_mac)
786*5113495bSYour Name {
787*5113495bSYour Name 	struct wlan_dp_link *dp_link;
788*5113495bSYour Name 
789*5113495bSYour Name 	dp_link = dp_get_vdev_priv_obj(vdev);
790*5113495bSYour Name 	if (unlikely(!dp_link)) {
791*5113495bSYour Name 		dp_err("DP link not found");
792*5113495bSYour Name 		return;
793*5113495bSYour Name 	}
794*5113495bSYour Name 
795*5113495bSYour Name 	qdf_copy_macaddr(&dp_link->conn_info.peer_macaddr, peer_mac);
796*5113495bSYour Name }
797*5113495bSYour Name 
ucfg_dp_softap_check_wait_for_tx_eap_pkt(struct wlan_objmgr_vdev * vdev,struct qdf_mac_addr * mac_addr)798*5113495bSYour Name void ucfg_dp_softap_check_wait_for_tx_eap_pkt(struct wlan_objmgr_vdev *vdev,
799*5113495bSYour Name 					      struct qdf_mac_addr *mac_addr)
800*5113495bSYour Name {
801*5113495bSYour Name 	struct wlan_dp_intf *dp_intf;
802*5113495bSYour Name 	struct wlan_dp_link *dp_link;
803*5113495bSYour Name 
804*5113495bSYour Name 	dp_link = dp_get_vdev_priv_obj(vdev);
805*5113495bSYour Name 	if (unlikely(!dp_link)) {
806*5113495bSYour Name 		dp_err("DP link not found");
807*5113495bSYour Name 		return;
808*5113495bSYour Name 	}
809*5113495bSYour Name 
810*5113495bSYour Name 	dp_intf = dp_link->dp_intf;
811*5113495bSYour Name 	dp_softap_check_wait_for_tx_eap_pkt(dp_intf, mac_addr);
812*5113495bSYour Name }
813*5113495bSYour Name 
ucfg_dp_update_dhcp_state_on_disassoc(struct wlan_objmgr_vdev * vdev,struct qdf_mac_addr * mac_addr)814*5113495bSYour Name void ucfg_dp_update_dhcp_state_on_disassoc(struct wlan_objmgr_vdev *vdev,
815*5113495bSYour Name 					   struct qdf_mac_addr *mac_addr)
816*5113495bSYour Name {
817*5113495bSYour Name 	struct wlan_dp_intf *dp_intf;
818*5113495bSYour Name 	struct wlan_dp_link *dp_link;
819*5113495bSYour Name 	struct wlan_objmgr_peer *peer;
820*5113495bSYour Name 	struct wlan_dp_sta_info *stainfo;
821*5113495bSYour Name 
822*5113495bSYour Name 	dp_link = dp_get_vdev_priv_obj(vdev);
823*5113495bSYour Name 	if (unlikely(!dp_link)) {
824*5113495bSYour Name 		dp_err("DP link not found");
825*5113495bSYour Name 		return;
826*5113495bSYour Name 	}
827*5113495bSYour Name 
828*5113495bSYour Name 	dp_intf = dp_link->dp_intf;
829*5113495bSYour Name 	peer = wlan_objmgr_get_peer_by_mac(dp_intf->dp_ctx->psoc,
830*5113495bSYour Name 					   mac_addr->bytes,
831*5113495bSYour Name 					   WLAN_DP_ID);
832*5113495bSYour Name 	if (!peer) {
833*5113495bSYour Name 		dp_err("Peer object not found mac:" QDF_MAC_ADDR_FMT,
834*5113495bSYour Name 		       QDF_MAC_ADDR_REF(mac_addr->bytes));
835*5113495bSYour Name 		return;
836*5113495bSYour Name 	}
837*5113495bSYour Name 
838*5113495bSYour Name 	stainfo = dp_get_peer_priv_obj(peer);
839*5113495bSYour Name 	if (!stainfo) {
840*5113495bSYour Name 		wlan_objmgr_peer_release_ref(peer, WLAN_DP_ID);
841*5113495bSYour Name 		return;
842*5113495bSYour Name 	}
843*5113495bSYour Name 
844*5113495bSYour Name 	/* Send DHCP STOP indication to FW */
845*5113495bSYour Name 	stainfo->dhcp_phase = DHCP_PHASE_ACK;
846*5113495bSYour Name 	if (stainfo->dhcp_nego_status == DHCP_NEGO_IN_PROGRESS)
847*5113495bSYour Name 		dp_post_dhcp_ind(dp_link,
848*5113495bSYour Name 				 stainfo->sta_mac.bytes,
849*5113495bSYour Name 				 0);
850*5113495bSYour Name 	stainfo->dhcp_nego_status = DHCP_NEGO_STOP;
851*5113495bSYour Name 	wlan_objmgr_peer_release_ref(peer, WLAN_DP_ID);
852*5113495bSYour Name }
853*5113495bSYour Name 
ucfg_dp_set_dfs_cac_tx(struct wlan_objmgr_vdev * vdev,bool tx_block)854*5113495bSYour Name void ucfg_dp_set_dfs_cac_tx(struct wlan_objmgr_vdev *vdev, bool tx_block)
855*5113495bSYour Name {
856*5113495bSYour Name 	struct wlan_dp_intf *dp_intf;
857*5113495bSYour Name 	struct wlan_dp_link *dp_link;
858*5113495bSYour Name 
859*5113495bSYour Name 	dp_link = dp_get_vdev_priv_obj(vdev);
860*5113495bSYour Name 	if (unlikely(!dp_link)) {
861*5113495bSYour Name 		dp_err("DP link not found");
862*5113495bSYour Name 		return;
863*5113495bSYour Name 	}
864*5113495bSYour Name 
865*5113495bSYour Name 	dp_intf = dp_link->dp_intf;
866*5113495bSYour Name 	if (tx_block)
867*5113495bSYour Name 		dp_intf->sap_tx_block_mask |= DP_TX_DFS_CAC_BLOCK;
868*5113495bSYour Name 	else
869*5113495bSYour Name 		dp_intf->sap_tx_block_mask &= ~DP_TX_DFS_CAC_BLOCK;
870*5113495bSYour Name }
871*5113495bSYour Name 
ucfg_dp_set_bss_state_start(struct wlan_objmgr_vdev * vdev,bool start)872*5113495bSYour Name void ucfg_dp_set_bss_state_start(struct wlan_objmgr_vdev *vdev, bool start)
873*5113495bSYour Name {
874*5113495bSYour Name 	struct wlan_dp_intf *dp_intf;
875*5113495bSYour Name 	struct wlan_dp_link *dp_link;
876*5113495bSYour Name 
877*5113495bSYour Name 	dp_link = dp_get_vdev_priv_obj(vdev);
878*5113495bSYour Name 	if (unlikely(!dp_link)) {
879*5113495bSYour Name 		dp_err("DP link not found");
880*5113495bSYour Name 		return;
881*5113495bSYour Name 	}
882*5113495bSYour Name 
883*5113495bSYour Name 	dp_intf = dp_link->dp_intf;
884*5113495bSYour Name 	if (start) {
885*5113495bSYour Name 		dp_intf->sap_tx_block_mask &= ~DP_TX_SAP_STOP;
886*5113495bSYour Name 		dp_intf->bss_state = BSS_INTF_START;
887*5113495bSYour Name 	} else {
888*5113495bSYour Name 		dp_intf->sap_tx_block_mask |= DP_TX_SAP_STOP;
889*5113495bSYour Name 		dp_intf->bss_state = BSS_INTF_STOP;
890*5113495bSYour Name 	}
891*5113495bSYour Name }
892*5113495bSYour Name 
ucfg_dp_lro_set_reset(struct wlan_objmgr_vdev * vdev,uint8_t enable_flag)893*5113495bSYour Name QDF_STATUS ucfg_dp_lro_set_reset(struct wlan_objmgr_vdev *vdev,
894*5113495bSYour Name 				 uint8_t enable_flag)
895*5113495bSYour Name {
896*5113495bSYour Name 	struct wlan_dp_intf *dp_intf;
897*5113495bSYour Name 	struct wlan_dp_link *dp_link;
898*5113495bSYour Name 
899*5113495bSYour Name 	dp_link = dp_get_vdev_priv_obj(vdev);
900*5113495bSYour Name 	if (unlikely(!dp_link)) {
901*5113495bSYour Name 		dp_err("DP link not found");
902*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
903*5113495bSYour Name 	}
904*5113495bSYour Name 
905*5113495bSYour Name 	dp_intf = dp_link->dp_intf;
906*5113495bSYour Name 	return dp_lro_set_reset(dp_intf, enable_flag);
907*5113495bSYour Name }
908*5113495bSYour Name 
ucfg_dp_is_ol_enabled(struct wlan_objmgr_psoc * psoc)909*5113495bSYour Name bool ucfg_dp_is_ol_enabled(struct wlan_objmgr_psoc *psoc)
910*5113495bSYour Name {
911*5113495bSYour Name 	struct wlan_dp_psoc_context *dp_ctx;
912*5113495bSYour Name 
913*5113495bSYour Name 	dp_ctx = dp_psoc_get_priv(psoc);
914*5113495bSYour Name 	if (!dp_ctx) {
915*5113495bSYour Name 		dp_err("DP context not found");
916*5113495bSYour Name 		return 0;
917*5113495bSYour Name 	}
918*5113495bSYour Name 
919*5113495bSYour Name 	return dp_ctx->ol_enable;
920*5113495bSYour Name }
921*5113495bSYour Name 
922*5113495bSYour Name #ifdef RECEIVE_OFFLOAD
ucfg_dp_rx_handle_concurrency(struct wlan_objmgr_psoc * psoc,bool disable)923*5113495bSYour Name void ucfg_dp_rx_handle_concurrency(struct wlan_objmgr_psoc *psoc,
924*5113495bSYour Name 				   bool disable)
925*5113495bSYour Name {
926*5113495bSYour Name 	struct wlan_dp_psoc_context *dp_ctx;
927*5113495bSYour Name 
928*5113495bSYour Name 	dp_ctx = dp_psoc_get_priv(psoc);
929*5113495bSYour Name 	if (!dp_ctx) {
930*5113495bSYour Name 		dp_err("DP context not found");
931*5113495bSYour Name 		return;
932*5113495bSYour Name 	}
933*5113495bSYour Name 
934*5113495bSYour Name 	if (disable) {
935*5113495bSYour Name 		if (DP_BUS_BW_CFG(dp_ctx->dp_cfg.enable_tcp_delack)) {
936*5113495bSYour Name 			struct wlan_rx_tp_data rx_tp_data;
937*5113495bSYour Name 
938*5113495bSYour Name 			dp_info("Enable TCP delack as LRO disabled in concurrency");
939*5113495bSYour Name 			rx_tp_data.rx_tp_flags = TCP_DEL_ACK_IND;
940*5113495bSYour Name 			rx_tp_data.level =
941*5113495bSYour Name 				DP_BUS_BW_GET_RX_LVL(dp_ctx);
942*5113495bSYour Name 			wlan_dp_update_tcp_rx_param(dp_ctx, &rx_tp_data);
943*5113495bSYour Name 			dp_ctx->en_tcp_delack_no_lro = 1;
944*5113495bSYour Name 		}
945*5113495bSYour Name 		qdf_atomic_set(&dp_ctx->disable_rx_ol_in_concurrency, 1);
946*5113495bSYour Name 	} else {
947*5113495bSYour Name 		if (DP_BUS_BW_CFG(dp_ctx->dp_cfg.enable_tcp_delack)) {
948*5113495bSYour Name 			dp_info("Disable TCP delack as LRO is enabled");
949*5113495bSYour Name 			dp_ctx->en_tcp_delack_no_lro = 0;
950*5113495bSYour Name 			dp_reset_tcp_delack(psoc);
951*5113495bSYour Name 		}
952*5113495bSYour Name 		qdf_atomic_set(&dp_ctx->disable_rx_ol_in_concurrency, 0);
953*5113495bSYour Name 	}
954*5113495bSYour Name }
955*5113495bSYour Name 
ucfg_dp_rx_ol_init(struct wlan_objmgr_psoc * psoc,bool is_wifi3_0_target)956*5113495bSYour Name QDF_STATUS ucfg_dp_rx_ol_init(struct wlan_objmgr_psoc *psoc,
957*5113495bSYour Name 			      bool is_wifi3_0_target)
958*5113495bSYour Name {
959*5113495bSYour Name 	struct wlan_dp_psoc_context *dp_ctx;
960*5113495bSYour Name 
961*5113495bSYour Name 	dp_ctx = dp_psoc_get_priv(psoc);
962*5113495bSYour Name 	if (!dp_ctx) {
963*5113495bSYour Name 		dp_err("DP context not found");
964*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
965*5113495bSYour Name 	}
966*5113495bSYour Name 
967*5113495bSYour Name 	return dp_rx_ol_init(dp_ctx, is_wifi3_0_target);
968*5113495bSYour Name }
969*5113495bSYour Name #else /* RECEIVE_OFFLOAD */
970*5113495bSYour Name 
ucfg_dp_rx_ol_init(struct wlan_objmgr_psoc * psoc,bool is_wifi3_0_target)971*5113495bSYour Name QDF_STATUS ucfg_dp_rx_ol_init(struct wlan_objmgr_psoc *psoc,
972*5113495bSYour Name 			      bool is_wifi3_0_target)
973*5113495bSYour Name {
974*5113495bSYour Name 	dp_err("Rx_OL, LRO/GRO not supported");
975*5113495bSYour Name 	return QDF_STATUS_E_NOSUPPORT;
976*5113495bSYour Name }
977*5113495bSYour Name #endif
978*5113495bSYour Name 
ucfg_dp_is_rx_common_thread_enabled(struct wlan_objmgr_psoc * psoc)979*5113495bSYour Name bool ucfg_dp_is_rx_common_thread_enabled(struct wlan_objmgr_psoc *psoc)
980*5113495bSYour Name {
981*5113495bSYour Name 	struct wlan_dp_psoc_context *dp_ctx;
982*5113495bSYour Name 
983*5113495bSYour Name 	dp_ctx = dp_psoc_get_priv(psoc);
984*5113495bSYour Name 	if (!dp_ctx) {
985*5113495bSYour Name 		dp_err("DP context not found");
986*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
987*5113495bSYour Name 	}
988*5113495bSYour Name 
989*5113495bSYour Name 	return dp_ctx->enable_rxthread;
990*5113495bSYour Name }
991*5113495bSYour Name 
ucfg_dp_is_rx_threads_enabled(struct wlan_objmgr_psoc * psoc)992*5113495bSYour Name bool ucfg_dp_is_rx_threads_enabled(struct wlan_objmgr_psoc *psoc)
993*5113495bSYour Name {
994*5113495bSYour Name 	struct wlan_dp_psoc_context *dp_ctx;
995*5113495bSYour Name 
996*5113495bSYour Name 	dp_ctx = dp_psoc_get_priv(psoc);
997*5113495bSYour Name 	if (!dp_ctx) {
998*5113495bSYour Name 		dp_err("DP context not found");
999*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
1000*5113495bSYour Name 	}
1001*5113495bSYour Name 
1002*5113495bSYour Name 	return dp_ctx->enable_dp_rx_threads;
1003*5113495bSYour Name }
1004*5113495bSYour Name 
1005*5113495bSYour Name #ifdef WLAN_FEATURE_RX_SOFTIRQ_TIME_LIMIT
1006*5113495bSYour Name /**
1007*5113495bSYour Name  * dp_get_config_rx_softirq_limits() - Update DP rx softirq limit config
1008*5113495bSYour Name  *                          datapath
1009*5113495bSYour Name  * @psoc: psoc handle
1010*5113495bSYour Name  * @params: DP Configuration parameters
1011*5113495bSYour Name  *
1012*5113495bSYour Name  * Return: None
1013*5113495bSYour Name  */
1014*5113495bSYour Name static
dp_get_config_rx_softirq_limits(struct wlan_objmgr_psoc * psoc,struct cdp_config_params * params)1015*5113495bSYour Name void dp_get_config_rx_softirq_limits(struct wlan_objmgr_psoc *psoc,
1016*5113495bSYour Name 				     struct cdp_config_params *params)
1017*5113495bSYour Name {
1018*5113495bSYour Name 	params->tx_comp_loop_pkt_limit = cfg_get(psoc,
1019*5113495bSYour Name 						 CFG_DP_TX_COMP_LOOP_PKT_LIMIT);
1020*5113495bSYour Name 	params->rx_reap_loop_pkt_limit = cfg_get(psoc,
1021*5113495bSYour Name 						 CFG_DP_RX_REAP_LOOP_PKT_LIMIT);
1022*5113495bSYour Name 	params->rx_hp_oos_update_limit = cfg_get(psoc,
1023*5113495bSYour Name 						 CFG_DP_RX_HP_OOS_UPDATE_LIMIT);
1024*5113495bSYour Name }
1025*5113495bSYour Name #else
1026*5113495bSYour Name static
dp_get_config_rx_softirq_limits(struct wlan_objmgr_psoc * psoc,struct cdp_config_params * params)1027*5113495bSYour Name void dp_get_config_rx_softirq_limits(struct wlan_objmgr_psoc *psoc,
1028*5113495bSYour Name 				     struct cdp_config_params *params)
1029*5113495bSYour Name {
1030*5113495bSYour Name }
1031*5113495bSYour Name #endif /* WLAN_FEATURE_RX_SOFTIRQ_TIME_LIMIT */
1032*5113495bSYour Name 
1033*5113495bSYour Name #if defined(QCA_LL_TX_FLOW_CONTROL_V2) || defined(QCA_LL_PDEV_TX_FLOW_CONTROL)
1034*5113495bSYour Name /**
1035*5113495bSYour Name  * dp_get_config_queue_threshold() - Update DP tx flow limit config
1036*5113495bSYour Name  *                          datapath
1037*5113495bSYour Name  * @psoc: psoc handle
1038*5113495bSYour Name  * @params: DP Configuration parameters
1039*5113495bSYour Name  *
1040*5113495bSYour Name  * Return: None
1041*5113495bSYour Name  */
1042*5113495bSYour Name static void
dp_get_config_queue_threshold(struct wlan_objmgr_psoc * psoc,struct cdp_config_params * params)1043*5113495bSYour Name dp_get_config_queue_threshold(struct wlan_objmgr_psoc *psoc,
1044*5113495bSYour Name 			      struct cdp_config_params *params)
1045*5113495bSYour Name {
1046*5113495bSYour Name 	params->tx_flow_stop_queue_threshold =
1047*5113495bSYour Name 			cfg_get(psoc, CFG_DP_TX_FLOW_STOP_QUEUE_TH);
1048*5113495bSYour Name 	params->tx_flow_start_queue_offset =
1049*5113495bSYour Name 			cfg_get(psoc, CFG_DP_TX_FLOW_START_QUEUE_OFFSET);
1050*5113495bSYour Name }
1051*5113495bSYour Name #else
1052*5113495bSYour Name static inline void
dp_get_config_queue_threshold(struct wlan_objmgr_psoc * psoc,struct cdp_config_params * params)1053*5113495bSYour Name dp_get_config_queue_threshold(struct wlan_objmgr_psoc *psoc,
1054*5113495bSYour Name 			      struct cdp_config_params *params)
1055*5113495bSYour Name {
1056*5113495bSYour Name }
1057*5113495bSYour Name #endif
1058*5113495bSYour Name 
1059*5113495bSYour Name QDF_STATUS
ucfg_dp_update_config(struct wlan_objmgr_psoc * psoc,struct wlan_dp_user_config * req)1060*5113495bSYour Name ucfg_dp_update_config(struct wlan_objmgr_psoc *psoc,
1061*5113495bSYour Name 		      struct wlan_dp_user_config *req)
1062*5113495bSYour Name {
1063*5113495bSYour Name 	struct cdp_config_params params = {0};
1064*5113495bSYour Name 	struct wlan_dp_psoc_context *dp_ctx;
1065*5113495bSYour Name 	QDF_STATUS status;
1066*5113495bSYour Name 	void *soc;
1067*5113495bSYour Name 
1068*5113495bSYour Name 	dp_ctx =  dp_psoc_get_priv(psoc);
1069*5113495bSYour Name 	if (!dp_ctx) {
1070*5113495bSYour Name 		dp_err("Unable to get DP context");
1071*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
1072*5113495bSYour Name 	}
1073*5113495bSYour Name 
1074*5113495bSYour Name 	dp_ctx->arp_connectivity_map = req->arp_connectivity_map;
1075*5113495bSYour Name 	soc = cds_get_context(QDF_MODULE_ID_SOC);
1076*5113495bSYour Name 	params.tso_enable = cfg_get(psoc, CFG_DP_TSO);
1077*5113495bSYour Name 	dp_ctx->dp_cfg.lro_enable = cfg_get(psoc, CFG_DP_LRO);
1078*5113495bSYour Name 	params.lro_enable = dp_ctx->dp_cfg.lro_enable;
1079*5113495bSYour Name 
1080*5113495bSYour Name 	dp_get_config_queue_threshold(psoc, &params);
1081*5113495bSYour Name 	params.flow_steering_enable =
1082*5113495bSYour Name 		cfg_get(psoc, CFG_DP_FLOW_STEERING_ENABLED);
1083*5113495bSYour Name 	params.napi_enable = dp_ctx->napi_enable;
1084*5113495bSYour Name 	params.p2p_tcp_udp_checksumoffload =
1085*5113495bSYour Name 		cfg_get(psoc, CFG_DP_P2P_TCP_UDP_CKSUM_OFFLOAD);
1086*5113495bSYour Name 	params.nan_tcp_udp_checksumoffload =
1087*5113495bSYour Name 		cfg_get(psoc, CFG_DP_NAN_TCP_UDP_CKSUM_OFFLOAD);
1088*5113495bSYour Name 	params.tcp_udp_checksumoffload =
1089*5113495bSYour Name 		cfg_get(psoc, CFG_DP_TCP_UDP_CKSUM_OFFLOAD);
1090*5113495bSYour Name 	params.ipa_enable = req->ipa_enable;
1091*5113495bSYour Name 	dp_ctx->dp_cfg.gro_enable = cfg_get(psoc, CFG_DP_GRO);
1092*5113495bSYour Name 	params.gro_enable = dp_ctx->dp_cfg.gro_enable;
1093*5113495bSYour Name 	params.tx_comp_loop_pkt_limit = cfg_get(psoc,
1094*5113495bSYour Name 						CFG_DP_TX_COMP_LOOP_PKT_LIMIT);
1095*5113495bSYour Name 	params.rx_reap_loop_pkt_limit = cfg_get(psoc,
1096*5113495bSYour Name 						CFG_DP_RX_REAP_LOOP_PKT_LIMIT);
1097*5113495bSYour Name 	params.rx_hp_oos_update_limit = cfg_get(psoc,
1098*5113495bSYour Name 						CFG_DP_RX_HP_OOS_UPDATE_LIMIT);
1099*5113495bSYour Name 	dp_get_config_rx_softirq_limits(psoc, &params);
1100*5113495bSYour Name 
1101*5113495bSYour Name 	status = cdp_update_config_parameters(soc, &params);
1102*5113495bSYour Name 	if (status) {
1103*5113495bSYour Name 		dp_err("Failed to attach config parameters");
1104*5113495bSYour Name 		return status;
1105*5113495bSYour Name 	}
1106*5113495bSYour Name 
1107*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1108*5113495bSYour Name }
1109*5113495bSYour Name 
1110*5113495bSYour Name uint64_t
ucfg_dp_get_rx_softirq_yield_duration(struct wlan_objmgr_psoc * psoc)1111*5113495bSYour Name ucfg_dp_get_rx_softirq_yield_duration(struct wlan_objmgr_psoc *psoc)
1112*5113495bSYour Name {
1113*5113495bSYour Name 	struct wlan_dp_psoc_context *dp_ctx;
1114*5113495bSYour Name 
1115*5113495bSYour Name 	dp_ctx = dp_psoc_get_priv(psoc);
1116*5113495bSYour Name 	if (!dp_ctx) {
1117*5113495bSYour Name 		dp_err("Unable to get DP context");
1118*5113495bSYour Name 		return 0;
1119*5113495bSYour Name 	}
1120*5113495bSYour Name 
1121*5113495bSYour Name 	return dp_ctx->dp_cfg.rx_softirq_max_yield_duration_ns;
1122*5113495bSYour Name }
1123*5113495bSYour Name 
1124*5113495bSYour Name #if defined(WLAN_SUPPORT_RX_FISA)
1125*5113495bSYour Name /**
1126*5113495bSYour Name  * dp_rx_register_fisa_ops() - FISA callback functions
1127*5113495bSYour Name  * @txrx_ops: operations handle holding callback functions
1128*5113495bSYour Name  *
1129*5113495bSYour Name  * Return: None
1130*5113495bSYour Name  */
1131*5113495bSYour Name static inline void
dp_rx_register_fisa_ops(struct ol_txrx_ops * txrx_ops)1132*5113495bSYour Name dp_rx_register_fisa_ops(struct ol_txrx_ops *txrx_ops)
1133*5113495bSYour Name {
1134*5113495bSYour Name 	txrx_ops->rx.osif_fisa_rx = wlan_dp_rx_fisa_cbk;
1135*5113495bSYour Name 	txrx_ops->rx.osif_fisa_flush = wlan_dp_rx_fisa_flush_by_ctx_id;
1136*5113495bSYour Name }
1137*5113495bSYour Name #else
1138*5113495bSYour Name static inline void
dp_rx_register_fisa_ops(struct ol_txrx_ops * txrx_ops)1139*5113495bSYour Name dp_rx_register_fisa_ops(struct ol_txrx_ops *txrx_ops)
1140*5113495bSYour Name {
1141*5113495bSYour Name }
1142*5113495bSYour Name #endif
1143*5113495bSYour Name 
1144*5113495bSYour Name #ifdef CONFIG_DP_PKT_ADD_TIMESTAMP
wlan_dp_get_tsf_time(void * dp_link_ctx,uint64_t input_time,uint64_t * tsf_time)1145*5113495bSYour Name static QDF_STATUS wlan_dp_get_tsf_time(void *dp_link_ctx,
1146*5113495bSYour Name 				       uint64_t input_time,
1147*5113495bSYour Name 				       uint64_t *tsf_time)
1148*5113495bSYour Name {
1149*5113495bSYour Name 	struct wlan_dp_link *dp_link = (struct wlan_dp_link *)dp_link_ctx;
1150*5113495bSYour Name 	struct wlan_dp_intf *dp_intf = dp_link->dp_intf;
1151*5113495bSYour Name 	struct wlan_dp_psoc_callbacks *dp_ops = &dp_intf->dp_ctx->dp_ops;
1152*5113495bSYour Name 
1153*5113495bSYour Name 	dp_ops->dp_get_tsf_time(dp_intf->dev,
1154*5113495bSYour Name 				input_time,
1155*5113495bSYour Name 				tsf_time);
1156*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1157*5113495bSYour Name }
1158*5113495bSYour Name #else
wlan_dp_get_tsf_time(void * dp_link_ctx,uint64_t input_time,uint64_t * tsf_time)1159*5113495bSYour Name static QDF_STATUS wlan_dp_get_tsf_time(void *dp_link_ctx,
1160*5113495bSYour Name 				       uint64_t input_time,
1161*5113495bSYour Name 				       uint64_t *tsf_time)
1162*5113495bSYour Name {
1163*5113495bSYour Name 	*tsf_time = 0;
1164*5113495bSYour Name 	return QDF_STATUS_E_NOSUPPORT;
1165*5113495bSYour Name }
1166*5113495bSYour Name #endif
1167*5113495bSYour Name 
ucfg_dp_sta_register_txrx_ops(struct wlan_objmgr_vdev * vdev)1168*5113495bSYour Name QDF_STATUS ucfg_dp_sta_register_txrx_ops(struct wlan_objmgr_vdev *vdev)
1169*5113495bSYour Name {
1170*5113495bSYour Name 	struct ol_txrx_ops txrx_ops;
1171*5113495bSYour Name 	void *soc = cds_get_context(QDF_MODULE_ID_SOC);
1172*5113495bSYour Name 	struct wlan_dp_intf *dp_intf;
1173*5113495bSYour Name 	struct wlan_dp_link *dp_link;
1174*5113495bSYour Name 
1175*5113495bSYour Name 	dp_link = dp_get_vdev_priv_obj(vdev);
1176*5113495bSYour Name 	if (unlikely(!dp_link)) {
1177*5113495bSYour Name 		dp_err("DP link not found");
1178*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
1179*5113495bSYour Name 	}
1180*5113495bSYour Name 
1181*5113495bSYour Name 	dp_intf = dp_link->dp_intf;
1182*5113495bSYour Name 	/* Register the vdev transmit and receive functions */
1183*5113495bSYour Name 	qdf_mem_zero(&txrx_ops, sizeof(txrx_ops));
1184*5113495bSYour Name 
1185*5113495bSYour Name 	if (dp_intf->dp_ctx->enable_dp_rx_threads) {
1186*5113495bSYour Name 		txrx_ops.rx.rx = dp_rx_pkt_thread_enqueue_cbk;
1187*5113495bSYour Name 		txrx_ops.rx.rx_stack = dp_rx_packet_cbk;
1188*5113495bSYour Name 		txrx_ops.rx.rx_flush = dp_rx_flush_packet_cbk;
1189*5113495bSYour Name 		txrx_ops.rx.rx_gro_flush = dp_rx_thread_gro_flush_ind_cbk;
1190*5113495bSYour Name 	} else {
1191*5113495bSYour Name 		txrx_ops.rx.rx = dp_rx_packet_cbk;
1192*5113495bSYour Name 		txrx_ops.rx.rx_stack = NULL;
1193*5113495bSYour Name 		txrx_ops.rx.rx_flush = NULL;
1194*5113495bSYour Name 	}
1195*5113495bSYour Name 
1196*5113495bSYour Name 	if (wlan_dp_cfg_is_rx_fisa_enabled(&dp_intf->dp_ctx->dp_cfg) &&
1197*5113495bSYour Name 	    dp_intf->device_mode != QDF_MONITOR_MODE) {
1198*5113495bSYour Name 		dp_debug("FISA feature enabled");
1199*5113495bSYour Name 		dp_rx_register_fisa_ops(&txrx_ops);
1200*5113495bSYour Name 	}
1201*5113495bSYour Name 
1202*5113495bSYour Name 	txrx_ops.rx.stats_rx = dp_tx_rx_collect_connectivity_stats_info;
1203*5113495bSYour Name 
1204*5113495bSYour Name 	txrx_ops.tx.tx_comp = dp_sta_notify_tx_comp_cb;
1205*5113495bSYour Name 	txrx_ops.tx.tx = NULL;
1206*5113495bSYour Name 	txrx_ops.get_tsf_time = wlan_dp_get_tsf_time;
1207*5113495bSYour Name 	txrx_ops.vdev_del_notify = wlan_dp_link_cdp_vdev_delete_notification;
1208*5113495bSYour Name 	cdp_vdev_register(soc, dp_link->link_id, (ol_osif_vdev_handle)dp_link,
1209*5113495bSYour Name 			  &txrx_ops);
1210*5113495bSYour Name 	if (!txrx_ops.tx.tx) {
1211*5113495bSYour Name 		dp_err("vdev register fail");
1212*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
1213*5113495bSYour Name 	}
1214*5113495bSYour Name 
1215*5113495bSYour Name 	dp_link->cdp_vdev_registered = 1;
1216*5113495bSYour Name 	dp_link->cdp_vdev_deleted = 0;
1217*5113495bSYour Name 	dp_link->destroyed = 0;
1218*5113495bSYour Name 
1219*5113495bSYour Name 	dp_intf->txrx_ops = txrx_ops;
1220*5113495bSYour Name 
1221*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1222*5113495bSYour Name }
1223*5113495bSYour Name 
1224*5113495bSYour Name #ifdef FEATURE_WLAN_TDLS
ucfg_dp_tdlsta_register_txrx_ops(struct wlan_objmgr_vdev * vdev)1225*5113495bSYour Name QDF_STATUS ucfg_dp_tdlsta_register_txrx_ops(struct wlan_objmgr_vdev *vdev)
1226*5113495bSYour Name {
1227*5113495bSYour Name 	struct ol_txrx_ops txrx_ops;
1228*5113495bSYour Name 	void *soc = cds_get_context(QDF_MODULE_ID_SOC);
1229*5113495bSYour Name 	struct wlan_dp_intf *dp_intf;
1230*5113495bSYour Name 	struct wlan_dp_link *dp_link;
1231*5113495bSYour Name 
1232*5113495bSYour Name 	dp_link = dp_get_vdev_priv_obj(vdev);
1233*5113495bSYour Name 	if (unlikely(!dp_link)) {
1234*5113495bSYour Name 		dp_err("DP link not found");
1235*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
1236*5113495bSYour Name 	}
1237*5113495bSYour Name 
1238*5113495bSYour Name 	dp_intf = dp_link->dp_intf;
1239*5113495bSYour Name 	/* Register the vdev transmit and receive functions */
1240*5113495bSYour Name 	qdf_mem_zero(&txrx_ops, sizeof(txrx_ops));
1241*5113495bSYour Name 	if (dp_intf->dp_ctx->enable_dp_rx_threads) {
1242*5113495bSYour Name 		txrx_ops.rx.rx = dp_rx_pkt_thread_enqueue_cbk;
1243*5113495bSYour Name 		txrx_ops.rx.rx_stack = dp_rx_packet_cbk;
1244*5113495bSYour Name 		txrx_ops.rx.rx_flush = dp_rx_flush_packet_cbk;
1245*5113495bSYour Name 		txrx_ops.rx.rx_gro_flush = dp_rx_thread_gro_flush_ind_cbk;
1246*5113495bSYour Name 	} else {
1247*5113495bSYour Name 		txrx_ops.rx.rx = dp_rx_packet_cbk;
1248*5113495bSYour Name 		txrx_ops.rx.rx_stack = NULL;
1249*5113495bSYour Name 		txrx_ops.rx.rx_flush = NULL;
1250*5113495bSYour Name 	}
1251*5113495bSYour Name 
1252*5113495bSYour Name 	if (wlan_dp_cfg_is_rx_fisa_enabled(&dp_intf->dp_ctx->dp_cfg) &&
1253*5113495bSYour Name 	    dp_intf->device_mode != QDF_MONITOR_MODE) {
1254*5113495bSYour Name 		dp_debug("FISA feature enabled");
1255*5113495bSYour Name 		dp_rx_register_fisa_ops(&txrx_ops);
1256*5113495bSYour Name 	}
1257*5113495bSYour Name 
1258*5113495bSYour Name 	txrx_ops.rx.stats_rx = dp_tx_rx_collect_connectivity_stats_info;
1259*5113495bSYour Name 
1260*5113495bSYour Name 	txrx_ops.tx.tx_comp = dp_sta_notify_tx_comp_cb;
1261*5113495bSYour Name 	txrx_ops.tx.tx = NULL;
1262*5113495bSYour Name 
1263*5113495bSYour Name 	txrx_ops.vdev_del_notify = wlan_dp_link_cdp_vdev_delete_notification;
1264*5113495bSYour Name 	cdp_vdev_register(soc, dp_link->link_id, (ol_osif_vdev_handle)dp_link,
1265*5113495bSYour Name 			  &txrx_ops);
1266*5113495bSYour Name 
1267*5113495bSYour Name 	if (!txrx_ops.tx.tx) {
1268*5113495bSYour Name 		dp_err("vdev register fail");
1269*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
1270*5113495bSYour Name 	}
1271*5113495bSYour Name 
1272*5113495bSYour Name 	dp_link->cdp_vdev_registered = 1;
1273*5113495bSYour Name 	dp_link->cdp_vdev_deleted = 0;
1274*5113495bSYour Name 	dp_link->destroyed = 0;
1275*5113495bSYour Name 	dp_intf->txrx_ops = txrx_ops;
1276*5113495bSYour Name 
1277*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1278*5113495bSYour Name }
1279*5113495bSYour Name #endif
1280*5113495bSYour Name 
ucfg_dp_ocb_register_txrx_ops(struct wlan_objmgr_vdev * vdev)1281*5113495bSYour Name QDF_STATUS ucfg_dp_ocb_register_txrx_ops(struct wlan_objmgr_vdev *vdev)
1282*5113495bSYour Name {
1283*5113495bSYour Name 	struct ol_txrx_ops txrx_ops;
1284*5113495bSYour Name 	void *soc = cds_get_context(QDF_MODULE_ID_SOC);
1285*5113495bSYour Name 	struct wlan_dp_intf *dp_intf;
1286*5113495bSYour Name 	struct wlan_dp_link *dp_link;
1287*5113495bSYour Name 
1288*5113495bSYour Name 	dp_link = dp_get_vdev_priv_obj(vdev);
1289*5113495bSYour Name 	if (unlikely(!dp_link)) {
1290*5113495bSYour Name 		dp_err("DP link not found");
1291*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
1292*5113495bSYour Name 	}
1293*5113495bSYour Name 
1294*5113495bSYour Name 	dp_intf = dp_link->dp_intf;
1295*5113495bSYour Name 	/* Register the vdev transmit and receive functions */
1296*5113495bSYour Name 	qdf_mem_zero(&txrx_ops, sizeof(txrx_ops));
1297*5113495bSYour Name 	txrx_ops.rx.rx = dp_rx_packet_cbk;
1298*5113495bSYour Name 	txrx_ops.rx.stats_rx = dp_tx_rx_collect_connectivity_stats_info;
1299*5113495bSYour Name 	txrx_ops.vdev_del_notify = wlan_dp_link_cdp_vdev_delete_notification;
1300*5113495bSYour Name 
1301*5113495bSYour Name 	cdp_vdev_register(soc, dp_link->link_id, (ol_osif_vdev_handle)dp_link,
1302*5113495bSYour Name 			  &txrx_ops);
1303*5113495bSYour Name 	if (!txrx_ops.tx.tx) {
1304*5113495bSYour Name 		dp_err("vdev register fail");
1305*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
1306*5113495bSYour Name 	}
1307*5113495bSYour Name 
1308*5113495bSYour Name 	dp_link->cdp_vdev_registered = 1;
1309*5113495bSYour Name 	dp_link->cdp_vdev_deleted = 0;
1310*5113495bSYour Name 	dp_link->destroyed = 0;
1311*5113495bSYour Name 	dp_intf->txrx_ops = txrx_ops;
1312*5113495bSYour Name 
1313*5113495bSYour Name 	qdf_copy_macaddr(&dp_link->conn_info.peer_macaddr,
1314*5113495bSYour Name 			 &dp_link->mac_addr);
1315*5113495bSYour Name 
1316*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1317*5113495bSYour Name }
1318*5113495bSYour Name 
1319*5113495bSYour Name #ifdef FEATURE_MONITOR_MODE_SUPPORT
ucfg_dp_mon_register_txrx_ops(struct wlan_objmgr_vdev * vdev)1320*5113495bSYour Name QDF_STATUS ucfg_dp_mon_register_txrx_ops(struct wlan_objmgr_vdev *vdev)
1321*5113495bSYour Name {
1322*5113495bSYour Name 	struct ol_txrx_ops txrx_ops;
1323*5113495bSYour Name 	void *soc = cds_get_context(QDF_MODULE_ID_SOC);
1324*5113495bSYour Name 	struct wlan_dp_intf *dp_intf;
1325*5113495bSYour Name 	struct wlan_dp_link *dp_link;
1326*5113495bSYour Name 
1327*5113495bSYour Name 	dp_link = dp_get_vdev_priv_obj(vdev);
1328*5113495bSYour Name 	if (unlikely(!dp_link)) {
1329*5113495bSYour Name 		dp_err("DP link not found");
1330*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
1331*5113495bSYour Name 	}
1332*5113495bSYour Name 
1333*5113495bSYour Name 	dp_intf = dp_link->dp_intf;
1334*5113495bSYour Name 	qdf_mem_zero(&txrx_ops, sizeof(txrx_ops));
1335*5113495bSYour Name 	txrx_ops.rx.rx = dp_mon_rx_packet_cbk;
1336*5113495bSYour Name 	dp_monitor_set_rx_monitor_cb(&txrx_ops, dp_rx_monitor_callback);
1337*5113495bSYour Name 	txrx_ops.vdev_del_notify = wlan_dp_link_cdp_vdev_delete_notification;
1338*5113495bSYour Name 	cdp_vdev_register(soc, dp_link->link_id,
1339*5113495bSYour Name 			  (ol_osif_vdev_handle)dp_link,
1340*5113495bSYour Name 			  &txrx_ops);
1341*5113495bSYour Name 
1342*5113495bSYour Name 	dp_link->cdp_vdev_registered = 1;
1343*5113495bSYour Name 	dp_link->cdp_vdev_deleted = 0;
1344*5113495bSYour Name 	dp_link->destroyed = 0;
1345*5113495bSYour Name 	dp_intf->txrx_ops = txrx_ops;
1346*5113495bSYour Name 
1347*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1348*5113495bSYour Name }
1349*5113495bSYour Name #endif
1350*5113495bSYour Name 
ucfg_dp_softap_register_txrx_ops(struct wlan_objmgr_vdev * vdev,struct ol_txrx_ops * txrx_ops)1351*5113495bSYour Name QDF_STATUS ucfg_dp_softap_register_txrx_ops(struct wlan_objmgr_vdev *vdev,
1352*5113495bSYour Name 					    struct ol_txrx_ops *txrx_ops)
1353*5113495bSYour Name {
1354*5113495bSYour Name 	void *soc = cds_get_context(QDF_MODULE_ID_SOC);
1355*5113495bSYour Name 	struct wlan_dp_intf *dp_intf;
1356*5113495bSYour Name 	struct wlan_dp_link *dp_link;
1357*5113495bSYour Name 
1358*5113495bSYour Name 	dp_link = dp_get_vdev_priv_obj(vdev);
1359*5113495bSYour Name 	if (unlikely(!dp_link)) {
1360*5113495bSYour Name 		dp_err("DP link not found");
1361*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
1362*5113495bSYour Name 	}
1363*5113495bSYour Name 
1364*5113495bSYour Name 	dp_intf = dp_link->dp_intf;
1365*5113495bSYour Name 
1366*5113495bSYour Name 	/* Register the vdev transmit and receive functions */
1367*5113495bSYour Name 	txrx_ops->tx.tx_comp = dp_softap_notify_tx_compl_cbk;
1368*5113495bSYour Name 
1369*5113495bSYour Name 	if (dp_intf->dp_ctx->enable_dp_rx_threads) {
1370*5113495bSYour Name 		txrx_ops->rx.rx = dp_rx_pkt_thread_enqueue_cbk;
1371*5113495bSYour Name 		txrx_ops->rx.rx_stack = dp_softap_rx_packet_cbk;
1372*5113495bSYour Name 		txrx_ops->rx.rx_flush = dp_rx_flush_packet_cbk;
1373*5113495bSYour Name 		txrx_ops->rx.rx_gro_flush = dp_rx_thread_gro_flush_ind_cbk;
1374*5113495bSYour Name 	} else {
1375*5113495bSYour Name 		txrx_ops->rx.rx = dp_softap_rx_packet_cbk;
1376*5113495bSYour Name 		txrx_ops->rx.rx_stack = NULL;
1377*5113495bSYour Name 		txrx_ops->rx.rx_flush = NULL;
1378*5113495bSYour Name 	}
1379*5113495bSYour Name 
1380*5113495bSYour Name 	txrx_ops->get_tsf_time = wlan_dp_get_tsf_time;
1381*5113495bSYour Name 	txrx_ops->vdev_del_notify = wlan_dp_link_cdp_vdev_delete_notification;
1382*5113495bSYour Name 	cdp_vdev_register(soc,
1383*5113495bSYour Name 			  dp_link->link_id,
1384*5113495bSYour Name 			  (ol_osif_vdev_handle)dp_link,
1385*5113495bSYour Name 			  txrx_ops);
1386*5113495bSYour Name 	if (!txrx_ops->tx.tx) {
1387*5113495bSYour Name 		dp_err("vdev register fail");
1388*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
1389*5113495bSYour Name 	}
1390*5113495bSYour Name 
1391*5113495bSYour Name 	dp_link->cdp_vdev_registered = 1;
1392*5113495bSYour Name 	dp_link->cdp_vdev_deleted = 0;
1393*5113495bSYour Name 	dp_link->destroyed = 0;
1394*5113495bSYour Name 	dp_intf->txrx_ops = *txrx_ops;
1395*5113495bSYour Name 	dp_intf->sap_tx_block_mask &= ~DP_TX_FN_CLR;
1396*5113495bSYour Name 
1397*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1398*5113495bSYour Name }
1399*5113495bSYour Name 
ucfg_dp_register_pkt_capture_callbacks(struct wlan_objmgr_vdev * vdev)1400*5113495bSYour Name QDF_STATUS ucfg_dp_register_pkt_capture_callbacks(struct wlan_objmgr_vdev *vdev)
1401*5113495bSYour Name {
1402*5113495bSYour Name 	struct wlan_dp_intf *dp_intf;
1403*5113495bSYour Name 	struct wlan_dp_link *dp_link;
1404*5113495bSYour Name 
1405*5113495bSYour Name 	dp_link = dp_get_vdev_priv_obj(vdev);
1406*5113495bSYour Name 	if (unlikely(!dp_link)) {
1407*5113495bSYour Name 		dp_err("DP link not found");
1408*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
1409*5113495bSYour Name 	}
1410*5113495bSYour Name 
1411*5113495bSYour Name 	dp_intf = dp_link->dp_intf;
1412*5113495bSYour Name 	return wlan_pkt_capture_register_callbacks(vdev,
1413*5113495bSYour Name 						   dp_mon_rx_packet_cbk,
1414*5113495bSYour Name 						   dp_intf);
1415*5113495bSYour Name }
1416*5113495bSYour Name 
ucfg_dp_start_xmit(qdf_nbuf_t nbuf,struct wlan_objmgr_vdev * vdev)1417*5113495bSYour Name QDF_STATUS ucfg_dp_start_xmit(qdf_nbuf_t nbuf, struct wlan_objmgr_vdev *vdev)
1418*5113495bSYour Name {
1419*5113495bSYour Name 	struct wlan_dp_intf *dp_intf;
1420*5113495bSYour Name 	struct wlan_dp_link *dp_link, *tx_dp_link;
1421*5113495bSYour Name 	QDF_STATUS status;
1422*5113495bSYour Name 
1423*5113495bSYour Name 	dp_link = dp_get_vdev_priv_obj(vdev);
1424*5113495bSYour Name 	if (unlikely(!dp_link)) {
1425*5113495bSYour Name 		dp_err_rl("DP link not found");
1426*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
1427*5113495bSYour Name 	}
1428*5113495bSYour Name 
1429*5113495bSYour Name 	dp_intf = dp_link->dp_intf;
1430*5113495bSYour Name 
1431*5113495bSYour Name 	/*
1432*5113495bSYour Name 	 * UMAC may queue TX on any vdev of the interface, but it may not be
1433*5113495bSYour Name 	 * in sync with the def_link for DP, hence ignore the vdev from
1434*5113495bSYour Name 	 * UMAC and select the tx_dp_link in DP.
1435*5113495bSYour Name 	 *
1436*5113495bSYour Name 	 * Since one link is already present in the dp_intf and validated above,
1437*5113495bSYour Name 	 * the def_link is not expected to be NULL. Hence there is no need
1438*5113495bSYour Name 	 * to validate tx_dp_link again.
1439*5113495bSYour Name 	 */
1440*5113495bSYour Name 	tx_dp_link = dp_intf->def_link;
1441*5113495bSYour Name 	qdf_atomic_inc(&dp_intf->num_active_task);
1442*5113495bSYour Name 	status = dp_start_xmit(tx_dp_link, nbuf);
1443*5113495bSYour Name 	qdf_atomic_dec(&dp_intf->num_active_task);
1444*5113495bSYour Name 
1445*5113495bSYour Name 	return status;
1446*5113495bSYour Name }
1447*5113495bSYour Name 
ucfg_dp_rx_packet_cbk(struct wlan_objmgr_vdev * vdev,qdf_nbuf_t nbuf)1448*5113495bSYour Name QDF_STATUS ucfg_dp_rx_packet_cbk(struct wlan_objmgr_vdev *vdev, qdf_nbuf_t nbuf)
1449*5113495bSYour Name {
1450*5113495bSYour Name 	struct wlan_dp_intf *dp_intf;
1451*5113495bSYour Name 	struct wlan_dp_link *dp_link;
1452*5113495bSYour Name 
1453*5113495bSYour Name 	dp_link = dp_get_vdev_priv_obj(vdev);
1454*5113495bSYour Name 	if (unlikely(!dp_link)) {
1455*5113495bSYour Name 		dp_err_rl("DP link not found");
1456*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
1457*5113495bSYour Name 	}
1458*5113495bSYour Name 
1459*5113495bSYour Name 	dp_intf = dp_link->dp_intf;
1460*5113495bSYour Name 	return dp_rx_packet_cbk(dp_link, nbuf);
1461*5113495bSYour Name }
1462*5113495bSYour Name 
ucfg_dp_tx_timeout(struct wlan_objmgr_vdev * vdev)1463*5113495bSYour Name void ucfg_dp_tx_timeout(struct wlan_objmgr_vdev *vdev)
1464*5113495bSYour Name {
1465*5113495bSYour Name 	struct wlan_dp_intf *dp_intf;
1466*5113495bSYour Name 	struct wlan_dp_link *dp_link;
1467*5113495bSYour Name 
1468*5113495bSYour Name 	dp_link = dp_get_vdev_priv_obj(vdev);
1469*5113495bSYour Name 	if (unlikely(!dp_link)) {
1470*5113495bSYour Name 		dp_err_rl("DP link not found");
1471*5113495bSYour Name 		return;
1472*5113495bSYour Name 	}
1473*5113495bSYour Name 
1474*5113495bSYour Name 	dp_intf = dp_link->dp_intf;
1475*5113495bSYour Name 	dp_tx_timeout(dp_intf);
1476*5113495bSYour Name }
1477*5113495bSYour Name 
1478*5113495bSYour Name QDF_STATUS
ucfg_dp_softap_start_xmit(qdf_nbuf_t nbuf,struct wlan_objmgr_vdev * vdev)1479*5113495bSYour Name ucfg_dp_softap_start_xmit(qdf_nbuf_t nbuf, struct wlan_objmgr_vdev *vdev)
1480*5113495bSYour Name {
1481*5113495bSYour Name 	struct wlan_dp_intf *dp_intf;
1482*5113495bSYour Name 	struct wlan_dp_link *dp_link;
1483*5113495bSYour Name 	QDF_STATUS status;
1484*5113495bSYour Name 
1485*5113495bSYour Name 	dp_link = dp_get_vdev_priv_obj(vdev);
1486*5113495bSYour Name 	if (unlikely(!dp_link)) {
1487*5113495bSYour Name 		dp_err_rl("DP link not found");
1488*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
1489*5113495bSYour Name 	}
1490*5113495bSYour Name 
1491*5113495bSYour Name 	dp_intf = dp_link->dp_intf;
1492*5113495bSYour Name 	qdf_atomic_inc(&dp_intf->num_active_task);
1493*5113495bSYour Name 	status = dp_softap_start_xmit(nbuf, dp_link);
1494*5113495bSYour Name 	qdf_atomic_dec(&dp_intf->num_active_task);
1495*5113495bSYour Name 
1496*5113495bSYour Name 	return status;
1497*5113495bSYour Name }
1498*5113495bSYour Name 
ucfg_dp_softap_tx_timeout(struct wlan_objmgr_vdev * vdev)1499*5113495bSYour Name void ucfg_dp_softap_tx_timeout(struct wlan_objmgr_vdev *vdev)
1500*5113495bSYour Name {
1501*5113495bSYour Name 	struct wlan_dp_intf *dp_intf;
1502*5113495bSYour Name 	struct wlan_dp_link *dp_link;
1503*5113495bSYour Name 
1504*5113495bSYour Name 	dp_link = dp_get_vdev_priv_obj(vdev);
1505*5113495bSYour Name 	if (unlikely(!dp_link)) {
1506*5113495bSYour Name 		dp_err_rl("DP link not found");
1507*5113495bSYour Name 		return;
1508*5113495bSYour Name 	}
1509*5113495bSYour Name 
1510*5113495bSYour Name 	dp_intf = dp_link->dp_intf;
1511*5113495bSYour Name 	dp_softap_tx_timeout(dp_intf);
1512*5113495bSYour Name }
1513*5113495bSYour Name 
ucfg_dp_get_dev_stats(qdf_netdev_t dev)1514*5113495bSYour Name qdf_net_dev_stats *ucfg_dp_get_dev_stats(qdf_netdev_t dev)
1515*5113495bSYour Name {
1516*5113495bSYour Name 	struct wlan_dp_intf *dp_intf;
1517*5113495bSYour Name 	struct wlan_dp_psoc_context *dp_ctx;
1518*5113495bSYour Name 
1519*5113495bSYour Name 	dp_ctx =  dp_get_context();
1520*5113495bSYour Name 
1521*5113495bSYour Name 	dp_intf = dp_get_intf_by_netdev(dp_ctx, dev);
1522*5113495bSYour Name 	if (!dp_intf) {
1523*5113495bSYour Name 		dp_err("DP interface not found dev: %s",
1524*5113495bSYour Name 		       qdf_netdev_get_devname(dev));
1525*5113495bSYour Name 		QDF_BUG(0);
1526*5113495bSYour Name 		return NULL;
1527*5113495bSYour Name 	}
1528*5113495bSYour Name 
1529*5113495bSYour Name 	return &dp_intf->stats;
1530*5113495bSYour Name }
1531*5113495bSYour Name 
ucfg_dp_inc_rx_pkt_stats(struct wlan_objmgr_vdev * vdev,uint32_t pkt_len,bool delivered)1532*5113495bSYour Name void ucfg_dp_inc_rx_pkt_stats(struct wlan_objmgr_vdev *vdev,
1533*5113495bSYour Name 			      uint32_t pkt_len,
1534*5113495bSYour Name 			      bool delivered)
1535*5113495bSYour Name {
1536*5113495bSYour Name 	struct wlan_dp_intf *dp_intf;
1537*5113495bSYour Name 	struct wlan_dp_link *dp_link;
1538*5113495bSYour Name 	struct dp_tx_rx_stats *stats;
1539*5113495bSYour Name 	unsigned int cpu_index;
1540*5113495bSYour Name 
1541*5113495bSYour Name 	dp_link = dp_get_vdev_priv_obj(vdev);
1542*5113495bSYour Name 	if (unlikely(!dp_link)) {
1543*5113495bSYour Name 		dp_err_rl("DP link not found");
1544*5113495bSYour Name 		return;
1545*5113495bSYour Name 	}
1546*5113495bSYour Name 
1547*5113495bSYour Name 	dp_intf = dp_link->dp_intf;
1548*5113495bSYour Name 	cpu_index = qdf_get_cpu();
1549*5113495bSYour Name 	stats = &dp_intf->dp_stats.tx_rx_stats;
1550*5113495bSYour Name 
1551*5113495bSYour Name 	++stats->per_cpu[cpu_index].rx_packets;
1552*5113495bSYour Name 	qdf_net_stats_add_rx_pkts(&dp_intf->stats, 1);
1553*5113495bSYour Name 	qdf_net_stats_add_rx_bytes(&dp_intf->stats, pkt_len);
1554*5113495bSYour Name 
1555*5113495bSYour Name 	if (delivered)
1556*5113495bSYour Name 		++stats->per_cpu[cpu_index].rx_delivered;
1557*5113495bSYour Name 	else
1558*5113495bSYour Name 		++stats->per_cpu[cpu_index].rx_refused;
1559*5113495bSYour Name }
1560*5113495bSYour Name 
ucfg_dp_register_rx_mic_error_ind_handler(void * soc)1561*5113495bSYour Name void ucfg_dp_register_rx_mic_error_ind_handler(void *soc)
1562*5113495bSYour Name {
1563*5113495bSYour Name 	cdp_register_rx_mic_error_ind_handler(soc, dp_rx_mic_error_ind);
1564*5113495bSYour Name }
1565*5113495bSYour Name 
1566*5113495bSYour Name #ifdef WLAN_NUD_TRACKING
1567*5113495bSYour Name bool
ucfg_dp_is_roam_after_nud_enabled(struct wlan_objmgr_psoc * psoc)1568*5113495bSYour Name ucfg_dp_is_roam_after_nud_enabled(struct wlan_objmgr_psoc *psoc)
1569*5113495bSYour Name {
1570*5113495bSYour Name 	struct wlan_dp_psoc_context *dp_ctx;
1571*5113495bSYour Name 	struct wlan_dp_psoc_cfg *dp_cfg;
1572*5113495bSYour Name 
1573*5113495bSYour Name 	dp_ctx = dp_psoc_get_priv(psoc);
1574*5113495bSYour Name 	if (!dp_ctx) {
1575*5113495bSYour Name 		dp_err("Unable to get DP context");
1576*5113495bSYour Name 		return false;
1577*5113495bSYour Name 	}
1578*5113495bSYour Name 
1579*5113495bSYour Name 	dp_cfg = &dp_ctx->dp_cfg;
1580*5113495bSYour Name 	if (!dp_cfg) {
1581*5113495bSYour Name 		dp_err("Unable to get DP config");
1582*5113495bSYour Name 		return false;
1583*5113495bSYour Name 	}
1584*5113495bSYour Name 
1585*5113495bSYour Name 	if (dp_cfg->enable_nud_tracking == DP_ROAM_AFTER_NUD_FAIL ||
1586*5113495bSYour Name 	    dp_cfg->enable_nud_tracking == DP_DISCONNECT_AFTER_ROAM_FAIL)
1587*5113495bSYour Name 		return true;
1588*5113495bSYour Name 
1589*5113495bSYour Name 	return false;
1590*5113495bSYour Name }
1591*5113495bSYour Name 
1592*5113495bSYour Name bool
ucfg_dp_is_disconect_after_roam_fail(struct wlan_objmgr_psoc * psoc)1593*5113495bSYour Name ucfg_dp_is_disconect_after_roam_fail(struct wlan_objmgr_psoc *psoc)
1594*5113495bSYour Name {
1595*5113495bSYour Name 	struct wlan_dp_psoc_context *dp_ctx;
1596*5113495bSYour Name 	struct wlan_dp_psoc_cfg *dp_cfg;
1597*5113495bSYour Name 
1598*5113495bSYour Name 	dp_ctx = dp_psoc_get_priv(psoc);
1599*5113495bSYour Name 	if (!dp_ctx) {
1600*5113495bSYour Name 		dp_err("Unable to get DP context");
1601*5113495bSYour Name 		return false;
1602*5113495bSYour Name 	}
1603*5113495bSYour Name 
1604*5113495bSYour Name 	dp_cfg = &dp_ctx->dp_cfg;
1605*5113495bSYour Name 	if (!dp_cfg) {
1606*5113495bSYour Name 		dp_err("Unable to get DP config");
1607*5113495bSYour Name 		return false;
1608*5113495bSYour Name 	}
1609*5113495bSYour Name 
1610*5113495bSYour Name 	if (dp_cfg->enable_nud_tracking == DP_DISCONNECT_AFTER_ROAM_FAIL)
1611*5113495bSYour Name 		return true;
1612*5113495bSYour Name 
1613*5113495bSYour Name 	return false;
1614*5113495bSYour Name }
1615*5113495bSYour Name #endif
1616*5113495bSYour Name 
ucfg_dp_bbm_context_init(struct wlan_objmgr_psoc * psoc)1617*5113495bSYour Name int ucfg_dp_bbm_context_init(struct wlan_objmgr_psoc *psoc)
1618*5113495bSYour Name {
1619*5113495bSYour Name 	return dp_bbm_context_init(psoc);
1620*5113495bSYour Name }
1621*5113495bSYour Name 
ucfg_dp_bbm_context_deinit(struct wlan_objmgr_psoc * psoc)1622*5113495bSYour Name void ucfg_dp_bbm_context_deinit(struct wlan_objmgr_psoc *psoc)
1623*5113495bSYour Name {
1624*5113495bSYour Name 	dp_bbm_context_deinit(psoc);
1625*5113495bSYour Name }
1626*5113495bSYour Name 
ucfg_dp_bbm_apply_independent_policy(struct wlan_objmgr_psoc * psoc,struct bbm_params * params)1627*5113495bSYour Name void ucfg_dp_bbm_apply_independent_policy(struct wlan_objmgr_psoc *psoc,
1628*5113495bSYour Name 					  struct bbm_params *params)
1629*5113495bSYour Name {
1630*5113495bSYour Name 	dp_bbm_apply_independent_policy(psoc, params);
1631*5113495bSYour Name }
1632*5113495bSYour Name 
ucfg_dp_set_rx_mode_rps(bool enable)1633*5113495bSYour Name void ucfg_dp_set_rx_mode_rps(bool enable)
1634*5113495bSYour Name {
1635*5113495bSYour Name 	dp_set_rx_mode_rps(enable);
1636*5113495bSYour Name }
1637*5113495bSYour Name 
ucfg_dp_periodic_sta_stats_start(struct wlan_objmgr_vdev * vdev)1638*5113495bSYour Name void ucfg_dp_periodic_sta_stats_start(struct wlan_objmgr_vdev *vdev)
1639*5113495bSYour Name {
1640*5113495bSYour Name 	dp_periodic_sta_stats_start(vdev);
1641*5113495bSYour Name }
1642*5113495bSYour Name 
ucfg_dp_periodic_sta_stats_stop(struct wlan_objmgr_vdev * vdev)1643*5113495bSYour Name void ucfg_dp_periodic_sta_stats_stop(struct wlan_objmgr_vdev *vdev)
1644*5113495bSYour Name {
1645*5113495bSYour Name 	dp_periodic_sta_stats_stop(vdev);
1646*5113495bSYour Name }
1647*5113495bSYour Name 
ucfg_dp_try_send_rps_ind(struct wlan_objmgr_vdev * vdev)1648*5113495bSYour Name void ucfg_dp_try_send_rps_ind(struct wlan_objmgr_vdev *vdev)
1649*5113495bSYour Name {
1650*5113495bSYour Name 	dp_try_send_rps_ind(vdev);
1651*5113495bSYour Name }
1652*5113495bSYour Name 
ucfg_dp_reg_ipa_rsp_ind(struct wlan_objmgr_pdev * pdev)1653*5113495bSYour Name void ucfg_dp_reg_ipa_rsp_ind(struct wlan_objmgr_pdev *pdev)
1654*5113495bSYour Name {
1655*5113495bSYour Name 	ucfg_ipa_reg_rps_enable_cb(pdev, dp_set_rps);
1656*5113495bSYour Name }
1657*5113495bSYour Name 
ucfg_dp_try_set_rps_cpu_mask(struct wlan_objmgr_psoc * psoc)1658*5113495bSYour Name void ucfg_dp_try_set_rps_cpu_mask(struct wlan_objmgr_psoc *psoc)
1659*5113495bSYour Name {
1660*5113495bSYour Name 	dp_try_set_rps_cpu_mask(psoc);
1661*5113495bSYour Name }
1662*5113495bSYour Name 
ucfg_dp_add_latency_critical_client(struct wlan_objmgr_vdev * vdev,enum qca_wlan_802_11_mode phymode)1663*5113495bSYour Name void ucfg_dp_add_latency_critical_client(struct wlan_objmgr_vdev *vdev,
1664*5113495bSYour Name 					 enum qca_wlan_802_11_mode phymode)
1665*5113495bSYour Name {
1666*5113495bSYour Name 	dp_add_latency_critical_client(vdev, phymode);
1667*5113495bSYour Name }
1668*5113495bSYour Name 
ucfg_dp_del_latency_critical_client(struct wlan_objmgr_vdev * vdev,enum qca_wlan_802_11_mode phymode)1669*5113495bSYour Name void ucfg_dp_del_latency_critical_client(struct wlan_objmgr_vdev *vdev,
1670*5113495bSYour Name 					 enum qca_wlan_802_11_mode phymode)
1671*5113495bSYour Name {
1672*5113495bSYour Name 	dp_del_latency_critical_client(vdev, phymode);
1673*5113495bSYour Name }
1674*5113495bSYour Name 
ucfg_dp_reset_tcp_delack(struct wlan_objmgr_psoc * psoc)1675*5113495bSYour Name void ucfg_dp_reset_tcp_delack(struct wlan_objmgr_psoc *psoc)
1676*5113495bSYour Name {
1677*5113495bSYour Name 	dp_reset_tcp_delack(psoc);
1678*5113495bSYour Name }
1679*5113495bSYour Name 
1680*5113495bSYour Name void
ucfg_dp_set_current_throughput_level(struct wlan_objmgr_psoc * psoc,enum pld_bus_width_type next_vote_level)1681*5113495bSYour Name ucfg_dp_set_current_throughput_level(struct wlan_objmgr_psoc *psoc,
1682*5113495bSYour Name 				     enum pld_bus_width_type next_vote_level)
1683*5113495bSYour Name {
1684*5113495bSYour Name 	dp_set_current_throughput_level(psoc, next_vote_level);
1685*5113495bSYour Name }
1686*5113495bSYour Name 
1687*5113495bSYour Name void
ucfg_dp_set_high_bus_bw_request(struct wlan_objmgr_psoc * psoc,uint8_t vdev_id,bool high_bus_bw)1688*5113495bSYour Name ucfg_dp_set_high_bus_bw_request(struct wlan_objmgr_psoc *psoc,
1689*5113495bSYour Name 				uint8_t vdev_id,
1690*5113495bSYour Name 				bool high_bus_bw)
1691*5113495bSYour Name {
1692*5113495bSYour Name 	dp_set_high_bus_bw_request(psoc, vdev_id, high_bus_bw);
1693*5113495bSYour Name }
1694*5113495bSYour Name 
ucfg_wlan_dp_display_tx_rx_histogram(struct wlan_objmgr_psoc * psoc)1695*5113495bSYour Name void ucfg_wlan_dp_display_tx_rx_histogram(struct wlan_objmgr_psoc *psoc)
1696*5113495bSYour Name {
1697*5113495bSYour Name 	wlan_dp_display_tx_rx_histogram(psoc);
1698*5113495bSYour Name }
1699*5113495bSYour Name 
ucfg_wlan_dp_clear_tx_rx_histogram(struct wlan_objmgr_psoc * psoc)1700*5113495bSYour Name void ucfg_wlan_dp_clear_tx_rx_histogram(struct wlan_objmgr_psoc *psoc)
1701*5113495bSYour Name {
1702*5113495bSYour Name 	wlan_dp_clear_tx_rx_histogram(psoc);
1703*5113495bSYour Name }
1704*5113495bSYour Name 
ucfg_dp_bus_bw_compute_timer_start(struct wlan_objmgr_psoc * psoc)1705*5113495bSYour Name void ucfg_dp_bus_bw_compute_timer_start(struct wlan_objmgr_psoc *psoc)
1706*5113495bSYour Name {
1707*5113495bSYour Name 	dp_bus_bw_compute_timer_start(psoc);
1708*5113495bSYour Name }
1709*5113495bSYour Name 
ucfg_dp_bus_bw_compute_timer_try_start(struct wlan_objmgr_psoc * psoc)1710*5113495bSYour Name void ucfg_dp_bus_bw_compute_timer_try_start(struct wlan_objmgr_psoc *psoc)
1711*5113495bSYour Name {
1712*5113495bSYour Name 	dp_bus_bw_compute_timer_try_start(psoc);
1713*5113495bSYour Name }
1714*5113495bSYour Name 
ucfg_dp_bus_bw_compute_timer_stop(struct wlan_objmgr_psoc * psoc)1715*5113495bSYour Name void ucfg_dp_bus_bw_compute_timer_stop(struct wlan_objmgr_psoc *psoc)
1716*5113495bSYour Name {
1717*5113495bSYour Name 	dp_bus_bw_compute_timer_stop(psoc);
1718*5113495bSYour Name }
1719*5113495bSYour Name 
ucfg_dp_bus_bw_compute_timer_try_stop(struct wlan_objmgr_psoc * psoc)1720*5113495bSYour Name void ucfg_dp_bus_bw_compute_timer_try_stop(struct wlan_objmgr_psoc *psoc)
1721*5113495bSYour Name {
1722*5113495bSYour Name 	dp_bus_bw_compute_timer_try_stop(psoc);
1723*5113495bSYour Name }
1724*5113495bSYour Name 
ucfg_dp_bus_bw_compute_prev_txrx_stats(struct wlan_objmgr_vdev * vdev)1725*5113495bSYour Name void ucfg_dp_bus_bw_compute_prev_txrx_stats(struct wlan_objmgr_vdev *vdev)
1726*5113495bSYour Name {
1727*5113495bSYour Name 	dp_bus_bw_compute_prev_txrx_stats(vdev);
1728*5113495bSYour Name }
1729*5113495bSYour Name 
1730*5113495bSYour Name void
ucfg_dp_bus_bw_compute_reset_prev_txrx_stats(struct wlan_objmgr_vdev * vdev)1731*5113495bSYour Name ucfg_dp_bus_bw_compute_reset_prev_txrx_stats(struct wlan_objmgr_vdev *vdev)
1732*5113495bSYour Name {
1733*5113495bSYour Name 	dp_bus_bw_compute_reset_prev_txrx_stats(vdev);
1734*5113495bSYour Name }
1735*5113495bSYour Name 
ucfg_dp_nud_set_gateway_addr(struct wlan_objmgr_vdev * vdev,struct qdf_mac_addr gw_mac_addr)1736*5113495bSYour Name void ucfg_dp_nud_set_gateway_addr(struct wlan_objmgr_vdev *vdev,
1737*5113495bSYour Name 				  struct qdf_mac_addr gw_mac_addr)
1738*5113495bSYour Name {
1739*5113495bSYour Name 	dp_nud_set_gateway_addr(vdev, gw_mac_addr);
1740*5113495bSYour Name }
1741*5113495bSYour Name 
ucfg_dp_nud_event(struct qdf_mac_addr * netdev_mac_addr,struct qdf_mac_addr * gw_mac_addr,uint8_t nud_state)1742*5113495bSYour Name void ucfg_dp_nud_event(struct qdf_mac_addr *netdev_mac_addr,
1743*5113495bSYour Name 		       struct qdf_mac_addr *gw_mac_addr,
1744*5113495bSYour Name 		       uint8_t nud_state)
1745*5113495bSYour Name {
1746*5113495bSYour Name 	dp_nud_netevent_cb(netdev_mac_addr, gw_mac_addr, nud_state);
1747*5113495bSYour Name }
1748*5113495bSYour Name 
ucfg_dp_get_arp_stats_event_handler(struct wlan_objmgr_psoc * psoc,struct dp_rsp_stats * rsp)1749*5113495bSYour Name QDF_STATUS ucfg_dp_get_arp_stats_event_handler(struct wlan_objmgr_psoc *psoc,
1750*5113495bSYour Name 					       struct dp_rsp_stats *rsp)
1751*5113495bSYour Name {
1752*5113495bSYour Name 	return dp_get_arp_stats_event_handler(psoc, rsp);
1753*5113495bSYour Name }
1754*5113495bSYour Name 
ucfg_dp_get_arp_request_ctx(struct wlan_objmgr_psoc * psoc)1755*5113495bSYour Name void *ucfg_dp_get_arp_request_ctx(struct wlan_objmgr_psoc *psoc)
1756*5113495bSYour Name {
1757*5113495bSYour Name 	return dp_get_arp_request_ctx(psoc);
1758*5113495bSYour Name }
1759*5113495bSYour Name 
ucfg_dp_nud_reset_tracking(struct wlan_objmgr_vdev * vdev)1760*5113495bSYour Name void ucfg_dp_nud_reset_tracking(struct wlan_objmgr_vdev *vdev)
1761*5113495bSYour Name {
1762*5113495bSYour Name 	struct wlan_dp_link *dp_link = dp_get_vdev_priv_obj(vdev);
1763*5113495bSYour Name 	struct wlan_dp_intf *dp_intf;
1764*5113495bSYour Name 
1765*5113495bSYour Name 	if (!dp_link) {
1766*5113495bSYour Name 		dp_err("Unable to get DP link");
1767*5113495bSYour Name 		return;
1768*5113495bSYour Name 	}
1769*5113495bSYour Name 
1770*5113495bSYour Name 	dp_intf = dp_link->dp_intf;
1771*5113495bSYour Name 	dp_nud_reset_tracking(dp_intf);
1772*5113495bSYour Name }
1773*5113495bSYour Name 
ucfg_dp_nud_tracking_enabled(struct wlan_objmgr_psoc * psoc)1774*5113495bSYour Name uint8_t ucfg_dp_nud_tracking_enabled(struct wlan_objmgr_psoc *psoc)
1775*5113495bSYour Name {
1776*5113495bSYour Name 	struct wlan_dp_psoc_context *dp_ctx = dp_psoc_get_priv(psoc);
1777*5113495bSYour Name 
1778*5113495bSYour Name 	if (!dp_ctx) {
1779*5113495bSYour Name 		dp_err("DP Context is NULL");
1780*5113495bSYour Name 		return 0;
1781*5113495bSYour Name 	}
1782*5113495bSYour Name 	return dp_ctx->dp_cfg.enable_nud_tracking;
1783*5113495bSYour Name }
1784*5113495bSYour Name 
ucfg_dp_nud_indicate_roam(struct wlan_objmgr_vdev * vdev)1785*5113495bSYour Name void ucfg_dp_nud_indicate_roam(struct wlan_objmgr_vdev *vdev)
1786*5113495bSYour Name {
1787*5113495bSYour Name 	dp_nud_indicate_roam(vdev);
1788*5113495bSYour Name }
1789*5113495bSYour Name 
ucfg_dp_clear_arp_stats(struct wlan_objmgr_vdev * vdev)1790*5113495bSYour Name void ucfg_dp_clear_arp_stats(struct wlan_objmgr_vdev *vdev)
1791*5113495bSYour Name {
1792*5113495bSYour Name 	struct wlan_dp_link *dp_link = dp_get_vdev_priv_obj(vdev);
1793*5113495bSYour Name 	struct wlan_dp_intf *dp_intf;
1794*5113495bSYour Name 
1795*5113495bSYour Name 	if (!dp_link) {
1796*5113495bSYour Name 		dp_err("Unable to get DP link");
1797*5113495bSYour Name 		return;
1798*5113495bSYour Name 	}
1799*5113495bSYour Name 
1800*5113495bSYour Name 	dp_intf = dp_link->dp_intf;
1801*5113495bSYour Name 	qdf_mem_zero(&dp_intf->dp_stats.arp_stats,
1802*5113495bSYour Name 		     sizeof(dp_intf->dp_stats.arp_stats));
1803*5113495bSYour Name }
1804*5113495bSYour Name 
ucfg_dp_clear_dns_stats(struct wlan_objmgr_vdev * vdev)1805*5113495bSYour Name void ucfg_dp_clear_dns_stats(struct wlan_objmgr_vdev *vdev)
1806*5113495bSYour Name {
1807*5113495bSYour Name 	struct wlan_dp_link *dp_link = dp_get_vdev_priv_obj(vdev);
1808*5113495bSYour Name 	struct wlan_dp_intf *dp_intf;
1809*5113495bSYour Name 
1810*5113495bSYour Name 	if (!dp_link) {
1811*5113495bSYour Name 		dp_err("Unable to get DP link");
1812*5113495bSYour Name 		return;
1813*5113495bSYour Name 	}
1814*5113495bSYour Name 
1815*5113495bSYour Name 	dp_intf = dp_link->dp_intf;
1816*5113495bSYour Name 	qdf_mem_zero(&dp_intf->dp_stats.dns_stats,
1817*5113495bSYour Name 		     sizeof(dp_intf->dp_stats.dns_stats));
1818*5113495bSYour Name }
1819*5113495bSYour Name 
ucfg_dp_clear_tcp_stats(struct wlan_objmgr_vdev * vdev)1820*5113495bSYour Name void ucfg_dp_clear_tcp_stats(struct wlan_objmgr_vdev *vdev)
1821*5113495bSYour Name {
1822*5113495bSYour Name 	struct wlan_dp_link *dp_link = dp_get_vdev_priv_obj(vdev);
1823*5113495bSYour Name 	struct wlan_dp_intf *dp_intf;
1824*5113495bSYour Name 
1825*5113495bSYour Name 	if (!dp_link) {
1826*5113495bSYour Name 		dp_err("Unable to get DP link");
1827*5113495bSYour Name 		return;
1828*5113495bSYour Name 	}
1829*5113495bSYour Name 
1830*5113495bSYour Name 	dp_intf = dp_link->dp_intf;
1831*5113495bSYour Name 	qdf_mem_zero(&dp_intf->dp_stats.tcp_stats,
1832*5113495bSYour Name 		     sizeof(dp_intf->dp_stats.tcp_stats));
1833*5113495bSYour Name }
1834*5113495bSYour Name 
ucfg_dp_clear_icmpv4_stats(struct wlan_objmgr_vdev * vdev)1835*5113495bSYour Name void ucfg_dp_clear_icmpv4_stats(struct wlan_objmgr_vdev *vdev)
1836*5113495bSYour Name {
1837*5113495bSYour Name 	struct wlan_dp_link *dp_link = dp_get_vdev_priv_obj(vdev);
1838*5113495bSYour Name 	struct wlan_dp_intf *dp_intf;
1839*5113495bSYour Name 
1840*5113495bSYour Name 	if (!dp_link) {
1841*5113495bSYour Name 		dp_err("Unable to get DP link");
1842*5113495bSYour Name 		return;
1843*5113495bSYour Name 	}
1844*5113495bSYour Name 
1845*5113495bSYour Name 	dp_intf = dp_link->dp_intf;
1846*5113495bSYour Name 	qdf_mem_zero(&dp_intf->dp_stats.icmpv4_stats,
1847*5113495bSYour Name 		     sizeof(dp_intf->dp_stats.icmpv4_stats));
1848*5113495bSYour Name }
1849*5113495bSYour Name 
ucfg_dp_clear_dns_payload_value(struct wlan_objmgr_vdev * vdev)1850*5113495bSYour Name void ucfg_dp_clear_dns_payload_value(struct wlan_objmgr_vdev *vdev)
1851*5113495bSYour Name {
1852*5113495bSYour Name 	struct wlan_dp_link *dp_link = dp_get_vdev_priv_obj(vdev);
1853*5113495bSYour Name 	struct wlan_dp_intf *dp_intf;
1854*5113495bSYour Name 
1855*5113495bSYour Name 	if (!dp_link) {
1856*5113495bSYour Name 		dp_err("Unable to get DP link");
1857*5113495bSYour Name 		return;
1858*5113495bSYour Name 	}
1859*5113495bSYour Name 
1860*5113495bSYour Name 	dp_intf = dp_link->dp_intf;
1861*5113495bSYour Name 	qdf_mem_zero(dp_intf->dns_payload, dp_intf->track_dns_domain_len);
1862*5113495bSYour Name }
1863*5113495bSYour Name 
ucfg_dp_set_pkt_type_bitmap_value(struct wlan_objmgr_vdev * vdev,uint32_t value)1864*5113495bSYour Name void ucfg_dp_set_pkt_type_bitmap_value(struct wlan_objmgr_vdev *vdev,
1865*5113495bSYour Name 				       uint32_t value)
1866*5113495bSYour Name {
1867*5113495bSYour Name 	struct wlan_dp_link *dp_link = dp_get_vdev_priv_obj(vdev);
1868*5113495bSYour Name 	struct wlan_dp_intf *dp_intf;
1869*5113495bSYour Name 
1870*5113495bSYour Name 	if (!dp_link) {
1871*5113495bSYour Name 		dp_err("Unable to get DP link");
1872*5113495bSYour Name 		return;
1873*5113495bSYour Name 	}
1874*5113495bSYour Name 
1875*5113495bSYour Name 	dp_intf = dp_link->dp_intf;
1876*5113495bSYour Name 	dp_intf->pkt_type_bitmap = value;
1877*5113495bSYour Name }
1878*5113495bSYour Name 
ucfg_dp_intf_get_pkt_type_bitmap_value(void * intf_ctx)1879*5113495bSYour Name uint32_t ucfg_dp_intf_get_pkt_type_bitmap_value(void *intf_ctx)
1880*5113495bSYour Name {
1881*5113495bSYour Name 	struct wlan_dp_intf *dp_intf = (struct wlan_dp_intf *)intf_ctx;
1882*5113495bSYour Name 
1883*5113495bSYour Name 	if (!dp_intf) {
1884*5113495bSYour Name 		dp_err("Unable to get DP link");
1885*5113495bSYour Name 		return 0;
1886*5113495bSYour Name 	}
1887*5113495bSYour Name 
1888*5113495bSYour Name 	return dp_intf->pkt_type_bitmap;
1889*5113495bSYour Name }
1890*5113495bSYour Name 
ucfg_dp_set_track_dest_ipv4_value(struct wlan_objmgr_vdev * vdev,uint32_t value)1891*5113495bSYour Name void ucfg_dp_set_track_dest_ipv4_value(struct wlan_objmgr_vdev *vdev,
1892*5113495bSYour Name 				       uint32_t value)
1893*5113495bSYour Name {
1894*5113495bSYour Name 	struct wlan_dp_link *dp_link = dp_get_vdev_priv_obj(vdev);
1895*5113495bSYour Name 	struct wlan_dp_intf *dp_intf;
1896*5113495bSYour Name 
1897*5113495bSYour Name 	if (!dp_link) {
1898*5113495bSYour Name 		dp_err("Unable to get DP link");
1899*5113495bSYour Name 		return;
1900*5113495bSYour Name 	}
1901*5113495bSYour Name 
1902*5113495bSYour Name 	dp_intf = dp_link->dp_intf;
1903*5113495bSYour Name 	dp_intf->track_dest_ipv4 = value;
1904*5113495bSYour Name }
1905*5113495bSYour Name 
ucfg_dp_set_track_dest_port_value(struct wlan_objmgr_vdev * vdev,uint32_t value)1906*5113495bSYour Name void ucfg_dp_set_track_dest_port_value(struct wlan_objmgr_vdev *vdev,
1907*5113495bSYour Name 				       uint32_t value)
1908*5113495bSYour Name {
1909*5113495bSYour Name 	struct wlan_dp_link *dp_link = dp_get_vdev_priv_obj(vdev);
1910*5113495bSYour Name 	struct wlan_dp_intf *dp_intf;
1911*5113495bSYour Name 
1912*5113495bSYour Name 	if (!dp_link) {
1913*5113495bSYour Name 		dp_err("Unable to get DP link");
1914*5113495bSYour Name 		return;
1915*5113495bSYour Name 	}
1916*5113495bSYour Name 
1917*5113495bSYour Name 	dp_intf = dp_link->dp_intf;
1918*5113495bSYour Name 	dp_intf->track_dest_port = value;
1919*5113495bSYour Name }
1920*5113495bSYour Name 
ucfg_dp_set_track_src_port_value(struct wlan_objmgr_vdev * vdev,uint32_t value)1921*5113495bSYour Name void ucfg_dp_set_track_src_port_value(struct wlan_objmgr_vdev *vdev,
1922*5113495bSYour Name 				      uint32_t value)
1923*5113495bSYour Name {
1924*5113495bSYour Name 	struct wlan_dp_link *dp_link = dp_get_vdev_priv_obj(vdev);
1925*5113495bSYour Name 	struct wlan_dp_intf *dp_intf;
1926*5113495bSYour Name 
1927*5113495bSYour Name 	if (!dp_link) {
1928*5113495bSYour Name 		dp_err("Unable to get DP link");
1929*5113495bSYour Name 		return;
1930*5113495bSYour Name 	}
1931*5113495bSYour Name 
1932*5113495bSYour Name 	dp_intf = dp_link->dp_intf;
1933*5113495bSYour Name 	dp_intf->track_src_port = value;
1934*5113495bSYour Name }
1935*5113495bSYour Name 
ucfg_dp_set_track_dns_domain_len_value(struct wlan_objmgr_vdev * vdev,uint32_t value)1936*5113495bSYour Name void ucfg_dp_set_track_dns_domain_len_value(struct wlan_objmgr_vdev *vdev,
1937*5113495bSYour Name 					    uint32_t value)
1938*5113495bSYour Name {
1939*5113495bSYour Name 	struct wlan_dp_link *dp_link = dp_get_vdev_priv_obj(vdev);
1940*5113495bSYour Name 	struct wlan_dp_intf *dp_intf;
1941*5113495bSYour Name 
1942*5113495bSYour Name 	if (!dp_link) {
1943*5113495bSYour Name 		dp_err("Unable to get DP link");
1944*5113495bSYour Name 		return;
1945*5113495bSYour Name 	}
1946*5113495bSYour Name 
1947*5113495bSYour Name 	dp_intf = dp_link->dp_intf;
1948*5113495bSYour Name 	dp_intf->track_dns_domain_len = value;
1949*5113495bSYour Name }
1950*5113495bSYour Name 
ucfg_dp_set_track_arp_ip_value(struct wlan_objmgr_vdev * vdev,uint32_t value)1951*5113495bSYour Name void ucfg_dp_set_track_arp_ip_value(struct wlan_objmgr_vdev *vdev,
1952*5113495bSYour Name 				    uint32_t value)
1953*5113495bSYour Name {
1954*5113495bSYour Name 	struct wlan_dp_link *dp_link = dp_get_vdev_priv_obj(vdev);
1955*5113495bSYour Name 	struct wlan_dp_intf *dp_intf;
1956*5113495bSYour Name 
1957*5113495bSYour Name 	if (!dp_link) {
1958*5113495bSYour Name 		dp_err("Unable to get DP link");
1959*5113495bSYour Name 		return;
1960*5113495bSYour Name 	}
1961*5113495bSYour Name 
1962*5113495bSYour Name 	dp_intf = dp_link->dp_intf;
1963*5113495bSYour Name 	dp_intf->track_arp_ip = value;
1964*5113495bSYour Name }
1965*5113495bSYour Name 
ucfg_dp_get_pkt_type_bitmap_value(struct wlan_objmgr_vdev * vdev)1966*5113495bSYour Name uint32_t ucfg_dp_get_pkt_type_bitmap_value(struct wlan_objmgr_vdev *vdev)
1967*5113495bSYour Name {
1968*5113495bSYour Name 	struct wlan_dp_link *dp_link = dp_get_vdev_priv_obj(vdev);
1969*5113495bSYour Name 	struct wlan_dp_intf *dp_intf;
1970*5113495bSYour Name 
1971*5113495bSYour Name 	if (!dp_link) {
1972*5113495bSYour Name 		dp_err("Unable to get DP link");
1973*5113495bSYour Name 		return 0;
1974*5113495bSYour Name 	}
1975*5113495bSYour Name 
1976*5113495bSYour Name 	dp_intf = dp_link->dp_intf;
1977*5113495bSYour Name 	return dp_intf->pkt_type_bitmap;
1978*5113495bSYour Name }
1979*5113495bSYour Name 
ucfg_dp_get_dns_payload_value(struct wlan_objmgr_vdev * vdev,uint8_t * dns_query)1980*5113495bSYour Name void ucfg_dp_get_dns_payload_value(struct wlan_objmgr_vdev *vdev,
1981*5113495bSYour Name 				   uint8_t *dns_query)
1982*5113495bSYour Name {
1983*5113495bSYour Name 	struct wlan_dp_link *dp_link = dp_get_vdev_priv_obj(vdev);
1984*5113495bSYour Name 	struct wlan_dp_intf *dp_intf;
1985*5113495bSYour Name 
1986*5113495bSYour Name 	if (!dp_link) {
1987*5113495bSYour Name 		dp_err("Unable to get DP link");
1988*5113495bSYour Name 		return;
1989*5113495bSYour Name 	}
1990*5113495bSYour Name 
1991*5113495bSYour Name 	dp_intf = dp_link->dp_intf;
1992*5113495bSYour Name 	qdf_mem_copy(dns_query, dp_intf->dns_payload,
1993*5113495bSYour Name 		     dp_intf->track_dns_domain_len);
1994*5113495bSYour Name }
1995*5113495bSYour Name 
ucfg_dp_get_track_dns_domain_len_value(struct wlan_objmgr_vdev * vdev)1996*5113495bSYour Name uint32_t ucfg_dp_get_track_dns_domain_len_value(struct wlan_objmgr_vdev *vdev)
1997*5113495bSYour Name {
1998*5113495bSYour Name 	struct wlan_dp_link *dp_link = dp_get_vdev_priv_obj(vdev);
1999*5113495bSYour Name 	struct wlan_dp_intf *dp_intf;
2000*5113495bSYour Name 
2001*5113495bSYour Name 	if (!dp_link) {
2002*5113495bSYour Name 		dp_err("Unable to get DP link");
2003*5113495bSYour Name 		return 0;
2004*5113495bSYour Name 	}
2005*5113495bSYour Name 
2006*5113495bSYour Name 	dp_intf = dp_link->dp_intf;
2007*5113495bSYour Name 	return dp_intf->track_dns_domain_len;
2008*5113495bSYour Name }
2009*5113495bSYour Name 
ucfg_dp_get_track_dest_port_value(struct wlan_objmgr_vdev * vdev)2010*5113495bSYour Name uint32_t ucfg_dp_get_track_dest_port_value(struct wlan_objmgr_vdev *vdev)
2011*5113495bSYour Name {
2012*5113495bSYour Name 	struct wlan_dp_link *dp_link = dp_get_vdev_priv_obj(vdev);
2013*5113495bSYour Name 	struct wlan_dp_intf *dp_intf;
2014*5113495bSYour Name 
2015*5113495bSYour Name 	if (!dp_link) {
2016*5113495bSYour Name 		dp_err("Unable to get DP link");
2017*5113495bSYour Name 		return 0;
2018*5113495bSYour Name 	}
2019*5113495bSYour Name 
2020*5113495bSYour Name 	dp_intf = dp_link->dp_intf;
2021*5113495bSYour Name 	return dp_intf->track_dest_port;
2022*5113495bSYour Name }
2023*5113495bSYour Name 
ucfg_dp_get_track_src_port_value(struct wlan_objmgr_vdev * vdev)2024*5113495bSYour Name uint32_t ucfg_dp_get_track_src_port_value(struct wlan_objmgr_vdev *vdev)
2025*5113495bSYour Name {
2026*5113495bSYour Name 	struct wlan_dp_link *dp_link = dp_get_vdev_priv_obj(vdev);
2027*5113495bSYour Name 	struct wlan_dp_intf *dp_intf;
2028*5113495bSYour Name 
2029*5113495bSYour Name 	if (!dp_link) {
2030*5113495bSYour Name 		dp_err("Unable to get DP link");
2031*5113495bSYour Name 		return 0;
2032*5113495bSYour Name 	}
2033*5113495bSYour Name 
2034*5113495bSYour Name 	dp_intf = dp_link->dp_intf;
2035*5113495bSYour Name 	return dp_intf->track_src_port;
2036*5113495bSYour Name }
2037*5113495bSYour Name 
ucfg_dp_get_track_dest_ipv4_value(struct wlan_objmgr_vdev * vdev)2038*5113495bSYour Name uint32_t ucfg_dp_get_track_dest_ipv4_value(struct wlan_objmgr_vdev *vdev)
2039*5113495bSYour Name {
2040*5113495bSYour Name 	struct wlan_dp_link *dp_link = dp_get_vdev_priv_obj(vdev);
2041*5113495bSYour Name 	struct wlan_dp_intf *dp_intf;
2042*5113495bSYour Name 
2043*5113495bSYour Name 	if (!dp_link) {
2044*5113495bSYour Name 		dp_err("Unable to get DP link");
2045*5113495bSYour Name 		return 0;
2046*5113495bSYour Name 	}
2047*5113495bSYour Name 
2048*5113495bSYour Name 	dp_intf = dp_link->dp_intf;
2049*5113495bSYour Name 	return dp_intf->track_dest_ipv4;
2050*5113495bSYour Name }
2051*5113495bSYour Name 
ucfg_dp_get_dad_value(struct wlan_objmgr_vdev * vdev)2052*5113495bSYour Name bool ucfg_dp_get_dad_value(struct wlan_objmgr_vdev *vdev)
2053*5113495bSYour Name {
2054*5113495bSYour Name 	struct wlan_dp_link *dp_link = dp_get_vdev_priv_obj(vdev);
2055*5113495bSYour Name 	struct wlan_dp_intf *dp_intf;
2056*5113495bSYour Name 
2057*5113495bSYour Name 	if (!dp_link) {
2058*5113495bSYour Name 		dp_err("Unable to get DP link");
2059*5113495bSYour Name 		return 0;
2060*5113495bSYour Name 	}
2061*5113495bSYour Name 
2062*5113495bSYour Name 	dp_intf = dp_link->dp_intf;
2063*5113495bSYour Name 	return dp_intf->dad;
2064*5113495bSYour Name }
2065*5113495bSYour Name 
ucfg_dp_get_con_status_value(struct wlan_objmgr_vdev * vdev)2066*5113495bSYour Name bool ucfg_dp_get_con_status_value(struct wlan_objmgr_vdev *vdev)
2067*5113495bSYour Name {
2068*5113495bSYour Name 	struct wlan_dp_link *dp_link = dp_get_vdev_priv_obj(vdev);
2069*5113495bSYour Name 	struct wlan_dp_intf *dp_intf;
2070*5113495bSYour Name 
2071*5113495bSYour Name 	if (!dp_link) {
2072*5113495bSYour Name 		dp_err("Unable to get DP link");
2073*5113495bSYour Name 		return 0;
2074*5113495bSYour Name 	}
2075*5113495bSYour Name 
2076*5113495bSYour Name 	dp_intf = dp_link->dp_intf;
2077*5113495bSYour Name 	return dp_intf->con_status;
2078*5113495bSYour Name }
2079*5113495bSYour Name 
ucfg_dp_get_link_id(struct wlan_objmgr_vdev * vdev)2080*5113495bSYour Name uint8_t ucfg_dp_get_link_id(struct wlan_objmgr_vdev *vdev)
2081*5113495bSYour Name {
2082*5113495bSYour Name 	struct wlan_dp_link *dp_link = dp_get_vdev_priv_obj(vdev);
2083*5113495bSYour Name 
2084*5113495bSYour Name 	if (!dp_link) {
2085*5113495bSYour Name 		dp_err("Unable to get DP link");
2086*5113495bSYour Name 		return 0;
2087*5113495bSYour Name 	}
2088*5113495bSYour Name 
2089*5113495bSYour Name 	return dp_link->link_id;
2090*5113495bSYour Name }
2091*5113495bSYour Name 
ucfg_dp_get_arp_stats(struct wlan_objmgr_vdev * vdev)2092*5113495bSYour Name struct dp_arp_stats *ucfg_dp_get_arp_stats(struct wlan_objmgr_vdev *vdev)
2093*5113495bSYour Name {
2094*5113495bSYour Name 	struct wlan_dp_link *dp_link = dp_get_vdev_priv_obj(vdev);
2095*5113495bSYour Name 	struct wlan_dp_intf *dp_intf;
2096*5113495bSYour Name 
2097*5113495bSYour Name 	if (!dp_link) {
2098*5113495bSYour Name 		dp_err("Unable to get DP link");
2099*5113495bSYour Name 		return NULL;
2100*5113495bSYour Name 	}
2101*5113495bSYour Name 
2102*5113495bSYour Name 	dp_intf = dp_link->dp_intf;
2103*5113495bSYour Name 	return &dp_intf->dp_stats.arp_stats;
2104*5113495bSYour Name }
2105*5113495bSYour Name 
ucfg_dp_get_icmpv4_stats(struct wlan_objmgr_vdev * vdev)2106*5113495bSYour Name struct dp_icmpv4_stats *ucfg_dp_get_icmpv4_stats(struct wlan_objmgr_vdev *vdev)
2107*5113495bSYour Name {
2108*5113495bSYour Name 	struct wlan_dp_link *dp_link = dp_get_vdev_priv_obj(vdev);
2109*5113495bSYour Name 	struct wlan_dp_intf *dp_intf;
2110*5113495bSYour Name 
2111*5113495bSYour Name 	if (!dp_link) {
2112*5113495bSYour Name 		dp_err("Unable to get DP link");
2113*5113495bSYour Name 		return NULL;
2114*5113495bSYour Name 	}
2115*5113495bSYour Name 
2116*5113495bSYour Name 	dp_intf = dp_link->dp_intf;
2117*5113495bSYour Name 	return &dp_intf->dp_stats.icmpv4_stats;
2118*5113495bSYour Name }
2119*5113495bSYour Name 
ucfg_dp_get_tcp_stats(struct wlan_objmgr_vdev * vdev)2120*5113495bSYour Name struct dp_tcp_stats *ucfg_dp_get_tcp_stats(struct wlan_objmgr_vdev *vdev)
2121*5113495bSYour Name {
2122*5113495bSYour Name 	struct wlan_dp_link *dp_link = dp_get_vdev_priv_obj(vdev);
2123*5113495bSYour Name 	struct wlan_dp_intf *dp_intf;
2124*5113495bSYour Name 
2125*5113495bSYour Name 	if (!dp_link) {
2126*5113495bSYour Name 		dp_err("Unable to get DP link");
2127*5113495bSYour Name 		return NULL;
2128*5113495bSYour Name 	}
2129*5113495bSYour Name 
2130*5113495bSYour Name 	dp_intf = dp_link->dp_intf;
2131*5113495bSYour Name 	return &dp_intf->dp_stats.tcp_stats;
2132*5113495bSYour Name }
2133*5113495bSYour Name 
ucfg_dp_get_dns_stats(struct wlan_objmgr_vdev * vdev)2134*5113495bSYour Name struct dp_dns_stats *ucfg_dp_get_dns_stats(struct wlan_objmgr_vdev *vdev)
2135*5113495bSYour Name {
2136*5113495bSYour Name 	struct wlan_dp_link *dp_link = dp_get_vdev_priv_obj(vdev);
2137*5113495bSYour Name 	struct wlan_dp_intf *dp_intf;
2138*5113495bSYour Name 
2139*5113495bSYour Name 	if (!dp_link) {
2140*5113495bSYour Name 		dp_err("Unable to get DP link");
2141*5113495bSYour Name 		return NULL;
2142*5113495bSYour Name 	}
2143*5113495bSYour Name 
2144*5113495bSYour Name 	dp_intf = dp_link->dp_intf;
2145*5113495bSYour Name 	return &dp_intf->dp_stats.dns_stats;
2146*5113495bSYour Name }
2147*5113495bSYour Name 
ucfg_dp_set_nud_stats_cb(struct wlan_objmgr_psoc * psoc,void * cookie)2148*5113495bSYour Name void ucfg_dp_set_nud_stats_cb(struct wlan_objmgr_psoc *psoc, void *cookie)
2149*5113495bSYour Name {
2150*5113495bSYour Name 	struct wlan_dp_psoc_sb_ops *sb_ops = dp_intf_get_tx_ops(psoc);
2151*5113495bSYour Name 
2152*5113495bSYour Name 	if (!sb_ops) {
2153*5113495bSYour Name 		dp_err("Unable to get ops");
2154*5113495bSYour Name 		return;
2155*5113495bSYour Name 	}
2156*5113495bSYour Name 
2157*5113495bSYour Name 	sb_ops->dp_arp_stats_register_event_handler(psoc);
2158*5113495bSYour Name 	sb_ops->arp_request_ctx = cookie;
2159*5113495bSYour Name }
2160*5113495bSYour Name 
ucfg_dp_clear_nud_stats_cb(struct wlan_objmgr_psoc * psoc)2161*5113495bSYour Name void ucfg_dp_clear_nud_stats_cb(struct wlan_objmgr_psoc *psoc)
2162*5113495bSYour Name {
2163*5113495bSYour Name 	struct wlan_dp_psoc_sb_ops *sb_ops = dp_intf_get_tx_ops(psoc);
2164*5113495bSYour Name 
2165*5113495bSYour Name 	if (!sb_ops) {
2166*5113495bSYour Name 		dp_err("Unable to get ops");
2167*5113495bSYour Name 		return;
2168*5113495bSYour Name 	}
2169*5113495bSYour Name 
2170*5113495bSYour Name 	sb_ops->dp_arp_stats_unregister_event_handler(psoc);
2171*5113495bSYour Name }
2172*5113495bSYour Name 
ucfg_dp_set_dump_dp_trace(uint16_t cmd_type,uint16_t count)2173*5113495bSYour Name void ucfg_dp_set_dump_dp_trace(uint16_t cmd_type, uint16_t count)
2174*5113495bSYour Name {
2175*5113495bSYour Name 	dp_set_dump_dp_trace(cmd_type, count);
2176*5113495bSYour Name }
2177*5113495bSYour Name 
ucfg_dp_get_current_throughput_level(struct wlan_objmgr_psoc * psoc)2178*5113495bSYour Name int ucfg_dp_get_current_throughput_level(struct wlan_objmgr_psoc *psoc)
2179*5113495bSYour Name {
2180*5113495bSYour Name 	struct wlan_dp_psoc_context *dp_ctx = dp_psoc_get_priv(psoc);
2181*5113495bSYour Name 
2182*5113495bSYour Name 	if (!dp_ctx)
2183*5113495bSYour Name 		return 0;
2184*5113495bSYour Name 
2185*5113495bSYour Name 	return dp_get_current_throughput_level(dp_ctx);
2186*5113495bSYour Name }
2187*5113495bSYour Name 
ucfg_dp_get_bus_bw_high_threshold(struct wlan_objmgr_psoc * psoc)2188*5113495bSYour Name uint32_t ucfg_dp_get_bus_bw_high_threshold(struct wlan_objmgr_psoc *psoc)
2189*5113495bSYour Name {
2190*5113495bSYour Name 	struct wlan_dp_psoc_context *dp_ctx = dp_psoc_get_priv(psoc);
2191*5113495bSYour Name 
2192*5113495bSYour Name 	if (!dp_ctx)
2193*5113495bSYour Name 		return 0;
2194*5113495bSYour Name 
2195*5113495bSYour Name 	return dp_get_bus_bw_high_threshold(dp_ctx);
2196*5113495bSYour Name }
2197*5113495bSYour Name 
2198*5113495bSYour Name QDF_STATUS
ucfg_dp_req_get_arp_stats(struct wlan_objmgr_psoc * psoc,struct dp_get_arp_stats_params * params)2199*5113495bSYour Name ucfg_dp_req_get_arp_stats(struct wlan_objmgr_psoc *psoc,
2200*5113495bSYour Name 			  struct dp_get_arp_stats_params *params)
2201*5113495bSYour Name {
2202*5113495bSYour Name 	struct wlan_dp_psoc_sb_ops *sb_ops = dp_intf_get_tx_ops(psoc);
2203*5113495bSYour Name 
2204*5113495bSYour Name 	if (!sb_ops) {
2205*5113495bSYour Name 		dp_err("Unable to get ops");
2206*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
2207*5113495bSYour Name 	}
2208*5113495bSYour Name 
2209*5113495bSYour Name 	return sb_ops->dp_get_arp_req_stats(psoc, params);
2210*5113495bSYour Name }
2211*5113495bSYour Name 
2212*5113495bSYour Name QDF_STATUS
ucfg_dp_req_set_arp_stats(struct wlan_objmgr_psoc * psoc,struct dp_set_arp_stats_params * params)2213*5113495bSYour Name ucfg_dp_req_set_arp_stats(struct wlan_objmgr_psoc *psoc,
2214*5113495bSYour Name 			  struct dp_set_arp_stats_params *params)
2215*5113495bSYour Name {
2216*5113495bSYour Name 	struct wlan_dp_psoc_sb_ops *sb_ops = dp_intf_get_tx_ops(psoc);
2217*5113495bSYour Name 
2218*5113495bSYour Name 	if (!sb_ops) {
2219*5113495bSYour Name 		dp_err("Unable to get ops");
2220*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
2221*5113495bSYour Name 	}
2222*5113495bSYour Name 
2223*5113495bSYour Name 	return sb_ops->dp_set_arp_req_stats(psoc, params);
2224*5113495bSYour Name }
2225*5113495bSYour Name 
ucfg_dp_register_hdd_callbacks(struct wlan_objmgr_psoc * psoc,struct wlan_dp_psoc_callbacks * cb_obj)2226*5113495bSYour Name void ucfg_dp_register_hdd_callbacks(struct wlan_objmgr_psoc *psoc,
2227*5113495bSYour Name 				    struct wlan_dp_psoc_callbacks *cb_obj)
2228*5113495bSYour Name {
2229*5113495bSYour Name 	struct wlan_dp_psoc_context *dp_ctx = dp_psoc_get_priv(psoc);
2230*5113495bSYour Name 
2231*5113495bSYour Name 	if (!dp_ctx) {
2232*5113495bSYour Name 		dp_err("DP ctx is NULL");
2233*5113495bSYour Name 		return;
2234*5113495bSYour Name 	}
2235*5113495bSYour Name 	dp_ctx->dp_ops.callback_ctx = cb_obj->callback_ctx;
2236*5113495bSYour Name 	dp_ctx->dp_ops.wlan_dp_sta_get_dot11mode =
2237*5113495bSYour Name 		cb_obj->wlan_dp_sta_get_dot11mode;
2238*5113495bSYour Name 	dp_ctx->dp_ops.wlan_dp_get_ap_client_count =
2239*5113495bSYour Name 		cb_obj->wlan_dp_get_ap_client_count;
2240*5113495bSYour Name 	dp_ctx->dp_ops.wlan_dp_sta_ndi_connected =
2241*5113495bSYour Name 		cb_obj->wlan_dp_sta_ndi_connected;
2242*5113495bSYour Name 	dp_ctx->dp_ops.dp_any_adapter_connected =
2243*5113495bSYour Name 		cb_obj->dp_any_adapter_connected;
2244*5113495bSYour Name 	dp_ctx->dp_ops.dp_send_svc_nlink_msg = cb_obj->dp_send_svc_nlink_msg;
2245*5113495bSYour Name 	dp_ctx->dp_ops.dp_pm_qos_update_request =
2246*5113495bSYour Name 		cb_obj->dp_pm_qos_update_request;
2247*5113495bSYour Name 	dp_ctx->dp_ops.dp_pld_remove_pm_qos = cb_obj->dp_pld_remove_pm_qos;
2248*5113495bSYour Name 	dp_ctx->dp_ops.dp_pld_request_pm_qos = cb_obj->dp_pld_request_pm_qos;
2249*5113495bSYour Name 	dp_ctx->dp_ops.dp_pm_qos_add_request = cb_obj->dp_pm_qos_add_request;
2250*5113495bSYour Name 	dp_ctx->dp_ops.dp_pm_qos_remove_request =
2251*5113495bSYour Name 		cb_obj->dp_pm_qos_remove_request;
2252*5113495bSYour Name 	dp_ctx->dp_ops.wlan_dp_display_tx_multiq_stats =
2253*5113495bSYour Name 		cb_obj->wlan_dp_display_tx_multiq_stats;
2254*5113495bSYour Name 	dp_ctx->dp_ops.wlan_dp_display_netif_queue_history =
2255*5113495bSYour Name 		cb_obj->wlan_dp_display_netif_queue_history;
2256*5113495bSYour Name 	dp_ctx->dp_ops.dp_send_mscs_action_frame =
2257*5113495bSYour Name 		cb_obj->dp_send_mscs_action_frame;
2258*5113495bSYour Name 	dp_ctx->dp_ops.dp_pktlog_enable_disable =
2259*5113495bSYour Name 		cb_obj->dp_pktlog_enable_disable;
2260*5113495bSYour Name 	dp_ctx->dp_ops.dp_is_roaming_in_progress =
2261*5113495bSYour Name 		cb_obj->dp_is_roaming_in_progress;
2262*5113495bSYour Name 	dp_ctx->dp_ops.dp_is_ap_active = cb_obj->dp_is_ap_active;
2263*5113495bSYour Name 	dp_ctx->dp_ops.dp_disable_rx_ol_for_low_tput =
2264*5113495bSYour Name 		cb_obj->dp_disable_rx_ol_for_low_tput;
2265*5113495bSYour Name 	dp_ctx->dp_ops.dp_napi_apply_throughput_policy =
2266*5113495bSYour Name 		cb_obj->dp_napi_apply_throughput_policy;
2267*5113495bSYour Name 	dp_ctx->dp_ops.dp_is_link_adapter = cb_obj->dp_is_link_adapter;
2268*5113495bSYour Name 	dp_ctx->dp_ops.dp_get_pause_map = cb_obj->dp_get_pause_map;
2269*5113495bSYour Name 	dp_ctx->dp_ops.dp_nud_failure_work = cb_obj->dp_nud_failure_work;
2270*5113495bSYour Name 
2271*5113495bSYour Name 	dp_ctx->dp_ops.dp_get_tx_resource = cb_obj->dp_get_tx_resource;
2272*5113495bSYour Name 	dp_ctx->dp_ops.dp_get_tx_flow_low_watermark =
2273*5113495bSYour Name 		cb_obj->dp_get_tx_flow_low_watermark;
2274*5113495bSYour Name 	dp_ctx->dp_ops.dp_get_tsf_time = cb_obj->dp_get_tsf_time;
2275*5113495bSYour Name 	dp_ctx->dp_ops.dp_tsf_timestamp_rx = cb_obj->dp_tsf_timestamp_rx;
2276*5113495bSYour Name 	dp_ctx->dp_ops.dp_gro_rx_legacy_get_napi =
2277*5113495bSYour Name 		cb_obj->dp_gro_rx_legacy_get_napi;
2278*5113495bSYour Name 	dp_ctx->dp_ops.dp_get_netdev_by_vdev_mac =
2279*5113495bSYour Name 		cb_obj->dp_get_netdev_by_vdev_mac;
2280*5113495bSYour Name 
2281*5113495bSYour Name 	dp_ctx->dp_ops.dp_nbuf_push_pkt = cb_obj->dp_nbuf_push_pkt;
2282*5113495bSYour Name 	dp_ctx->dp_ops.dp_rx_napi_gro_flush = cb_obj->dp_rx_napi_gro_flush;
2283*5113495bSYour Name 	dp_ctx->dp_ops.dp_rx_thread_napi_gro_flush =
2284*5113495bSYour Name 	    cb_obj->dp_rx_thread_napi_gro_flush;
2285*5113495bSYour Name 	dp_ctx->dp_ops.dp_rx_napi_gro_receive = cb_obj->dp_rx_napi_gro_receive;
2286*5113495bSYour Name 	dp_ctx->dp_ops.dp_lro_rx_cb = cb_obj->dp_lro_rx_cb;
2287*5113495bSYour Name 	dp_ctx->dp_ops.dp_register_rx_offld_flush_cb =
2288*5113495bSYour Name 		cb_obj->dp_register_rx_offld_flush_cb;
2289*5113495bSYour Name 	dp_ctx->dp_ops.dp_rx_check_qdisc_configured =
2290*5113495bSYour Name 		cb_obj->dp_rx_check_qdisc_configured;
2291*5113495bSYour Name 	dp_ctx->dp_ops.dp_is_gratuitous_arp_unsolicited_na =
2292*5113495bSYour Name 		cb_obj->dp_is_gratuitous_arp_unsolicited_na;
2293*5113495bSYour Name 	dp_ctx->dp_ops.dp_send_rx_pkt_over_nl = cb_obj->dp_send_rx_pkt_over_nl;
2294*5113495bSYour Name 	dp_ctx->dp_ops.osif_dp_send_tcp_param_update_event =
2295*5113495bSYour Name 		cb_obj->osif_dp_send_tcp_param_update_event;
2296*5113495bSYour Name 	dp_ctx->dp_ops.os_if_dp_nud_stats_info =
2297*5113495bSYour Name 		cb_obj->os_if_dp_nud_stats_info;
2298*5113495bSYour Name 	dp_ctx->dp_ops.osif_dp_process_mic_error =
2299*5113495bSYour Name 		cb_obj->osif_dp_process_mic_error;
2300*5113495bSYour Name 	dp_ctx->dp_ops.link_monitoring_cb = cb_obj->link_monitoring_cb;
2301*5113495bSYour Name 	}
2302*5113495bSYour Name 
ucfg_dp_register_event_handler(struct wlan_objmgr_psoc * psoc,struct wlan_dp_psoc_nb_ops * cb_obj)2303*5113495bSYour Name void ucfg_dp_register_event_handler(struct wlan_objmgr_psoc *psoc,
2304*5113495bSYour Name 				    struct wlan_dp_psoc_nb_ops *cb_obj)
2305*5113495bSYour Name {
2306*5113495bSYour Name 	struct wlan_dp_psoc_context *dp_ctx = dp_psoc_get_priv(psoc);
2307*5113495bSYour Name 
2308*5113495bSYour Name 	if (!dp_ctx) {
2309*5113495bSYour Name 		dp_err("DP ctx is NULL");
2310*5113495bSYour Name 		return;
2311*5113495bSYour Name 	}
2312*5113495bSYour Name 
2313*5113495bSYour Name 	dp_ctx->nb_ops.osif_dp_get_arp_stats_evt =
2314*5113495bSYour Name 		cb_obj->osif_dp_get_arp_stats_evt;
2315*5113495bSYour Name }
2316*5113495bSYour Name 
ucfg_dp_get_bus_bw_compute_interval(struct wlan_objmgr_psoc * psoc)2317*5113495bSYour Name uint32_t ucfg_dp_get_bus_bw_compute_interval(struct wlan_objmgr_psoc *psoc)
2318*5113495bSYour Name {
2319*5113495bSYour Name 	struct wlan_dp_psoc_context *dp_ctx = dp_psoc_get_priv(psoc);
2320*5113495bSYour Name 
2321*5113495bSYour Name 	if (!dp_ctx) {
2322*5113495bSYour Name 		dp_err("DP ctx is NULL");
2323*5113495bSYour Name 		return 0;
2324*5113495bSYour Name 	}
2325*5113495bSYour Name 	return DP_BUS_BW_CFG(dp_ctx->dp_cfg.bus_bw_compute_interval);
2326*5113495bSYour Name }
2327*5113495bSYour Name 
ucfg_dp_get_txrx_stats(struct wlan_objmgr_vdev * vdev,struct dp_tx_rx_stats * dp_stats)2328*5113495bSYour Name QDF_STATUS ucfg_dp_get_txrx_stats(struct wlan_objmgr_vdev *vdev,
2329*5113495bSYour Name 				  struct dp_tx_rx_stats *dp_stats)
2330*5113495bSYour Name {
2331*5113495bSYour Name 	struct wlan_dp_link *dp_link = dp_get_vdev_priv_obj(vdev);
2332*5113495bSYour Name 	struct wlan_dp_intf *dp_intf;
2333*5113495bSYour Name 	struct dp_tx_rx_stats *txrx_stats;
2334*5113495bSYour Name 	int i = 0, rx_mcast_drp = 0;
2335*5113495bSYour Name 
2336*5113495bSYour Name 	if (!dp_link) {
2337*5113495bSYour Name 		dp_err("Unable to get DP link");
2338*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
2339*5113495bSYour Name 	}
2340*5113495bSYour Name 
2341*5113495bSYour Name 	dp_intf = dp_link->dp_intf;
2342*5113495bSYour Name 	txrx_stats = &dp_intf->dp_stats.tx_rx_stats;
2343*5113495bSYour Name 	for (i = 0; i < NUM_CPUS; i++) {
2344*5113495bSYour Name 		dp_stats->per_cpu[i].rx_packets = txrx_stats->per_cpu[i].rx_packets;
2345*5113495bSYour Name 		dp_stats->per_cpu[i].rx_dropped = txrx_stats->per_cpu[i].rx_dropped;
2346*5113495bSYour Name 		dp_stats->per_cpu[i].rx_delivered = txrx_stats->per_cpu[i].rx_delivered;
2347*5113495bSYour Name 		dp_stats->per_cpu[i].rx_refused = txrx_stats->per_cpu[i].rx_refused;
2348*5113495bSYour Name 		dp_stats->per_cpu[i].tx_called = txrx_stats->per_cpu[i].tx_called;
2349*5113495bSYour Name 		dp_stats->per_cpu[i].tx_dropped = txrx_stats->per_cpu[i].tx_dropped;
2350*5113495bSYour Name 		dp_stats->per_cpu[i].tx_orphaned = txrx_stats->per_cpu[i].tx_orphaned;
2351*5113495bSYour Name 	}
2352*5113495bSYour Name 	rx_mcast_drp = qdf_atomic_read(&txrx_stats->rx_usolict_arp_n_mcast_drp);
2353*5113495bSYour Name 	qdf_atomic_set(&dp_stats->rx_usolict_arp_n_mcast_drp, rx_mcast_drp);
2354*5113495bSYour Name 
2355*5113495bSYour Name 	dp_stats->rx_aggregated = txrx_stats->rx_aggregated;
2356*5113495bSYour Name 	dp_stats->rx_gro_dropped = txrx_stats->rx_gro_dropped;
2357*5113495bSYour Name 	dp_stats->rx_non_aggregated = txrx_stats->rx_non_aggregated;
2358*5113495bSYour Name 	dp_stats->rx_gro_flush_skip = txrx_stats->rx_gro_flush_skip;
2359*5113495bSYour Name 	dp_stats->rx_gro_low_tput_flush = txrx_stats->rx_gro_low_tput_flush;
2360*5113495bSYour Name 	dp_stats->tx_timeout_cnt = txrx_stats->tx_timeout_cnt;
2361*5113495bSYour Name 	dp_stats->cont_txtimeout_cnt = txrx_stats->cont_txtimeout_cnt;
2362*5113495bSYour Name 	dp_stats->last_txtimeout = txrx_stats->last_txtimeout;
2363*5113495bSYour Name 
2364*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
2365*5113495bSYour Name }
2366*5113495bSYour Name 
ucfg_dp_get_net_dev_stats(struct wlan_objmgr_vdev * vdev,qdf_net_dev_stats * stats)2367*5113495bSYour Name void ucfg_dp_get_net_dev_stats(struct wlan_objmgr_vdev *vdev,
2368*5113495bSYour Name 			       qdf_net_dev_stats *stats)
2369*5113495bSYour Name {
2370*5113495bSYour Name 	struct wlan_dp_link *dp_link;
2371*5113495bSYour Name 	struct wlan_dp_intf *dp_intf;
2372*5113495bSYour Name 
2373*5113495bSYour Name 	dp_link = dp_get_vdev_priv_obj(vdev);
2374*5113495bSYour Name 	if (unlikely(!dp_link)) {
2375*5113495bSYour Name 		dp_err_rl("DP link not found");
2376*5113495bSYour Name 		return;
2377*5113495bSYour Name 	}
2378*5113495bSYour Name 
2379*5113495bSYour Name 	dp_intf = dp_link->dp_intf;
2380*5113495bSYour Name 	dp_get_net_dev_stats(dp_intf, stats);
2381*5113495bSYour Name }
2382*5113495bSYour Name 
ucfg_dp_clear_net_dev_stats(qdf_netdev_t dev)2383*5113495bSYour Name void ucfg_dp_clear_net_dev_stats(qdf_netdev_t dev)
2384*5113495bSYour Name {
2385*5113495bSYour Name 	struct wlan_dp_intf *dp_intf;
2386*5113495bSYour Name 	struct wlan_dp_psoc_context *dp_ctx;
2387*5113495bSYour Name 
2388*5113495bSYour Name 	dp_ctx =  dp_get_context();
2389*5113495bSYour Name 	if (qdf_unlikely(!dp_ctx)) {
2390*5113495bSYour Name 		dp_err_rl("DP context not found");
2391*5113495bSYour Name 		return;
2392*5113495bSYour Name 	}
2393*5113495bSYour Name 
2394*5113495bSYour Name 	dp_intf = dp_get_intf_by_netdev(dp_ctx, dev);
2395*5113495bSYour Name 	if (qdf_unlikely(!dp_intf)) {
2396*5113495bSYour Name 		dp_err_rl("DP interface not found");
2397*5113495bSYour Name 		return;
2398*5113495bSYour Name 	}
2399*5113495bSYour Name 
2400*5113495bSYour Name 	dp_clear_net_dev_stats(dp_intf);
2401*5113495bSYour Name }
2402*5113495bSYour Name 
ucfg_dp_reset_cont_txtimeout_cnt(struct wlan_objmgr_vdev * vdev)2403*5113495bSYour Name void ucfg_dp_reset_cont_txtimeout_cnt(struct wlan_objmgr_vdev *vdev)
2404*5113495bSYour Name {
2405*5113495bSYour Name 	struct wlan_dp_link *dp_link = dp_get_vdev_priv_obj(vdev);
2406*5113495bSYour Name 	struct wlan_dp_intf *dp_intf;
2407*5113495bSYour Name 
2408*5113495bSYour Name 	if (!dp_link) {
2409*5113495bSYour Name 		dp_err("Unable to get DP link");
2410*5113495bSYour Name 		return;
2411*5113495bSYour Name 	}
2412*5113495bSYour Name 
2413*5113495bSYour Name 	dp_intf = dp_link->dp_intf;
2414*5113495bSYour Name 	dp_intf->dp_stats.tx_rx_stats.cont_txtimeout_cnt = 0;
2415*5113495bSYour Name }
2416*5113495bSYour Name 
ucfg_dp_set_rx_thread_affinity(struct wlan_objmgr_psoc * psoc)2417*5113495bSYour Name void ucfg_dp_set_rx_thread_affinity(struct wlan_objmgr_psoc *psoc)
2418*5113495bSYour Name {
2419*5113495bSYour Name 	struct wlan_dp_psoc_context *dp_ctx = dp_psoc_get_priv(psoc);
2420*5113495bSYour Name 	struct wlan_dp_psoc_cfg *cfg;
2421*5113495bSYour Name 
2422*5113495bSYour Name 	if (!dp_ctx) {
2423*5113495bSYour Name 		dp_err("DP ctx is NULL");
2424*5113495bSYour Name 		return;
2425*5113495bSYour Name 	}
2426*5113495bSYour Name 	cfg = &dp_ctx->dp_cfg;
2427*5113495bSYour Name 
2428*5113495bSYour Name 	if (cfg->rx_thread_affinity_mask)
2429*5113495bSYour Name 		cds_set_rx_thread_cpu_mask(cfg->rx_thread_affinity_mask);
2430*5113495bSYour Name 
2431*5113495bSYour Name 	if (cfg->rx_thread_ul_affinity_mask)
2432*5113495bSYour Name 		cds_set_rx_thread_ul_cpu_mask(cfg->rx_thread_ul_affinity_mask);
2433*5113495bSYour Name }
2434*5113495bSYour Name 
ucfg_dp_get_disable_rx_ol_val(struct wlan_objmgr_psoc * psoc,uint8_t * disable_conc,uint8_t * disable_low_tput)2435*5113495bSYour Name void ucfg_dp_get_disable_rx_ol_val(struct wlan_objmgr_psoc *psoc,
2436*5113495bSYour Name 				   uint8_t *disable_conc,
2437*5113495bSYour Name 				   uint8_t *disable_low_tput)
2438*5113495bSYour Name {
2439*5113495bSYour Name 	struct wlan_dp_psoc_context *dp_ctx = dp_psoc_get_priv(psoc);
2440*5113495bSYour Name 
2441*5113495bSYour Name 	if (!dp_ctx) {
2442*5113495bSYour Name 		dp_err("Unable to get DP context");
2443*5113495bSYour Name 		return;
2444*5113495bSYour Name 	}
2445*5113495bSYour Name 	*disable_conc = qdf_atomic_read(&dp_ctx->disable_rx_ol_in_concurrency);
2446*5113495bSYour Name 	*disable_low_tput = qdf_atomic_read(&dp_ctx->disable_rx_ol_in_low_tput);
2447*5113495bSYour Name }
2448*5113495bSYour Name 
ucfg_dp_get_rx_aggregation_val(struct wlan_objmgr_psoc * psoc)2449*5113495bSYour Name uint32_t ucfg_dp_get_rx_aggregation_val(struct wlan_objmgr_psoc *psoc)
2450*5113495bSYour Name {
2451*5113495bSYour Name 	struct wlan_dp_psoc_context *dp_ctx = dp_psoc_get_priv(psoc);
2452*5113495bSYour Name 
2453*5113495bSYour Name 	if (!dp_ctx) {
2454*5113495bSYour Name 		dp_err("Unable to get DP context");
2455*5113495bSYour Name 		return 0;
2456*5113495bSYour Name 	}
2457*5113495bSYour Name 	return qdf_atomic_read(&dp_ctx->dp_agg_param.rx_aggregation);
2458*5113495bSYour Name }
2459*5113495bSYour Name 
ucfg_dp_set_rx_aggregation_val(struct wlan_objmgr_psoc * psoc,uint32_t value)2460*5113495bSYour Name void ucfg_dp_set_rx_aggregation_val(struct wlan_objmgr_psoc *psoc,
2461*5113495bSYour Name 				    uint32_t value)
2462*5113495bSYour Name {
2463*5113495bSYour Name 	struct wlan_dp_psoc_context *dp_ctx = dp_psoc_get_priv(psoc);
2464*5113495bSYour Name 
2465*5113495bSYour Name 	if (!dp_ctx) {
2466*5113495bSYour Name 		dp_err("Unable to get DP context");
2467*5113495bSYour Name 		return;
2468*5113495bSYour Name 	}
2469*5113495bSYour Name 	qdf_atomic_set(&dp_ctx->dp_agg_param.rx_aggregation, !!value);
2470*5113495bSYour Name }
2471*5113495bSYour Name 
ucfg_dp_set_tc_based_dyn_gro(struct wlan_objmgr_psoc * psoc,bool value)2472*5113495bSYour Name void ucfg_dp_set_tc_based_dyn_gro(struct wlan_objmgr_psoc *psoc, bool value)
2473*5113495bSYour Name {
2474*5113495bSYour Name 	struct wlan_dp_psoc_context *dp_ctx = dp_psoc_get_priv(psoc);
2475*5113495bSYour Name 
2476*5113495bSYour Name 	if (!dp_ctx) {
2477*5113495bSYour Name 		dp_err("DP ctx is NULL");
2478*5113495bSYour Name 		return;
2479*5113495bSYour Name 	}
2480*5113495bSYour Name 	dp_ctx->dp_agg_param.tc_based_dyn_gro = value;
2481*5113495bSYour Name }
2482*5113495bSYour Name 
ucfg_dp_runtime_disable_rx_thread(struct wlan_objmgr_vdev * vdev,bool value)2483*5113495bSYour Name void ucfg_dp_runtime_disable_rx_thread(struct wlan_objmgr_vdev *vdev,
2484*5113495bSYour Name 				       bool value)
2485*5113495bSYour Name {
2486*5113495bSYour Name 	struct wlan_dp_link *dp_link = dp_get_vdev_priv_obj(vdev);
2487*5113495bSYour Name 	struct wlan_dp_intf *dp_intf;
2488*5113495bSYour Name 
2489*5113495bSYour Name 	if (!dp_link) {
2490*5113495bSYour Name 		dp_err("Unable to get DP link");
2491*5113495bSYour Name 		return;
2492*5113495bSYour Name 	}
2493*5113495bSYour Name 
2494*5113495bSYour Name 	dp_intf = dp_link->dp_intf;
2495*5113495bSYour Name 	dp_intf->runtime_disable_rx_thread = value;
2496*5113495bSYour Name }
2497*5113495bSYour Name 
ucfg_dp_get_napi_enabled(struct wlan_objmgr_psoc * psoc)2498*5113495bSYour Name bool ucfg_dp_get_napi_enabled(struct wlan_objmgr_psoc *psoc)
2499*5113495bSYour Name {
2500*5113495bSYour Name 	struct wlan_dp_psoc_context *dp_ctx = dp_psoc_get_priv(psoc);
2501*5113495bSYour Name 
2502*5113495bSYour Name 	if (!dp_ctx) {
2503*5113495bSYour Name 		dp_err("Unable to get DP context");
2504*5113495bSYour Name 		return 0;
2505*5113495bSYour Name 	}
2506*5113495bSYour Name 	return dp_ctx->napi_enable;
2507*5113495bSYour Name }
2508*5113495bSYour Name 
ucfg_dp_set_tc_ingress_prio(struct wlan_objmgr_psoc * psoc,uint32_t value)2509*5113495bSYour Name void ucfg_dp_set_tc_ingress_prio(struct wlan_objmgr_psoc *psoc, uint32_t value)
2510*5113495bSYour Name {
2511*5113495bSYour Name 	struct wlan_dp_psoc_context *dp_ctx = dp_psoc_get_priv(psoc);
2512*5113495bSYour Name 
2513*5113495bSYour Name 	if (!dp_ctx) {
2514*5113495bSYour Name 		dp_err("DP ctx is NULL");
2515*5113495bSYour Name 		return;
2516*5113495bSYour Name 	}
2517*5113495bSYour Name 	dp_ctx->dp_agg_param.tc_ingress_prio = value;
2518*5113495bSYour Name }
2519*5113495bSYour Name 
ucfg_dp_nud_fail_data_stall_evt_enabled(void)2520*5113495bSYour Name bool ucfg_dp_nud_fail_data_stall_evt_enabled(void)
2521*5113495bSYour Name {
2522*5113495bSYour Name 	return dp_is_data_stall_event_enabled(DP_HOST_NUD_FAILURE);
2523*5113495bSYour Name }
2524*5113495bSYour Name 
ucfg_dp_fw_data_stall_evt_enabled(void)2525*5113495bSYour Name uint32_t ucfg_dp_fw_data_stall_evt_enabled(void)
2526*5113495bSYour Name {
2527*5113495bSYour Name 	return cdp_cfg_get(cds_get_context(QDF_MODULE_ID_SOC),
2528*5113495bSYour Name 			   cfg_dp_enable_data_stall) & FW_DATA_STALL_EVT_MASK;
2529*5113495bSYour Name }
2530*5113495bSYour Name 
ucfg_dp_event_eapol_log(qdf_nbuf_t nbuf,enum qdf_proto_dir dir)2531*5113495bSYour Name void ucfg_dp_event_eapol_log(qdf_nbuf_t nbuf, enum qdf_proto_dir dir)
2532*5113495bSYour Name {
2533*5113495bSYour Name 	dp_event_eapol_log(nbuf, dir);
2534*5113495bSYour Name }
2535*5113495bSYour Name 
2536*5113495bSYour Name QDF_STATUS
ucfg_dp_softap_inspect_dhcp_packet(struct wlan_objmgr_vdev * vdev,qdf_nbuf_t nbuf,enum qdf_proto_dir dir)2537*5113495bSYour Name ucfg_dp_softap_inspect_dhcp_packet(struct wlan_objmgr_vdev *vdev,
2538*5113495bSYour Name 				   qdf_nbuf_t nbuf, enum qdf_proto_dir dir)
2539*5113495bSYour Name {
2540*5113495bSYour Name 	struct wlan_dp_link *dp_link = dp_get_vdev_priv_obj(vdev);
2541*5113495bSYour Name 
2542*5113495bSYour Name 	if (!dp_link) {
2543*5113495bSYour Name 		dp_err("Unable to get DP link");
2544*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
2545*5113495bSYour Name 	}
2546*5113495bSYour Name 
2547*5113495bSYour Name 	return dp_softap_inspect_dhcp_packet(dp_link, nbuf, dir);
2548*5113495bSYour Name }
2549*5113495bSYour Name 
2550*5113495bSYour Name void
dp_ucfg_enable_link_monitoring(struct wlan_objmgr_psoc * psoc,struct wlan_objmgr_vdev * vdev,uint32_t threshold)2551*5113495bSYour Name dp_ucfg_enable_link_monitoring(struct wlan_objmgr_psoc *psoc,
2552*5113495bSYour Name 			       struct wlan_objmgr_vdev *vdev,
2553*5113495bSYour Name 			       uint32_t threshold)
2554*5113495bSYour Name {
2555*5113495bSYour Name 	struct wlan_dp_link *dp_link;
2556*5113495bSYour Name 	struct wlan_dp_intf *dp_intf;
2557*5113495bSYour Name 
2558*5113495bSYour Name 	dp_link = dp_get_vdev_priv_obj(vdev);
2559*5113495bSYour Name 	if (unlikely(!dp_link)) {
2560*5113495bSYour Name 		dp_err("DP link not found");
2561*5113495bSYour Name 		return;
2562*5113495bSYour Name 	}
2563*5113495bSYour Name 
2564*5113495bSYour Name 	dp_intf = dp_link->dp_intf;
2565*5113495bSYour Name 	dp_intf->link_monitoring.rx_linkspeed_threshold = threshold;
2566*5113495bSYour Name 	dp_intf->link_monitoring.enabled = true;
2567*5113495bSYour Name }
2568*5113495bSYour Name 
2569*5113495bSYour Name void
dp_ucfg_disable_link_monitoring(struct wlan_objmgr_psoc * psoc,struct wlan_objmgr_vdev * vdev)2570*5113495bSYour Name dp_ucfg_disable_link_monitoring(struct wlan_objmgr_psoc *psoc,
2571*5113495bSYour Name 				struct wlan_objmgr_vdev *vdev)
2572*5113495bSYour Name {
2573*5113495bSYour Name 	struct wlan_dp_intf *dp_intf;
2574*5113495bSYour Name 	struct wlan_dp_link *dp_link;
2575*5113495bSYour Name 
2576*5113495bSYour Name 	dp_link = dp_get_vdev_priv_obj(vdev);
2577*5113495bSYour Name 	if (unlikely(!dp_link)) {
2578*5113495bSYour Name 		dp_err("DP link not found");
2579*5113495bSYour Name 		return;
2580*5113495bSYour Name 	}
2581*5113495bSYour Name 
2582*5113495bSYour Name 	dp_intf = dp_link->dp_intf;
2583*5113495bSYour Name 	dp_intf->link_monitoring.enabled = false;
2584*5113495bSYour Name 	dp_intf->link_monitoring.rx_linkspeed_threshold = 0;
2585*5113495bSYour Name }
2586*5113495bSYour Name 
2587*5113495bSYour Name #ifdef DP_TRAFFIC_END_INDICATION
2588*5113495bSYour Name QDF_STATUS
ucfg_dp_traffic_end_indication_get(struct wlan_objmgr_vdev * vdev,struct dp_traffic_end_indication * info)2589*5113495bSYour Name ucfg_dp_traffic_end_indication_get(struct wlan_objmgr_vdev *vdev,
2590*5113495bSYour Name 				   struct dp_traffic_end_indication *info)
2591*5113495bSYour Name {
2592*5113495bSYour Name 	struct wlan_dp_link *dp_link = dp_get_vdev_priv_obj(vdev);
2593*5113495bSYour Name 	struct wlan_dp_intf *dp_intf;
2594*5113495bSYour Name 
2595*5113495bSYour Name 	if (!dp_link) {
2596*5113495bSYour Name 		dp_err("Unable to get DP link");
2597*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
2598*5113495bSYour Name 	}
2599*5113495bSYour Name 
2600*5113495bSYour Name 	dp_intf = dp_link->dp_intf;
2601*5113495bSYour Name 
2602*5113495bSYour Name 	info->enabled = dp_intf->traffic_end_ind.enabled;
2603*5113495bSYour Name 	info->def_dscp = dp_intf->traffic_end_ind.def_dscp;
2604*5113495bSYour Name 	info->spl_dscp = dp_intf->traffic_end_ind.spl_dscp;
2605*5113495bSYour Name 
2606*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
2607*5113495bSYour Name }
2608*5113495bSYour Name 
2609*5113495bSYour Name QDF_STATUS
ucfg_dp_traffic_end_indication_set(struct wlan_objmgr_vdev * vdev,struct dp_traffic_end_indication info)2610*5113495bSYour Name ucfg_dp_traffic_end_indication_set(struct wlan_objmgr_vdev *vdev,
2611*5113495bSYour Name 				   struct dp_traffic_end_indication info)
2612*5113495bSYour Name {
2613*5113495bSYour Name 	struct wlan_dp_link *dp_link = dp_get_vdev_priv_obj(vdev);
2614*5113495bSYour Name 	struct wlan_dp_intf *dp_intf;
2615*5113495bSYour Name 	cdp_config_param_type vdev_param;
2616*5113495bSYour Name 
2617*5113495bSYour Name 	if (!dp_link) {
2618*5113495bSYour Name 		dp_err("Unable to get DP link");
2619*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
2620*5113495bSYour Name 	}
2621*5113495bSYour Name 
2622*5113495bSYour Name 	dp_intf = dp_link->dp_intf;
2623*5113495bSYour Name 	dp_intf->traffic_end_ind = info;
2624*5113495bSYour Name 
2625*5113495bSYour Name 	dp_debug("enabled:%u default dscp:%u special dscp:%u",
2626*5113495bSYour Name 		 dp_intf->traffic_end_ind.enabled,
2627*5113495bSYour Name 		 dp_intf->traffic_end_ind.def_dscp,
2628*5113495bSYour Name 		 dp_intf->traffic_end_ind.spl_dscp);
2629*5113495bSYour Name 
2630*5113495bSYour Name 	vdev_param.cdp_vdev_param_traffic_end_ind = info.enabled;
2631*5113495bSYour Name 	if (cdp_txrx_set_vdev_param(cds_get_context(QDF_MODULE_ID_SOC),
2632*5113495bSYour Name 				    dp_link->link_id,
2633*5113495bSYour Name 				    CDP_ENABLE_TRAFFIC_END_INDICATION,
2634*5113495bSYour Name 				    vdev_param))
2635*5113495bSYour Name 		dp_err("Failed to set traffic end indication param on DP vdev");
2636*5113495bSYour Name 
2637*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
2638*5113495bSYour Name }
2639*5113495bSYour Name 
ucfg_dp_traffic_end_indication_update_dscp(struct wlan_objmgr_psoc * psoc,uint8_t vdev_id,unsigned char * dscp)2640*5113495bSYour Name void ucfg_dp_traffic_end_indication_update_dscp(struct wlan_objmgr_psoc *psoc,
2641*5113495bSYour Name 						uint8_t vdev_id,
2642*5113495bSYour Name 						unsigned char *dscp)
2643*5113495bSYour Name {
2644*5113495bSYour Name 	struct wlan_objmgr_vdev *vdev;
2645*5113495bSYour Name 	struct wlan_dp_intf *dp_intf;
2646*5113495bSYour Name 	struct wlan_dp_link *dp_link;
2647*5113495bSYour Name 
2648*5113495bSYour Name 	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id, WLAN_DP_ID);
2649*5113495bSYour Name 	if (vdev) {
2650*5113495bSYour Name 		dp_link = dp_get_vdev_priv_obj(vdev);
2651*5113495bSYour Name 
2652*5113495bSYour Name 		if (!dp_link) {
2653*5113495bSYour Name 			dp_err("Unable to get DP link");
2654*5113495bSYour Name 			goto end;
2655*5113495bSYour Name 		}
2656*5113495bSYour Name 
2657*5113495bSYour Name 		dp_intf = dp_link->dp_intf;
2658*5113495bSYour Name 		if (!dp_intf->traffic_end_ind.enabled)
2659*5113495bSYour Name 			goto end;
2660*5113495bSYour Name 
2661*5113495bSYour Name 		if (*dscp == dp_intf->traffic_end_ind.spl_dscp)
2662*5113495bSYour Name 			*dscp = dp_intf->traffic_end_ind.def_dscp;
2663*5113495bSYour Name end:
2664*5113495bSYour Name 		wlan_objmgr_vdev_release_ref(vdev, WLAN_DP_ID);
2665*5113495bSYour Name 	}
2666*5113495bSYour Name }
2667*5113495bSYour Name #endif
2668*5113495bSYour Name 
ucfg_dp_prealloc_init(struct cdp_ctrl_objmgr_psoc * ctrl_psoc)2669*5113495bSYour Name QDF_STATUS ucfg_dp_prealloc_init(struct cdp_ctrl_objmgr_psoc *ctrl_psoc)
2670*5113495bSYour Name {
2671*5113495bSYour Name 	wlan_dp_select_profile_cfg((struct wlan_objmgr_psoc *)ctrl_psoc);
2672*5113495bSYour Name 	return dp_prealloc_init(ctrl_psoc);
2673*5113495bSYour Name }
2674*5113495bSYour Name 
ucfg_dp_prealloc_deinit(void)2675*5113495bSYour Name void ucfg_dp_prealloc_deinit(void)
2676*5113495bSYour Name {
2677*5113495bSYour Name 	dp_prealloc_deinit();
2678*5113495bSYour Name }
2679*5113495bSYour Name 
2680*5113495bSYour Name #ifdef DP_MEM_PRE_ALLOC
ucfg_dp_prealloc_get_consistent_mem_unaligned(qdf_size_t size,qdf_dma_addr_t * base_addr,uint32_t ring_type)2681*5113495bSYour Name void *ucfg_dp_prealloc_get_consistent_mem_unaligned(qdf_size_t size,
2682*5113495bSYour Name 						    qdf_dma_addr_t *base_addr,
2683*5113495bSYour Name 						    uint32_t ring_type)
2684*5113495bSYour Name {
2685*5113495bSYour Name 	return dp_prealloc_get_consistent_mem_unaligned(size, base_addr,
2686*5113495bSYour Name 							ring_type);
2687*5113495bSYour Name }
2688*5113495bSYour Name 
ucfg_dp_prealloc_put_consistent_mem_unaligned(void * va_unaligned)2689*5113495bSYour Name void ucfg_dp_prealloc_put_consistent_mem_unaligned(void *va_unaligned)
2690*5113495bSYour Name {
2691*5113495bSYour Name 	dp_prealloc_put_consistent_mem_unaligned(va_unaligned);
2692*5113495bSYour Name }
2693*5113495bSYour Name 
ucfg_dp_prealloc_get_multi_pages(uint32_t desc_type,qdf_size_t elem_size,uint16_t elem_num,struct qdf_mem_multi_page_t * pages,bool cacheable)2694*5113495bSYour Name void ucfg_dp_prealloc_get_multi_pages(uint32_t desc_type, qdf_size_t elem_size,
2695*5113495bSYour Name 				      uint16_t elem_num,
2696*5113495bSYour Name 				      struct qdf_mem_multi_page_t *pages,
2697*5113495bSYour Name 				      bool cacheable)
2698*5113495bSYour Name {
2699*5113495bSYour Name 	dp_prealloc_get_multi_pages(desc_type, elem_size, elem_num, pages,
2700*5113495bSYour Name 				    cacheable);
2701*5113495bSYour Name }
2702*5113495bSYour Name 
ucfg_dp_prealloc_put_multi_pages(uint32_t desc_type,struct qdf_mem_multi_page_t * pages)2703*5113495bSYour Name void ucfg_dp_prealloc_put_multi_pages(uint32_t desc_type,
2704*5113495bSYour Name 				      struct qdf_mem_multi_page_t *pages)
2705*5113495bSYour Name {
2706*5113495bSYour Name 	dp_prealloc_put_multi_pages(desc_type, pages);
2707*5113495bSYour Name }
2708*5113495bSYour Name #endif
2709*5113495bSYour Name 
2710*5113495bSYour Name #if defined(WLAN_SUPPORT_RX_FISA)
ucfg_dp_rx_skip_fisa(uint32_t value)2711*5113495bSYour Name void ucfg_dp_rx_skip_fisa(uint32_t value)
2712*5113495bSYour Name {
2713*5113495bSYour Name 	struct wlan_dp_psoc_context *dp_ctx;
2714*5113495bSYour Name 
2715*5113495bSYour Name 	dp_ctx = dp_get_context();
2716*5113495bSYour Name 
2717*5113495bSYour Name 	if (dp_ctx)
2718*5113495bSYour Name 		dp_rx_skip_fisa(dp_ctx, value);
2719*5113495bSYour Name }
2720*5113495bSYour Name #endif
2721*5113495bSYour Name 
2722*5113495bSYour Name #ifdef FEATURE_DIRECT_LINK
ucfg_dp_direct_link_init(struct wlan_objmgr_psoc * psoc)2723*5113495bSYour Name QDF_STATUS ucfg_dp_direct_link_init(struct wlan_objmgr_psoc *psoc)
2724*5113495bSYour Name {
2725*5113495bSYour Name 	struct wlan_dp_psoc_context *dp_ctx = dp_psoc_get_priv(psoc);
2726*5113495bSYour Name 
2727*5113495bSYour Name 	if (!dp_ctx) {
2728*5113495bSYour Name 		dp_err("DP context not found");
2729*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
2730*5113495bSYour Name 	}
2731*5113495bSYour Name 
2732*5113495bSYour Name 	return dp_direct_link_init(dp_ctx);
2733*5113495bSYour Name }
2734*5113495bSYour Name 
ucfg_dp_direct_link_deinit(struct wlan_objmgr_psoc * psoc,bool is_ssr)2735*5113495bSYour Name void ucfg_dp_direct_link_deinit(struct wlan_objmgr_psoc *psoc, bool is_ssr)
2736*5113495bSYour Name {
2737*5113495bSYour Name 	struct wlan_dp_psoc_context *dp_ctx = dp_psoc_get_priv(psoc);
2738*5113495bSYour Name 
2739*5113495bSYour Name 	if (!dp_ctx) {
2740*5113495bSYour Name 		dp_err("DP context not found");
2741*5113495bSYour Name 		return;
2742*5113495bSYour Name 	}
2743*5113495bSYour Name 
2744*5113495bSYour Name 	dp_direct_link_deinit(dp_ctx, is_ssr);
2745*5113495bSYour Name }
2746*5113495bSYour Name 
2747*5113495bSYour Name void
ucfg_dp_wfds_handle_request_mem_ind(struct wlan_qmi_wfds_mem_ind_msg * mem_msg)2748*5113495bSYour Name ucfg_dp_wfds_handle_request_mem_ind(struct wlan_qmi_wfds_mem_ind_msg *mem_msg)
2749*5113495bSYour Name {
2750*5113495bSYour Name 	dp_wfds_handle_request_mem_ind(mem_msg);
2751*5113495bSYour Name }
2752*5113495bSYour Name 
2753*5113495bSYour Name void
ucfg_dp_wfds_handle_ipcc_map_n_cfg_ind(struct wlan_qmi_wfds_ipcc_map_n_cfg_ind_msg * ipcc_msg)2754*5113495bSYour Name ucfg_dp_wfds_handle_ipcc_map_n_cfg_ind(struct wlan_qmi_wfds_ipcc_map_n_cfg_ind_msg *ipcc_msg)
2755*5113495bSYour Name {
2756*5113495bSYour Name 	dp_wfds_handle_ipcc_map_n_cfg_ind(ipcc_msg);
2757*5113495bSYour Name }
2758*5113495bSYour Name 
ucfg_dp_wfds_new_server(void)2759*5113495bSYour Name QDF_STATUS ucfg_dp_wfds_new_server(void)
2760*5113495bSYour Name {
2761*5113495bSYour Name 	return dp_wfds_new_server();
2762*5113495bSYour Name }
2763*5113495bSYour Name 
ucfg_dp_wfds_del_server(void)2764*5113495bSYour Name void ucfg_dp_wfds_del_server(void)
2765*5113495bSYour Name {
2766*5113495bSYour Name 	dp_wfds_del_server();
2767*5113495bSYour Name }
2768*5113495bSYour Name 
ucfg_dp_config_direct_link(qdf_netdev_t dev,bool config_direct_link,bool enable_low_latency)2769*5113495bSYour Name QDF_STATUS ucfg_dp_config_direct_link(qdf_netdev_t dev,
2770*5113495bSYour Name 				      bool config_direct_link,
2771*5113495bSYour Name 				      bool enable_low_latency)
2772*5113495bSYour Name {
2773*5113495bSYour Name 	struct wlan_dp_psoc_context *dp_ctx;
2774*5113495bSYour Name 	struct wlan_dp_intf *dp_intf;
2775*5113495bSYour Name 
2776*5113495bSYour Name 	dp_ctx = dp_get_context();
2777*5113495bSYour Name 	if (!dp_ctx)
2778*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
2779*5113495bSYour Name 
2780*5113495bSYour Name 	dp_intf = dp_get_intf_by_netdev(dp_ctx, dev);
2781*5113495bSYour Name 	if (!dp_intf) {
2782*5113495bSYour Name 		dp_err("Unable to get DP interface");
2783*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
2784*5113495bSYour Name 	}
2785*5113495bSYour Name 
2786*5113495bSYour Name 	return dp_config_direct_link(dp_intf, config_direct_link,
2787*5113495bSYour Name 				     enable_low_latency);
2788*5113495bSYour Name }
2789*5113495bSYour Name #endif
2790*5113495bSYour Name 
ucfg_dp_bus_suspend(ol_txrx_soc_handle soc,uint8_t pdev_id)2791*5113495bSYour Name QDF_STATUS ucfg_dp_bus_suspend(ol_txrx_soc_handle soc, uint8_t pdev_id)
2792*5113495bSYour Name {
2793*5113495bSYour Name 	return __wlan_dp_bus_suspend(soc, pdev_id);
2794*5113495bSYour Name }
2795*5113495bSYour Name 
ucfg_dp_bus_resume(ol_txrx_soc_handle soc,uint8_t pdev_id)2796*5113495bSYour Name QDF_STATUS ucfg_dp_bus_resume(ol_txrx_soc_handle soc, uint8_t pdev_id)
2797*5113495bSYour Name {
2798*5113495bSYour Name 	return __wlan_dp_bus_resume(soc, pdev_id);
2799*5113495bSYour Name }
2800*5113495bSYour Name 
ucfg_dp_txrx_soc_attach(struct dp_txrx_soc_attach_params * params,bool * is_wifi3_0_target)2801*5113495bSYour Name void *ucfg_dp_txrx_soc_attach(struct dp_txrx_soc_attach_params *params,
2802*5113495bSYour Name 			      bool *is_wifi3_0_target)
2803*5113495bSYour Name {
2804*5113495bSYour Name 	return wlan_dp_txrx_soc_attach(params, is_wifi3_0_target);
2805*5113495bSYour Name }
2806*5113495bSYour Name 
ucfg_dp_txrx_soc_detach(ol_txrx_soc_handle soc)2807*5113495bSYour Name void ucfg_dp_txrx_soc_detach(ol_txrx_soc_handle soc)
2808*5113495bSYour Name {
2809*5113495bSYour Name 	return wlan_dp_txrx_soc_detach(soc);
2810*5113495bSYour Name }
2811*5113495bSYour Name 
ucfg_dp_txrx_attach_target(ol_txrx_soc_handle soc,uint8_t pdev_id)2812*5113495bSYour Name QDF_STATUS ucfg_dp_txrx_attach_target(ol_txrx_soc_handle soc, uint8_t pdev_id)
2813*5113495bSYour Name {
2814*5113495bSYour Name 	return wlan_dp_txrx_attach_target(soc, pdev_id);
2815*5113495bSYour Name }
2816*5113495bSYour Name 
ucfg_dp_txrx_pdev_attach(ol_txrx_soc_handle soc)2817*5113495bSYour Name QDF_STATUS ucfg_dp_txrx_pdev_attach(ol_txrx_soc_handle soc)
2818*5113495bSYour Name {
2819*5113495bSYour Name 	return wlan_dp_txrx_pdev_attach(soc);
2820*5113495bSYour Name }
2821*5113495bSYour Name 
ucfg_dp_txrx_pdev_detach(ol_txrx_soc_handle soc,uint8_t pdev_id,int force)2822*5113495bSYour Name QDF_STATUS ucfg_dp_txrx_pdev_detach(ol_txrx_soc_handle soc, uint8_t pdev_id,
2823*5113495bSYour Name 				    int force)
2824*5113495bSYour Name {
2825*5113495bSYour Name 	return wlan_dp_txrx_pdev_detach(soc, pdev_id, force);
2826*5113495bSYour Name }
2827*5113495bSYour Name 
ucfg_dp_txrx_init(ol_txrx_soc_handle soc,uint8_t pdev_id,struct dp_txrx_config * config)2828*5113495bSYour Name QDF_STATUS ucfg_dp_txrx_init(ol_txrx_soc_handle soc, uint8_t pdev_id,
2829*5113495bSYour Name 			     struct dp_txrx_config *config)
2830*5113495bSYour Name {
2831*5113495bSYour Name 	return dp_txrx_init(soc, pdev_id, config);
2832*5113495bSYour Name }
2833*5113495bSYour Name 
ucfg_dp_txrx_deinit(ol_txrx_soc_handle soc)2834*5113495bSYour Name QDF_STATUS ucfg_dp_txrx_deinit(ol_txrx_soc_handle soc)
2835*5113495bSYour Name {
2836*5113495bSYour Name 	return dp_txrx_deinit(soc);
2837*5113495bSYour Name }
2838*5113495bSYour Name 
ucfg_dp_txrx_ext_dump_stats(ol_txrx_soc_handle soc,uint8_t stats_id)2839*5113495bSYour Name QDF_STATUS ucfg_dp_txrx_ext_dump_stats(ol_txrx_soc_handle soc,
2840*5113495bSYour Name 				       uint8_t stats_id)
2841*5113495bSYour Name {
2842*5113495bSYour Name 	return dp_txrx_ext_dump_stats(soc, stats_id);
2843*5113495bSYour Name }
2844*5113495bSYour Name 
ucfg_dp_txrx_set_cpu_mask(ol_txrx_soc_handle soc,qdf_cpu_mask * new_mask)2845*5113495bSYour Name QDF_STATUS ucfg_dp_txrx_set_cpu_mask(ol_txrx_soc_handle soc,
2846*5113495bSYour Name 				     qdf_cpu_mask *new_mask)
2847*5113495bSYour Name {
2848*5113495bSYour Name 	return dp_txrx_set_cpu_mask(soc, new_mask);
2849*5113495bSYour Name }
2850*5113495bSYour Name 
2851*5113495bSYour Name QDF_STATUS
ucfg_dp_get_per_link_peer_stats(ol_txrx_soc_handle soc,uint8_t vdev_id,uint8_t * peer_mac,struct cdp_peer_stats * peer_stats,enum cdp_peer_type peer_type,uint8_t num_link)2852*5113495bSYour Name ucfg_dp_get_per_link_peer_stats(ol_txrx_soc_handle soc, uint8_t vdev_id,
2853*5113495bSYour Name 				uint8_t *peer_mac,
2854*5113495bSYour Name 				struct cdp_peer_stats *peer_stats,
2855*5113495bSYour Name 				enum cdp_peer_type peer_type,
2856*5113495bSYour Name 				uint8_t num_link)
2857*5113495bSYour Name {
2858*5113495bSYour Name 	return cdp_host_get_per_link_peer_stats(soc, vdev_id, peer_mac,
2859*5113495bSYour Name 						peer_stats, peer_type,
2860*5113495bSYour Name 						num_link);
2861*5113495bSYour Name }
2862*5113495bSYour Name 
2863*5113495bSYour Name #ifdef WLAN_FEATURE_LOCAL_PKT_CAPTURE
ucfg_dp_is_local_pkt_capture_enabled(struct wlan_objmgr_psoc * psoc)2864*5113495bSYour Name bool ucfg_dp_is_local_pkt_capture_enabled(struct wlan_objmgr_psoc *psoc)
2865*5113495bSYour Name {
2866*5113495bSYour Name 	void *soc = cds_get_context(QDF_MODULE_ID_SOC);
2867*5113495bSYour Name 
2868*5113495bSYour Name 	return cdp_cfg_get(soc, cfg_dp_local_pkt_capture);
2869*5113495bSYour Name }
2870*5113495bSYour Name #endif
2871*5113495bSYour Name 
ucfg_dp_get_vdev_stats(ol_txrx_soc_handle soc,uint8_t vdev_id,struct cdp_vdev_stats * buf)2872*5113495bSYour Name QDF_STATUS ucfg_dp_get_vdev_stats(ol_txrx_soc_handle soc, uint8_t vdev_id,
2873*5113495bSYour Name 				  struct cdp_vdev_stats *buf)
2874*5113495bSYour Name {
2875*5113495bSYour Name 	return cdp_host_get_vdev_stats(soc, vdev_id, buf, true);
2876*5113495bSYour Name }
2877*5113495bSYour Name 
ucfg_dp_set_mon_conf_flags(struct wlan_objmgr_psoc * psoc,uint32_t flags)2878*5113495bSYour Name void ucfg_dp_set_mon_conf_flags(struct wlan_objmgr_psoc *psoc, uint32_t flags)
2879*5113495bSYour Name {
2880*5113495bSYour Name 	cdp_config_param_type val;
2881*5113495bSYour Name 	QDF_STATUS status;
2882*5113495bSYour Name 	struct wlan_dp_psoc_context *dp_ctx = dp_get_context();
2883*5113495bSYour Name 
2884*5113495bSYour Name 	if (!dp_ctx) {
2885*5113495bSYour Name 		dp_err("Failed to set flag %d, dp_ctx NULL", flags);
2886*5113495bSYour Name 		return;
2887*5113495bSYour Name 	}
2888*5113495bSYour Name 
2889*5113495bSYour Name 	val.cdp_monitor_flag = flags;
2890*5113495bSYour Name 	status = cdp_txrx_set_psoc_param(dp_ctx->cdp_soc,
2891*5113495bSYour Name 					 CDP_MONITOR_FLAG, val);
2892*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status))
2893*5113495bSYour Name 		dp_err("Failed to set flag %d status %d", flags, status);
2894*5113495bSYour Name }
2895