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, ¶ms);
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, ¶ms);
1100
1101 status = cdp_update_config_parameters(soc, ¶ms);
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