xref: /wlan-driver/qcacld-3.0/components/target_if/nan/src/target_if_nan.c (revision 5113495b16420b49004c444715d2daae2066e7dc)
1*5113495bSYour Name /*
2*5113495bSYour Name  * Copyright (c) 2016-2021 The Linux Foundation. All rights reserved.
3*5113495bSYour Name  * Copyright (c) 2022-2023 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 target if functions
22*5113495bSYour Name  */
23*5113495bSYour Name 
24*5113495bSYour Name #include "../../../nan/core/src/nan_main_i.h"
25*5113495bSYour Name #include "nan_public_structs.h"
26*5113495bSYour Name #include "nan_ucfg_api.h"
27*5113495bSYour Name #include "target_if_nan.h"
28*5113495bSYour Name #include "wlan_nan_api.h"
29*5113495bSYour Name #include "target_if.h"
30*5113495bSYour Name #include "wmi_unified_api.h"
31*5113495bSYour Name #include "scheduler_api.h"
32*5113495bSYour Name #include <wmi_unified.h>
33*5113495bSYour Name 
target_if_nan_event_flush_cb(struct scheduler_msg * msg)34*5113495bSYour Name static QDF_STATUS target_if_nan_event_flush_cb(struct scheduler_msg *msg)
35*5113495bSYour Name {
36*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc;
37*5113495bSYour Name 
38*5113495bSYour Name 	if (!msg || !msg->bodyptr) {
39*5113495bSYour Name 		target_if_err("Empty message for NAN Discovery event");
40*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
41*5113495bSYour Name 	}
42*5113495bSYour Name 
43*5113495bSYour Name 	psoc = ((struct nan_event_params *)msg->bodyptr)->psoc;
44*5113495bSYour Name 	wlan_objmgr_psoc_release_ref(psoc, WLAN_NAN_ID);
45*5113495bSYour Name 	qdf_mem_free(msg->bodyptr);
46*5113495bSYour Name 	msg->bodyptr = NULL;
47*5113495bSYour Name 
48*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
49*5113495bSYour Name }
50*5113495bSYour Name 
target_if_nan_event_dispatcher(struct scheduler_msg * msg)51*5113495bSYour Name static QDF_STATUS target_if_nan_event_dispatcher(struct scheduler_msg *msg)
52*5113495bSYour Name {
53*5113495bSYour Name 	struct wlan_nan_rx_ops *nan_rx_ops;
54*5113495bSYour Name 	struct nan_event_params *nan_rsp;
55*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc;
56*5113495bSYour Name 	QDF_STATUS status;
57*5113495bSYour Name 
58*5113495bSYour Name 	nan_rsp = msg->bodyptr;
59*5113495bSYour Name 	psoc = nan_rsp->psoc;
60*5113495bSYour Name 
61*5113495bSYour Name 	nan_rx_ops = nan_psoc_get_rx_ops(psoc);
62*5113495bSYour Name 	if (!nan_rx_ops) {
63*5113495bSYour Name 		target_if_err("nan_rx_ops is null");
64*5113495bSYour Name 		status = QDF_STATUS_E_NULL_VALUE;
65*5113495bSYour Name 	} else {
66*5113495bSYour Name 		status = nan_rx_ops->nan_discovery_event_rx(msg);
67*5113495bSYour Name 	}
68*5113495bSYour Name 
69*5113495bSYour Name 	target_if_nan_event_flush_cb(msg);
70*5113495bSYour Name 	return status;
71*5113495bSYour Name }
72*5113495bSYour Name 
target_if_ndp_event_flush_cb(struct scheduler_msg * msg)73*5113495bSYour Name static QDF_STATUS target_if_ndp_event_flush_cb(struct scheduler_msg *msg)
74*5113495bSYour Name {
75*5113495bSYour Name 	void *ptr = msg->bodyptr;
76*5113495bSYour Name 	struct wlan_objmgr_vdev *vdev = NULL;
77*5113495bSYour Name 
78*5113495bSYour Name 	switch (msg->type) {
79*5113495bSYour Name 	case NDP_INITIATOR_RSP:
80*5113495bSYour Name 		vdev = ((struct nan_datapath_initiator_rsp *)ptr)->vdev;
81*5113495bSYour Name 		break;
82*5113495bSYour Name 	case NDP_INDICATION:
83*5113495bSYour Name 		vdev = ((struct nan_datapath_indication_event *)ptr)->vdev;
84*5113495bSYour Name 		break;
85*5113495bSYour Name 	case NDP_CONFIRM:
86*5113495bSYour Name 		vdev = ((struct nan_datapath_confirm_event *)ptr)->vdev;
87*5113495bSYour Name 		break;
88*5113495bSYour Name 	case NDP_RESPONDER_RSP:
89*5113495bSYour Name 		vdev = ((struct nan_datapath_responder_rsp *)ptr)->vdev;
90*5113495bSYour Name 		break;
91*5113495bSYour Name 	case NDP_END_RSP:
92*5113495bSYour Name 		vdev = ((struct nan_datapath_end_rsp_event *)ptr)->vdev;
93*5113495bSYour Name 		break;
94*5113495bSYour Name 	case NDP_END_IND:
95*5113495bSYour Name 		vdev = ((struct nan_datapath_end_indication_event *)ptr)->vdev;
96*5113495bSYour Name 		break;
97*5113495bSYour Name 	case NDP_SCHEDULE_UPDATE:
98*5113495bSYour Name 		vdev = ((struct nan_datapath_sch_update_event *)ptr)->vdev;
99*5113495bSYour Name 		break;
100*5113495bSYour Name 	case NDP_HOST_UPDATE:
101*5113495bSYour Name 		vdev = ((struct nan_datapath_host_event *)ptr)->vdev;
102*5113495bSYour Name 		break;
103*5113495bSYour Name 	default:
104*5113495bSYour Name 		break;
105*5113495bSYour Name 	}
106*5113495bSYour Name 
107*5113495bSYour Name 	if (vdev)
108*5113495bSYour Name 		wlan_objmgr_vdev_release_ref(vdev, WLAN_NAN_ID);
109*5113495bSYour Name 	qdf_mem_free(msg->bodyptr);
110*5113495bSYour Name 	msg->bodyptr = NULL;
111*5113495bSYour Name 
112*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
113*5113495bSYour Name }
114*5113495bSYour Name 
target_if_ndp_event_dispatcher(struct scheduler_msg * msg)115*5113495bSYour Name static QDF_STATUS target_if_ndp_event_dispatcher(struct scheduler_msg *msg)
116*5113495bSYour Name {
117*5113495bSYour Name 	QDF_STATUS status;
118*5113495bSYour Name 	void *ptr = msg->bodyptr;
119*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc;
120*5113495bSYour Name 	struct wlan_objmgr_vdev *vdev = NULL;
121*5113495bSYour Name 	struct wlan_nan_rx_ops *nan_rx_ops;
122*5113495bSYour Name 
123*5113495bSYour Name 	switch (msg->type) {
124*5113495bSYour Name 	case NDP_INITIATOR_RSP:
125*5113495bSYour Name 		vdev = ((struct nan_datapath_initiator_rsp *)ptr)->vdev;
126*5113495bSYour Name 		break;
127*5113495bSYour Name 	case NDP_INDICATION:
128*5113495bSYour Name 		vdev = ((struct nan_datapath_indication_event *)ptr)->vdev;
129*5113495bSYour Name 		break;
130*5113495bSYour Name 	case NDP_CONFIRM:
131*5113495bSYour Name 		vdev = ((struct nan_datapath_confirm_event *)ptr)->vdev;
132*5113495bSYour Name 		break;
133*5113495bSYour Name 	case NDP_RESPONDER_RSP:
134*5113495bSYour Name 		vdev = ((struct nan_datapath_responder_rsp *)ptr)->vdev;
135*5113495bSYour Name 		break;
136*5113495bSYour Name 	case NDP_END_RSP:
137*5113495bSYour Name 		vdev = ((struct nan_datapath_end_rsp_event *)ptr)->vdev;
138*5113495bSYour Name 		break;
139*5113495bSYour Name 	case NDP_END_IND:
140*5113495bSYour Name 		vdev = ((struct nan_datapath_end_indication_event *)ptr)->vdev;
141*5113495bSYour Name 		break;
142*5113495bSYour Name 	case NDP_SCHEDULE_UPDATE:
143*5113495bSYour Name 		vdev = ((struct nan_datapath_sch_update_event *)ptr)->vdev;
144*5113495bSYour Name 		break;
145*5113495bSYour Name 	case NDP_HOST_UPDATE:
146*5113495bSYour Name 		vdev = ((struct nan_datapath_host_event *)ptr)->vdev;
147*5113495bSYour Name 		break;
148*5113495bSYour Name 	default:
149*5113495bSYour Name 		target_if_err("invalid msg type %d", msg->type);
150*5113495bSYour Name 		status = QDF_STATUS_E_INVAL;
151*5113495bSYour Name 		goto free_res;
152*5113495bSYour Name 	}
153*5113495bSYour Name 
154*5113495bSYour Name 	if (!vdev) {
155*5113495bSYour Name 		target_if_err("vdev is null");
156*5113495bSYour Name 		status = QDF_STATUS_E_NULL_VALUE;
157*5113495bSYour Name 		goto free_res;
158*5113495bSYour Name 	}
159*5113495bSYour Name 
160*5113495bSYour Name 	psoc = wlan_vdev_get_psoc(vdev);
161*5113495bSYour Name 	if (!psoc) {
162*5113495bSYour Name 		target_if_err("psoc is null");
163*5113495bSYour Name 		status = QDF_STATUS_E_NULL_VALUE;
164*5113495bSYour Name 		goto free_res;
165*5113495bSYour Name 	}
166*5113495bSYour Name 
167*5113495bSYour Name 	nan_rx_ops = nan_psoc_get_rx_ops(psoc);
168*5113495bSYour Name 	if (!nan_rx_ops) {
169*5113495bSYour Name 		target_if_err("nan_rx_ops is null");
170*5113495bSYour Name 		status = QDF_STATUS_E_NULL_VALUE;
171*5113495bSYour Name 		goto free_res;
172*5113495bSYour Name 	}
173*5113495bSYour Name 
174*5113495bSYour Name 	status = nan_rx_ops->nan_datapath_event_rx(msg);
175*5113495bSYour Name free_res:
176*5113495bSYour Name 	if (vdev)
177*5113495bSYour Name 		wlan_objmgr_vdev_release_ref(vdev, WLAN_NAN_ID);
178*5113495bSYour Name 	qdf_mem_free(msg->bodyptr);
179*5113495bSYour Name 	msg->bodyptr = NULL;
180*5113495bSYour Name 	return status;
181*5113495bSYour Name }
182*5113495bSYour Name 
target_if_nan_ndp_initiator_req(struct nan_datapath_initiator_req * ndp_req)183*5113495bSYour Name static QDF_STATUS target_if_nan_ndp_initiator_req(
184*5113495bSYour Name 			struct nan_datapath_initiator_req *ndp_req)
185*5113495bSYour Name {
186*5113495bSYour Name 	QDF_STATUS status;
187*5113495bSYour Name 	struct wmi_unified *wmi_handle;
188*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc;
189*5113495bSYour Name 	struct scheduler_msg pe_msg = {0};
190*5113495bSYour Name 	struct wlan_nan_rx_ops *nan_rx_ops;
191*5113495bSYour Name 	struct nan_datapath_initiator_rsp ndp_rsp = {0};
192*5113495bSYour Name 
193*5113495bSYour Name 	if (!ndp_req) {
194*5113495bSYour Name 		target_if_err("ndp_req is null.");
195*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
196*5113495bSYour Name 	}
197*5113495bSYour Name 
198*5113495bSYour Name 	psoc = wlan_vdev_get_psoc(ndp_req->vdev);
199*5113495bSYour Name 	if (!psoc) {
200*5113495bSYour Name 		target_if_err("psoc is null.");
201*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
202*5113495bSYour Name 	}
203*5113495bSYour Name 
204*5113495bSYour Name 	wmi_handle = get_wmi_unified_hdl_from_psoc(psoc);
205*5113495bSYour Name 	if (!wmi_handle) {
206*5113495bSYour Name 		target_if_err("wmi_handle is null.");
207*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
208*5113495bSYour Name 	}
209*5113495bSYour Name 
210*5113495bSYour Name 	nan_rx_ops = nan_psoc_get_rx_ops(psoc);
211*5113495bSYour Name 	if (!nan_rx_ops) {
212*5113495bSYour Name 		target_if_err("nan_rx_ops is null.");
213*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
214*5113495bSYour Name 	}
215*5113495bSYour Name 
216*5113495bSYour Name 	status = wmi_unified_ndp_initiator_req_cmd_send(wmi_handle, ndp_req);
217*5113495bSYour Name 	if (QDF_IS_STATUS_SUCCESS(status))
218*5113495bSYour Name 		return status;
219*5113495bSYour Name 
220*5113495bSYour Name 	ndp_rsp.vdev = ndp_req->vdev;
221*5113495bSYour Name 	ndp_rsp.transaction_id = ndp_req->transaction_id;
222*5113495bSYour Name 	ndp_rsp.ndp_instance_id = ndp_req->service_instance_id;
223*5113495bSYour Name 	ndp_rsp.status = NAN_DATAPATH_DATA_INITIATOR_REQ_FAILED;
224*5113495bSYour Name 	pe_msg.type = NDP_INITIATOR_RSP;
225*5113495bSYour Name 	pe_msg.bodyptr = &ndp_rsp;
226*5113495bSYour Name 	if (nan_rx_ops->nan_datapath_event_rx)
227*5113495bSYour Name 		nan_rx_ops->nan_datapath_event_rx(&pe_msg);
228*5113495bSYour Name 
229*5113495bSYour Name 	return status;
230*5113495bSYour Name }
231*5113495bSYour Name 
target_if_nan_dmesg_handler(ol_scn_t scn,uint8_t * data,uint32_t data_len)232*5113495bSYour Name static int target_if_nan_dmesg_handler(ol_scn_t scn, uint8_t *data,
233*5113495bSYour Name 				       uint32_t data_len)
234*5113495bSYour Name {
235*5113495bSYour Name 	QDF_STATUS status;
236*5113495bSYour Name 	struct nan_dump_msg msg;
237*5113495bSYour Name 	struct wmi_unified *wmi_handle;
238*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc;
239*5113495bSYour Name 
240*5113495bSYour Name 	psoc = target_if_get_psoc_from_scn_hdl(scn);
241*5113495bSYour Name 	if (!psoc) {
242*5113495bSYour Name 		target_if_err("psoc is null");
243*5113495bSYour Name 		return -EINVAL;
244*5113495bSYour Name 	}
245*5113495bSYour Name 
246*5113495bSYour Name 	wmi_handle = get_wmi_unified_hdl_from_psoc(psoc);
247*5113495bSYour Name 	if (!wmi_handle) {
248*5113495bSYour Name 		target_if_err("wmi_handle is null");
249*5113495bSYour Name 		return -EINVAL;
250*5113495bSYour Name 	}
251*5113495bSYour Name 
252*5113495bSYour Name 	status = wmi_extract_nan_msg(wmi_handle, data, &msg);
253*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
254*5113495bSYour Name 		target_if_err("parsing of event failed, %d", status);
255*5113495bSYour Name 		return -EINVAL;
256*5113495bSYour Name 	}
257*5113495bSYour Name 
258*5113495bSYour Name 	if (!msg.msg) {
259*5113495bSYour Name 		target_if_err("msg not present %d", msg.data_len);
260*5113495bSYour Name 		return -EINVAL;
261*5113495bSYour Name 	}
262*5113495bSYour Name 
263*5113495bSYour Name 	target_if_info("%s", msg.msg);
264*5113495bSYour Name 
265*5113495bSYour Name 	return 0;
266*5113495bSYour Name }
267*5113495bSYour Name 
target_if_ndp_initiator_rsp_handler(ol_scn_t scn,uint8_t * data,uint32_t len)268*5113495bSYour Name static int target_if_ndp_initiator_rsp_handler(ol_scn_t scn, uint8_t *data,
269*5113495bSYour Name 						uint32_t len)
270*5113495bSYour Name {
271*5113495bSYour Name 	QDF_STATUS status;
272*5113495bSYour Name 	struct wmi_unified *wmi_handle;
273*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc;
274*5113495bSYour Name 	struct scheduler_msg msg = {0};
275*5113495bSYour Name 	struct nan_datapath_initiator_rsp *rsp;
276*5113495bSYour Name 
277*5113495bSYour Name 	psoc = target_if_get_psoc_from_scn_hdl(scn);
278*5113495bSYour Name 	if (!psoc) {
279*5113495bSYour Name 		target_if_err("psoc is null");
280*5113495bSYour Name 		return -EINVAL;
281*5113495bSYour Name 	}
282*5113495bSYour Name 
283*5113495bSYour Name 	wmi_handle = get_wmi_unified_hdl_from_psoc(psoc);
284*5113495bSYour Name 	if (!wmi_handle) {
285*5113495bSYour Name 		target_if_err("wmi_handle is null");
286*5113495bSYour Name 		return -EINVAL;
287*5113495bSYour Name 	}
288*5113495bSYour Name 
289*5113495bSYour Name 	rsp = qdf_mem_malloc(sizeof(*rsp));
290*5113495bSYour Name 	if (!rsp)
291*5113495bSYour Name 		return -ENOMEM;
292*5113495bSYour Name 
293*5113495bSYour Name 	status = wmi_extract_ndp_initiator_rsp(wmi_handle, data, rsp);
294*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
295*5113495bSYour Name 		target_if_err("parsing of event failed, %d", status);
296*5113495bSYour Name 		qdf_mem_free(rsp);
297*5113495bSYour Name 		return -EINVAL;
298*5113495bSYour Name 	}
299*5113495bSYour Name 
300*5113495bSYour Name 	msg.bodyptr = rsp;
301*5113495bSYour Name 	msg.type = NDP_INITIATOR_RSP;
302*5113495bSYour Name 	msg.callback = target_if_ndp_event_dispatcher;
303*5113495bSYour Name 	msg.flush_callback = target_if_ndp_event_flush_cb;
304*5113495bSYour Name 	target_if_debug("NDP_INITIATOR_RSP sent: %d", msg.type);
305*5113495bSYour Name 	status = scheduler_post_message(QDF_MODULE_ID_TARGET_IF,
306*5113495bSYour Name 					QDF_MODULE_ID_TARGET_IF,
307*5113495bSYour Name 					QDF_MODULE_ID_TARGET_IF, &msg);
308*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
309*5113495bSYour Name 		target_if_ndp_event_flush_cb(&msg);
310*5113495bSYour Name 		return -EINVAL;
311*5113495bSYour Name 	}
312*5113495bSYour Name 
313*5113495bSYour Name 	return 0;
314*5113495bSYour Name }
315*5113495bSYour Name 
target_if_ndp_ind_handler(ol_scn_t scn,uint8_t * data,uint32_t data_len)316*5113495bSYour Name static int target_if_ndp_ind_handler(ol_scn_t scn, uint8_t *data,
317*5113495bSYour Name 				     uint32_t data_len)
318*5113495bSYour Name {
319*5113495bSYour Name 	QDF_STATUS status;
320*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc;
321*5113495bSYour Name 	struct wmi_unified *wmi_handle;
322*5113495bSYour Name 	struct scheduler_msg msg = {0};
323*5113495bSYour Name 	struct nan_datapath_indication_event *rsp;
324*5113495bSYour Name 
325*5113495bSYour Name 	psoc = target_if_get_psoc_from_scn_hdl(scn);
326*5113495bSYour Name 	if (!psoc) {
327*5113495bSYour Name 		target_if_err("psoc is null");
328*5113495bSYour Name 		return -EINVAL;
329*5113495bSYour Name 	}
330*5113495bSYour Name 
331*5113495bSYour Name 	wmi_handle = get_wmi_unified_hdl_from_psoc(psoc);
332*5113495bSYour Name 	if (!wmi_handle) {
333*5113495bSYour Name 		target_if_err("wmi_handle is null");
334*5113495bSYour Name 		return -EINVAL;
335*5113495bSYour Name 	}
336*5113495bSYour Name 
337*5113495bSYour Name 	rsp = qdf_mem_malloc(sizeof(*rsp));
338*5113495bSYour Name 	if (!rsp)
339*5113495bSYour Name 		return -ENOMEM;
340*5113495bSYour Name 
341*5113495bSYour Name 	status = wmi_extract_ndp_ind(wmi_handle, data, rsp);
342*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
343*5113495bSYour Name 		target_if_err("parsing of event failed, %d", status);
344*5113495bSYour Name 		qdf_mem_free(rsp);
345*5113495bSYour Name 		return -EINVAL;
346*5113495bSYour Name 	}
347*5113495bSYour Name 
348*5113495bSYour Name 	msg.bodyptr = rsp;
349*5113495bSYour Name 	msg.type = NDP_INDICATION;
350*5113495bSYour Name 	msg.callback = target_if_ndp_event_dispatcher;
351*5113495bSYour Name 	msg.flush_callback = target_if_ndp_event_flush_cb;
352*5113495bSYour Name 	target_if_debug("NDP_INDICATION sent: %d", msg.type);
353*5113495bSYour Name 	status = scheduler_post_message(QDF_MODULE_ID_TARGET_IF,
354*5113495bSYour Name 					QDF_MODULE_ID_TARGET_IF,
355*5113495bSYour Name 					QDF_MODULE_ID_TARGET_IF, &msg);
356*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
357*5113495bSYour Name 		target_if_ndp_event_flush_cb(&msg);
358*5113495bSYour Name 		return -EINVAL;
359*5113495bSYour Name 	}
360*5113495bSYour Name 
361*5113495bSYour Name 	return 0;
362*5113495bSYour Name }
363*5113495bSYour Name 
target_if_ndp_confirm_handler(ol_scn_t scn,uint8_t * data,uint32_t data_len)364*5113495bSYour Name static int target_if_ndp_confirm_handler(ol_scn_t scn, uint8_t *data,
365*5113495bSYour Name 					uint32_t data_len)
366*5113495bSYour Name {
367*5113495bSYour Name 	QDF_STATUS status;
368*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc;
369*5113495bSYour Name 	struct wmi_unified *wmi_handle;
370*5113495bSYour Name 	struct scheduler_msg msg = {0};
371*5113495bSYour Name 	struct nan_datapath_confirm_event *rsp;
372*5113495bSYour Name 
373*5113495bSYour Name 	psoc = target_if_get_psoc_from_scn_hdl(scn);
374*5113495bSYour Name 	if (!psoc) {
375*5113495bSYour Name 		target_if_err("psoc is null");
376*5113495bSYour Name 		return -EINVAL;
377*5113495bSYour Name 	}
378*5113495bSYour Name 
379*5113495bSYour Name 	wmi_handle = get_wmi_unified_hdl_from_psoc(psoc);
380*5113495bSYour Name 	if (!wmi_handle) {
381*5113495bSYour Name 		target_if_err("wmi_handle is null");
382*5113495bSYour Name 		return -EINVAL;
383*5113495bSYour Name 	}
384*5113495bSYour Name 
385*5113495bSYour Name 	rsp = qdf_mem_malloc(sizeof(*rsp));
386*5113495bSYour Name 	if (!rsp)
387*5113495bSYour Name 		return -ENOMEM;
388*5113495bSYour Name 
389*5113495bSYour Name 	status = wmi_extract_ndp_confirm(wmi_handle, data, rsp);
390*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
391*5113495bSYour Name 		target_if_err("parsing of event failed, %d", status);
392*5113495bSYour Name 		qdf_mem_free(rsp);
393*5113495bSYour Name 		return -EINVAL;
394*5113495bSYour Name 	}
395*5113495bSYour Name 
396*5113495bSYour Name 	msg.bodyptr = rsp;
397*5113495bSYour Name 	msg.type = NDP_CONFIRM;
398*5113495bSYour Name 	msg.callback = target_if_ndp_event_dispatcher;
399*5113495bSYour Name 	msg.flush_callback = target_if_ndp_event_flush_cb;
400*5113495bSYour Name 	target_if_debug("NDP_CONFIRM sent: %d", msg.type);
401*5113495bSYour Name 	status = scheduler_post_message(QDF_MODULE_ID_TARGET_IF,
402*5113495bSYour Name 					QDF_MODULE_ID_TARGET_IF,
403*5113495bSYour Name 					QDF_MODULE_ID_TARGET_IF, &msg);
404*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
405*5113495bSYour Name 		target_if_ndp_event_flush_cb(&msg);
406*5113495bSYour Name 		return -EINVAL;
407*5113495bSYour Name 	}
408*5113495bSYour Name 
409*5113495bSYour Name 	return 0;
410*5113495bSYour Name }
411*5113495bSYour Name 
target_if_nan_ndp_responder_req(struct nan_datapath_responder_req * req)412*5113495bSYour Name static QDF_STATUS target_if_nan_ndp_responder_req(
413*5113495bSYour Name 				struct nan_datapath_responder_req *req)
414*5113495bSYour Name {
415*5113495bSYour Name 	QDF_STATUS status;
416*5113495bSYour Name 	struct wmi_unified *wmi_handle;
417*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc;
418*5113495bSYour Name 	struct scheduler_msg pe_msg = {0};
419*5113495bSYour Name 	struct wlan_nan_rx_ops *nan_rx_ops;
420*5113495bSYour Name 	struct nan_datapath_responder_rsp rsp = {0};
421*5113495bSYour Name 
422*5113495bSYour Name 	if (!req) {
423*5113495bSYour Name 		target_if_err("Invalid req.");
424*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
425*5113495bSYour Name 	}
426*5113495bSYour Name 
427*5113495bSYour Name 	psoc = wlan_vdev_get_psoc(req->vdev);
428*5113495bSYour Name 	if (!psoc) {
429*5113495bSYour Name 		target_if_err("psoc is null.");
430*5113495bSYour Name 		return QDF_STATUS_E_NULL_VALUE;
431*5113495bSYour Name 	}
432*5113495bSYour Name 
433*5113495bSYour Name 	wmi_handle = get_wmi_unified_hdl_from_psoc(psoc);
434*5113495bSYour Name 	if (!wmi_handle) {
435*5113495bSYour Name 		target_if_err("wmi_handle is null.");
436*5113495bSYour Name 		return QDF_STATUS_E_NULL_VALUE;
437*5113495bSYour Name 	}
438*5113495bSYour Name 
439*5113495bSYour Name 	nan_rx_ops = nan_psoc_get_rx_ops(psoc);
440*5113495bSYour Name 	if (!nan_rx_ops) {
441*5113495bSYour Name 		target_if_err("nan_rx_ops is null.");
442*5113495bSYour Name 		return QDF_STATUS_E_NULL_VALUE;
443*5113495bSYour Name 	}
444*5113495bSYour Name 
445*5113495bSYour Name 	status = wmi_unified_ndp_responder_req_cmd_send(wmi_handle, req);
446*5113495bSYour Name 	if (QDF_IS_STATUS_SUCCESS(status))
447*5113495bSYour Name 		return status;
448*5113495bSYour Name 
449*5113495bSYour Name 	rsp.vdev = req->vdev;
450*5113495bSYour Name 	rsp.transaction_id = req->transaction_id;
451*5113495bSYour Name 	rsp.status = NAN_DATAPATH_RSP_STATUS_ERROR;
452*5113495bSYour Name 	rsp.reason = NAN_DATAPATH_DATA_RESPONDER_REQ_FAILED;
453*5113495bSYour Name 	pe_msg.bodyptr = &rsp;
454*5113495bSYour Name 	pe_msg.type = NDP_RESPONDER_RSP;
455*5113495bSYour Name 	if (nan_rx_ops->nan_datapath_event_rx)
456*5113495bSYour Name 		nan_rx_ops->nan_datapath_event_rx(&pe_msg);
457*5113495bSYour Name 
458*5113495bSYour Name 	return status;
459*5113495bSYour Name }
460*5113495bSYour Name 
target_if_ndp_responder_rsp_handler(ol_scn_t scn,uint8_t * data,uint32_t len)461*5113495bSYour Name static int target_if_ndp_responder_rsp_handler(ol_scn_t scn, uint8_t *data,
462*5113495bSYour Name 						uint32_t len)
463*5113495bSYour Name {
464*5113495bSYour Name 	QDF_STATUS status;
465*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc;
466*5113495bSYour Name 	struct wmi_unified *wmi_handle;
467*5113495bSYour Name 	struct scheduler_msg msg = {0};
468*5113495bSYour Name 	struct nan_datapath_responder_rsp *rsp;
469*5113495bSYour Name 
470*5113495bSYour Name 	psoc = target_if_get_psoc_from_scn_hdl(scn);
471*5113495bSYour Name 	if (!psoc) {
472*5113495bSYour Name 		target_if_err("psoc is null");
473*5113495bSYour Name 		return -EINVAL;
474*5113495bSYour Name 	}
475*5113495bSYour Name 
476*5113495bSYour Name 	wmi_handle = get_wmi_unified_hdl_from_psoc(psoc);
477*5113495bSYour Name 	if (!wmi_handle) {
478*5113495bSYour Name 		target_if_err("wmi_handle is null.");
479*5113495bSYour Name 		return -EINVAL;
480*5113495bSYour Name 	}
481*5113495bSYour Name 
482*5113495bSYour Name 	rsp = qdf_mem_malloc(sizeof(*rsp));
483*5113495bSYour Name 	if (!rsp)
484*5113495bSYour Name 		return -ENOMEM;
485*5113495bSYour Name 
486*5113495bSYour Name 	status = wmi_extract_ndp_responder_rsp(wmi_handle, data, rsp);
487*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
488*5113495bSYour Name 		target_if_err("parsing of event failed, %d", status);
489*5113495bSYour Name 		qdf_mem_free(rsp);
490*5113495bSYour Name 		return -EINVAL;
491*5113495bSYour Name 	}
492*5113495bSYour Name 
493*5113495bSYour Name 	msg.bodyptr = rsp;
494*5113495bSYour Name 	msg.type = NDP_RESPONDER_RSP;
495*5113495bSYour Name 	msg.callback = target_if_ndp_event_dispatcher;
496*5113495bSYour Name 	msg.flush_callback = target_if_ndp_event_flush_cb;
497*5113495bSYour Name 	target_if_debug("NDP_INITIATOR_RSP sent: %d", msg.type);
498*5113495bSYour Name 	status = scheduler_post_message(QDF_MODULE_ID_TARGET_IF,
499*5113495bSYour Name 					QDF_MODULE_ID_TARGET_IF,
500*5113495bSYour Name 					QDF_MODULE_ID_TARGET_IF, &msg);
501*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
502*5113495bSYour Name 		target_if_ndp_event_flush_cb(&msg);
503*5113495bSYour Name 		return -EINVAL;
504*5113495bSYour Name 	}
505*5113495bSYour Name 
506*5113495bSYour Name 	return 0;
507*5113495bSYour Name }
508*5113495bSYour Name 
target_if_nan_ndp_end_req(struct nan_datapath_end_req * req)509*5113495bSYour Name static QDF_STATUS target_if_nan_ndp_end_req(struct nan_datapath_end_req *req)
510*5113495bSYour Name {
511*5113495bSYour Name 	QDF_STATUS status;
512*5113495bSYour Name 	struct wmi_unified *wmi_handle;
513*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc;
514*5113495bSYour Name 	struct scheduler_msg msg = {0};
515*5113495bSYour Name 	struct wlan_nan_rx_ops *nan_rx_ops;
516*5113495bSYour Name 	struct nan_datapath_end_rsp_event end_rsp = {0};
517*5113495bSYour Name 
518*5113495bSYour Name 	if (!req) {
519*5113495bSYour Name 		target_if_err("req is null");
520*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
521*5113495bSYour Name 	}
522*5113495bSYour Name 
523*5113495bSYour Name 	psoc = wlan_vdev_get_psoc(req->vdev);
524*5113495bSYour Name 	if (!psoc) {
525*5113495bSYour Name 		target_if_err("psoc is null.");
526*5113495bSYour Name 		return QDF_STATUS_E_NULL_VALUE;
527*5113495bSYour Name 	}
528*5113495bSYour Name 
529*5113495bSYour Name 	wmi_handle = get_wmi_unified_hdl_from_psoc(psoc);
530*5113495bSYour Name 	if (!wmi_handle) {
531*5113495bSYour Name 		target_if_err("wmi_handle is null.");
532*5113495bSYour Name 		return QDF_STATUS_E_NULL_VALUE;
533*5113495bSYour Name 	}
534*5113495bSYour Name 
535*5113495bSYour Name 	nan_rx_ops = nan_psoc_get_rx_ops(psoc);
536*5113495bSYour Name 	if (!nan_rx_ops) {
537*5113495bSYour Name 		target_if_err("nan_rx_ops is null.");
538*5113495bSYour Name 		return QDF_STATUS_E_NULL_VALUE;
539*5113495bSYour Name 	}
540*5113495bSYour Name 
541*5113495bSYour Name 	status = wmi_unified_ndp_end_req_cmd_send(wmi_handle, req);
542*5113495bSYour Name 	if (QDF_IS_STATUS_SUCCESS(status))
543*5113495bSYour Name 		return status;
544*5113495bSYour Name 
545*5113495bSYour Name 	end_rsp.vdev = req->vdev;
546*5113495bSYour Name 	msg.type = NDP_END_RSP;
547*5113495bSYour Name 	end_rsp.status = NAN_DATAPATH_RSP_STATUS_ERROR;
548*5113495bSYour Name 	end_rsp.reason = NAN_DATAPATH_END_FAILED;
549*5113495bSYour Name 	end_rsp.transaction_id = req->transaction_id;
550*5113495bSYour Name 	msg.bodyptr = &end_rsp;
551*5113495bSYour Name 
552*5113495bSYour Name 	if (nan_rx_ops->nan_datapath_event_rx)
553*5113495bSYour Name 		nan_rx_ops->nan_datapath_event_rx(&msg);
554*5113495bSYour Name 
555*5113495bSYour Name 	return status;
556*5113495bSYour Name }
557*5113495bSYour Name 
target_if_ndp_end_rsp_handler(ol_scn_t scn,uint8_t * data,uint32_t data_len)558*5113495bSYour Name static int target_if_ndp_end_rsp_handler(ol_scn_t scn, uint8_t *data,
559*5113495bSYour Name 					 uint32_t data_len)
560*5113495bSYour Name {
561*5113495bSYour Name 	QDF_STATUS status;
562*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc;
563*5113495bSYour Name 	struct wmi_unified *wmi_handle;
564*5113495bSYour Name 	struct scheduler_msg msg = {0};
565*5113495bSYour Name 	struct nan_datapath_end_rsp_event *end_rsp;
566*5113495bSYour Name 
567*5113495bSYour Name 	psoc = target_if_get_psoc_from_scn_hdl(scn);
568*5113495bSYour Name 	if (!psoc) {
569*5113495bSYour Name 		target_if_err("psoc is null");
570*5113495bSYour Name 		return -EINVAL;
571*5113495bSYour Name 	}
572*5113495bSYour Name 
573*5113495bSYour Name 	wmi_handle = get_wmi_unified_hdl_from_psoc(psoc);
574*5113495bSYour Name 	if (!wmi_handle) {
575*5113495bSYour Name 		target_if_err("wmi_handle is null.");
576*5113495bSYour Name 		return -EINVAL;
577*5113495bSYour Name 	}
578*5113495bSYour Name 
579*5113495bSYour Name 	end_rsp = qdf_mem_malloc(sizeof(*end_rsp));
580*5113495bSYour Name 	if (!end_rsp)
581*5113495bSYour Name 		return -ENOMEM;
582*5113495bSYour Name 
583*5113495bSYour Name 	status = wmi_extract_ndp_end_rsp(wmi_handle, data, end_rsp);
584*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
585*5113495bSYour Name 		target_if_err("parsing of event failed, %d", status);
586*5113495bSYour Name 		qdf_mem_free(end_rsp);
587*5113495bSYour Name 		return -EINVAL;
588*5113495bSYour Name 	}
589*5113495bSYour Name 
590*5113495bSYour Name 	msg.bodyptr = end_rsp;
591*5113495bSYour Name 	msg.type = NDP_END_RSP;
592*5113495bSYour Name 	msg.callback = target_if_ndp_event_dispatcher;
593*5113495bSYour Name 	msg.flush_callback = target_if_ndp_event_flush_cb;
594*5113495bSYour Name 	target_if_debug("NDP_END_RSP sent: %d", msg.type);
595*5113495bSYour Name 	status = scheduler_post_message(QDF_MODULE_ID_TARGET_IF,
596*5113495bSYour Name 					QDF_MODULE_ID_TARGET_IF,
597*5113495bSYour Name 					QDF_MODULE_ID_TARGET_IF, &msg);
598*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
599*5113495bSYour Name 		target_if_ndp_event_flush_cb(&msg);
600*5113495bSYour Name 		return -EINVAL;
601*5113495bSYour Name 	}
602*5113495bSYour Name 
603*5113495bSYour Name 	return 0;
604*5113495bSYour Name }
605*5113495bSYour Name 
target_if_ndp_end_ind_handler(ol_scn_t scn,uint8_t * data,uint32_t data_len)606*5113495bSYour Name static int target_if_ndp_end_ind_handler(ol_scn_t scn, uint8_t *data,
607*5113495bSYour Name 					 uint32_t data_len)
608*5113495bSYour Name {
609*5113495bSYour Name 	QDF_STATUS status;
610*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc;
611*5113495bSYour Name 	struct wmi_unified *wmi_handle;
612*5113495bSYour Name 	struct scheduler_msg msg = {0};
613*5113495bSYour Name 	struct nan_datapath_end_indication_event *rsp = NULL;
614*5113495bSYour Name 
615*5113495bSYour Name 	psoc = target_if_get_psoc_from_scn_hdl(scn);
616*5113495bSYour Name 	if (!psoc) {
617*5113495bSYour Name 		target_if_err("psoc is null");
618*5113495bSYour Name 		return -EINVAL;
619*5113495bSYour Name 	}
620*5113495bSYour Name 
621*5113495bSYour Name 	wmi_handle = get_wmi_unified_hdl_from_psoc(psoc);
622*5113495bSYour Name 	if (!wmi_handle) {
623*5113495bSYour Name 		target_if_err("wmi_handle is null.");
624*5113495bSYour Name 		return -EINVAL;
625*5113495bSYour Name 	}
626*5113495bSYour Name 
627*5113495bSYour Name 	status = wmi_extract_ndp_end_ind(wmi_handle, data, &rsp);
628*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
629*5113495bSYour Name 		target_if_err("parsing of event failed, %d", status);
630*5113495bSYour Name 		return -EINVAL;
631*5113495bSYour Name 	}
632*5113495bSYour Name 
633*5113495bSYour Name 	rsp->vdev = wlan_objmgr_get_vdev_by_opmode_from_psoc(
634*5113495bSYour Name 			  wmi_handle->soc->wmi_psoc, QDF_NDI_MODE, WLAN_NAN_ID);
635*5113495bSYour Name 	if (!rsp->vdev) {
636*5113495bSYour Name 		target_if_err("vdev is null");
637*5113495bSYour Name 		qdf_mem_free(rsp);
638*5113495bSYour Name 		return -EINVAL;
639*5113495bSYour Name 	}
640*5113495bSYour Name 
641*5113495bSYour Name 	msg.bodyptr = rsp;
642*5113495bSYour Name 	msg.type = NDP_END_IND;
643*5113495bSYour Name 	msg.callback = target_if_ndp_event_dispatcher;
644*5113495bSYour Name 	msg.flush_callback = target_if_ndp_event_flush_cb;
645*5113495bSYour Name 	target_if_debug("NDP_END_IND sent: %d", msg.type);
646*5113495bSYour Name 	status = scheduler_post_message(QDF_MODULE_ID_TARGET_IF,
647*5113495bSYour Name 					QDF_MODULE_ID_TARGET_IF,
648*5113495bSYour Name 					QDF_MODULE_ID_TARGET_IF, &msg);
649*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
650*5113495bSYour Name 		target_if_ndp_event_flush_cb(&msg);
651*5113495bSYour Name 		return -EINVAL;
652*5113495bSYour Name 	}
653*5113495bSYour Name 
654*5113495bSYour Name 	return 0;
655*5113495bSYour Name }
656*5113495bSYour Name 
target_if_ndp_sch_update_handler(ol_scn_t scn,uint8_t * data,uint32_t data_len)657*5113495bSYour Name static int target_if_ndp_sch_update_handler(ol_scn_t scn, uint8_t *data,
658*5113495bSYour Name 					    uint32_t data_len)
659*5113495bSYour Name {
660*5113495bSYour Name 	QDF_STATUS status;
661*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc;
662*5113495bSYour Name 	struct wmi_unified *wmi_handle;
663*5113495bSYour Name 	struct scheduler_msg msg = {0};
664*5113495bSYour Name 	struct nan_datapath_sch_update_event *rsp;
665*5113495bSYour Name 
666*5113495bSYour Name 	psoc = target_if_get_psoc_from_scn_hdl(scn);
667*5113495bSYour Name 	if (!psoc) {
668*5113495bSYour Name 		target_if_err("psoc is null");
669*5113495bSYour Name 		return -EINVAL;
670*5113495bSYour Name 	}
671*5113495bSYour Name 
672*5113495bSYour Name 	wmi_handle = get_wmi_unified_hdl_from_psoc(psoc);
673*5113495bSYour Name 	if (!wmi_handle) {
674*5113495bSYour Name 		target_if_err("wmi_handle is null.");
675*5113495bSYour Name 		return -EINVAL;
676*5113495bSYour Name 	}
677*5113495bSYour Name 
678*5113495bSYour Name 	rsp = qdf_mem_malloc(sizeof(*rsp));
679*5113495bSYour Name 	if (!rsp)
680*5113495bSYour Name 		return -ENOMEM;
681*5113495bSYour Name 
682*5113495bSYour Name 	status = wmi_extract_ndp_sch_update(wmi_handle, data, rsp);
683*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
684*5113495bSYour Name 		target_if_err("parsing of event failed, %d", status);
685*5113495bSYour Name 		qdf_mem_free(rsp);
686*5113495bSYour Name 		return -EINVAL;
687*5113495bSYour Name 	}
688*5113495bSYour Name 
689*5113495bSYour Name 	msg.bodyptr = rsp;
690*5113495bSYour Name 	msg.type = NDP_SCHEDULE_UPDATE;
691*5113495bSYour Name 	msg.callback = target_if_ndp_event_dispatcher;
692*5113495bSYour Name 	msg.flush_callback = target_if_ndp_event_flush_cb;
693*5113495bSYour Name 	target_if_debug("NDP_SCHEDULE_UPDATE sent: %d", msg.type);
694*5113495bSYour Name 	status = scheduler_post_message(QDF_MODULE_ID_TARGET_IF,
695*5113495bSYour Name 					QDF_MODULE_ID_TARGET_IF,
696*5113495bSYour Name 					QDF_MODULE_ID_TARGET_IF, &msg);
697*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
698*5113495bSYour Name 		target_if_ndp_event_flush_cb(&msg);
699*5113495bSYour Name 		return -EINVAL;
700*5113495bSYour Name 	}
701*5113495bSYour Name 
702*5113495bSYour Name 	return 0;
703*5113495bSYour Name }
704*5113495bSYour Name 
target_if_nan_end_all_ndps_req(void * req)705*5113495bSYour Name static QDF_STATUS target_if_nan_end_all_ndps_req(void *req)
706*5113495bSYour Name {
707*5113495bSYour Name 	struct wlan_objmgr_vdev *vdev;
708*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc;
709*5113495bSYour Name 	struct wmi_unified *wmi_handle;
710*5113495bSYour Name 	uint8_t vdev_id;
711*5113495bSYour Name 
712*5113495bSYour Name 	vdev = ((struct nan_datapath_end_all_ndps *)req)->vdev;
713*5113495bSYour Name 	if (!vdev) {
714*5113495bSYour Name 		target_if_err("vdev object is NULL!");
715*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
716*5113495bSYour Name 	}
717*5113495bSYour Name 	vdev_id = wlan_vdev_get_id(vdev);
718*5113495bSYour Name 
719*5113495bSYour Name 	psoc = wlan_vdev_get_psoc(vdev);
720*5113495bSYour Name 	if (!psoc) {
721*5113495bSYour Name 		target_if_err("psoc is null.");
722*5113495bSYour Name 		return QDF_STATUS_E_NULL_VALUE;
723*5113495bSYour Name 	}
724*5113495bSYour Name 
725*5113495bSYour Name 	wmi_handle = get_wmi_unified_hdl_from_psoc(psoc);
726*5113495bSYour Name 	if (!wmi_handle) {
727*5113495bSYour Name 		target_if_err("wmi_handle is null.");
728*5113495bSYour Name 		return QDF_STATUS_E_NULL_VALUE;
729*5113495bSYour Name 	}
730*5113495bSYour Name 
731*5113495bSYour Name 	return wmi_unified_terminate_all_ndps_req_cmd(wmi_handle, vdev_id);
732*5113495bSYour Name }
733*5113495bSYour Name 
target_if_ndp_host_event_handler(ol_scn_t scn,uint8_t * data,uint32_t data_len)734*5113495bSYour Name static int target_if_ndp_host_event_handler(ol_scn_t scn, uint8_t *data,
735*5113495bSYour Name 					    uint32_t data_len)
736*5113495bSYour Name {
737*5113495bSYour Name 	QDF_STATUS status;
738*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc;
739*5113495bSYour Name 	struct wmi_unified *wmi_handle;
740*5113495bSYour Name 	struct scheduler_msg msg = {0};
741*5113495bSYour Name 	struct nan_datapath_host_event *host_evt = NULL;
742*5113495bSYour Name 
743*5113495bSYour Name 	psoc = target_if_get_psoc_from_scn_hdl(scn);
744*5113495bSYour Name 	if (!psoc) {
745*5113495bSYour Name 		target_if_err("psoc is null");
746*5113495bSYour Name 		return -EINVAL;
747*5113495bSYour Name 	}
748*5113495bSYour Name 
749*5113495bSYour Name 	wmi_handle = get_wmi_unified_hdl_from_psoc(psoc);
750*5113495bSYour Name 	if (!wmi_handle) {
751*5113495bSYour Name 		target_if_err("wmi_handle is null.");
752*5113495bSYour Name 		return -EINVAL;
753*5113495bSYour Name 	}
754*5113495bSYour Name 
755*5113495bSYour Name 	host_evt = qdf_mem_malloc(sizeof(*host_evt));
756*5113495bSYour Name 	if (!host_evt)
757*5113495bSYour Name 		return -ENOMEM;
758*5113495bSYour Name 
759*5113495bSYour Name 	status = wmi_extract_ndp_host_event(wmi_handle, data, host_evt);
760*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
761*5113495bSYour Name 		target_if_err("parsing of event failed, %d", status);
762*5113495bSYour Name 		qdf_mem_free(host_evt);
763*5113495bSYour Name 		return -EINVAL;
764*5113495bSYour Name 	}
765*5113495bSYour Name 
766*5113495bSYour Name 	if (!host_evt->vdev) {
767*5113495bSYour Name 		target_if_err("vdev is null");
768*5113495bSYour Name 		qdf_mem_free(host_evt);
769*5113495bSYour Name 		return -EINVAL;
770*5113495bSYour Name 	}
771*5113495bSYour Name 
772*5113495bSYour Name 	msg.bodyptr = host_evt;
773*5113495bSYour Name 	msg.type = NDP_HOST_UPDATE;
774*5113495bSYour Name 	msg.callback = target_if_ndp_event_dispatcher;
775*5113495bSYour Name 	msg.flush_callback = target_if_ndp_event_flush_cb;
776*5113495bSYour Name 	target_if_debug("NDP_HOST_UPDATE sent: %d", msg.type);
777*5113495bSYour Name 	status = scheduler_post_message(QDF_MODULE_ID_TARGET_IF,
778*5113495bSYour Name 					QDF_MODULE_ID_TARGET_IF,
779*5113495bSYour Name 					QDF_MODULE_ID_TARGET_IF, &msg);
780*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
781*5113495bSYour Name 		target_if_err("failed to post msg, status: %d", status);
782*5113495bSYour Name 		target_if_ndp_event_flush_cb(&msg);
783*5113495bSYour Name 		return -EINVAL;
784*5113495bSYour Name 	}
785*5113495bSYour Name 
786*5113495bSYour Name 	return 0;
787*5113495bSYour Name }
788*5113495bSYour Name 
target_if_nan_datapath_req(void * req,uint32_t req_type)789*5113495bSYour Name static QDF_STATUS target_if_nan_datapath_req(void *req, uint32_t req_type)
790*5113495bSYour Name {
791*5113495bSYour Name 	/* send cmd to fw */
792*5113495bSYour Name 	switch (req_type) {
793*5113495bSYour Name 	case NDP_INITIATOR_REQ:
794*5113495bSYour Name 		target_if_nan_ndp_initiator_req(req);
795*5113495bSYour Name 		break;
796*5113495bSYour Name 	case NDP_RESPONDER_REQ:
797*5113495bSYour Name 		target_if_nan_ndp_responder_req(req);
798*5113495bSYour Name 		break;
799*5113495bSYour Name 	case NDP_END_REQ:
800*5113495bSYour Name 		target_if_nan_ndp_end_req(req);
801*5113495bSYour Name 		break;
802*5113495bSYour Name 	case NDP_END_ALL:
803*5113495bSYour Name 		target_if_nan_end_all_ndps_req(req);
804*5113495bSYour Name 		break;
805*5113495bSYour Name 	default:
806*5113495bSYour Name 		target_if_err("invalid req type");
807*5113495bSYour Name 		break;
808*5113495bSYour Name 	}
809*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
810*5113495bSYour Name }
811*5113495bSYour Name 
target_if_nan_generic_req(struct wlan_objmgr_psoc * psoc,void * nan_req)812*5113495bSYour Name static QDF_STATUS target_if_nan_generic_req(struct wlan_objmgr_psoc *psoc,
813*5113495bSYour Name 					    void *nan_req)
814*5113495bSYour Name {
815*5113495bSYour Name 	struct wmi_unified *wmi_handle;
816*5113495bSYour Name 
817*5113495bSYour Name 	if (!psoc) {
818*5113495bSYour Name 		target_if_err("psoc is null.");
819*5113495bSYour Name 		return QDF_STATUS_E_NULL_VALUE;
820*5113495bSYour Name 	}
821*5113495bSYour Name 
822*5113495bSYour Name 	if (!nan_req) {
823*5113495bSYour Name 		target_if_err("Invalid req.");
824*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
825*5113495bSYour Name 	}
826*5113495bSYour Name 
827*5113495bSYour Name 	wmi_handle = get_wmi_unified_hdl_from_psoc(psoc);
828*5113495bSYour Name 	if (!wmi_handle) {
829*5113495bSYour Name 		target_if_err("wmi_handle is null.");
830*5113495bSYour Name 		return QDF_STATUS_E_NULL_VALUE;
831*5113495bSYour Name 	}
832*5113495bSYour Name 
833*5113495bSYour Name 	return wmi_unified_nan_req_cmd(wmi_handle, nan_req);
834*5113495bSYour Name }
835*5113495bSYour Name 
target_if_nan_disable_req(struct nan_disable_req * nan_req)836*5113495bSYour Name static QDF_STATUS target_if_nan_disable_req(struct nan_disable_req *nan_req)
837*5113495bSYour Name {
838*5113495bSYour Name 	struct wmi_unified *wmi_handle;
839*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc;
840*5113495bSYour Name 
841*5113495bSYour Name 	if (!nan_req) {
842*5113495bSYour Name 		target_if_err("Invalid req.");
843*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
844*5113495bSYour Name 	}
845*5113495bSYour Name 	psoc = nan_req->psoc;
846*5113495bSYour Name 
847*5113495bSYour Name 	if (!psoc) {
848*5113495bSYour Name 		target_if_err("psoc is null.");
849*5113495bSYour Name 		return QDF_STATUS_E_NULL_VALUE;
850*5113495bSYour Name 	}
851*5113495bSYour Name 
852*5113495bSYour Name 	wmi_handle = get_wmi_unified_hdl_from_psoc(psoc);
853*5113495bSYour Name 	if (!wmi_handle) {
854*5113495bSYour Name 		target_if_err("wmi_handle is null.");
855*5113495bSYour Name 		return QDF_STATUS_E_NULL_VALUE;
856*5113495bSYour Name 	}
857*5113495bSYour Name 
858*5113495bSYour Name 	return wmi_unified_nan_disable_req_cmd(wmi_handle, nan_req);
859*5113495bSYour Name }
860*5113495bSYour Name 
target_if_nan_discovery_req(void * req,uint32_t req_type)861*5113495bSYour Name static QDF_STATUS target_if_nan_discovery_req(void *req, uint32_t req_type)
862*5113495bSYour Name {
863*5113495bSYour Name 	QDF_STATUS status;
864*5113495bSYour Name 
865*5113495bSYour Name 	if (!req) {
866*5113495bSYour Name 		target_if_err("Invalid req.");
867*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
868*5113495bSYour Name 	}
869*5113495bSYour Name 
870*5113495bSYour Name 	switch (req_type) {
871*5113495bSYour Name 	case NAN_DISABLE_REQ:
872*5113495bSYour Name 		status = target_if_nan_disable_req(req);
873*5113495bSYour Name 		break;
874*5113495bSYour Name 	case NAN_GENERIC_REQ: {
875*5113495bSYour Name 			struct nan_generic_req *nan_req = req;
876*5113495bSYour Name 
877*5113495bSYour Name 			status = target_if_nan_generic_req(nan_req->psoc,
878*5113495bSYour Name 							   &nan_req->params);
879*5113495bSYour Name 			break;
880*5113495bSYour Name 		}
881*5113495bSYour Name 	case NAN_ENABLE_REQ: {
882*5113495bSYour Name 			struct nan_enable_req *nan_req = req;
883*5113495bSYour Name 
884*5113495bSYour Name 			status = target_if_nan_generic_req(nan_req->psoc,
885*5113495bSYour Name 							   &nan_req->params);
886*5113495bSYour Name 			break;
887*5113495bSYour Name 		}
888*5113495bSYour Name 	default:
889*5113495bSYour Name 		target_if_err("Invalid NAN req type");
890*5113495bSYour Name 		status = QDF_STATUS_E_INVAL;
891*5113495bSYour Name 		break;
892*5113495bSYour Name 	}
893*5113495bSYour Name 
894*5113495bSYour Name 	return status;
895*5113495bSYour Name }
896*5113495bSYour Name 
target_if_nan_register_tx_ops(struct wlan_nan_tx_ops * tx_ops)897*5113495bSYour Name void target_if_nan_register_tx_ops(struct wlan_nan_tx_ops *tx_ops)
898*5113495bSYour Name {
899*5113495bSYour Name 	tx_ops->nan_discovery_req_tx = target_if_nan_discovery_req;
900*5113495bSYour Name 	tx_ops->nan_datapath_req_tx = target_if_nan_datapath_req;
901*5113495bSYour Name }
902*5113495bSYour Name 
target_if_nan_register_rx_ops(struct wlan_nan_rx_ops * rx_ops)903*5113495bSYour Name void target_if_nan_register_rx_ops(struct wlan_nan_rx_ops *rx_ops)
904*5113495bSYour Name {
905*5113495bSYour Name 	rx_ops->nan_discovery_event_rx = nan_discovery_event_handler;
906*5113495bSYour Name 	rx_ops->nan_datapath_event_rx = nan_datapath_event_handler;
907*5113495bSYour Name }
908*5113495bSYour Name 
target_if_nan_rsp_handler(ol_scn_t scn,uint8_t * data,uint32_t len)909*5113495bSYour Name int target_if_nan_rsp_handler(ol_scn_t scn, uint8_t *data, uint32_t len)
910*5113495bSYour Name {
911*5113495bSYour Name 	struct nan_event_params *nan_rsp, temp_evt_params = {0};
912*5113495bSYour Name 	struct scheduler_msg msg = {0};
913*5113495bSYour Name 	struct wmi_unified *wmi_handle;
914*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc;
915*5113495bSYour Name 	QDF_STATUS status;
916*5113495bSYour Name 	uint8_t *buf_ptr;
917*5113495bSYour Name 
918*5113495bSYour Name 	psoc = target_if_get_psoc_from_scn_hdl(scn);
919*5113495bSYour Name 	if (!psoc) {
920*5113495bSYour Name 		target_if_err("psoc is null");
921*5113495bSYour Name 		return -EINVAL;
922*5113495bSYour Name 	}
923*5113495bSYour Name 
924*5113495bSYour Name 	wmi_handle = get_wmi_unified_hdl_from_psoc(psoc);
925*5113495bSYour Name 	if (!wmi_handle) {
926*5113495bSYour Name 		target_if_err("wmi_handle is null");
927*5113495bSYour Name 		return -EINVAL;
928*5113495bSYour Name 	}
929*5113495bSYour Name 
930*5113495bSYour Name 	status = wmi_extract_nan_event_rsp(wmi_handle, data, &temp_evt_params,
931*5113495bSYour Name 					   &buf_ptr);
932*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
933*5113495bSYour Name 		target_if_err("parsing of event failed, %d", status);
934*5113495bSYour Name 		return -EINVAL;
935*5113495bSYour Name 	}
936*5113495bSYour Name 
937*5113495bSYour Name 	nan_rsp = qdf_mem_malloc(sizeof(*nan_rsp) + temp_evt_params.buf_len);
938*5113495bSYour Name 	if (!nan_rsp)
939*5113495bSYour Name 		return -ENOMEM;
940*5113495bSYour Name 
941*5113495bSYour Name 	qdf_mem_copy(nan_rsp, &temp_evt_params, sizeof(*nan_rsp));
942*5113495bSYour Name 
943*5113495bSYour Name 	status = wlan_objmgr_psoc_try_get_ref(psoc, WLAN_NAN_ID);
944*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
945*5113495bSYour Name 		target_if_err("Failed to obtain psoc ref");
946*5113495bSYour Name 		return -EACCES;
947*5113495bSYour Name 	}
948*5113495bSYour Name 
949*5113495bSYour Name 	nan_rsp->psoc = psoc;
950*5113495bSYour Name 	qdf_mem_copy(nan_rsp->buf, buf_ptr, nan_rsp->buf_len);
951*5113495bSYour Name 
952*5113495bSYour Name 	msg.bodyptr = nan_rsp;
953*5113495bSYour Name 	msg.type = nan_rsp->evt_type;
954*5113495bSYour Name 	msg.callback = target_if_nan_event_dispatcher;
955*5113495bSYour Name 	msg.flush_callback = target_if_nan_event_flush_cb;
956*5113495bSYour Name 	target_if_debug("NAN Event sent: %d", msg.type);
957*5113495bSYour Name 	status = scheduler_post_message(QDF_MODULE_ID_TARGET_IF,
958*5113495bSYour Name 					QDF_MODULE_ID_TARGET_IF,
959*5113495bSYour Name 					QDF_MODULE_ID_TARGET_IF, &msg);
960*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
961*5113495bSYour Name 		target_if_err("failed to post msg, status: %d", status);
962*5113495bSYour Name 		target_if_nan_event_flush_cb(&msg);
963*5113495bSYour Name 		return -EINVAL;
964*5113495bSYour Name 	}
965*5113495bSYour Name 
966*5113495bSYour Name 	return 0;
967*5113495bSYour Name }
968*5113495bSYour Name 
target_if_nan_register_events(struct wlan_objmgr_psoc * psoc)969*5113495bSYour Name QDF_STATUS target_if_nan_register_events(struct wlan_objmgr_psoc *psoc)
970*5113495bSYour Name {
971*5113495bSYour Name 	QDF_STATUS ret;
972*5113495bSYour Name 	wmi_unified_t handle = get_wmi_unified_hdl_from_psoc(psoc);
973*5113495bSYour Name 
974*5113495bSYour Name 	if (!handle) {
975*5113495bSYour Name 		target_if_err("handle is NULL");
976*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
977*5113495bSYour Name 	}
978*5113495bSYour Name 
979*5113495bSYour Name 	/* Register for nan response event */
980*5113495bSYour Name 	ret = wmi_unified_register_event_handler(handle, wmi_nan_event_id,
981*5113495bSYour Name 						 target_if_nan_rsp_handler,
982*5113495bSYour Name 						 WMI_RX_UMAC_CTX);
983*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(ret)) {
984*5113495bSYour Name 		target_if_err("wmi event registration failed, ret: %d", ret);
985*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
986*5113495bSYour Name 	}
987*5113495bSYour Name 
988*5113495bSYour Name 	ret = wmi_unified_register_event_handler(handle,
989*5113495bSYour Name 		wmi_ndp_initiator_rsp_event_id,
990*5113495bSYour Name 		target_if_ndp_initiator_rsp_handler,
991*5113495bSYour Name 		WMI_RX_UMAC_CTX);
992*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(ret)) {
993*5113495bSYour Name 		target_if_err("wmi event registration failed, ret: %d", ret);
994*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
995*5113495bSYour Name 	}
996*5113495bSYour Name 
997*5113495bSYour Name 	ret = wmi_unified_register_event_handler(handle, wmi_nan_dmesg_event_id,
998*5113495bSYour Name 						 target_if_nan_dmesg_handler,
999*5113495bSYour Name 						 WMI_RX_WORK_CTX);
1000*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(ret)) {
1001*5113495bSYour Name 		target_if_err("wmi event registration failed, ret: %d", ret);
1002*5113495bSYour Name 		target_if_nan_deregister_events(psoc);
1003*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
1004*5113495bSYour Name 	}
1005*5113495bSYour Name 
1006*5113495bSYour Name 	ret = wmi_unified_register_event_handler(handle,
1007*5113495bSYour Name 		wmi_ndp_indication_event_id,
1008*5113495bSYour Name 		target_if_ndp_ind_handler,
1009*5113495bSYour Name 		WMI_RX_UMAC_CTX);
1010*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(ret)) {
1011*5113495bSYour Name 		target_if_err("wmi event registration failed, ret: %d", ret);
1012*5113495bSYour Name 		target_if_nan_deregister_events(psoc);
1013*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
1014*5113495bSYour Name 	}
1015*5113495bSYour Name 
1016*5113495bSYour Name 	ret = wmi_unified_register_event_handler(handle,
1017*5113495bSYour Name 		wmi_ndp_confirm_event_id,
1018*5113495bSYour Name 		target_if_ndp_confirm_handler,
1019*5113495bSYour Name 		WMI_RX_UMAC_CTX);
1020*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(ret)) {
1021*5113495bSYour Name 		target_if_err("wmi event registration failed, ret: %d", ret);
1022*5113495bSYour Name 		target_if_nan_deregister_events(psoc);
1023*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
1024*5113495bSYour Name 	}
1025*5113495bSYour Name 
1026*5113495bSYour Name 	ret = wmi_unified_register_event_handler(handle,
1027*5113495bSYour Name 		wmi_ndp_responder_rsp_event_id,
1028*5113495bSYour Name 		target_if_ndp_responder_rsp_handler,
1029*5113495bSYour Name 		WMI_RX_UMAC_CTX);
1030*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(ret)) {
1031*5113495bSYour Name 		target_if_err("wmi event registration failed, ret: %d", ret);
1032*5113495bSYour Name 		target_if_nan_deregister_events(psoc);
1033*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
1034*5113495bSYour Name 	}
1035*5113495bSYour Name 
1036*5113495bSYour Name 	ret = wmi_unified_register_event_handler(handle,
1037*5113495bSYour Name 		wmi_ndp_end_indication_event_id,
1038*5113495bSYour Name 		target_if_ndp_end_ind_handler,
1039*5113495bSYour Name 		WMI_RX_UMAC_CTX);
1040*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(ret)) {
1041*5113495bSYour Name 		target_if_err("wmi event registration failed, ret: %d", ret);
1042*5113495bSYour Name 		target_if_nan_deregister_events(psoc);
1043*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
1044*5113495bSYour Name 	}
1045*5113495bSYour Name 
1046*5113495bSYour Name 	ret = wmi_unified_register_event_handler(handle,
1047*5113495bSYour Name 		wmi_ndp_end_rsp_event_id,
1048*5113495bSYour Name 		target_if_ndp_end_rsp_handler,
1049*5113495bSYour Name 		WMI_RX_UMAC_CTX);
1050*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(ret)) {
1051*5113495bSYour Name 		target_if_err("wmi event registration failed, ret: %d", ret);
1052*5113495bSYour Name 		target_if_nan_deregister_events(psoc);
1053*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
1054*5113495bSYour Name 	}
1055*5113495bSYour Name 
1056*5113495bSYour Name 	ret = wmi_unified_register_event_handler(handle,
1057*5113495bSYour Name 		wmi_ndl_schedule_update_event_id,
1058*5113495bSYour Name 		target_if_ndp_sch_update_handler,
1059*5113495bSYour Name 		WMI_RX_UMAC_CTX);
1060*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(ret)) {
1061*5113495bSYour Name 		target_if_err("wmi event registration failed, ret: %d", ret);
1062*5113495bSYour Name 		target_if_nan_deregister_events(psoc);
1063*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
1064*5113495bSYour Name 	}
1065*5113495bSYour Name 
1066*5113495bSYour Name 	ret = wmi_unified_register_event_handler(handle, wmi_ndp_event_id,
1067*5113495bSYour Name 					       target_if_ndp_host_event_handler,
1068*5113495bSYour Name 					       WMI_RX_UMAC_CTX);
1069*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(ret)) {
1070*5113495bSYour Name 		target_if_err("wmi event registration failed, ret: %d", ret);
1071*5113495bSYour Name 		target_if_nan_deregister_events(psoc);
1072*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
1073*5113495bSYour Name 	}
1074*5113495bSYour Name 
1075*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1076*5113495bSYour Name }
1077*5113495bSYour Name 
target_if_nan_deregister_events(struct wlan_objmgr_psoc * psoc)1078*5113495bSYour Name QDF_STATUS target_if_nan_deregister_events(struct wlan_objmgr_psoc *psoc)
1079*5113495bSYour Name {
1080*5113495bSYour Name 	QDF_STATUS ret, status = QDF_STATUS_SUCCESS;
1081*5113495bSYour Name 	wmi_unified_t handle = get_wmi_unified_hdl_from_psoc(psoc);
1082*5113495bSYour Name 
1083*5113495bSYour Name 	if (!handle) {
1084*5113495bSYour Name 		target_if_err("handle is NULL");
1085*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
1086*5113495bSYour Name 	}
1087*5113495bSYour Name 	ret = wmi_unified_unregister_event_handler(handle,
1088*5113495bSYour Name 				wmi_ndl_schedule_update_event_id);
1089*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(ret)) {
1090*5113495bSYour Name 		target_if_err("wmi event deregistration failed, ret: %d", ret);
1091*5113495bSYour Name 		status = ret;
1092*5113495bSYour Name 	}
1093*5113495bSYour Name 
1094*5113495bSYour Name 	ret = wmi_unified_unregister_event_handler(handle,
1095*5113495bSYour Name 				wmi_ndp_end_rsp_event_id);
1096*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(ret)) {
1097*5113495bSYour Name 		target_if_err("wmi event deregistration failed, ret: %d", ret);
1098*5113495bSYour Name 		status = ret;
1099*5113495bSYour Name 	}
1100*5113495bSYour Name 
1101*5113495bSYour Name 	ret = wmi_unified_unregister_event_handler(handle,
1102*5113495bSYour Name 				wmi_ndp_end_indication_event_id);
1103*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(ret)) {
1104*5113495bSYour Name 		target_if_err("wmi event deregistration failed, ret: %d", ret);
1105*5113495bSYour Name 		status = ret;
1106*5113495bSYour Name 	}
1107*5113495bSYour Name 
1108*5113495bSYour Name 	ret = wmi_unified_unregister_event_handler(handle,
1109*5113495bSYour Name 				wmi_ndp_responder_rsp_event_id);
1110*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(ret)) {
1111*5113495bSYour Name 		target_if_err("wmi event deregistration failed, ret: %d", ret);
1112*5113495bSYour Name 		status = ret;
1113*5113495bSYour Name 	}
1114*5113495bSYour Name 
1115*5113495bSYour Name 	ret = wmi_unified_unregister_event_handler(handle,
1116*5113495bSYour Name 				wmi_ndp_confirm_event_id);
1117*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(ret)) {
1118*5113495bSYour Name 		target_if_err("wmi event deregistration failed, ret: %d", ret);
1119*5113495bSYour Name 		status = ret;
1120*5113495bSYour Name 	}
1121*5113495bSYour Name 
1122*5113495bSYour Name 	ret = wmi_unified_unregister_event_handler(handle,
1123*5113495bSYour Name 				wmi_ndp_indication_event_id);
1124*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(ret)) {
1125*5113495bSYour Name 		target_if_err("wmi event deregistration failed, ret: %d", ret);
1126*5113495bSYour Name 		status = ret;
1127*5113495bSYour Name 	}
1128*5113495bSYour Name 
1129*5113495bSYour Name 	ret = wmi_unified_unregister_event_handler(handle,
1130*5113495bSYour Name 						   wmi_nan_dmesg_event_id);
1131*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(ret)) {
1132*5113495bSYour Name 		target_if_err("wmi event deregistration failed, ret: %d", ret);
1133*5113495bSYour Name 		status = ret;
1134*5113495bSYour Name 	}
1135*5113495bSYour Name 
1136*5113495bSYour Name 	ret = wmi_unified_unregister_event_handler(handle,
1137*5113495bSYour Name 				wmi_ndp_initiator_rsp_event_id);
1138*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(ret)) {
1139*5113495bSYour Name 		target_if_err("wmi event deregistration failed, ret: %d", ret);
1140*5113495bSYour Name 		status = ret;
1141*5113495bSYour Name 	}
1142*5113495bSYour Name 
1143*5113495bSYour Name 	ret = wmi_unified_unregister_event_handler(handle, wmi_ndp_event_id);
1144*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(ret)) {
1145*5113495bSYour Name 		target_if_err("wmi event deregistration failed, ret: %d", ret);
1146*5113495bSYour Name 		status = ret;
1147*5113495bSYour Name 	}
1148*5113495bSYour Name 
1149*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status))
1150*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
1151*5113495bSYour Name 	else
1152*5113495bSYour Name 		return QDF_STATUS_SUCCESS;
1153*5113495bSYour Name }
1154*5113495bSYour Name 
target_if_nan_set_vdev_feature_config(struct wlan_objmgr_psoc * psoc,uint8_t vdev_id)1155*5113495bSYour Name void target_if_nan_set_vdev_feature_config(struct wlan_objmgr_psoc *psoc,
1156*5113495bSYour Name 					   uint8_t vdev_id)
1157*5113495bSYour Name {
1158*5113495bSYour Name 	QDF_STATUS status;
1159*5113495bSYour Name 	uint32_t nan_features;
1160*5113495bSYour Name 	struct vdev_set_params param;
1161*5113495bSYour Name 	wmi_unified_t wmi_handle = get_wmi_unified_hdl_from_psoc(psoc);
1162*5113495bSYour Name 
1163*5113495bSYour Name 	if (!wmi_handle) {
1164*5113495bSYour Name 		target_if_err("Invalid wmi handle");
1165*5113495bSYour Name 		return;
1166*5113495bSYour Name 	}
1167*5113495bSYour Name 
1168*5113495bSYour Name 	if (!target_if_is_vdev_valid(vdev_id)) {
1169*5113495bSYour Name 		target_if_err("vdev_id: %d is invalid, reject the req: param id %d",
1170*5113495bSYour Name 			      vdev_id,
1171*5113495bSYour Name 			      wmi_vdev_param_enable_disable_nan_config_features);
1172*5113495bSYour Name 		return;
1173*5113495bSYour Name 	}
1174*5113495bSYour Name 
1175*5113495bSYour Name 	ucfg_get_nan_feature_config(psoc, &nan_features);
1176*5113495bSYour Name 	target_if_debug("vdev_id:%d NAN features:0x%x", vdev_id, nan_features);
1177*5113495bSYour Name 
1178*5113495bSYour Name 	param.vdev_id = vdev_id;
1179*5113495bSYour Name 	param.param_id = wmi_vdev_param_enable_disable_nan_config_features;
1180*5113495bSYour Name 	param.param_value = nan_features;
1181*5113495bSYour Name 
1182*5113495bSYour Name 	status = wmi_unified_vdev_set_param_send(wmi_handle, &param);
1183*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status))
1184*5113495bSYour Name 		target_if_err("failed to set NAN_CONFIG_FEATURES(status = %d)",
1185*5113495bSYour Name 			      status);
1186*5113495bSYour Name }
1187