xref: /wlan-driver/qcacld-3.0/components/nan/core/src/nan_api.c (revision 5113495b16420b49004c444715d2daae2066e7dc)
1*5113495bSYour Name /*
2*5113495bSYour Name  * Copyright (c) 2016-2021 The Linux Foundation. All rights reserved.
3*5113495bSYour Name  * Copyright (c) 2021-2024 Qualcomm Innovation Center, Inc. All rights reserved.
4*5113495bSYour Name  *
5*5113495bSYour Name  * Permission to use, copy, modify, and/or distribute this software for
6*5113495bSYour Name  * any purpose with or without fee is hereby granted, provided that the
7*5113495bSYour Name  * above copyright notice and this permission notice appear in all
8*5113495bSYour Name  * copies.
9*5113495bSYour Name  *
10*5113495bSYour Name  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11*5113495bSYour Name  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12*5113495bSYour Name  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13*5113495bSYour Name  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14*5113495bSYour Name  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15*5113495bSYour Name  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16*5113495bSYour Name  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17*5113495bSYour Name  * PERFORMANCE OF THIS SOFTWARE.
18*5113495bSYour Name  */
19*5113495bSYour Name 
20*5113495bSYour Name /**
21*5113495bSYour Name  * DOC: contains nan public API function definitions
22*5113495bSYour Name  */
23*5113495bSYour Name 
24*5113495bSYour Name #include "nan_main_i.h"
25*5113495bSYour Name #include "wlan_nan_api.h"
26*5113495bSYour Name #include "target_if_nan.h"
27*5113495bSYour Name #include "nan_public_structs.h"
28*5113495bSYour Name #include "wlan_objmgr_cmn.h"
29*5113495bSYour Name #include "wlan_objmgr_global_obj.h"
30*5113495bSYour Name #include "wlan_objmgr_psoc_obj.h"
31*5113495bSYour Name #include "wlan_objmgr_pdev_obj.h"
32*5113495bSYour Name #include "wlan_objmgr_vdev_obj.h"
33*5113495bSYour Name #include "nan_ucfg_api.h"
34*5113495bSYour Name #include <wlan_mlme_api.h>
35*5113495bSYour Name 
nan_psoc_obj_created_notification(struct wlan_objmgr_psoc * psoc,void * arg_list)36*5113495bSYour Name static QDF_STATUS nan_psoc_obj_created_notification(
37*5113495bSYour Name 		struct wlan_objmgr_psoc *psoc, void *arg_list)
38*5113495bSYour Name {
39*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_SUCCESS;
40*5113495bSYour Name 	struct nan_psoc_priv_obj *nan_obj;
41*5113495bSYour Name 
42*5113495bSYour Name 	nan_debug("nan_psoc_create_notif called");
43*5113495bSYour Name 	nan_obj = qdf_mem_malloc(sizeof(*nan_obj));
44*5113495bSYour Name 	if (!nan_obj)
45*5113495bSYour Name 		return QDF_STATUS_E_NOMEM;
46*5113495bSYour Name 
47*5113495bSYour Name 	qdf_spinlock_create(&nan_obj->lock);
48*5113495bSYour Name 	status = wlan_objmgr_psoc_component_obj_attach(psoc, WLAN_UMAC_COMP_NAN,
49*5113495bSYour Name 						       nan_obj,
50*5113495bSYour Name 						       QDF_STATUS_SUCCESS);
51*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
52*5113495bSYour Name 		nan_alert("obj attach with psoc failed");
53*5113495bSYour Name 		goto nan_psoc_notif_failed;
54*5113495bSYour Name 	}
55*5113495bSYour Name 
56*5113495bSYour Name 	target_if_nan_register_tx_ops(&nan_obj->tx_ops);
57*5113495bSYour Name 	target_if_nan_register_rx_ops(&nan_obj->rx_ops);
58*5113495bSYour Name 
59*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
60*5113495bSYour Name 
61*5113495bSYour Name nan_psoc_notif_failed:
62*5113495bSYour Name 
63*5113495bSYour Name 	qdf_spinlock_destroy(&nan_obj->lock);
64*5113495bSYour Name 	qdf_mem_free(nan_obj);
65*5113495bSYour Name 	return status;
66*5113495bSYour Name }
67*5113495bSYour Name 
nan_psoc_obj_destroyed_notification(struct wlan_objmgr_psoc * psoc,void * arg_list)68*5113495bSYour Name static QDF_STATUS nan_psoc_obj_destroyed_notification(
69*5113495bSYour Name 				struct wlan_objmgr_psoc *psoc, void *arg_list)
70*5113495bSYour Name {
71*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_SUCCESS;
72*5113495bSYour Name 	struct nan_psoc_priv_obj *nan_obj = nan_get_psoc_priv_obj(psoc);
73*5113495bSYour Name 
74*5113495bSYour Name 	nan_debug("nan_psoc_delete_notif called");
75*5113495bSYour Name 	if (!nan_obj) {
76*5113495bSYour Name 		nan_err("nan_obj is NULL");
77*5113495bSYour Name 		return QDF_STATUS_E_FAULT;
78*5113495bSYour Name 	}
79*5113495bSYour Name 
80*5113495bSYour Name 	status = wlan_objmgr_psoc_component_obj_detach(psoc,
81*5113495bSYour Name 						       WLAN_UMAC_COMP_NAN,
82*5113495bSYour Name 						       nan_obj);
83*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status))
84*5113495bSYour Name 		nan_err("nan_obj detach failed");
85*5113495bSYour Name 
86*5113495bSYour Name 	nan_debug("nan_obj deleted with status %d", status);
87*5113495bSYour Name 	qdf_spinlock_destroy(&nan_obj->lock);
88*5113495bSYour Name 	qdf_mem_free(nan_obj);
89*5113495bSYour Name 
90*5113495bSYour Name 	return status;
91*5113495bSYour Name }
92*5113495bSYour Name 
nan_vdev_obj_created_notification(struct wlan_objmgr_vdev * vdev,void * arg_list)93*5113495bSYour Name static QDF_STATUS nan_vdev_obj_created_notification(
94*5113495bSYour Name 		struct wlan_objmgr_vdev *vdev, void *arg_list)
95*5113495bSYour Name {
96*5113495bSYour Name 	struct nan_vdev_priv_obj *nan_obj;
97*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_SUCCESS;
98*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc;
99*5113495bSYour Name 
100*5113495bSYour Name 	nan_debug("nan_vdev_create_notif called");
101*5113495bSYour Name 	if (ucfg_is_nan_vdev(vdev)) {
102*5113495bSYour Name 		psoc = wlan_vdev_get_psoc(vdev);
103*5113495bSYour Name 		if (!psoc) {
104*5113495bSYour Name 			nan_err("psoc is NULL");
105*5113495bSYour Name 			return QDF_STATUS_E_INVAL;
106*5113495bSYour Name 		}
107*5113495bSYour Name 		target_if_nan_set_vdev_feature_config(psoc,
108*5113495bSYour Name 						      wlan_vdev_get_id(vdev));
109*5113495bSYour Name 	}
110*5113495bSYour Name 	if (wlan_vdev_mlme_get_opmode(vdev) != QDF_NDI_MODE) {
111*5113495bSYour Name 		nan_debug("not a ndi vdev. do nothing");
112*5113495bSYour Name 		return QDF_STATUS_SUCCESS;
113*5113495bSYour Name 	}
114*5113495bSYour Name 
115*5113495bSYour Name 	nan_obj = qdf_mem_malloc(sizeof(*nan_obj));
116*5113495bSYour Name 	if (!nan_obj)
117*5113495bSYour Name 		return QDF_STATUS_E_NOMEM;
118*5113495bSYour Name 
119*5113495bSYour Name 	qdf_spinlock_create(&nan_obj->lock);
120*5113495bSYour Name 	status = wlan_objmgr_vdev_component_obj_attach(vdev, WLAN_UMAC_COMP_NAN,
121*5113495bSYour Name 						       (void *)nan_obj,
122*5113495bSYour Name 						       QDF_STATUS_SUCCESS);
123*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
124*5113495bSYour Name 		nan_alert("obj attach with vdev failed");
125*5113495bSYour Name 		goto nan_vdev_notif_failed;
126*5113495bSYour Name 	}
127*5113495bSYour Name 
128*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
129*5113495bSYour Name 
130*5113495bSYour Name nan_vdev_notif_failed:
131*5113495bSYour Name 
132*5113495bSYour Name 	qdf_spinlock_destroy(&nan_obj->lock);
133*5113495bSYour Name 	qdf_mem_free(nan_obj);
134*5113495bSYour Name 	return status;
135*5113495bSYour Name }
136*5113495bSYour Name 
nan_vdev_obj_destroyed_notification(struct wlan_objmgr_vdev * vdev,void * arg_list)137*5113495bSYour Name static QDF_STATUS nan_vdev_obj_destroyed_notification(
138*5113495bSYour Name 				struct wlan_objmgr_vdev *vdev, void *arg_list)
139*5113495bSYour Name {
140*5113495bSYour Name 	struct nan_vdev_priv_obj *nan_obj;
141*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_SUCCESS;
142*5113495bSYour Name 
143*5113495bSYour Name 	nan_debug("nan_vdev_delete_notif called");
144*5113495bSYour Name 	if (wlan_vdev_mlme_get_opmode(vdev) != QDF_NDI_MODE) {
145*5113495bSYour Name 		nan_debug("not a ndi vdev. do nothing");
146*5113495bSYour Name 		return QDF_STATUS_SUCCESS;
147*5113495bSYour Name 	}
148*5113495bSYour Name 
149*5113495bSYour Name 	nan_obj = nan_get_vdev_priv_obj(vdev);
150*5113495bSYour Name 	if (!nan_obj) {
151*5113495bSYour Name 		nan_err("nan_obj is NULL");
152*5113495bSYour Name 		return QDF_STATUS_E_FAULT;
153*5113495bSYour Name 	}
154*5113495bSYour Name 
155*5113495bSYour Name 	status = wlan_objmgr_vdev_component_obj_detach(vdev, WLAN_UMAC_COMP_NAN,
156*5113495bSYour Name 						       nan_obj);
157*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status))
158*5113495bSYour Name 		nan_err("nan_obj detach failed");
159*5113495bSYour Name 
160*5113495bSYour Name 	nan_debug("nan_obj deleted with status %d", status);
161*5113495bSYour Name 	qdf_spinlock_destroy(&nan_obj->lock);
162*5113495bSYour Name 	qdf_mem_free(nan_obj);
163*5113495bSYour Name 
164*5113495bSYour Name 	return status;
165*5113495bSYour Name }
166*5113495bSYour Name 
167*5113495bSYour Name /**
168*5113495bSYour Name  * nan_peer_obj_created_notification() - Handler for peer object creation
169*5113495bSYour Name  * notification event
170*5113495bSYour Name  * @peer: Pointer to the PEER Object
171*5113495bSYour Name  * @arg_list: Pointer to private argument - NULL
172*5113495bSYour Name  *
173*5113495bSYour Name  * This function gets called from object manager when peer is being
174*5113495bSYour Name  * created.
175*5113495bSYour Name  *
176*5113495bSYour Name  * Return: QDF_STATUS
177*5113495bSYour Name  */
nan_peer_obj_created_notification(struct wlan_objmgr_peer * peer,void * arg_list)178*5113495bSYour Name static QDF_STATUS nan_peer_obj_created_notification(
179*5113495bSYour Name 		struct wlan_objmgr_peer *peer, void *arg_list)
180*5113495bSYour Name {
181*5113495bSYour Name 	struct nan_peer_priv_obj *nan_peer_obj;
182*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_SUCCESS;
183*5113495bSYour Name 
184*5113495bSYour Name 	nan_peer_obj = qdf_mem_malloc(sizeof(*nan_peer_obj));
185*5113495bSYour Name 	if (!nan_peer_obj)
186*5113495bSYour Name 		return QDF_STATUS_E_NOMEM;
187*5113495bSYour Name 
188*5113495bSYour Name 	qdf_spinlock_create(&nan_peer_obj->lock);
189*5113495bSYour Name 	status = wlan_objmgr_peer_component_obj_attach(peer, WLAN_UMAC_COMP_NAN,
190*5113495bSYour Name 						       (void *)nan_peer_obj,
191*5113495bSYour Name 						       QDF_STATUS_SUCCESS);
192*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
193*5113495bSYour Name 		nan_alert("obj attach with peer failed");
194*5113495bSYour Name 		goto nan_peer_notif_failed;
195*5113495bSYour Name 	}
196*5113495bSYour Name 
197*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
198*5113495bSYour Name 
199*5113495bSYour Name nan_peer_notif_failed:
200*5113495bSYour Name 
201*5113495bSYour Name 	qdf_spinlock_destroy(&nan_peer_obj->lock);
202*5113495bSYour Name 	qdf_mem_free(nan_peer_obj);
203*5113495bSYour Name 	return status;
204*5113495bSYour Name }
205*5113495bSYour Name 
206*5113495bSYour Name /**
207*5113495bSYour Name  * nan_peer_obj_destroyed_notification() - Handler for peer object deletion
208*5113495bSYour Name  * notification event
209*5113495bSYour Name  * @peer: Pointer to the PEER Object
210*5113495bSYour Name  * @arg_list: Pointer to private argument - NULL
211*5113495bSYour Name  *
212*5113495bSYour Name  * This function gets called from object manager when peer is being destroyed.
213*5113495bSYour Name  *
214*5113495bSYour Name  * Return: QDF_STATUS
215*5113495bSYour Name  */
nan_peer_obj_destroyed_notification(struct wlan_objmgr_peer * peer,void * arg_list)216*5113495bSYour Name static QDF_STATUS nan_peer_obj_destroyed_notification(
217*5113495bSYour Name 				struct wlan_objmgr_peer *peer, void *arg_list)
218*5113495bSYour Name {
219*5113495bSYour Name 	struct nan_peer_priv_obj *nan_peer_obj;
220*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_SUCCESS;
221*5113495bSYour Name 
222*5113495bSYour Name 	nan_peer_obj = nan_get_peer_priv_obj(peer);
223*5113495bSYour Name 	if (!nan_peer_obj) {
224*5113495bSYour Name 		nan_err("nan_peer_obj is NULL");
225*5113495bSYour Name 		return QDF_STATUS_E_FAULT;
226*5113495bSYour Name 	}
227*5113495bSYour Name 
228*5113495bSYour Name 	status = wlan_objmgr_peer_component_obj_detach(peer, WLAN_UMAC_COMP_NAN,
229*5113495bSYour Name 						       nan_peer_obj);
230*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status))
231*5113495bSYour Name 		nan_err("nan_peer_obj detach failed");
232*5113495bSYour Name 
233*5113495bSYour Name 	nan_debug("nan_peer_obj deleted with status %d", status);
234*5113495bSYour Name 	qdf_spinlock_destroy(&nan_peer_obj->lock);
235*5113495bSYour Name 	qdf_mem_free(nan_peer_obj);
236*5113495bSYour Name 
237*5113495bSYour Name 	return status;
238*5113495bSYour Name }
239*5113495bSYour Name 
nan_init(void)240*5113495bSYour Name QDF_STATUS nan_init(void)
241*5113495bSYour Name {
242*5113495bSYour Name 	QDF_STATUS status;
243*5113495bSYour Name 
244*5113495bSYour Name 	/* register psoc create handler functions. */
245*5113495bSYour Name 	status = wlan_objmgr_register_psoc_create_handler(
246*5113495bSYour Name 		WLAN_UMAC_COMP_NAN,
247*5113495bSYour Name 		nan_psoc_obj_created_notification,
248*5113495bSYour Name 		NULL);
249*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
250*5113495bSYour Name 		nan_err("wlan_objmgr_register_psoc_create_handler failed");
251*5113495bSYour Name 		return status;
252*5113495bSYour Name 	}
253*5113495bSYour Name 
254*5113495bSYour Name 	/* register psoc delete handler functions. */
255*5113495bSYour Name 	status = wlan_objmgr_register_psoc_destroy_handler(
256*5113495bSYour Name 		WLAN_UMAC_COMP_NAN,
257*5113495bSYour Name 		nan_psoc_obj_destroyed_notification,
258*5113495bSYour Name 		NULL);
259*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
260*5113495bSYour Name 		nan_err("wlan_objmgr_register_psoc_destroy_handler failed");
261*5113495bSYour Name 		goto err_psoc_destroy_reg;
262*5113495bSYour Name 	}
263*5113495bSYour Name 
264*5113495bSYour Name 	/* register vdev create handler functions. */
265*5113495bSYour Name 	status = wlan_objmgr_register_vdev_create_handler(
266*5113495bSYour Name 		WLAN_UMAC_COMP_NAN,
267*5113495bSYour Name 		nan_vdev_obj_created_notification,
268*5113495bSYour Name 		NULL);
269*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
270*5113495bSYour Name 		nan_err("wlan_objmgr_register_psoc_create_handler failed");
271*5113495bSYour Name 		goto err_vdev_create_reg;
272*5113495bSYour Name 	}
273*5113495bSYour Name 
274*5113495bSYour Name 	/* register vdev delete handler functions. */
275*5113495bSYour Name 	status = wlan_objmgr_register_vdev_destroy_handler(
276*5113495bSYour Name 		WLAN_UMAC_COMP_NAN,
277*5113495bSYour Name 		nan_vdev_obj_destroyed_notification,
278*5113495bSYour Name 		NULL);
279*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
280*5113495bSYour Name 		nan_err("wlan_objmgr_register_psoc_destroy_handler failed");
281*5113495bSYour Name 		goto err_vdev_destroy_reg;
282*5113495bSYour Name 	}
283*5113495bSYour Name 
284*5113495bSYour Name 	/* register peer create handler functions. */
285*5113495bSYour Name 	status = wlan_objmgr_register_peer_create_handler(
286*5113495bSYour Name 		WLAN_UMAC_COMP_NAN,
287*5113495bSYour Name 		nan_peer_obj_created_notification,
288*5113495bSYour Name 		NULL);
289*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
290*5113495bSYour Name 		nan_err("wlan_objmgr_register_peer_create_handler failed");
291*5113495bSYour Name 		goto err_peer_create_reg;
292*5113495bSYour Name 	}
293*5113495bSYour Name 
294*5113495bSYour Name 	/* register peer delete handler functions. */
295*5113495bSYour Name 	status = wlan_objmgr_register_peer_destroy_handler(
296*5113495bSYour Name 		WLAN_UMAC_COMP_NAN,
297*5113495bSYour Name 		nan_peer_obj_destroyed_notification,
298*5113495bSYour Name 		NULL);
299*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status))
300*5113495bSYour Name 		nan_err("wlan_objmgr_register_peer_destroy_handler failed");
301*5113495bSYour Name 	else
302*5113495bSYour Name 		return QDF_STATUS_SUCCESS;
303*5113495bSYour Name 
304*5113495bSYour Name 	wlan_objmgr_unregister_peer_create_handler(WLAN_UMAC_COMP_NAN,
305*5113495bSYour Name 					nan_peer_obj_created_notification,
306*5113495bSYour Name 					NULL);
307*5113495bSYour Name err_peer_create_reg:
308*5113495bSYour Name 	wlan_objmgr_unregister_vdev_destroy_handler(WLAN_UMAC_COMP_NAN,
309*5113495bSYour Name 					nan_vdev_obj_destroyed_notification,
310*5113495bSYour Name 					NULL);
311*5113495bSYour Name err_vdev_destroy_reg:
312*5113495bSYour Name 	wlan_objmgr_unregister_vdev_create_handler(WLAN_UMAC_COMP_NAN,
313*5113495bSYour Name 					nan_vdev_obj_created_notification,
314*5113495bSYour Name 					NULL);
315*5113495bSYour Name err_vdev_create_reg:
316*5113495bSYour Name 	wlan_objmgr_unregister_psoc_destroy_handler(WLAN_UMAC_COMP_NAN,
317*5113495bSYour Name 					nan_psoc_obj_destroyed_notification,
318*5113495bSYour Name 					NULL);
319*5113495bSYour Name err_psoc_destroy_reg:
320*5113495bSYour Name 	wlan_objmgr_unregister_psoc_create_handler(WLAN_UMAC_COMP_NAN,
321*5113495bSYour Name 					nan_psoc_obj_created_notification,
322*5113495bSYour Name 					NULL);
323*5113495bSYour Name 
324*5113495bSYour Name 	return status;
325*5113495bSYour Name }
326*5113495bSYour Name 
nan_deinit(void)327*5113495bSYour Name QDF_STATUS nan_deinit(void)
328*5113495bSYour Name {
329*5113495bSYour Name 	QDF_STATUS ret = QDF_STATUS_SUCCESS, status;
330*5113495bSYour Name 
331*5113495bSYour Name 	/* register psoc create handler functions. */
332*5113495bSYour Name 	status = wlan_objmgr_unregister_psoc_create_handler(
333*5113495bSYour Name 		WLAN_UMAC_COMP_NAN,
334*5113495bSYour Name 		nan_psoc_obj_created_notification,
335*5113495bSYour Name 		NULL);
336*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
337*5113495bSYour Name 		nan_err("wlan_objmgr_unregister_psoc_create_handler failed");
338*5113495bSYour Name 		ret = status;
339*5113495bSYour Name 	}
340*5113495bSYour Name 
341*5113495bSYour Name 	/* register vdev create handler functions. */
342*5113495bSYour Name 	status = wlan_objmgr_unregister_psoc_destroy_handler(
343*5113495bSYour Name 		WLAN_UMAC_COMP_NAN,
344*5113495bSYour Name 		nan_psoc_obj_destroyed_notification,
345*5113495bSYour Name 		NULL);
346*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
347*5113495bSYour Name 		nan_err("wlan_objmgr_deregister_psoc_destroy_handler failed");
348*5113495bSYour Name 		ret = status;
349*5113495bSYour Name 	}
350*5113495bSYour Name 
351*5113495bSYour Name 	/* de-register vdev create handler functions. */
352*5113495bSYour Name 	status = wlan_objmgr_unregister_vdev_create_handler(
353*5113495bSYour Name 		WLAN_UMAC_COMP_NAN,
354*5113495bSYour Name 		nan_vdev_obj_created_notification,
355*5113495bSYour Name 		NULL);
356*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
357*5113495bSYour Name 		nan_err("wlan_objmgr_unregister_psoc_create_handler failed");
358*5113495bSYour Name 		ret = status;
359*5113495bSYour Name 	}
360*5113495bSYour Name 
361*5113495bSYour Name 	/* de-register vdev delete handler functions. */
362*5113495bSYour Name 	status = wlan_objmgr_unregister_vdev_destroy_handler(
363*5113495bSYour Name 		WLAN_UMAC_COMP_NAN,
364*5113495bSYour Name 		nan_vdev_obj_destroyed_notification,
365*5113495bSYour Name 		NULL);
366*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
367*5113495bSYour Name 		nan_err("wlan_objmgr_deregister_psoc_destroy_handler failed");
368*5113495bSYour Name 		ret = status;
369*5113495bSYour Name 	}
370*5113495bSYour Name 
371*5113495bSYour Name 	/* de-register peer create handler functions. */
372*5113495bSYour Name 	status = wlan_objmgr_unregister_peer_create_handler(
373*5113495bSYour Name 		WLAN_UMAC_COMP_NAN,
374*5113495bSYour Name 		nan_peer_obj_created_notification,
375*5113495bSYour Name 		NULL);
376*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
377*5113495bSYour Name 		nan_err("wlan_objmgr_unregister_peer_create_handler failed");
378*5113495bSYour Name 		ret = status;
379*5113495bSYour Name 	}
380*5113495bSYour Name 
381*5113495bSYour Name 	/* de-register peer delete handler functions. */
382*5113495bSYour Name 	status = wlan_objmgr_unregister_peer_destroy_handler(
383*5113495bSYour Name 		WLAN_UMAC_COMP_NAN,
384*5113495bSYour Name 		nan_peer_obj_destroyed_notification,
385*5113495bSYour Name 		NULL);
386*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
387*5113495bSYour Name 		nan_err("wlan_objmgr_deregister_peer_destroy_handler failed");
388*5113495bSYour Name 		ret = status;
389*5113495bSYour Name 	}
390*5113495bSYour Name 
391*5113495bSYour Name 	return ret;
392*5113495bSYour Name }
393*5113495bSYour Name 
nan_psoc_enable(struct wlan_objmgr_psoc * psoc)394*5113495bSYour Name QDF_STATUS nan_psoc_enable(struct wlan_objmgr_psoc *psoc)
395*5113495bSYour Name {
396*5113495bSYour Name 	QDF_STATUS status = target_if_nan_register_events(psoc);
397*5113495bSYour Name 
398*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status))
399*5113495bSYour Name 		nan_err("target_if_nan_register_events failed");
400*5113495bSYour Name 
401*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
402*5113495bSYour Name }
403*5113495bSYour Name 
nan_psoc_disable(struct wlan_objmgr_psoc * psoc)404*5113495bSYour Name QDF_STATUS nan_psoc_disable(struct wlan_objmgr_psoc *psoc)
405*5113495bSYour Name {
406*5113495bSYour Name 	QDF_STATUS status = target_if_nan_deregister_events(psoc);
407*5113495bSYour Name 
408*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status))
409*5113495bSYour Name 		nan_err("target_if_nan_deregister_events failed");
410*5113495bSYour Name 
411*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
412*5113495bSYour Name }
413*5113495bSYour Name 
414*5113495bSYour Name static bool
wlan_is_nan_allowed_on_6ghz_freq(struct wlan_objmgr_pdev * pdev,uint32_t freq)415*5113495bSYour Name wlan_is_nan_allowed_on_6ghz_freq(struct wlan_objmgr_pdev *pdev, uint32_t freq)
416*5113495bSYour Name {
417*5113495bSYour Name 	QDF_STATUS status;
418*5113495bSYour Name 	struct regulatory_channel *chan_list;
419*5113495bSYour Name 	uint32_t len_6g =
420*5113495bSYour Name 			NUM_6GHZ_CHANNELS * sizeof(struct regulatory_channel);
421*5113495bSYour Name 	uint16_t i;
422*5113495bSYour Name 	bool ret = false;
423*5113495bSYour Name 
424*5113495bSYour Name 	chan_list = qdf_mem_malloc(len_6g);
425*5113495bSYour Name 	if (!chan_list)
426*5113495bSYour Name 		return ret;
427*5113495bSYour Name 
428*5113495bSYour Name 	status = wlan_reg_get_6g_ap_master_chan_list(pdev,
429*5113495bSYour Name 						     REG_VERY_LOW_POWER_AP,
430*5113495bSYour Name 						     chan_list);
431*5113495bSYour Name 
432*5113495bSYour Name 	for (i = 0; i < NUM_6GHZ_CHANNELS; i++) {
433*5113495bSYour Name 		if ((freq == chan_list[i].center_freq) &&
434*5113495bSYour Name 		    (chan_list[i].state == CHANNEL_STATE_ENABLE)) {
435*5113495bSYour Name 			ret = true;
436*5113495bSYour Name 			goto end;
437*5113495bSYour Name 		}
438*5113495bSYour Name 	}
439*5113495bSYour Name 
440*5113495bSYour Name end:
441*5113495bSYour Name 	qdf_mem_free(chan_list);
442*5113495bSYour Name 	return ret;
443*5113495bSYour Name }
444*5113495bSYour Name 
wlan_is_nan_allowed_on_freq(struct wlan_objmgr_pdev * pdev,uint32_t freq)445*5113495bSYour Name bool wlan_is_nan_allowed_on_freq(struct wlan_objmgr_pdev *pdev, uint32_t freq)
446*5113495bSYour Name {
447*5113495bSYour Name 	bool nan_allowed = true;
448*5113495bSYour Name 
449*5113495bSYour Name 	/* Check for 6GHz channels */
450*5113495bSYour Name 	if (wlan_reg_is_6ghz_chan_freq(freq)) {
451*5113495bSYour Name 		nan_allowed = wlan_is_nan_allowed_on_6ghz_freq(pdev, freq);
452*5113495bSYour Name 		return nan_allowed;
453*5113495bSYour Name 	}
454*5113495bSYour Name 
455*5113495bSYour Name 	/* Check for SRD channels */
456*5113495bSYour Name 	if (wlan_reg_is_etsi_srd_chan_for_freq(pdev, freq))
457*5113495bSYour Name 		wlan_mlme_get_srd_master_mode_for_vdev(wlan_pdev_get_psoc(pdev),
458*5113495bSYour Name 						       QDF_NAN_DISC_MODE,
459*5113495bSYour Name 						       &nan_allowed);
460*5113495bSYour Name 
461*5113495bSYour Name 	/* Check for Indoor channels */
462*5113495bSYour Name 	if (wlan_reg_is_freq_indoor(pdev, freq))
463*5113495bSYour Name 		wlan_mlme_get_indoor_support_for_nan(wlan_pdev_get_psoc(pdev),
464*5113495bSYour Name 						     &nan_allowed);
465*5113495bSYour Name 	/*
466*5113495bSYour Name 	 * Check for dfs only if channel is not indoor,
467*5113495bSYour Name 	 * Check for passive channels as well
468*5113495bSYour Name 	 */
469*5113495bSYour Name 	else if (wlan_reg_is_dfs_for_freq(pdev, freq) ||
470*5113495bSYour Name 		 wlan_reg_is_passive_for_freq(pdev, freq))
471*5113495bSYour Name 		nan_allowed = false;
472*5113495bSYour Name 
473*5113495bSYour Name 	return nan_allowed;
474*5113495bSYour Name }
475*5113495bSYour Name 
476*5113495bSYour Name #ifdef WLAN_FEATURE_11BE_MLO
wlan_is_mlo_sta_nan_ndi_allowed(struct wlan_objmgr_psoc * psoc)477*5113495bSYour Name bool wlan_is_mlo_sta_nan_ndi_allowed(struct wlan_objmgr_psoc *psoc)
478*5113495bSYour Name {
479*5113495bSYour Name 	struct nan_psoc_priv_obj *psoc_nan_obj;
480*5113495bSYour Name 
481*5113495bSYour Name 	psoc_nan_obj = nan_get_psoc_priv_obj(psoc);
482*5113495bSYour Name 	if (!psoc_nan_obj) {
483*5113495bSYour Name 		nan_err("psoc_nan_obj is null");
484*5113495bSYour Name 		return false;
485*5113495bSYour Name 	}
486*5113495bSYour Name 
487*5113495bSYour Name 	return psoc_nan_obj->nan_caps.mlo_sta_nan_ndi_allowed;
488*5113495bSYour Name }
489*5113495bSYour Name #endif
490*5113495bSYour Name 
491*5113495bSYour Name #if defined(WLAN_FEATURE_NAN) && defined(WLAN_CHIPSET_STATS)
nan_cstats_log_nan_enable_resp_evt(struct nan_event_params * nan_event)492*5113495bSYour Name void nan_cstats_log_nan_enable_resp_evt(struct nan_event_params *nan_event)
493*5113495bSYour Name {
494*5113495bSYour Name 	struct cstats_nan_disc_enable_resp stat = {0};
495*5113495bSYour Name 	struct wlan_objmgr_vdev *vdev;
496*5113495bSYour Name 
497*5113495bSYour Name 	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(nan_event->psoc,
498*5113495bSYour Name 						    nan_event->vdev_id,
499*5113495bSYour Name 						    WLAN_NAN_ID);
500*5113495bSYour Name 	if (!vdev) {
501*5113495bSYour Name 		nan_err("Invalid vdev!");
502*5113495bSYour Name 		return;
503*5113495bSYour Name 	}
504*5113495bSYour Name 
505*5113495bSYour Name 	stat.cmn.hdr.evt_id =
506*5113495bSYour Name 		WLAN_CHIPSET_STATS_NAN_DISCOVERY_ENABLE_RESP_EVENT_ID;
507*5113495bSYour Name 	stat.cmn.hdr.length = sizeof(struct cstats_nan_disc_enable_resp) -
508*5113495bSYour Name 			      sizeof(struct cstats_hdr);
509*5113495bSYour Name 	stat.cmn.opmode = wlan_vdev_mlme_get_opmode(vdev);
510*5113495bSYour Name 	stat.cmn.vdev_id = wlan_vdev_get_id(vdev);
511*5113495bSYour Name 	stat.cmn.timestamp_us = qdf_get_time_of_the_day_us();
512*5113495bSYour Name 	stat.cmn.time_tick = qdf_get_log_timestamp();
513*5113495bSYour Name 
514*5113495bSYour Name 	stat.is_enable_success = nan_event->is_nan_enable_success;
515*5113495bSYour Name 	stat.mac_id = nan_event->mac_id;
516*5113495bSYour Name 	stat.disc_state = nan_get_discovery_state(nan_event->psoc);
517*5113495bSYour Name 
518*5113495bSYour Name 	wlan_objmgr_vdev_release_ref(vdev, WLAN_NAN_ID);
519*5113495bSYour Name 
520*5113495bSYour Name 	wlan_cstats_host_stats(sizeof(struct cstats_nan_disc_enable_resp),
521*5113495bSYour Name 			       &stat);
522*5113495bSYour Name }
523*5113495bSYour Name 
nan_cstats_log_nan_disable_resp_evt(uint8_t vdev_id,struct wlan_objmgr_psoc * psoc)524*5113495bSYour Name void nan_cstats_log_nan_disable_resp_evt(uint8_t vdev_id,
525*5113495bSYour Name 					 struct wlan_objmgr_psoc *psoc)
526*5113495bSYour Name {
527*5113495bSYour Name 	struct cstats_nan_disc_disable_resp stat = {0};
528*5113495bSYour Name 
529*5113495bSYour Name 	stat.cmn.hdr.evt_id =
530*5113495bSYour Name 	   WLAN_CHIPSET_STATS_NAN_DISCOVERY_DISABLE_RESP_EVENT_ID;
531*5113495bSYour Name 	stat.cmn.hdr.length =
532*5113495bSYour Name 		sizeof(struct cstats_nan_disc_disable_resp) -
533*5113495bSYour Name 		sizeof(struct cstats_hdr);
534*5113495bSYour Name 	stat.cmn.opmode = QDF_NAN_DISC_MODE;
535*5113495bSYour Name 	stat.cmn.vdev_id = vdev_id;
536*5113495bSYour Name 	stat.cmn.timestamp_us = qdf_get_time_of_the_day_us();
537*5113495bSYour Name 	stat.cmn.time_tick = qdf_get_log_timestamp();
538*5113495bSYour Name 	stat.disc_state = nan_get_discovery_state(psoc);
539*5113495bSYour Name 
540*5113495bSYour Name 	wlan_cstats_host_stats(sizeof(struct cstats_nan_disc_disable_resp),
541*5113495bSYour Name 			       &stat);
542*5113495bSYour Name }
543*5113495bSYour Name #endif /* WLAN_CHIPSET_STATS */
544