1 /*
2 * Copyright (c) 2020, The Linux Foundation. All rights reserved.
3 * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
4 *
5 * Permission to use, copy, modify, and/or distribute this software for any
6 * purpose with or without fee is hereby granted, provided that the above
7 * copyright notice and this permission notice appear in all copies.
8 *
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16 */
17
18 /*
19 * DOC: contains coex south bound interface definitions
20 */
21
22 #include <wlan_coex_main.h>
23 #include <wlan_coex_tgt_api.h>
24 #include <wlan_lmac_if_def.h>
25 #include "wlan_objmgr_pdev_obj.h"
26
27 static inline struct wlan_lmac_if_coex_tx_ops *
wlan_psoc_get_coex_txops(struct wlan_objmgr_psoc * psoc)28 wlan_psoc_get_coex_txops(struct wlan_objmgr_psoc *psoc)
29 {
30 struct wlan_lmac_if_tx_ops *tx_ops;
31
32 tx_ops = wlan_psoc_get_lmac_if_txops(psoc);
33 if (!tx_ops) {
34 coex_err("tx_ops is NULL");
35 return NULL;
36 }
37
38 return &tx_ops->coex_ops;
39 }
40
41 static inline struct wlan_lmac_if_coex_tx_ops *
wlan_vdev_get_coex_txops(struct wlan_objmgr_vdev * vdev)42 wlan_vdev_get_coex_txops(struct wlan_objmgr_vdev *vdev)
43 {
44 struct wlan_objmgr_psoc *psoc;
45
46 psoc = wlan_vdev_get_psoc(vdev);
47 if (!psoc) {
48 coex_err("NULL psoc");
49 return NULL;
50 }
51
52 return wlan_psoc_get_coex_txops(psoc);
53 }
54
55 QDF_STATUS
tgt_send_coex_config(struct wlan_objmgr_vdev * vdev,struct coex_config_params * param)56 tgt_send_coex_config(struct wlan_objmgr_vdev *vdev,
57 struct coex_config_params *param)
58 {
59 struct wlan_lmac_if_coex_tx_ops *coex_ops;
60 struct wlan_objmgr_psoc *psoc;
61 struct wlan_objmgr_pdev *pdev;
62
63 if (!vdev) {
64 coex_err("NULL vdev");
65 return QDF_STATUS_E_NULL_VALUE;
66 }
67
68 psoc = wlan_vdev_get_psoc(vdev);
69 if (!psoc) {
70 coex_err("NULL psoc");
71 return QDF_STATUS_E_NULL_VALUE;
72 }
73
74 pdev = wlan_vdev_get_pdev(vdev);
75 if (!pdev) {
76 coex_err("NULL pdev");
77 return QDF_STATUS_E_NULL_VALUE;
78 }
79
80 coex_ops = wlan_psoc_get_coex_txops(psoc);
81 if (coex_ops && coex_ops->coex_config_send)
82 return coex_ops->coex_config_send(pdev, param);
83
84 return QDF_STATUS_SUCCESS;
85 }
86
87 QDF_STATUS
tgt_send_coex_multi_config(struct wlan_objmgr_vdev * vdev,struct coex_multi_config * param)88 tgt_send_coex_multi_config(struct wlan_objmgr_vdev *vdev,
89 struct coex_multi_config *param)
90 {
91 struct wlan_lmac_if_coex_tx_ops *coex_ops;
92 struct wlan_objmgr_psoc *psoc;
93 struct wlan_objmgr_pdev *pdev;
94
95 if (!vdev) {
96 coex_err("NULL vdev");
97 return QDF_STATUS_E_NULL_VALUE;
98 }
99
100 psoc = wlan_vdev_get_psoc(vdev);
101 if (!psoc) {
102 coex_err("NULL psoc");
103 return QDF_STATUS_E_NULL_VALUE;
104 }
105
106 pdev = wlan_vdev_get_pdev(vdev);
107 if (!pdev) {
108 coex_err("NULL pdev");
109 return QDF_STATUS_E_NULL_VALUE;
110 }
111
112 coex_ops = wlan_psoc_get_coex_txops(psoc);
113 if (coex_ops && coex_ops->coex_multi_config_send)
114 return coex_ops->coex_multi_config_send(pdev, param);
115
116 return QDF_STATUS_SUCCESS;
117 }
118
119 bool
tgt_get_coex_multi_config_support(struct wlan_objmgr_psoc * psoc)120 tgt_get_coex_multi_config_support(struct wlan_objmgr_psoc *psoc)
121 {
122 struct wlan_lmac_if_coex_tx_ops *coex_ops;
123
124 coex_ops = wlan_psoc_get_coex_txops(psoc);
125 if (coex_ops && coex_ops->coex_get_multi_config_support)
126 return coex_ops->coex_get_multi_config_support(psoc);
127
128 return false;
129 }
130
131 #ifdef WLAN_FEATURE_DBAM_CONFIG
132 QDF_STATUS
tgt_send_dbam_config(struct wlan_objmgr_vdev * vdev,struct coex_dbam_config_params * param)133 tgt_send_dbam_config(struct wlan_objmgr_vdev *vdev,
134 struct coex_dbam_config_params *param)
135 {
136 struct wlan_lmac_if_dbam_tx_ops *dbam_tx_ops;
137 struct wlan_objmgr_psoc *psoc;
138
139 psoc = wlan_vdev_get_psoc(vdev);
140 if (!psoc) {
141 coex_err("NULL psoc");
142 return QDF_STATUS_E_NULL_VALUE;
143 }
144
145 dbam_tx_ops = wlan_psoc_get_dbam_tx_ops(psoc);
146 if (dbam_tx_ops && dbam_tx_ops->set_dbam_config)
147 return dbam_tx_ops->set_dbam_config(psoc, param);
148
149 return QDF_STATUS_SUCCESS;
150 }
151 #endif
152