1 /*
2 * Copyright (c) 2017-2021 The Linux Foundation. All rights reserved.
3 * Copyright (c) 2022-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 nan definitions exposed to other modules
22 */
23
24 #ifndef _WLAN_NAN_API_H_
25 #define _WLAN_NAN_API_H_
26
27 #include "wlan_objmgr_peer_obj.h"
28 #include "wlan_policy_mgr_public_struct.h"
29 #include "qdf_status.h"
30 #include <nan_public_structs.h>
31 #include <wlan_cp_stats_chipset_stats.h>
32
33 #ifdef WLAN_FEATURE_NAN
34
35 #include "../src/nan_main_i.h"
36
37 struct wlan_objmgr_psoc;
38
39 /**
40 * nan_init: initializes NAN component, called by dispatcher init
41 *
42 * Return: status of operation
43 */
44 QDF_STATUS nan_init(void);
45
46 /**
47 * nan_deinit: de-initializes NAN component, called by dispatcher init
48 *
49 * Return: status of operation
50 */
51 QDF_STATUS nan_deinit(void);
52
53 /**
54 * nan_psoc_enable: psoc enable API for NANitioning component
55 * @psoc: pointer to PSOC
56 *
57 * Return: status of operation
58 */
59 QDF_STATUS nan_psoc_enable(struct wlan_objmgr_psoc *psoc);
60
61 /**
62 * nan_psoc_disable: psoc disable API for NANitioning component
63 * @psoc: pointer to PSOC
64 *
65 * Return: status of operation
66 */
67 QDF_STATUS nan_psoc_disable(struct wlan_objmgr_psoc *psoc);
68
69 /**
70 * nan_get_peer_priv_obj: get NAN priv object from peer object
71 * @peer: pointer to peer object
72 *
73 * Return: pointer to NAN peer private object
74 */
75 static inline
nan_get_peer_priv_obj(struct wlan_objmgr_peer * peer)76 struct nan_peer_priv_obj *nan_get_peer_priv_obj(struct wlan_objmgr_peer *peer)
77 {
78 struct nan_peer_priv_obj *obj;
79
80 if (!peer) {
81 nan_err("peer is null");
82 return NULL;
83 }
84 obj = wlan_objmgr_peer_get_comp_private_obj(peer, WLAN_UMAC_COMP_NAN);
85
86 return obj;
87 }
88
89 /**
90 * nan_get_vdev_priv_obj: get NAN priv object from vdev object
91 * @vdev: pointer to vdev object
92 *
93 * Return: pointer to NAN vdev private object
94 */
95 static inline
nan_get_vdev_priv_obj(struct wlan_objmgr_vdev * vdev)96 struct nan_vdev_priv_obj *nan_get_vdev_priv_obj(struct wlan_objmgr_vdev *vdev)
97 {
98 struct nan_vdev_priv_obj *obj;
99
100 if (!vdev) {
101 nan_err("vdev is null");
102 return NULL;
103 }
104 obj = wlan_objmgr_vdev_get_comp_private_obj(vdev, WLAN_UMAC_COMP_NAN);
105
106 return obj;
107 }
108
109 /**
110 * nan_get_psoc_priv_obj: get NAN priv object from psoc object
111 * @psoc: pointer to psoc object
112 *
113 * Return: pointer to NAN psoc private object
114 */
115 static inline
nan_get_psoc_priv_obj(struct wlan_objmgr_psoc * psoc)116 struct nan_psoc_priv_obj *nan_get_psoc_priv_obj(struct wlan_objmgr_psoc *psoc)
117 {
118 struct nan_psoc_priv_obj *obj;
119
120 if (!psoc) {
121 nan_err("psoc is null");
122 return NULL;
123 }
124 obj = wlan_objmgr_psoc_get_comp_private_obj(psoc, WLAN_UMAC_COMP_NAN);
125
126 return obj;
127 }
128
129 /**
130 * nan_psoc_get_tx_ops: get TX ops from the NAN private object
131 * @psoc: pointer to psoc object
132 *
133 * Return: pointer to TX op callback
134 */
135 static inline
nan_psoc_get_tx_ops(struct wlan_objmgr_psoc * psoc)136 struct wlan_nan_tx_ops *nan_psoc_get_tx_ops(struct wlan_objmgr_psoc *psoc)
137 {
138 struct nan_psoc_priv_obj *nan_priv;
139
140 if (!psoc) {
141 nan_err("psoc is null");
142 return NULL;
143 }
144
145 nan_priv = nan_get_psoc_priv_obj(psoc);
146 if (!nan_priv) {
147 nan_err("psoc private object is null");
148 return NULL;
149 }
150
151 return &nan_priv->tx_ops;
152 }
153
154 /**
155 * nan_psoc_get_rx_ops: get RX ops from the NAN private object
156 * @psoc: pointer to psoc object
157 *
158 * Return: pointer to RX op callback
159 */
160 static inline
nan_psoc_get_rx_ops(struct wlan_objmgr_psoc * psoc)161 struct wlan_nan_rx_ops *nan_psoc_get_rx_ops(struct wlan_objmgr_psoc *psoc)
162 {
163 struct nan_psoc_priv_obj *nan_priv;
164
165 if (!psoc) {
166 nan_err("psoc is null");
167 return NULL;
168 }
169
170 nan_priv = nan_get_psoc_priv_obj(psoc);
171 if (!nan_priv) {
172 nan_err("psoc private object is null");
173 return NULL;
174 }
175
176 return &nan_priv->rx_ops;
177 }
178
179 /**
180 * wlan_nan_get_connection_info: Get NAN related connection info
181 * @psoc: pointer to psoc object
182 * @conn_info: Coonection info structure pointer
183 *
184 * Return: status of operation
185 */
186 QDF_STATUS
187 wlan_nan_get_connection_info(struct wlan_objmgr_psoc *psoc,
188 struct policy_mgr_vdev_entry_info *conn_info);
189
190 /**
191 * wlan_nan_get_disc_5g_ch_freq: Get NAN Disc 5G channel frequency
192 * @psoc: pointer to psoc object
193 *
194 * Return: NAN Disc 5G channel frequency
195 */
196 uint32_t wlan_nan_get_disc_5g_ch_freq(struct wlan_objmgr_psoc *psoc);
197
198 /**
199 * wlan_nan_get_sap_conc_support: Get NAN+SAP conc support
200 * @psoc: pointer to psoc object
201 *
202 * Return: True if NAN+SAP supported else false
203 */
204 bool wlan_nan_get_sap_conc_support(struct wlan_objmgr_psoc *psoc);
205
206 /**
207 * nan_disable_cleanup: Cleanup NAN state upon NAN disable
208 * @psoc: pointer to psoc object
209 *
210 * Return: Cleanup NAN state upon NAN disable
211 */
212 QDF_STATUS nan_disable_cleanup(struct wlan_objmgr_psoc *psoc);
213
214 /**
215 * wlan_nan_is_beamforming_supported- Get support for beamforing
216 * @psoc: pointer to psoc object
217 *
218 * Return: True if beamforming is supported, false if not.
219 */
220 bool wlan_nan_is_beamforming_supported(struct wlan_objmgr_psoc *psoc);
221
222 /**
223 * wlan_is_nan_allowed_on_freq() - Check if NAN is allowed on given freq
224 * @pdev: pdev context
225 * @freq: Frequency to be checked
226 *
227 * Check if NAN/NDP can be enabled on given frequency.
228 *
229 * Return: True if NAN is allowed on the given frequency
230 */
231 bool wlan_is_nan_allowed_on_freq(struct wlan_objmgr_pdev *pdev, uint32_t freq);
232
233 /**
234 * nan_handle_emlsr_concurrency()- Handle NAN+eMLSR concurrency
235 * @psoc: pointer to psoc object
236 * @nan_enable: Carries true if NAN is getting enabled.
237 * Carries false upon NAN enable failure/NAN disabled indication
238 *
239 * Return: void
240 */
241 void nan_handle_emlsr_concurrency(struct wlan_objmgr_psoc *psoc,
242 bool nan_enable);
243 #else /* WLAN_FEATURE_NAN */
nan_init(void)244 static inline QDF_STATUS nan_init(void)
245 {
246 return QDF_STATUS_SUCCESS;
247 }
248
nan_deinit(void)249 static inline QDF_STATUS nan_deinit(void)
250 {
251 return QDF_STATUS_SUCCESS;
252 }
253
nan_psoc_enable(struct wlan_objmgr_psoc * psoc)254 static inline QDF_STATUS nan_psoc_enable(struct wlan_objmgr_psoc *psoc)
255 {
256 return QDF_STATUS_SUCCESS;
257 }
258
nan_psoc_disable(struct wlan_objmgr_psoc * psoc)259 static inline QDF_STATUS nan_psoc_disable(struct wlan_objmgr_psoc *psoc)
260 {
261 return QDF_STATUS_SUCCESS;
262 }
263
264 static inline QDF_STATUS
wlan_nan_get_connection_info(struct wlan_objmgr_psoc * psoc,struct policy_mgr_vdev_entry_info * conn_info)265 wlan_nan_get_connection_info(struct wlan_objmgr_psoc *psoc,
266 struct policy_mgr_vdev_entry_info *conn_info)
267 {
268 return QDF_STATUS_E_FAILURE;
269 }
270
271 static inline uint32_t
wlan_nan_get_disc_5g_ch_freq(struct wlan_objmgr_psoc * psoc)272 wlan_nan_get_disc_5g_ch_freq(struct wlan_objmgr_psoc *psoc)
273 {
274 return 0;
275 }
276
277 static inline
wlan_nan_get_sap_conc_support(struct wlan_objmgr_psoc * psoc)278 bool wlan_nan_get_sap_conc_support(struct wlan_objmgr_psoc *psoc)
279 {
280 return false;
281 }
282
283 static inline
nan_disable_cleanup(struct wlan_objmgr_psoc * psoc)284 QDF_STATUS nan_disable_cleanup(struct wlan_objmgr_psoc *psoc)
285 {
286 return QDF_STATUS_E_FAILURE;
287 }
288
289 static inline
wlan_nan_is_beamforming_supported(struct wlan_objmgr_psoc * psoc)290 bool wlan_nan_is_beamforming_supported(struct wlan_objmgr_psoc *psoc)
291 {
292 return false;
293 }
294
295 static inline
wlan_is_nan_allowed_on_freq(struct wlan_objmgr_pdev * pdev,uint32_t freq)296 bool wlan_is_nan_allowed_on_freq(struct wlan_objmgr_pdev *pdev, uint32_t freq)
297 {
298 return false;
299 }
300
301 static inline void
nan_handle_emlsr_concurrency(struct wlan_objmgr_psoc * psoc,bool nan_enable)302 nan_handle_emlsr_concurrency(struct wlan_objmgr_psoc *psoc, bool nan_enable)
303 {}
304 #endif /* WLAN_FEATURE_NAN */
305
306 #if defined(WLAN_FEATURE_NAN) && defined(WLAN_FEATURE_11BE_MLO)
307 /**
308 * wlan_is_mlo_sta_nan_ndi_allowed()- Get support for MLO STA +
309 * NAN Disc + NDI concurrency
310 * @psoc: pointer to psoc object
311 *
312 * Return: True if mlo sta + nan + ndi concurrency allowed or not.
313 */
314 bool wlan_is_mlo_sta_nan_ndi_allowed(struct wlan_objmgr_psoc *psoc);
315 #else
316 static inline bool
wlan_is_mlo_sta_nan_ndi_allowed(struct wlan_objmgr_psoc * psoc)317 wlan_is_mlo_sta_nan_ndi_allowed(struct wlan_objmgr_psoc *psoc)
318 {
319 return false;
320 }
321 #endif
322
323 #if defined(WLAN_FEATURE_NAN) && defined(WLAN_CHIPSET_STATS)
324 /**
325 * nan_cstats_log_nan_enable_resp_evt() - Chipset stats NAN enable
326 * response event
327 *
328 * @nan_event: pointer to nan_event_params object
329 *
330 * Return: void
331 */
332 void nan_cstats_log_nan_enable_resp_evt(struct nan_event_params *nan_event);
333
334 /**
335 * nan_cstats_log_nan_disable_resp_evt() - Chipset stats NAN disable
336 * response event
337 *
338 * @vdev_id: vdev ID
339 * @psoc: pointer to psoc object
340 *
341 * Return: void
342 */
343 void
344 nan_cstats_log_nan_disable_resp_evt(uint8_t vdev_id,
345 struct wlan_objmgr_psoc *psoc);
346 #else
347 static inline void
nan_cstats_log_nan_enable_resp_evt(struct nan_event_params * nan_event)348 nan_cstats_log_nan_enable_resp_evt(struct nan_event_params *nan_event)
349 {
350 }
351
352 static inline void
nan_cstats_log_nan_disable_resp_evt(uint8_t vdev_id,struct wlan_objmgr_psoc * psoc)353 nan_cstats_log_nan_disable_resp_evt(uint8_t vdev_id,
354 struct wlan_objmgr_psoc *psoc)
355 {
356 }
357 #endif /* WLAN_FEATURE_NAN && WLAN_CHIPSET_STATS */
358 #endif /* _WLAN_NAN_API_H_ */
359