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 declarations for coex core functions
20 */
21
22 #ifndef _WLAN_COEX_MAIN_API_H_
23 #define _WLAN_COEX_MAIN_API_H_
24
25 #ifdef FEATURE_COEX
26 #include "wlan_coex_ucfg_api.h"
27 #include "wmi_unified_param.h"
28 #include "wlan_objmgr_psoc_obj.h"
29 #include "wlan_objmgr_vdev_obj.h"
30
31 #define coex_err(params...) \
32 QDF_TRACE_ERROR(QDF_MODULE_ID_COEX, params)
33 #define coex_info(params...) \
34 QDF_TRACE_INFO(QDF_MODULE_ID_COEX, params)
35 #define coex_debug(params...) \
36 QDF_TRACE_DEBUG(QDF_MODULE_ID_COEX, params)
37
38 #ifdef WLAN_FEATURE_DBAM_CONFIG
39 /**
40 * struct wlan_coex_callback - coex dbam callback structure
41 * @set_dbam_config_cb: callback for set_dbam_config
42 * @set_dbam_config_ctx: context for set_dbam_config callback
43 */
44 struct wlan_coex_callback {
45 void (*set_dbam_config_cb)(void *ctx, enum coex_dbam_comp_status *rsp);
46 void *set_dbam_config_ctx;
47 };
48 #endif
49
50 /**
51 * struct coex_psoc_obj - coex object definition
52 * @btc_chain_mode: BT Coex chain mode.
53 * @coex_config_updated: callback functions for each config type, which will
54 * be called when config is updated.
55 * @cb: structure to dbam callback
56 */
57 struct coex_psoc_obj {
58 enum coex_btc_chain_mode btc_chain_mode;
59 update_coex_cb coex_config_updated[COEX_CONFIG_TYPE_MAX];
60 #ifdef WLAN_FEATURE_DBAM_CONFIG
61 struct wlan_coex_callback cb;
62 #endif
63 };
64
65 /**
66 * wlan_psoc_get_coex_obj() - private API to get coex object from psoc
67 * @psoc: psoc object
68 *
69 * Return: coex object
70 */
71 #define wlan_psoc_get_coex_obj(psoc) \
72 wlan_psoc_get_coex_obj_fl(psoc, __func__, __LINE__)
73
74 static inline struct coex_psoc_obj *
wlan_psoc_get_coex_obj_fl(struct wlan_objmgr_psoc * psoc,const char * func,uint32_t line)75 wlan_psoc_get_coex_obj_fl(struct wlan_objmgr_psoc *psoc,
76 const char *func, uint32_t line)
77 {
78 struct coex_psoc_obj *psoc_obj;
79
80 psoc_obj = (struct coex_psoc_obj *)
81 wlan_objmgr_psoc_get_comp_private_obj(psoc,
82 WLAN_UMAC_COMP_COEX);
83 if (!psoc_obj) {
84 coex_err("%s:%u, Failed to get coex psoc object", func, line);
85 return NULL;
86 }
87 return psoc_obj;
88 }
89
90 /**
91 * wlan_coex_psoc_init() - API to initialize coex component
92 * @psoc: soc context
93 *
94 * Return: QDF_STATUS
95 */
96 QDF_STATUS
97 wlan_coex_psoc_init(struct wlan_objmgr_psoc *psoc);
98
99 /**
100 * wlan_coex_psoc_deinit() - API to deinitialize coex component
101 * @psoc: soc context
102 *
103 * Return: QDF_STATUS
104 */
105 QDF_STATUS
106 wlan_coex_psoc_deinit(struct wlan_objmgr_psoc *psoc);
107
108 /**
109 * wlan_coex_config_send() - private API to send coex config
110 * @vdev: pointer to vdev object
111 * @param: parameters of coex config
112 *
113 * Return: status of operation
114 */
115 QDF_STATUS wlan_coex_config_send(struct wlan_objmgr_vdev *vdev,
116 struct coex_config_params *param);
117
118 /**
119 * wlan_coex_multi_config_send() - API to send coex multiple configure
120 * @vdev: pointer to vdev object
121 * @param: parameters of coex multiple config
122 *
123 * QDF_STATUS
124 */
125 QDF_STATUS wlan_coex_multi_config_send(struct wlan_objmgr_vdev *vdev,
126 struct coex_multi_config *param);
127
128 /**
129 * wlan_coex_config_updated() - private API to notify that coex config
130 * is updated.
131 * @vdev: pointer to vdev object
132 * @type: type of coex config
133 *
134 * Return: status of operation
135 */
136 QDF_STATUS
137 wlan_coex_config_updated(struct wlan_objmgr_vdev *vdev, uint8_t type);
138
139 /**
140 * wlan_coex_psoc_created_notification() - PSOC obj create callback
141 * @psoc: PSOC object
142 * @arg_list: Variable argument list
143 *
144 * This callback is registered with object manager during initialization to
145 * get notified when the object is created.
146 *
147 * Return: Success or Failure
148 */
149 QDF_STATUS wlan_coex_psoc_created_notification(struct wlan_objmgr_psoc *psoc,
150 void *arg_list);
151
152 /**
153 * wlan_coex_psoc_destroyed_notification() - PSOC obj delete callback
154 * @psoc: PSOC object
155 * @arg_list: Variable argument list
156 *
157 * This callback is registered with object manager during initialization to
158 * get notified when the object is deleted.
159 *
160 * Return: Success or Failure
161 */
162 QDF_STATUS wlan_coex_psoc_destroyed_notification(struct wlan_objmgr_psoc *psoc,
163 void *arg_list);
164
165 /**
166 * wlan_coex_psoc_set_btc_chain_mode() - private API to set BT coex chain mode
167 * for psoc
168 * @psoc: pointer to psoc object
169 * @val: BT coex chain mode
170 *
171 * Return : status of operation
172 */
173 QDF_STATUS
174 wlan_coex_psoc_set_btc_chain_mode(struct wlan_objmgr_psoc *psoc,
175 enum coex_btc_chain_mode val);
176
177 /**
178 * wlan_coex_psoc_get_btc_chain_mode() - private API to get BT coex chain mode
179 * from psoc
180 * @psoc: pointer to psoc object
181 * @val: pointer to BT coex chain mode
182 *
183 * Return : status of operation
184 */
185 QDF_STATUS
186 wlan_coex_psoc_get_btc_chain_mode(struct wlan_objmgr_psoc *psoc,
187 enum coex_btc_chain_mode *val);
188 #endif
189
190 #ifdef WLAN_FEATURE_DBAM_CONFIG
191 /**
192 * wlan_dbam_config_send() - private API to send dbam config
193 * @vdev: pointer to vdev object
194 * @param: parameters of dbam config
195 *
196 * Return: QDF_STATUS of operation
197 */
198 QDF_STATUS wlan_dbam_config_send(struct wlan_objmgr_vdev *vdev,
199 struct coex_dbam_config_params *param);
200
201 static inline struct wlan_lmac_if_dbam_rx_ops *
wlan_psoc_get_dbam_rx_ops(struct wlan_objmgr_psoc * psoc)202 wlan_psoc_get_dbam_rx_ops(struct wlan_objmgr_psoc *psoc)
203 {
204 struct wlan_lmac_if_rx_ops *rx_ops;
205
206 rx_ops = wlan_psoc_get_lmac_if_rxops(psoc);
207 if (!rx_ops) {
208 coex_err("rx_ops is NULL");
209 return NULL;
210 }
211
212 return &rx_ops->dbam_rx_ops;
213 }
214
215 static inline struct wlan_lmac_if_dbam_tx_ops *
wlan_psoc_get_dbam_tx_ops(struct wlan_objmgr_psoc * psoc)216 wlan_psoc_get_dbam_tx_ops(struct wlan_objmgr_psoc *psoc)
217 {
218 struct wlan_lmac_if_tx_ops *tx_ops;
219
220 tx_ops = wlan_psoc_get_lmac_if_txops(psoc);
221 if (!tx_ops) {
222 coex_err("tx_ops is NULL");
223 return NULL;
224 }
225
226 return &tx_ops->dbam_tx_ops;
227 }
228
229 /**
230 * wlan_dbam_attach() - Attach dbam handler
231 * @psoc: psoc pointer
232 *
233 * This function gets called to register dbam FW events handler
234 *
235 * Return: QDF_STATUS
236 */
237 QDF_STATUS wlan_dbam_attach(struct wlan_objmgr_psoc *psoc);
238
239 /**
240 * wlan_dbam_detach() - Detach dbam handler
241 * @psoc: psoc pointer
242 *
243 * This function gets called to unregister dbam FW events handler
244 *
245 * Return: QDF_STATUS
246 */
247 QDF_STATUS wlan_dbam_detach(struct wlan_objmgr_psoc *psoc);
248 #endif /* WLAN_FEATURE_DBAM_CONFIG */
249 #endif
250