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