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