1 /*
2 * Copyright (c) 2017-2021 The Linux Foundation. All rights reserved.
3 * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
4 *
5 * Permission to use, copy, modify, and/or distribute this software for
6 * any purpose with or without fee is hereby granted, provided that the
7 * above copyright notice and this permission notice appear in all
8 * copies.
9 *
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17 * PERFORMANCE OF THIS SOFTWARE.
18 */
19
20 /**
21 * DOC: API for interacting with target interface.
22 *
23 */
24
25 #include "target_if.h"
26 #include "target_type.h"
27 #ifdef WLAN_ATF_ENABLE
28 #include "target_if_atf.h"
29 #endif
30 #ifdef WLAN_SA_API_ENABLE
31 #include "target_if_sa_api.h"
32 #endif
33 #ifdef WLAN_CFR_ENABLE
34 #include "target_if_cfr.h"
35 #endif
36 #ifdef WLAN_CONV_SPECTRAL_ENABLE
37 #include "target_if_spectral.h"
38 #endif
39
40 #ifdef WLAN_IOT_SIM_SUPPORT
41 #include <target_if_iot_sim.h>
42 #endif
43 #include <target_if_reg.h>
44 #include <target_if_scan.h>
45 #include <target_if_ftm.h>
46 #ifdef DFS_COMPONENT_ENABLE
47 #include <target_if_dfs.h>
48 #endif
49
50 #ifdef CONVERGED_P2P_ENABLE
51 #include "target_if_p2p.h"
52 #endif
53
54 #ifdef WIFI_POS_CONVERGED
55 #include "target_if_wifi_pos.h"
56 #include "target_if_wifi_pos_rx_ops.h"
57 #include "target_if_wifi_pos_tx_ops.h"
58 #endif
59
60 #ifdef FEATURE_WLAN_TDLS
61 #include "target_if_tdls.h"
62 #endif
63 #if defined(QCA_SUPPORT_SON) || defined(WLAN_FEATURE_SON)
64 #include <target_if_son.h>
65 #endif
66 #if defined WLAN_FEATURE_11AX
67 #include <target_if_spatial_reuse.h>
68 #endif
69 #ifdef WLAN_OFFCHAN_TXRX_ENABLE
70 #include <target_if_offchan_txrx_api.h>
71 #endif
72 #ifdef WLAN_SUPPORT_GREEN_AP
73 #include <target_if_green_ap.h>
74 #endif
75 #include <init_deinit_lmac.h>
76 #include <service_ready_util.h>
77
78 #ifdef DIRECT_BUF_RX_ENABLE
79 #include <target_if_direct_buf_rx_api.h>
80 #endif
81
82 #ifdef WLAN_SUPPORT_FILS
83 #include <target_if_fd.h>
84 #endif
85 #include "qdf_module.h"
86
87 #include <target_if_cp_stats.h>
88 #ifdef CRYPTO_SET_KEY_CONVERGED
89 #include <target_if_crypto.h>
90 #endif
91 #include <target_if_vdev_mgr_tx_ops.h>
92
93 #ifdef FEATURE_COEX
94 #include <target_if_coex.h>
95 #endif
96 #include <wlan_utility.h>
97
98 #ifdef DCS_INTERFERENCE_DETECTION
99 #include <target_if_dcs.h>
100 #endif
101
102 #include <target_if_gpio.h>
103 #ifdef IPA_OFFLOAD
104 #include <target_if_ipa.h>
105 #endif
106
107 #ifdef WLAN_MGMT_RX_REO_SUPPORT
108 #include <target_if_mgmt_txrx.h>
109 #endif /* WLAN_MGMT_RX_REO_SUPPORT */
110
111 #include "wmi_unified_api.h"
112 #include <target_if_twt.h>
113
114 #include <target_if_mlo_mgr.h>
115
116 #ifdef WLAN_FEATURE_COAP
117 #include <target_if_coap.h>
118 #endif
119
120 static struct target_if_ctx *g_target_if_ctx;
121
target_if_get_ctx(void)122 struct target_if_ctx *target_if_get_ctx(void)
123 {
124 return g_target_if_ctx;
125 }
126
target_if_get_psoc_from_scn_hdl(void * scn_handle)127 struct wlan_objmgr_psoc *target_if_get_psoc_from_scn_hdl(void *scn_handle)
128 {
129 struct wlan_objmgr_psoc *psoc;
130
131 qdf_spin_lock_bh(&g_target_if_ctx->lock);
132 if (scn_handle && g_target_if_ctx->get_psoc_hdl_cb)
133 psoc = g_target_if_ctx->get_psoc_hdl_cb(scn_handle);
134 else
135 psoc = NULL;
136 qdf_spin_unlock_bh(&g_target_if_ctx->lock);
137
138 return psoc;
139 }
140
target_if_get_pdev_from_scn_hdl(void * scn_handle)141 struct wlan_objmgr_pdev *target_if_get_pdev_from_scn_hdl(void *scn_handle)
142 {
143 struct wlan_objmgr_pdev *pdev;
144
145 qdf_spin_lock_bh(&g_target_if_ctx->lock);
146 if (scn_handle && g_target_if_ctx->get_pdev_hdl_cb)
147 pdev = g_target_if_ctx->get_pdev_hdl_cb(scn_handle);
148 else
149 pdev = NULL;
150 qdf_spin_unlock_bh(&g_target_if_ctx->lock);
151
152 return pdev;
153 }
154
155 #ifdef DIRECT_BUF_RX_ENABLE
target_if_direct_buf_rx_init(void)156 static QDF_STATUS target_if_direct_buf_rx_init(void)
157 {
158 return direct_buf_rx_init();
159 }
160
target_if_direct_buf_rx_deinit(void)161 static QDF_STATUS target_if_direct_buf_rx_deinit(void)
162 {
163 return direct_buf_rx_deinit();
164 }
165 #else
target_if_direct_buf_rx_init(void)166 static QDF_STATUS target_if_direct_buf_rx_init(void)
167 {
168 return QDF_STATUS_SUCCESS;
169 }
170
target_if_direct_buf_rx_deinit(void)171 static QDF_STATUS target_if_direct_buf_rx_deinit(void)
172 {
173 return QDF_STATUS_SUCCESS;
174 }
175 #endif /* DIRECT_BUF_RX_ENABLE */
176
target_if_init(get_psoc_handle_callback psoc_hdl_cb)177 QDF_STATUS target_if_init(get_psoc_handle_callback psoc_hdl_cb)
178 {
179 g_target_if_ctx = qdf_mem_malloc(sizeof(*g_target_if_ctx));
180 if (!g_target_if_ctx) {
181 QDF_ASSERT(0);
182 return QDF_STATUS_E_NOMEM;
183 }
184
185 qdf_spinlock_create(&g_target_if_ctx->lock);
186
187 qdf_spin_lock_bh(&g_target_if_ctx->lock);
188 g_target_if_ctx->magic = TGT_MAGIC;
189 g_target_if_ctx->get_psoc_hdl_cb = psoc_hdl_cb;
190 qdf_spin_unlock_bh(&g_target_if_ctx->lock);
191
192 target_if_direct_buf_rx_init();
193
194 return QDF_STATUS_SUCCESS;
195 }
196
target_if_deinit(void)197 QDF_STATUS target_if_deinit(void)
198 {
199 if (!g_target_if_ctx) {
200 QDF_ASSERT(0);
201 target_if_err("target if ctx is null");
202 return QDF_STATUS_E_INVAL;
203 }
204
205 qdf_spin_lock_bh(&g_target_if_ctx->lock);
206 g_target_if_ctx->magic = 0;
207 g_target_if_ctx->get_psoc_hdl_cb = NULL;
208 g_target_if_ctx->get_pdev_hdl_cb = NULL;
209 g_target_if_ctx->service_ready_cb = NULL;
210 qdf_spin_unlock_bh(&g_target_if_ctx->lock);
211
212 qdf_spinlock_destroy(&g_target_if_ctx->lock);
213 qdf_mem_free(g_target_if_ctx);
214 g_target_if_ctx = NULL;
215
216 target_if_direct_buf_rx_deinit();
217
218 return QDF_STATUS_SUCCESS;
219 }
220
221 qdf_export_symbol(target_if_deinit);
222
target_if_store_pdev_target_if_ctx(get_pdev_handle_callback pdev_hdl_cb)223 QDF_STATUS target_if_store_pdev_target_if_ctx(
224 get_pdev_handle_callback pdev_hdl_cb)
225 {
226 if (!g_target_if_ctx) {
227 QDF_ASSERT(0);
228 target_if_err("target if ctx is null");
229 return QDF_STATUS_E_INVAL;
230 }
231
232 qdf_spin_lock_bh(&g_target_if_ctx->lock);
233 g_target_if_ctx->get_pdev_hdl_cb = pdev_hdl_cb;
234 qdf_spin_unlock_bh(&g_target_if_ctx->lock);
235
236 return QDF_STATUS_SUCCESS;
237 }
238
239 #ifndef WLAN_OFFCHAN_TXRX_ENABLE
target_if_offchan_txrx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)240 static void target_if_offchan_txrx_ops_register(
241 struct wlan_lmac_if_tx_ops *tx_ops)
242 {
243 }
244 #endif /* WLAN_OFFCHAN_TXRX_ENABLE */
245
246 #ifndef WLAN_ATF_ENABLE
target_if_atf_tx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)247 static void target_if_atf_tx_ops_register(struct wlan_lmac_if_tx_ops *tx_ops)
248 {
249 }
250 #endif /* WLAN_ATF_ENABLE */
251
252 #ifndef WLAN_SA_API_ENABLE
target_if_sa_api_tx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)253 static void target_if_sa_api_tx_ops_register(struct wlan_lmac_if_tx_ops *tx_ops)
254 {
255 }
256 #endif /* WLAN_SA_API_ENABLE */
257
258 #ifndef WLAN_CFR_ENABLE
target_if_cfr_tx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)259 static void target_if_cfr_tx_ops_register(struct wlan_lmac_if_tx_ops *tx_ops)
260 {
261 }
262 #endif
263
264 #ifdef WLAN_SUPPORT_FILS
target_if_fd_tx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)265 static void target_if_fd_tx_ops_register(struct wlan_lmac_if_tx_ops *tx_ops)
266 {
267 target_if_fd_register_tx_ops(tx_ops);
268 }
269 #else
target_if_fd_tx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)270 static void target_if_fd_tx_ops_register(struct wlan_lmac_if_tx_ops *tx_ops)
271 {
272 }
273 #endif
274
275 #ifdef WIFI_POS_CONVERGED
276 static void
target_if_wifi_pos_tx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)277 target_if_wifi_pos_tx_ops_register(struct wlan_lmac_if_tx_ops *tx_ops)
278 {
279 target_if_wifi_pos_register_tx_ops(tx_ops);
280 }
281 #else
282 static void
target_if_wifi_pos_tx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)283 target_if_wifi_pos_tx_ops_register(struct wlan_lmac_if_tx_ops *tx_ops)
284 {
285 }
286 #endif
287
288 #if defined(QCA_SUPPORT_SON) || defined(WLAN_FEATURE_SON)
target_if_son_tx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)289 static void target_if_son_tx_ops_register(
290 struct wlan_lmac_if_tx_ops *tx_ops)
291 {
292 target_if_son_register_tx_ops(tx_ops);
293 return;
294 }
295 #else
target_if_son_tx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)296 static void target_if_son_tx_ops_register(
297 struct wlan_lmac_if_tx_ops *tx_ops)
298 {
299 return;
300 }
301 #endif
302
303 #if defined WLAN_FEATURE_SR
target_if_spatial_reuse_tx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)304 static void target_if_spatial_reuse_tx_ops_register(
305 struct wlan_lmac_if_tx_ops *tx_ops)
306 {
307 target_if_spatial_reuse_register_tx_ops(tx_ops);
308 }
309
310 #else
target_if_spatial_reuse_tx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)311 static void target_if_spatial_reuse_tx_ops_register(
312 struct wlan_lmac_if_tx_ops *tx_ops)
313 {
314 }
315
316 #endif
317
318 #ifdef FEATURE_WLAN_TDLS
target_if_tdls_tx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)319 static void target_if_tdls_tx_ops_register(struct wlan_lmac_if_tx_ops *tx_ops)
320 {
321 target_if_tdls_register_tx_ops(tx_ops);
322 }
323 #else
target_if_tdls_tx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)324 static void target_if_tdls_tx_ops_register(struct wlan_lmac_if_tx_ops *tx_ops)
325 {
326 }
327 #endif /* FEATURE_WLAN_TDLS */
328
329 #ifdef DFS_COMPONENT_ENABLE
target_if_dfs_tx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)330 static void target_if_dfs_tx_ops_register(
331 struct wlan_lmac_if_tx_ops *tx_ops)
332 {
333 target_if_register_dfs_tx_ops(tx_ops);
334 }
335 #else
target_if_dfs_tx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)336 static void target_if_dfs_tx_ops_register(
337 struct wlan_lmac_if_tx_ops *tx_ops)
338 {
339 }
340 #endif /* DFS_COMPONENT_ENABLE */
341
342 #ifdef WLAN_CONV_SPECTRAL_ENABLE
target_if_sptrl_tx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)343 static void target_if_sptrl_tx_ops_register(
344 struct wlan_lmac_if_tx_ops *tx_ops)
345 {
346 target_if_sptrl_register_tx_ops(tx_ops);
347 }
348 #else
target_if_sptrl_tx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)349 static void target_if_sptrl_tx_ops_register(
350 struct wlan_lmac_if_tx_ops *tx_ops)
351 {
352 }
353 #endif /* WLAN_CONV_SPECTRAL_ENABLE */
354
355 #ifdef WLAN_IOT_SIM_SUPPORT
target_if_iot_sim_tx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)356 static void target_if_iot_sim_tx_ops_register(
357 struct wlan_lmac_if_tx_ops *tx_ops)
358 {
359 target_if_iot_sim_register_tx_ops(tx_ops);
360 }
361 #else
target_if_iot_sim_tx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)362 static void target_if_iot_sim_tx_ops_register(
363 struct wlan_lmac_if_tx_ops *tx_ops)
364 {
365 }
366 #endif
367
368 #ifdef DIRECT_BUF_RX_ENABLE
target_if_direct_buf_rx_tx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)369 static void target_if_direct_buf_rx_tx_ops_register(
370 struct wlan_lmac_if_tx_ops *tx_ops)
371 {
372 target_if_direct_buf_rx_register_tx_ops(tx_ops);
373 }
374 #else
target_if_direct_buf_rx_tx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)375 static void target_if_direct_buf_rx_tx_ops_register(
376 struct wlan_lmac_if_tx_ops *tx_ops)
377 {
378 }
379 #endif /* DIRECT_BUF_RX_ENABLE */
380
381 #ifdef WLAN_SUPPORT_GREEN_AP
target_if_green_ap_tx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)382 static QDF_STATUS target_if_green_ap_tx_ops_register(
383 struct wlan_lmac_if_tx_ops *tx_ops)
384 {
385 return target_if_register_green_ap_tx_ops(tx_ops);
386 }
387 #else
target_if_green_ap_tx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)388 static QDF_STATUS target_if_green_ap_tx_ops_register(
389 struct wlan_lmac_if_tx_ops *tx_ops)
390 {
391 return QDF_STATUS_SUCCESS;
392 }
393 #endif /* WLAN_SUPPORT_GREEN_AP */
394 #if defined(CRYPTO_SET_KEY_CONVERGED)
target_if_crypto_tx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)395 static void target_if_crypto_tx_ops_register(
396 struct wlan_lmac_if_tx_ops *tx_ops)
397 {
398 target_if_crypto_register_tx_ops(tx_ops);
399 }
400 #else
target_if_crypto_tx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)401 static inline void target_if_crypto_tx_ops_register(
402 struct wlan_lmac_if_tx_ops *tx_ops)
403 {
404 }
405 #endif
406
407 #ifdef FEATURE_COEX
408 static QDF_STATUS
target_if_coex_tx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)409 target_if_coex_tx_ops_register(struct wlan_lmac_if_tx_ops *tx_ops)
410 {
411 return target_if_coex_register_tx_ops(tx_ops);
412 }
413 #else
414 static inline QDF_STATUS
target_if_coex_tx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)415 target_if_coex_tx_ops_register(struct wlan_lmac_if_tx_ops *tx_ops)
416 {
417 return QDF_STATUS_SUCCESS;
418 }
419 #endif
420
421 #ifdef WLAN_FEATURE_DBAM_CONFIG
422 static QDF_STATUS
target_if_dbam_tx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)423 target_if_dbam_tx_ops_register(struct wlan_lmac_if_tx_ops *tx_ops)
424 {
425 return target_if_dbam_register_tx_ops(tx_ops);
426 }
427 #else
428 static inline QDF_STATUS
target_if_dbam_tx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)429 target_if_dbam_tx_ops_register(struct wlan_lmac_if_tx_ops *tx_ops)
430 {
431 return QDF_STATUS_SUCCESS;
432 }
433 #endif
434
435 #ifdef WLAN_FEATURE_COAP
436 static QDF_STATUS
target_if_coap_tx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)437 target_if_coap_tx_ops_register(struct wlan_lmac_if_tx_ops *tx_ops)
438 {
439 return target_if_coap_register_tx_ops(tx_ops);
440 }
441 #else
442 static inline QDF_STATUS
target_if_coap_tx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)443 target_if_coap_tx_ops_register(struct wlan_lmac_if_tx_ops *tx_ops)
444 {
445 return QDF_STATUS_SUCCESS;
446 }
447 #endif
448
target_if_target_tx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)449 static void target_if_target_tx_ops_register(
450 struct wlan_lmac_if_tx_ops *tx_ops)
451 {
452 struct wlan_lmac_if_target_tx_ops *target_tx_ops;
453
454 if (!tx_ops) {
455 target_if_err("invalid tx_ops");
456 return;
457 }
458
459 target_tx_ops = &tx_ops->target_tx_ops;
460
461 target_tx_ops->tgt_is_tgt_type_ar900b =
462 target_is_tgt_type_ar900b;
463
464 target_tx_ops->tgt_is_tgt_type_qca9984 =
465 target_is_tgt_type_qca9984;
466
467 target_tx_ops->tgt_is_tgt_type_qca9888 =
468 target_is_tgt_type_qca9888;
469
470 target_tx_ops->tgt_is_tgt_type_adrastea =
471 target_is_tgt_type_adrastea;
472
473 target_tx_ops->tgt_is_tgt_type_qcn9000 =
474 target_is_tgt_type_qcn9000;
475
476 target_tx_ops->tgt_is_tgt_type_qcn6122 =
477 target_is_tgt_type_qcn6122;
478
479 target_tx_ops->tgt_is_tgt_type_qcn9160 =
480 target_is_tgt_type_qcn9160;
481
482 target_tx_ops->tgt_is_tgt_type_qcn6432 =
483 target_is_tgt_type_qcn6432;
484
485 target_tx_ops->tgt_is_tgt_type_qcn7605 =
486 target_is_tgt_type_qcn7605;
487
488 target_tx_ops->tgt_get_tgt_type =
489 lmac_get_tgt_type;
490
491 target_tx_ops->tgt_get_tgt_version =
492 lmac_get_tgt_version;
493
494 target_tx_ops->tgt_get_tgt_revision =
495 lmac_get_tgt_revision;
496 }
497
498 static QDF_STATUS
target_if_cp_stats_tx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)499 target_if_cp_stats_tx_ops_register(struct wlan_lmac_if_tx_ops *tx_ops)
500 {
501 return target_if_cp_stats_register_tx_ops(tx_ops);
502 }
503
504 #ifdef DCS_INTERFERENCE_DETECTION
505 static QDF_STATUS
target_if_dcs_tx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)506 target_if_dcs_tx_ops_register(struct wlan_lmac_if_tx_ops *tx_ops)
507 {
508 return target_if_dcs_register_tx_ops(tx_ops);
509 }
510 #else
511 static QDF_STATUS
target_if_dcs_tx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)512 target_if_dcs_tx_ops_register(struct wlan_lmac_if_tx_ops *tx_ops)
513 {
514 return QDF_STATUS_SUCCESS;
515 }
516 #endif
517
518 static QDF_STATUS
target_if_vdev_mgr_tx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)519 target_if_vdev_mgr_tx_ops_register(struct wlan_lmac_if_tx_ops *tx_ops)
520 {
521 return target_if_vdev_mgr_register_tx_ops(tx_ops);
522 }
523
524 #ifdef QCA_WIFI_FTM
525 static
target_if_ftm_tx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)526 void target_if_ftm_tx_ops_register(struct wlan_lmac_if_tx_ops *tx_ops)
527 {
528 target_if_ftm_register_tx_ops(tx_ops);
529 }
530 #else
531 static
target_if_ftm_tx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)532 void target_if_ftm_tx_ops_register(struct wlan_lmac_if_tx_ops *tx_ops)
533 {
534 }
535 #endif
536
537 #ifdef WLAN_FEATURE_GPIO_CFG
538 static
target_if_gpio_tx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)539 void target_if_gpio_tx_ops_register(struct wlan_lmac_if_tx_ops *tx_ops)
540 {
541 target_if_gpio_register_tx_ops(tx_ops);
542 }
543 #else
544 static
target_if_gpio_tx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)545 void target_if_gpio_tx_ops_register(struct wlan_lmac_if_tx_ops *tx_ops)
546 {
547 }
548 #endif
549
550 #ifdef WLAN_MGMT_RX_REO_SUPPORT
551 static
target_if_mgmt_txrx_register_tx_ops(struct wlan_lmac_if_tx_ops * tx_ops)552 void target_if_mgmt_txrx_register_tx_ops(struct wlan_lmac_if_tx_ops *tx_ops)
553 {
554 target_if_mgmt_txrx_tx_ops_register(tx_ops);
555 }
556 #else
557 static
target_if_mgmt_txrx_register_tx_ops(struct wlan_lmac_if_tx_ops * tx_ops)558 void target_if_mgmt_txrx_register_tx_ops(struct wlan_lmac_if_tx_ops *tx_ops)
559 {
560 }
561 #endif /* WLAN_MGMT_RX_REO_SUPPORT */
562
563 #ifdef WLAN_FEATURE_11BE_MLO
564 static QDF_STATUS
target_if_mlo_tx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)565 target_if_mlo_tx_ops_register(struct wlan_lmac_if_tx_ops *tx_ops)
566 {
567 return target_if_mlo_register_tx_ops(tx_ops);
568 }
569 #else
570 static QDF_STATUS
target_if_mlo_tx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)571 target_if_mlo_tx_ops_register(struct wlan_lmac_if_tx_ops *tx_ops)
572 {
573 return QDF_STATUS_SUCCESS;
574 }
575 #endif
576
577 #ifdef IPA_OFFLOAD
target_if_ipa_tx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)578 static void target_if_ipa_tx_ops_register(struct wlan_lmac_if_tx_ops *tx_ops)
579 {
580 target_if_ipa_register_tx_ops(tx_ops);
581 }
582 #else
target_if_ipa_tx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)583 static void target_if_ipa_tx_ops_register(struct wlan_lmac_if_tx_ops *tx_ops)
584 { }
585 #endif
586
587 #if defined(WLAN_SUPPORT_TWT) && defined(WLAN_TWT_CONV_SUPPORTED)
588 static
target_if_twt_tx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)589 void target_if_twt_tx_ops_register(struct wlan_lmac_if_tx_ops *tx_ops)
590 {
591 target_if_twt_register_tx_ops(tx_ops);
592 }
593 #else
594 static
target_if_twt_tx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)595 void target_if_twt_tx_ops_register(struct wlan_lmac_if_tx_ops *tx_ops)
596 {
597 }
598 #endif /* WLAN_SUPPORT_TWT && WLAN_TWT_CONV_SUPPORTED */
599
600 static
target_if_register_umac_tx_ops(struct wlan_lmac_if_tx_ops * tx_ops)601 QDF_STATUS target_if_register_umac_tx_ops(struct wlan_lmac_if_tx_ops *tx_ops)
602 {
603 /* call regulatory callback to register tx ops */
604 target_if_register_regulatory_tx_ops(tx_ops);
605
606 /* call umac callback to register legacy tx ops */
607 wlan_lmac_if_umac_tx_ops_register(tx_ops);
608
609 /* Register scan tx ops */
610 target_if_scan_tx_ops_register(tx_ops);
611
612 target_if_atf_tx_ops_register(tx_ops);
613
614 target_if_sa_api_tx_ops_register(tx_ops);
615
616 target_if_cfr_tx_ops_register(tx_ops);
617
618 target_if_wifi_pos_tx_ops_register(tx_ops);
619
620 target_if_dfs_tx_ops_register(tx_ops);
621
622 target_if_son_tx_ops_register(tx_ops);
623
624 target_if_spatial_reuse_tx_ops_register(tx_ops);
625
626 target_if_tdls_tx_ops_register(tx_ops);
627
628 target_if_fd_tx_ops_register(tx_ops);
629
630 target_if_target_tx_ops_register(tx_ops);
631
632 target_if_offchan_txrx_ops_register(tx_ops);
633
634 target_if_green_ap_tx_ops_register(tx_ops);
635
636 target_if_ftm_tx_ops_register(tx_ops);
637
638 target_if_cp_stats_tx_ops_register(tx_ops);
639
640 target_if_dcs_tx_ops_register(tx_ops);
641
642 target_if_crypto_tx_ops_register(tx_ops);
643
644 target_if_vdev_mgr_tx_ops_register(tx_ops);
645
646 target_if_coex_tx_ops_register(tx_ops);
647
648 target_if_gpio_tx_ops_register(tx_ops);
649
650 target_if_mgmt_txrx_register_tx_ops(tx_ops);
651
652 target_if_mlo_tx_ops_register(tx_ops);
653
654 target_if_ipa_tx_ops_register(tx_ops);
655
656 target_if_twt_tx_ops_register(tx_ops);
657
658 target_if_dbam_tx_ops_register(tx_ops);
659
660 target_if_coap_tx_ops_register(tx_ops);
661
662 /* Converged UMAC components to register their TX-ops here */
663 return QDF_STATUS_SUCCESS;
664 }
665
target_if_register_tx_ops(struct wlan_lmac_if_tx_ops * tx_ops)666 QDF_STATUS target_if_register_tx_ops(struct wlan_lmac_if_tx_ops *tx_ops)
667 {
668 /* Converged UMAC components to register their TX-ops */
669 target_if_register_umac_tx_ops(tx_ops);
670
671 /* Components parallel to UMAC to register their TX-ops here */
672 target_if_sptrl_tx_ops_register(tx_ops);
673
674 target_if_iot_sim_tx_ops_register(tx_ops);
675
676 /* Register direct buffer rx component tx ops here */
677 target_if_direct_buf_rx_tx_ops_register(tx_ops);
678
679 #ifdef CONVERGED_P2P_ENABLE
680 /* Converged UMAC components to register P2P TX-ops */
681 target_if_p2p_register_tx_ops(tx_ops);
682 #endif
683
684 return QDF_STATUS_SUCCESS;
685 }
686 qdf_export_symbol(target_if_register_tx_ops);
687
688 wmi_legacy_service_ready_callback
target_if_get_psoc_legacy_service_ready_cb(void)689 target_if_get_psoc_legacy_service_ready_cb(void)
690 {
691 wmi_legacy_service_ready_callback service_ready_cb;
692
693 qdf_spin_lock_bh(&g_target_if_ctx->lock);
694 if (g_target_if_ctx->service_ready_cb)
695 service_ready_cb = g_target_if_ctx->service_ready_cb;
696 else
697 service_ready_cb = NULL;
698 qdf_spin_unlock_bh(&g_target_if_ctx->lock);
699
700 return service_ready_cb;
701 }
702 qdf_export_symbol(target_if_get_psoc_legacy_service_ready_cb);
703
target_if_register_legacy_service_ready_cb(wmi_legacy_service_ready_callback service_ready_cb)704 QDF_STATUS target_if_register_legacy_service_ready_cb(
705 wmi_legacy_service_ready_callback service_ready_cb)
706 {
707 qdf_spin_lock_bh(&g_target_if_ctx->lock);
708 g_target_if_ctx->service_ready_cb = service_ready_cb;
709 qdf_spin_unlock_bh(&g_target_if_ctx->lock);
710
711 return QDF_STATUS_SUCCESS;
712 }
713 qdf_export_symbol(target_if_register_legacy_service_ready_cb);
714
target_if_alloc_pdev_tgt_info(struct wlan_objmgr_pdev * pdev)715 QDF_STATUS target_if_alloc_pdev_tgt_info(struct wlan_objmgr_pdev *pdev)
716 {
717 struct target_pdev_info *tgt_pdev_info;
718
719 if (!pdev) {
720 target_if_err("pdev is null");
721 return QDF_STATUS_E_INVAL;
722 }
723
724 tgt_pdev_info = qdf_mem_malloc(sizeof(*tgt_pdev_info));
725
726 if (!tgt_pdev_info)
727 return QDF_STATUS_E_NOMEM;
728
729 wlan_pdev_set_tgt_if_handle(pdev, tgt_pdev_info);
730
731 return QDF_STATUS_SUCCESS;
732 }
733
target_if_free_pdev_tgt_info(struct wlan_objmgr_pdev * pdev)734 QDF_STATUS target_if_free_pdev_tgt_info(struct wlan_objmgr_pdev *pdev)
735 {
736 struct target_pdev_info *tgt_pdev_info;
737
738 if (!pdev) {
739 target_if_err("pdev is null");
740 return QDF_STATUS_E_INVAL;
741 }
742
743 tgt_pdev_info = wlan_pdev_get_tgt_if_handle(pdev);
744
745 wlan_pdev_set_tgt_if_handle(pdev, NULL);
746
747 qdf_mem_free(tgt_pdev_info);
748
749 return QDF_STATUS_SUCCESS;
750 }
751
target_if_alloc_psoc_tgt_info(struct wlan_objmgr_psoc * psoc)752 QDF_STATUS target_if_alloc_psoc_tgt_info(struct wlan_objmgr_psoc *psoc)
753 {
754 struct target_psoc_info *tgt_psoc_info;
755
756 if (!psoc) {
757 target_if_err("psoc is null");
758 return QDF_STATUS_E_INVAL;
759 }
760
761 tgt_psoc_info = qdf_mem_malloc(sizeof(*tgt_psoc_info));
762
763 if (!tgt_psoc_info)
764 return QDF_STATUS_E_NOMEM;
765
766 wlan_psoc_set_tgt_if_handle(psoc, tgt_psoc_info);
767 target_psoc_set_preferred_hw_mode(tgt_psoc_info, WMI_HOST_HW_MODE_MAX);
768 wlan_minidump_log(tgt_psoc_info,
769 sizeof(*tgt_psoc_info), psoc,
770 WLAN_MD_OBJMGR_PSOC_TGT_INFO, "target_psoc_info");
771
772 qdf_event_create(&tgt_psoc_info->info.event);
773
774 return QDF_STATUS_SUCCESS;
775 }
776
target_if_psoc_tgt_info_mem_free(struct target_psoc_info * tgt_psoc_info)777 QDF_STATUS target_if_psoc_tgt_info_mem_free(
778 struct target_psoc_info *tgt_psoc_info)
779 {
780 struct wlan_psoc_host_service_ext_param *ext_param;
781
782 if (!tgt_psoc_info) {
783 target_if_err("tgt_psoc_info is NULL");
784 return QDF_STATUS_E_INVAL;
785 }
786
787 /* reminder to move this into init_deinit_chainmask_table_free */
788 ext_param = target_psoc_get_service_ext_param(tgt_psoc_info);
789 if (ext_param)
790 init_deinit_chainmask_table_free(ext_param);
791
792 init_deinit_dbr_ring_cap_free(tgt_psoc_info);
793 init_deinit_spectral_scaling_params_free(tgt_psoc_info);
794 init_deinit_scan_radio_cap_free(tgt_psoc_info);
795 init_deinit_msdu_idx_qtype_map_free(tgt_psoc_info);
796 init_deinit_aux_dev_cap_free(tgt_psoc_info);
797 init_deinit_rcc_aoa_cap_ext2_free(tgt_psoc_info);
798
799 return QDF_STATUS_SUCCESS;
800 }
801
target_if_free_psoc_tgt_info(struct wlan_objmgr_psoc * psoc)802 QDF_STATUS target_if_free_psoc_tgt_info(struct wlan_objmgr_psoc *psoc)
803 {
804 struct target_psoc_info *tgt_psoc_info;
805
806 if (!psoc) {
807 target_if_err("psoc is null");
808 return QDF_STATUS_E_INVAL;
809 }
810
811 tgt_psoc_info = wlan_psoc_get_tgt_if_handle(psoc);
812
813 target_if_psoc_tgt_info_mem_free(tgt_psoc_info);
814 qdf_event_destroy(&tgt_psoc_info->info.event);
815
816 wlan_psoc_set_tgt_if_handle(psoc, NULL);
817
818 wlan_minidump_remove(tgt_psoc_info,
819 sizeof(*tgt_psoc_info), psoc,
820 WLAN_MD_OBJMGR_PSOC_TGT_INFO, "target_psoc_info");
821 qdf_mem_free(tgt_psoc_info);
822
823 return QDF_STATUS_SUCCESS;
824 }
825
target_is_tgt_type_ar900b(uint32_t target_type)826 bool target_is_tgt_type_ar900b(uint32_t target_type)
827 {
828 return target_type == TARGET_TYPE_AR900B;
829 }
830
target_is_tgt_type_qca9984(uint32_t target_type)831 bool target_is_tgt_type_qca9984(uint32_t target_type)
832 {
833 return target_type == TARGET_TYPE_QCA9984;
834 }
835
target_is_tgt_type_qca9888(uint32_t target_type)836 bool target_is_tgt_type_qca9888(uint32_t target_type)
837 {
838 return target_type == TARGET_TYPE_QCA9888;
839 }
840
target_is_tgt_type_adrastea(uint32_t target_type)841 bool target_is_tgt_type_adrastea(uint32_t target_type)
842 {
843 return target_type == TARGET_TYPE_ADRASTEA;
844 }
845
target_is_tgt_type_qcn9000(uint32_t target_type)846 bool target_is_tgt_type_qcn9000(uint32_t target_type)
847 {
848 return target_type == TARGET_TYPE_QCN9000;
849 }
850
target_is_tgt_type_qcn6122(uint32_t target_type)851 bool target_is_tgt_type_qcn6122(uint32_t target_type)
852 {
853 return target_type == TARGET_TYPE_QCN6122;
854 }
855
target_is_tgt_type_qcn9160(uint32_t target_type)856 bool target_is_tgt_type_qcn9160(uint32_t target_type)
857 {
858 return target_type == TARGET_TYPE_QCN9160;
859 }
860
target_is_tgt_type_qcn6432(uint32_t target_type)861 bool target_is_tgt_type_qcn6432(uint32_t target_type)
862 {
863 return target_type == TARGET_TYPE_QCN6432;
864 }
865
target_is_tgt_type_qcn7605(uint32_t target_type)866 bool target_is_tgt_type_qcn7605(uint32_t target_type)
867 {
868 return target_type == TARGET_TYPE_QCN7605;
869 }
870
871 QDF_STATUS
target_pdev_is_scan_radio_supported(struct wlan_objmgr_pdev * pdev,bool * is_scan_radio_supported)872 target_pdev_is_scan_radio_supported(struct wlan_objmgr_pdev *pdev,
873 bool *is_scan_radio_supported)
874 {
875 struct wlan_objmgr_psoc *psoc;
876 struct wlan_psoc_host_scan_radio_caps *scan_radio_caps;
877 uint8_t cap_idx;
878 uint32_t num_scan_radio_caps;
879 int32_t phy_id;
880 struct target_psoc_info *tgt_psoc_info;
881 struct target_pdev_info *tgt_pdev;
882 uint32_t target_type = TARGET_TYPE_UNKNOWN;
883 struct wlan_lmac_if_target_tx_ops *target_type_tx_ops;
884 struct wlan_lmac_if_tx_ops *tx_ops;
885
886 if (!is_scan_radio_supported) {
887 target_if_err("input argument is null");
888 return QDF_STATUS_E_INVAL;
889 }
890 *is_scan_radio_supported = false;
891
892 if (!pdev) {
893 target_if_err("pdev is null");
894 return QDF_STATUS_E_INVAL;
895 }
896
897 psoc = wlan_pdev_get_psoc(pdev);
898 if (!psoc) {
899 target_if_err("psoc is null");
900 return QDF_STATUS_E_INVAL;
901 }
902
903 tgt_psoc_info = wlan_psoc_get_tgt_if_handle(psoc);
904 if (!tgt_psoc_info) {
905 target_if_err("target_psoc_info is null");
906 return QDF_STATUS_E_INVAL;
907 }
908
909 tx_ops = wlan_psoc_get_lmac_if_txops(psoc);
910 if (!tx_ops) {
911 target_if_err("tx_ops is null");
912 return QDF_STATUS_E_NULL_VALUE;
913 }
914
915 target_type_tx_ops = &tx_ops->target_tx_ops;
916 if (target_type_tx_ops->tgt_get_tgt_type)
917 target_type = target_type_tx_ops->tgt_get_tgt_type(psoc);
918
919 if (target_type == TARGET_TYPE_AR9888) {
920 *is_scan_radio_supported = true;
921 return QDF_STATUS_SUCCESS;
922 }
923
924 num_scan_radio_caps =
925 target_psoc_get_num_scan_radio_caps(tgt_psoc_info);
926 if (!num_scan_radio_caps)
927 return QDF_STATUS_SUCCESS;
928
929 scan_radio_caps = target_psoc_get_scan_radio_caps(tgt_psoc_info);
930 if (!scan_radio_caps) {
931 target_if_err("scan radio capabilities is null");
932 return QDF_STATUS_E_INVAL;
933 }
934
935 tgt_pdev = (struct target_pdev_info *)wlan_pdev_get_tgt_if_handle(pdev);
936 if (!tgt_pdev) {
937 target_if_err("target_pdev_info is null");
938 return QDF_STATUS_E_INVAL;
939 }
940
941 phy_id = target_pdev_get_phy_idx(tgt_pdev);
942 if (phy_id < 0) {
943 target_if_err("phy_id is invalid");
944 return QDF_STATUS_E_INVAL;
945 }
946
947 for (cap_idx = 0; cap_idx < num_scan_radio_caps; cap_idx++)
948 if (scan_radio_caps[cap_idx].phy_id == phy_id)
949 *is_scan_radio_supported =
950 scan_radio_caps[cap_idx].scan_radio_supported;
951
952 return QDF_STATUS_SUCCESS;
953 }
954
955 QDF_STATUS
target_pdev_scan_radio_is_dfs_enabled(struct wlan_objmgr_pdev * pdev,bool * is_dfs_en)956 target_pdev_scan_radio_is_dfs_enabled(struct wlan_objmgr_pdev *pdev,
957 bool *is_dfs_en)
958 {
959 struct wlan_objmgr_psoc *psoc;
960 struct wlan_psoc_host_scan_radio_caps *scan_radio_caps;
961 uint8_t cap_idx;
962 uint32_t num_scan_radio_caps, pdev_id;
963 int32_t phy_id;
964 struct target_psoc_info *tgt_psoc_info;
965 struct target_pdev_info *tgt_pdev;
966 uint32_t target_type = TARGET_TYPE_UNKNOWN;
967 struct wlan_lmac_if_target_tx_ops *target_type_tx_ops;
968 struct wlan_lmac_if_tx_ops *tx_ops;
969
970 if (!is_dfs_en) {
971 target_if_err("input argument is null");
972 return QDF_STATUS_E_INVAL;
973 }
974 *is_dfs_en = true;
975
976 if (!pdev) {
977 target_if_err("pdev is null");
978 return QDF_STATUS_E_INVAL;
979 }
980
981 psoc = wlan_pdev_get_psoc(pdev);
982 if (!psoc) {
983 target_if_err("psoc is null");
984 return QDF_STATUS_E_INVAL;
985 }
986
987 tgt_psoc_info = wlan_psoc_get_tgt_if_handle(psoc);
988 if (!tgt_psoc_info) {
989 target_if_err("target_psoc_info is null");
990 return QDF_STATUS_E_INVAL;
991 }
992
993 tx_ops = wlan_psoc_get_lmac_if_txops(psoc);
994 if (!tx_ops) {
995 target_if_err("tx_ops is null");
996 return QDF_STATUS_E_NULL_VALUE;
997 }
998 target_type_tx_ops = &tx_ops->target_tx_ops;
999 if (target_type_tx_ops->tgt_get_tgt_type)
1000 target_type = target_type_tx_ops->tgt_get_tgt_type(psoc);
1001
1002 if (target_type == TARGET_TYPE_AR9888) {
1003 *is_dfs_en = false;
1004 return QDF_STATUS_SUCCESS;
1005 }
1006
1007 num_scan_radio_caps =
1008 target_psoc_get_num_scan_radio_caps(tgt_psoc_info);
1009 if (!num_scan_radio_caps) {
1010 target_if_err("scan radio not supported for psoc");
1011 return QDF_STATUS_E_INVAL;
1012 }
1013
1014 scan_radio_caps = target_psoc_get_scan_radio_caps(tgt_psoc_info);
1015 if (!scan_radio_caps) {
1016 target_if_err("scan radio capabilities is null");
1017 return QDF_STATUS_E_INVAL;
1018 }
1019
1020 tgt_pdev = (struct target_pdev_info *)wlan_pdev_get_tgt_if_handle(pdev);
1021 if (!tgt_pdev) {
1022 target_if_err("target_pdev_info is null");
1023 return QDF_STATUS_E_INVAL;
1024 }
1025
1026 pdev_id = wlan_objmgr_pdev_get_pdev_id(pdev);
1027 phy_id = target_pdev_get_phy_idx(tgt_pdev);
1028 if (phy_id < 0) {
1029 target_if_err("phy_id is invalid");
1030 return QDF_STATUS_E_INVAL;
1031 }
1032
1033 for (cap_idx = 0; cap_idx < num_scan_radio_caps; cap_idx++)
1034 if (scan_radio_caps[cap_idx].phy_id == phy_id) {
1035 *is_dfs_en = scan_radio_caps[cap_idx].dfs_en;
1036 return QDF_STATUS_SUCCESS;
1037 }
1038
1039 target_if_err("No scan radio cap found in pdev %d", pdev_id);
1040
1041 return QDF_STATUS_E_INVAL;
1042 }
1043
1044 QDF_STATUS
target_is_scan_blanking_enabled(struct wlan_objmgr_pdev * pdev,bool * blanking_en)1045 target_is_scan_blanking_enabled(struct wlan_objmgr_pdev *pdev,
1046 bool *blanking_en)
1047 {
1048 struct wlan_objmgr_psoc *psoc;
1049 struct wlan_psoc_host_scan_radio_caps *scan_radio_caps;
1050 uint8_t cap_idx;
1051 uint32_t num_scan_radio_caps, pdev_id;
1052 int32_t phy_id;
1053 struct target_psoc_info *tgt_psoc_info;
1054 struct target_pdev_info *tgt_pdev;
1055 uint32_t target_type = TARGET_TYPE_UNKNOWN;
1056 struct wlan_lmac_if_target_tx_ops *target_type_tx_ops;
1057 struct wlan_lmac_if_tx_ops *tx_ops;
1058
1059
1060 if (!blanking_en) {
1061 target_if_err("input argument is null");
1062 return QDF_STATUS_E_NULL_VALUE;
1063 }
1064 *blanking_en = false;
1065
1066 if (!pdev) {
1067 target_if_err("pdev is null");
1068 return QDF_STATUS_E_NULL_VALUE;
1069 }
1070
1071 psoc = wlan_pdev_get_psoc(pdev);
1072 if (!psoc) {
1073 target_if_err("psoc is null");
1074 return QDF_STATUS_E_NULL_VALUE;
1075 }
1076
1077 tgt_psoc_info = wlan_psoc_get_tgt_if_handle(psoc);
1078 if (!tgt_psoc_info) {
1079 target_if_err("target_psoc_info is null");
1080 return QDF_STATUS_E_NULL_VALUE;
1081 }
1082
1083 tx_ops = wlan_psoc_get_lmac_if_txops(psoc);
1084 if (!tx_ops) {
1085 target_if_err("tx_ops is null");
1086 return QDF_STATUS_E_NULL_VALUE;
1087 }
1088
1089 target_type_tx_ops = &tx_ops->target_tx_ops;
1090 if (target_type_tx_ops->tgt_get_tgt_type)
1091 target_type = target_type_tx_ops->tgt_get_tgt_type(psoc);
1092
1093 if (target_type == TARGET_TYPE_AR9888) {
1094 *blanking_en = false;
1095 return QDF_STATUS_SUCCESS;
1096 }
1097
1098 num_scan_radio_caps =
1099 target_psoc_get_num_scan_radio_caps(tgt_psoc_info);
1100 if (!num_scan_radio_caps) {
1101 target_if_err("scan radio not supported for psoc");
1102 return QDF_STATUS_E_NULL_VALUE;
1103 }
1104
1105 scan_radio_caps = target_psoc_get_scan_radio_caps(tgt_psoc_info);
1106 if (!scan_radio_caps) {
1107 target_if_err("scan radio capabilities is null");
1108 return QDF_STATUS_E_NULL_VALUE;
1109 }
1110
1111 tgt_pdev = (struct target_pdev_info *)wlan_pdev_get_tgt_if_handle(pdev);
1112 if (!tgt_pdev) {
1113 target_if_err("target_pdev_info is null");
1114 return QDF_STATUS_E_NULL_VALUE;
1115 }
1116
1117 pdev_id = wlan_objmgr_pdev_get_pdev_id(pdev);
1118 phy_id = target_pdev_get_phy_idx(tgt_pdev);
1119 if (phy_id < 0) {
1120 target_if_err("phy_id is invalid");
1121 return QDF_STATUS_E_INVAL;
1122 }
1123
1124 for (cap_idx = 0; cap_idx < num_scan_radio_caps; cap_idx++)
1125 if (scan_radio_caps[cap_idx].phy_id == phy_id) {
1126 *blanking_en = scan_radio_caps[cap_idx].blanking_en;
1127 return QDF_STATUS_SUCCESS;
1128 }
1129
1130 target_if_err("No scan radio cap found in pdev %d", pdev_id);
1131
1132 return QDF_STATUS_E_INVAL;
1133 }
1134
target_if_set_reg_cc_ext_supp(struct target_psoc_info * tgt_hdl,struct wlan_objmgr_psoc * psoc)1135 void target_if_set_reg_cc_ext_supp(struct target_psoc_info *tgt_hdl,
1136 struct wlan_objmgr_psoc *psoc)
1137 {
1138 struct tgt_info *info;
1139
1140 if (!tgt_hdl)
1141 return;
1142
1143 info = (&tgt_hdl->info);
1144
1145 info->wlan_res_cfg.is_reg_cc_ext_event_supported =
1146 target_if_reg_is_reg_cc_ext_event_host_supported(psoc);
1147 }
1148
1149 #if defined(WLAN_FEATURE_11BE_MLO) && defined(WLAN_MLO_MULTI_CHIP)
target_if_pdev_get_hw_link_id(struct wlan_objmgr_pdev * pdev)1150 uint16_t target_if_pdev_get_hw_link_id(struct wlan_objmgr_pdev *pdev)
1151 {
1152 struct target_pdev_info *tgt_pdev_info;
1153
1154 if (!pdev)
1155 return PDEV_INVALID_HW_LINK_ID;
1156
1157 tgt_pdev_info = wlan_pdev_get_tgt_if_handle(pdev);
1158 if (!tgt_pdev_info)
1159 return PDEV_INVALID_HW_LINK_ID;
1160
1161 return tgt_pdev_info->hw_link_id;
1162 }
1163
target_pdev_set_hw_link_id(struct wlan_objmgr_pdev * pdev,uint16_t hw_link_id)1164 void target_pdev_set_hw_link_id(struct wlan_objmgr_pdev *pdev,
1165 uint16_t hw_link_id)
1166 {
1167 struct target_pdev_info *tgt_pdev_info;
1168
1169 if (!pdev)
1170 return;
1171
1172 tgt_pdev_info = wlan_pdev_get_tgt_if_handle(pdev);
1173 if (!tgt_pdev_info)
1174 return;
1175
1176 tgt_pdev_info->hw_link_id = hw_link_id;
1177 }
1178
target_if_mlo_setup_send(struct wlan_objmgr_pdev * pdev,struct wlan_objmgr_pdev ** pdev_list,uint8_t num_links,uint8_t grp_id)1179 static QDF_STATUS target_if_mlo_setup_send(struct wlan_objmgr_pdev *pdev,
1180 struct wlan_objmgr_pdev **pdev_list,
1181 uint8_t num_links, uint8_t grp_id)
1182 {
1183 wmi_unified_t wmi_handle;
1184 struct wmi_mlo_setup_params params = {0};
1185 uint8_t idx, num_valid_links = 0;
1186
1187 wmi_handle = lmac_get_pdev_wmi_handle(pdev);
1188 if (!wmi_handle)
1189 return QDF_STATUS_E_INVAL;
1190
1191 params.mld_grp_id = grp_id;
1192 params.pdev_id = wlan_objmgr_pdev_get_pdev_id(pdev);
1193
1194 for (idx = 0; idx < num_links; idx++) {
1195 if (pdev == pdev_list[idx])
1196 continue;
1197
1198 params.partner_links[num_valid_links] =
1199 target_if_pdev_get_hw_link_id(pdev_list[idx]);
1200 num_valid_links++;
1201 }
1202 params.num_valid_hw_links = num_valid_links;
1203
1204 return wmi_mlo_setup_cmd_send(wmi_handle, ¶ms);
1205 }
1206
target_if_mlo_setup_req(struct wlan_objmgr_pdev ** pdev,uint8_t num_pdevs,uint8_t grp_id)1207 QDF_STATUS target_if_mlo_setup_req(struct wlan_objmgr_pdev **pdev,
1208 uint8_t num_pdevs, uint8_t grp_id)
1209 {
1210 uint8_t idx;
1211
1212 for (idx = 0; idx < num_pdevs; idx++)
1213 target_if_mlo_setup_send(pdev[idx], pdev, num_pdevs, grp_id);
1214
1215 return QDF_STATUS_SUCCESS;
1216 }
1217
target_if_mlo_ready_send(struct wlan_objmgr_pdev * pdev)1218 static QDF_STATUS target_if_mlo_ready_send(struct wlan_objmgr_pdev *pdev)
1219 {
1220 wmi_unified_t wmi_handle;
1221 struct wmi_mlo_ready_params params = {0};
1222
1223 wmi_handle = lmac_get_pdev_wmi_handle(pdev);
1224 if (!wmi_handle)
1225 return QDF_STATUS_E_INVAL;
1226
1227 params.pdev_id = wlan_objmgr_pdev_get_pdev_id(pdev);
1228
1229 return wmi_mlo_ready_cmd_send(wmi_handle, ¶ms);
1230 }
1231
target_if_mlo_ready(struct wlan_objmgr_pdev ** pdev,uint8_t num_pdevs)1232 QDF_STATUS target_if_mlo_ready(struct wlan_objmgr_pdev **pdev,
1233 uint8_t num_pdevs)
1234 {
1235 uint8_t idx;
1236
1237 for (idx = 0; idx < num_pdevs; idx++)
1238 target_if_mlo_ready_send(pdev[idx]);
1239
1240 return QDF_STATUS_SUCCESS;
1241 }
1242
1243 QDF_STATUS
target_if_mlo_teardown_req(struct wlan_objmgr_pdev * pdev,enum wmi_mlo_teardown_reason reason,bool reset,bool standby_active)1244 target_if_mlo_teardown_req(struct wlan_objmgr_pdev *pdev,
1245 enum wmi_mlo_teardown_reason reason,
1246 bool reset, bool standby_active)
1247 {
1248 wmi_unified_t wmi_handle;
1249 struct wmi_mlo_teardown_params params = {0};
1250
1251 wmi_handle = lmac_get_pdev_wmi_handle(pdev);
1252 if (!wmi_handle)
1253 return QDF_STATUS_E_INVAL;
1254
1255 params.pdev_id = wlan_objmgr_pdev_get_pdev_id(pdev);
1256 params.reason = reason;
1257 params.umac_reset = reset;
1258 params.standby_active = standby_active;
1259
1260 return wmi_mlo_teardown_cmd_send(wmi_handle, ¶ms);
1261 }
1262 #endif /*WLAN_FEATURE_11BE_MLO && WLAN_MLO_MULTI_CHIP*/
1263