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