xref: /wlan-driver/qcacld-3.0/components/target_if/p2p/src/target_if_p2p.c (revision 5113495b16420b49004c444715d2daae2066e7dc)
1*5113495bSYour Name /*
2*5113495bSYour Name  * Copyright (c) 2017-2020 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: offload lmac interface APIs definitions for P2P
22*5113495bSYour Name  */
23*5113495bSYour Name 
24*5113495bSYour Name #include <wmi_unified_api.h>
25*5113495bSYour Name #include <wlan_p2p_public_struct.h>
26*5113495bSYour Name #include "target_if.h"
27*5113495bSYour Name #include "target_if_p2p.h"
28*5113495bSYour Name #include "target_if_p2p_mcc_quota.h"
29*5113495bSYour Name #include "init_deinit_lmac.h"
30*5113495bSYour Name 
31*5113495bSYour Name static inline struct wlan_lmac_if_p2p_rx_ops *
target_if_psoc_get_p2p_rx_ops(struct wlan_objmgr_psoc * psoc)32*5113495bSYour Name target_if_psoc_get_p2p_rx_ops(struct wlan_objmgr_psoc *psoc)
33*5113495bSYour Name {
34*5113495bSYour Name 	return &(psoc->soc_cb.rx_ops->p2p);
35*5113495bSYour Name }
36*5113495bSYour Name 
37*5113495bSYour Name #ifdef FEATURE_P2P_LISTEN_OFFLOAD
38*5113495bSYour Name static inline void
target_if_p2p_lo_register_tx_ops(struct wlan_lmac_if_p2p_tx_ops * p2p_tx_ops)39*5113495bSYour Name target_if_p2p_lo_register_tx_ops(struct wlan_lmac_if_p2p_tx_ops *p2p_tx_ops)
40*5113495bSYour Name {
41*5113495bSYour Name 	p2p_tx_ops->lo_start = target_if_p2p_lo_start;
42*5113495bSYour Name 	p2p_tx_ops->lo_stop = target_if_p2p_lo_stop;
43*5113495bSYour Name 	p2p_tx_ops->reg_lo_ev_handler =
44*5113495bSYour Name 			target_if_p2p_register_lo_event_handler;
45*5113495bSYour Name 	p2p_tx_ops->unreg_lo_ev_handler =
46*5113495bSYour Name 			target_if_p2p_unregister_lo_event_handler;
47*5113495bSYour Name }
48*5113495bSYour Name 
49*5113495bSYour Name /**
50*5113495bSYour Name  * target_p2p_lo_event_handler() - WMI callback for lo stop event
51*5113495bSYour Name  * @scn:       pointer to scn
52*5113495bSYour Name  * @data:      event buffer
53*5113495bSYour Name  * @datalen:   buffer length
54*5113495bSYour Name  *
55*5113495bSYour Name  * This function gets called from WMI when triggered wmi event
56*5113495bSYour Name  * wmi_p2p_lo_stop_event_id.
57*5113495bSYour Name  *
58*5113495bSYour Name  * Return: 0 - success
59*5113495bSYour Name  * others - failure
60*5113495bSYour Name  */
target_p2p_lo_event_handler(ol_scn_t scn,uint8_t * data,uint32_t datalen)61*5113495bSYour Name static int target_p2p_lo_event_handler(ol_scn_t scn, uint8_t *data,
62*5113495bSYour Name 	uint32_t datalen)
63*5113495bSYour Name {
64*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc;
65*5113495bSYour Name 	struct wmi_unified *wmi_handle;
66*5113495bSYour Name 	struct p2p_lo_event *event_info;
67*5113495bSYour Name 	struct wlan_lmac_if_p2p_rx_ops *p2p_rx_ops;
68*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_E_FAILURE;
69*5113495bSYour Name 
70*5113495bSYour Name 	target_if_debug("scn:%pK, data:%pK, datalen:%d", scn, data, datalen);
71*5113495bSYour Name 
72*5113495bSYour Name 	if (!scn || !data) {
73*5113495bSYour Name 		target_if_err("scn: 0x%pK, data: 0x%pK", scn, data);
74*5113495bSYour Name 		return -EINVAL;
75*5113495bSYour Name 	}
76*5113495bSYour Name 
77*5113495bSYour Name 	psoc = target_if_get_psoc_from_scn_hdl(scn);
78*5113495bSYour Name 	if (!psoc) {
79*5113495bSYour Name 		target_if_err("null psoc");
80*5113495bSYour Name 		return -EINVAL;
81*5113495bSYour Name 	}
82*5113495bSYour Name 
83*5113495bSYour Name 	wmi_handle = get_wmi_unified_hdl_from_psoc(psoc);
84*5113495bSYour Name 	if (!wmi_handle) {
85*5113495bSYour Name 		target_if_err("null wmi handle");
86*5113495bSYour Name 		return -EINVAL;
87*5113495bSYour Name 	}
88*5113495bSYour Name 
89*5113495bSYour Name 	event_info = qdf_mem_malloc(sizeof(*event_info));
90*5113495bSYour Name 	if (!event_info)
91*5113495bSYour Name 		return -ENOMEM;
92*5113495bSYour Name 
93*5113495bSYour Name 	if (wmi_extract_p2p_lo_stop_ev_param(wmi_handle, data,
94*5113495bSYour Name 			event_info)) {
95*5113495bSYour Name 		target_if_err("Failed to extract wmi p2p lo stop event");
96*5113495bSYour Name 		qdf_mem_free(event_info);
97*5113495bSYour Name 		return -EINVAL;
98*5113495bSYour Name 	}
99*5113495bSYour Name 
100*5113495bSYour Name 	p2p_rx_ops = target_if_psoc_get_p2p_rx_ops(psoc);
101*5113495bSYour Name 	if (p2p_rx_ops->lo_ev_handler) {
102*5113495bSYour Name 		status = p2p_rx_ops->lo_ev_handler(psoc, event_info);
103*5113495bSYour Name 		target_if_debug("call lo event handler, status:%d",
104*5113495bSYour Name 			status);
105*5113495bSYour Name 	} else {
106*5113495bSYour Name 		qdf_mem_free(event_info);
107*5113495bSYour Name 		target_if_debug("no valid lo event handler");
108*5113495bSYour Name 	}
109*5113495bSYour Name 
110*5113495bSYour Name 	return qdf_status_to_os_return(status);
111*5113495bSYour Name }
112*5113495bSYour Name 
target_if_p2p_register_lo_event_handler(struct wlan_objmgr_psoc * psoc,void * arg)113*5113495bSYour Name QDF_STATUS target_if_p2p_register_lo_event_handler(
114*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc, void *arg)
115*5113495bSYour Name {
116*5113495bSYour Name 	QDF_STATUS status;
117*5113495bSYour Name 	wmi_unified_t wmi_handle = lmac_get_wmi_unified_hdl(psoc);
118*5113495bSYour Name 
119*5113495bSYour Name 	target_if_debug("psoc:%pK, arg:%pK", psoc, arg);
120*5113495bSYour Name 
121*5113495bSYour Name 	if (!wmi_handle) {
122*5113495bSYour Name 		target_if_err("Invalid wmi handle");
123*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
124*5113495bSYour Name 	}
125*5113495bSYour Name 
126*5113495bSYour Name 	status = wmi_unified_register_event(wmi_handle,
127*5113495bSYour Name 					    wmi_p2p_lo_stop_event_id,
128*5113495bSYour Name 					    target_p2p_lo_event_handler);
129*5113495bSYour Name 
130*5113495bSYour Name 	target_if_debug("wmi register lo event handle, status:%d", status);
131*5113495bSYour Name 
132*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status))
133*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
134*5113495bSYour Name 	else
135*5113495bSYour Name 		return QDF_STATUS_SUCCESS;
136*5113495bSYour Name }
137*5113495bSYour Name 
target_if_p2p_unregister_lo_event_handler(struct wlan_objmgr_psoc * psoc,void * arg)138*5113495bSYour Name QDF_STATUS target_if_p2p_unregister_lo_event_handler(
139*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc, void *arg)
140*5113495bSYour Name {
141*5113495bSYour Name 	QDF_STATUS status;
142*5113495bSYour Name 	wmi_unified_t wmi_handle = lmac_get_wmi_unified_hdl(psoc);
143*5113495bSYour Name 
144*5113495bSYour Name 	target_if_debug("psoc:%pK, arg:%pK", psoc, arg);
145*5113495bSYour Name 
146*5113495bSYour Name 	if (!wmi_handle) {
147*5113495bSYour Name 		target_if_err("Invalid wmi handle");
148*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
149*5113495bSYour Name 	}
150*5113495bSYour Name 
151*5113495bSYour Name 	status = wmi_unified_unregister_event(wmi_handle,
152*5113495bSYour Name 					      wmi_p2p_lo_stop_event_id);
153*5113495bSYour Name 
154*5113495bSYour Name 	target_if_debug("wmi unregister lo event handle, status:%d", status);
155*5113495bSYour Name 
156*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status))
157*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
158*5113495bSYour Name 	else
159*5113495bSYour Name 		return QDF_STATUS_SUCCESS;
160*5113495bSYour Name }
161*5113495bSYour Name 
target_if_p2p_lo_start(struct wlan_objmgr_psoc * psoc,struct p2p_lo_start * lo_start)162*5113495bSYour Name QDF_STATUS target_if_p2p_lo_start(struct wlan_objmgr_psoc *psoc,
163*5113495bSYour Name 				  struct p2p_lo_start *lo_start)
164*5113495bSYour Name {
165*5113495bSYour Name 	wmi_unified_t wmi_handle = lmac_get_wmi_unified_hdl(psoc);
166*5113495bSYour Name 
167*5113495bSYour Name 	if (!wmi_handle) {
168*5113495bSYour Name 		target_if_err("Invalid wmi handle");
169*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
170*5113495bSYour Name 	}
171*5113495bSYour Name 
172*5113495bSYour Name 	if (!lo_start) {
173*5113495bSYour Name 		target_if_err("lo start parameters is null");
174*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
175*5113495bSYour Name 	}
176*5113495bSYour Name 	target_if_debug("psoc:%pK, vdev_id:%d", psoc, lo_start->vdev_id);
177*5113495bSYour Name 
178*5113495bSYour Name 	return wmi_unified_p2p_lo_start_cmd(wmi_handle, lo_start);
179*5113495bSYour Name }
180*5113495bSYour Name 
target_if_p2p_lo_stop(struct wlan_objmgr_psoc * psoc,uint32_t vdev_id)181*5113495bSYour Name QDF_STATUS target_if_p2p_lo_stop(struct wlan_objmgr_psoc *psoc,
182*5113495bSYour Name 				 uint32_t vdev_id)
183*5113495bSYour Name {
184*5113495bSYour Name 	wmi_unified_t wmi_handle = lmac_get_wmi_unified_hdl(psoc);
185*5113495bSYour Name 
186*5113495bSYour Name 	target_if_debug("psoc:%pK, vdev_id:%d", psoc, vdev_id);
187*5113495bSYour Name 
188*5113495bSYour Name 	if (!wmi_handle) {
189*5113495bSYour Name 		target_if_err("Invalid wmi handle");
190*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
191*5113495bSYour Name 	}
192*5113495bSYour Name 
193*5113495bSYour Name 	return wmi_unified_p2p_lo_stop_cmd(wmi_handle,
194*5113495bSYour Name 			(uint8_t)vdev_id);
195*5113495bSYour Name }
196*5113495bSYour Name #else
197*5113495bSYour Name static inline void
target_if_p2p_lo_register_tx_ops(struct wlan_lmac_if_p2p_tx_ops * p2p_tx_ops)198*5113495bSYour Name target_if_p2p_lo_register_tx_ops(struct wlan_lmac_if_p2p_tx_ops *p2p_tx_ops)
199*5113495bSYour Name {
200*5113495bSYour Name }
201*5113495bSYour Name #endif /* FEATURE_P2P_LISTEN_OFFLOAD */
202*5113495bSYour Name 
203*5113495bSYour Name /**
204*5113495bSYour Name  * target_p2p_noa_event_handler() - WMI callback for noa event
205*5113495bSYour Name  * @scn:       pointer to scn
206*5113495bSYour Name  * @data:      event buffer
207*5113495bSYour Name  * @datalen:   buffer length
208*5113495bSYour Name  *
209*5113495bSYour Name  * This function gets called from WMI when triggered WMI event
210*5113495bSYour Name  * wmi_p2p_noa_event_id.
211*5113495bSYour Name  *
212*5113495bSYour Name  * Return: 0 - success
213*5113495bSYour Name  * others - failure
214*5113495bSYour Name  */
target_p2p_noa_event_handler(ol_scn_t scn,uint8_t * data,uint32_t datalen)215*5113495bSYour Name static int target_p2p_noa_event_handler(ol_scn_t scn, uint8_t *data,
216*5113495bSYour Name 	uint32_t datalen)
217*5113495bSYour Name {
218*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc;
219*5113495bSYour Name 	struct wmi_unified *wmi_handle;
220*5113495bSYour Name 	struct p2p_noa_info *event_info;
221*5113495bSYour Name 	struct wlan_lmac_if_p2p_rx_ops *p2p_rx_ops;
222*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_E_FAILURE;
223*5113495bSYour Name 
224*5113495bSYour Name 	target_if_debug("scn:%pK, data:%pK, datalen:%d", scn, data, datalen);
225*5113495bSYour Name 
226*5113495bSYour Name 	if (!scn || !data) {
227*5113495bSYour Name 		target_if_err("scn: 0x%pK, data: 0x%pK", scn, data);
228*5113495bSYour Name 		return -EINVAL;
229*5113495bSYour Name 	}
230*5113495bSYour Name 
231*5113495bSYour Name 	psoc = target_if_get_psoc_from_scn_hdl(scn);
232*5113495bSYour Name 	if (!psoc) {
233*5113495bSYour Name 		target_if_err("null psoc");
234*5113495bSYour Name 		return -EINVAL;
235*5113495bSYour Name 	}
236*5113495bSYour Name 
237*5113495bSYour Name 	wmi_handle = get_wmi_unified_hdl_from_psoc(psoc);
238*5113495bSYour Name 	if (!wmi_handle) {
239*5113495bSYour Name 		target_if_err("null wmi handle");
240*5113495bSYour Name 		return -EINVAL;
241*5113495bSYour Name 	}
242*5113495bSYour Name 
243*5113495bSYour Name 	event_info = qdf_mem_malloc(sizeof(*event_info));
244*5113495bSYour Name 	if (!event_info)
245*5113495bSYour Name 		return -ENOMEM;
246*5113495bSYour Name 
247*5113495bSYour Name 	if (wmi_extract_p2p_noa_ev_param(wmi_handle, data,
248*5113495bSYour Name 			event_info)) {
249*5113495bSYour Name 		target_if_err("failed to extract wmi p2p noa event");
250*5113495bSYour Name 		qdf_mem_free(event_info);
251*5113495bSYour Name 		return -EINVAL;
252*5113495bSYour Name 	}
253*5113495bSYour Name 
254*5113495bSYour Name 	p2p_rx_ops = target_if_psoc_get_p2p_rx_ops(psoc);
255*5113495bSYour Name 	if (p2p_rx_ops->noa_ev_handler) {
256*5113495bSYour Name 		status = p2p_rx_ops->noa_ev_handler(psoc, event_info);
257*5113495bSYour Name 		target_if_debug("call noa event handler, status:%d",
258*5113495bSYour Name 			status);
259*5113495bSYour Name 	} else {
260*5113495bSYour Name 		qdf_mem_free(event_info);
261*5113495bSYour Name 		target_if_debug("no valid noa event handler");
262*5113495bSYour Name 	}
263*5113495bSYour Name 
264*5113495bSYour Name 	return qdf_status_to_os_return(status);
265*5113495bSYour Name }
266*5113495bSYour Name 
target_if_p2p_register_noa_event_handler(struct wlan_objmgr_psoc * psoc,void * arg)267*5113495bSYour Name QDF_STATUS target_if_p2p_register_noa_event_handler(
268*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc, void *arg)
269*5113495bSYour Name {
270*5113495bSYour Name 	int status;
271*5113495bSYour Name 	wmi_unified_t wmi_handle = lmac_get_wmi_unified_hdl(psoc);
272*5113495bSYour Name 
273*5113495bSYour Name 	target_if_debug("psoc:%pK, arg:%pK", psoc, arg);
274*5113495bSYour Name 
275*5113495bSYour Name 	if (!wmi_handle) {
276*5113495bSYour Name 		target_if_err("Invalid wmi handle");
277*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
278*5113495bSYour Name 	}
279*5113495bSYour Name 
280*5113495bSYour Name 	status = wmi_unified_register_event(wmi_handle,
281*5113495bSYour Name 			wmi_p2p_noa_event_id,
282*5113495bSYour Name 			target_p2p_noa_event_handler);
283*5113495bSYour Name 
284*5113495bSYour Name 	target_if_debug("wmi register noa event handle, status:%d",
285*5113495bSYour Name 		status);
286*5113495bSYour Name 
287*5113495bSYour Name 	return status == 0 ? QDF_STATUS_SUCCESS : QDF_STATUS_E_FAILURE;
288*5113495bSYour Name }
289*5113495bSYour Name 
target_if_p2p_unregister_noa_event_handler(struct wlan_objmgr_psoc * psoc,void * arg)290*5113495bSYour Name QDF_STATUS target_if_p2p_unregister_noa_event_handler(
291*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc, void *arg)
292*5113495bSYour Name {
293*5113495bSYour Name 	QDF_STATUS status;
294*5113495bSYour Name 	wmi_unified_t wmi_handle = lmac_get_wmi_unified_hdl(psoc);
295*5113495bSYour Name 
296*5113495bSYour Name 	target_if_debug("psoc:%pK, arg:%pK", psoc, arg);
297*5113495bSYour Name 
298*5113495bSYour Name 	if (!wmi_handle) {
299*5113495bSYour Name 		target_if_err("Invalid wmi handle");
300*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
301*5113495bSYour Name 	}
302*5113495bSYour Name 
303*5113495bSYour Name 	status = wmi_unified_unregister_event(wmi_handle,
304*5113495bSYour Name 			wmi_p2p_noa_event_id);
305*5113495bSYour Name 
306*5113495bSYour Name 	target_if_debug("wmi unregister noa event handle, status:%d",
307*5113495bSYour Name 		status);
308*5113495bSYour Name 
309*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status))
310*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
311*5113495bSYour Name 	else
312*5113495bSYour Name 		return QDF_STATUS_SUCCESS;
313*5113495bSYour Name }
314*5113495bSYour Name 
target_if_p2p_set_ps(struct wlan_objmgr_psoc * psoc,struct p2p_ps_config * ps_config)315*5113495bSYour Name QDF_STATUS target_if_p2p_set_ps(struct wlan_objmgr_psoc *psoc,
316*5113495bSYour Name 	struct p2p_ps_config *ps_config)
317*5113495bSYour Name {
318*5113495bSYour Name 	struct p2p_ps_params cmd;
319*5113495bSYour Name 	QDF_STATUS status;
320*5113495bSYour Name 	 wmi_unified_t wmi_handle = lmac_get_wmi_unified_hdl(psoc);
321*5113495bSYour Name 
322*5113495bSYour Name 	if (!wmi_handle) {
323*5113495bSYour Name 		target_if_err("Invalid wmi handle");
324*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
325*5113495bSYour Name 	}
326*5113495bSYour Name 
327*5113495bSYour Name 	if (!ps_config) {
328*5113495bSYour Name 		target_if_err("ps config parameters is null");
329*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
330*5113495bSYour Name 	}
331*5113495bSYour Name 
332*5113495bSYour Name 	target_if_debug("psoc:%pK, vdev_id:%d, opp_ps:%d", psoc,
333*5113495bSYour Name 			ps_config->vdev_id, ps_config->opp_ps);
334*5113495bSYour Name 
335*5113495bSYour Name 	cmd.opp_ps = ps_config->opp_ps;
336*5113495bSYour Name 	cmd.ctwindow = ps_config->ct_window;
337*5113495bSYour Name 	cmd.count = ps_config->count;
338*5113495bSYour Name 	cmd.duration = ps_config->duration;
339*5113495bSYour Name 	cmd.interval = ps_config->interval;
340*5113495bSYour Name 	cmd.single_noa_duration = ps_config->single_noa_duration;
341*5113495bSYour Name 	cmd.ps_selection = ps_config->ps_selection;
342*5113495bSYour Name 	cmd.session_id =  ps_config->vdev_id;
343*5113495bSYour Name 	cmd.start = ps_config->start;
344*5113495bSYour Name 
345*5113495bSYour Name 	if (ps_config->opp_ps)
346*5113495bSYour Name 		status = wmi_unified_set_p2pgo_oppps_req(wmi_handle,
347*5113495bSYour Name 				   &cmd);
348*5113495bSYour Name 	else
349*5113495bSYour Name 		status = wmi_unified_set_p2pgo_noa_req_cmd(wmi_handle,
350*5113495bSYour Name 				   &cmd);
351*5113495bSYour Name 
352*5113495bSYour Name 	if (status != QDF_STATUS_SUCCESS)
353*5113495bSYour Name 		target_if_err("Failed to send set uapsd param, %d",
354*5113495bSYour Name 				status);
355*5113495bSYour Name 
356*5113495bSYour Name 	return status;
357*5113495bSYour Name }
358*5113495bSYour Name 
target_if_p2p_set_noa(struct wlan_objmgr_psoc * psoc,uint32_t vdev_id,bool disable_noa)359*5113495bSYour Name QDF_STATUS target_if_p2p_set_noa(struct wlan_objmgr_psoc *psoc,
360*5113495bSYour Name 	uint32_t vdev_id, bool disable_noa)
361*5113495bSYour Name {
362*5113495bSYour Name 	struct vdev_set_params param;
363*5113495bSYour Name 	wmi_unified_t wmi_handle = lmac_get_wmi_unified_hdl(psoc);
364*5113495bSYour Name 
365*5113495bSYour Name 	if (!wmi_handle) {
366*5113495bSYour Name 		target_if_err("Invalid wmi handle");
367*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
368*5113495bSYour Name 	}
369*5113495bSYour Name 
370*5113495bSYour Name 	target_if_debug("psoc:%pK, vdev_id:%d disable_noa:%d",
371*5113495bSYour Name 				psoc, vdev_id, disable_noa);
372*5113495bSYour Name 	param.vdev_id = vdev_id;
373*5113495bSYour Name 	param.param_id = wmi_vdev_param_disable_noa_p2p_go;
374*5113495bSYour Name 	param.param_value = (uint32_t)disable_noa;
375*5113495bSYour Name 
376*5113495bSYour Name 	return wmi_unified_vdev_set_param_send(wmi_handle, &param);
377*5113495bSYour Name }
378*5113495bSYour Name 
target_p2p_mac_rx_filter_event_handler(ol_scn_t scn,uint8_t * data,uint32_t datalen)379*5113495bSYour Name static int target_p2p_mac_rx_filter_event_handler(ol_scn_t scn, uint8_t *data,
380*5113495bSYour Name 						  uint32_t datalen)
381*5113495bSYour Name {
382*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc;
383*5113495bSYour Name 	struct wmi_unified *wmi_handle;
384*5113495bSYour Name 	struct p2p_set_mac_filter_evt event_info;
385*5113495bSYour Name 	struct wlan_lmac_if_p2p_rx_ops *p2p_rx_ops;
386*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_E_FAILURE;
387*5113495bSYour Name 
388*5113495bSYour Name 	if (!scn || !data) {
389*5113495bSYour Name 		target_if_err("scn: 0x%pK, data: 0x%pK", scn, data);
390*5113495bSYour Name 		return -EINVAL;
391*5113495bSYour Name 	}
392*5113495bSYour Name 
393*5113495bSYour Name 	psoc = target_if_get_psoc_from_scn_hdl(scn);
394*5113495bSYour Name 	if (!psoc) {
395*5113495bSYour Name 		target_if_err("null psoc");
396*5113495bSYour Name 		return -EINVAL;
397*5113495bSYour Name 	}
398*5113495bSYour Name 
399*5113495bSYour Name 	wmi_handle = get_wmi_unified_hdl_from_psoc(psoc);
400*5113495bSYour Name 	if (!wmi_handle) {
401*5113495bSYour Name 		target_if_err("null wmi handle");
402*5113495bSYour Name 		return -EINVAL;
403*5113495bSYour Name 	}
404*5113495bSYour Name 
405*5113495bSYour Name 	if (wmi_extract_mac_addr_rx_filter_evt_param(wmi_handle, data,
406*5113495bSYour Name 						     &event_info)) {
407*5113495bSYour Name 		target_if_err("failed to extract wmi p2p noa event");
408*5113495bSYour Name 		return -EINVAL;
409*5113495bSYour Name 	}
410*5113495bSYour Name 	target_if_debug("vdev_id %d status %d", event_info.vdev_id,
411*5113495bSYour Name 			event_info.status);
412*5113495bSYour Name 	p2p_rx_ops = target_if_psoc_get_p2p_rx_ops(psoc);
413*5113495bSYour Name 	if (p2p_rx_ops && p2p_rx_ops->add_mac_addr_filter_evt_handler)
414*5113495bSYour Name 		status = p2p_rx_ops->add_mac_addr_filter_evt_handler(
415*5113495bSYour Name 					psoc, &event_info);
416*5113495bSYour Name 	else
417*5113495bSYour Name 		target_if_debug("no add mac addr filter event handler");
418*5113495bSYour Name 
419*5113495bSYour Name 	return qdf_status_to_os_return(status);
420*5113495bSYour Name }
421*5113495bSYour Name 
target_if_p2p_register_macaddr_rx_filter_evt_handler(struct wlan_objmgr_psoc * psoc,bool reg)422*5113495bSYour Name static QDF_STATUS target_if_p2p_register_macaddr_rx_filter_evt_handler(
423*5113495bSYour Name 		struct wlan_objmgr_psoc *psoc, bool reg)
424*5113495bSYour Name {
425*5113495bSYour Name 	int status;
426*5113495bSYour Name 	wmi_unified_t wmi_handle = lmac_get_wmi_unified_hdl(psoc);
427*5113495bSYour Name 
428*5113495bSYour Name 	target_if_debug("psoc:%pK, register %d mac addr rx evt", psoc, reg);
429*5113495bSYour Name 
430*5113495bSYour Name 	if (!wmi_handle) {
431*5113495bSYour Name 		target_if_err("Invalid wmi handle");
432*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
433*5113495bSYour Name 	}
434*5113495bSYour Name 	if (reg)
435*5113495bSYour Name 		status = wmi_unified_register_event(
436*5113495bSYour Name 				wmi_handle,
437*5113495bSYour Name 				wmi_vdev_add_macaddr_rx_filter_event_id,
438*5113495bSYour Name 				target_p2p_mac_rx_filter_event_handler);
439*5113495bSYour Name 	else
440*5113495bSYour Name 		status = wmi_unified_unregister_event(
441*5113495bSYour Name 				wmi_handle,
442*5113495bSYour Name 				wmi_vdev_add_macaddr_rx_filter_event_id);
443*5113495bSYour Name 
444*5113495bSYour Name 	return status == 0 ? QDF_STATUS_SUCCESS : QDF_STATUS_E_FAILURE;
445*5113495bSYour Name }
446*5113495bSYour Name 
target_if_p2p_set_mac_addr_rx_filter_cmd(struct wlan_objmgr_psoc * psoc,struct set_rx_mac_filter * param)447*5113495bSYour Name static QDF_STATUS target_if_p2p_set_mac_addr_rx_filter_cmd(
448*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc, struct set_rx_mac_filter *param)
449*5113495bSYour Name {
450*5113495bSYour Name 	wmi_unified_t wmi_handle = lmac_get_wmi_unified_hdl(psoc);
451*5113495bSYour Name 
452*5113495bSYour Name 	if (!wmi_handle) {
453*5113495bSYour Name 		target_if_err("Invalid wmi handle");
454*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
455*5113495bSYour Name 	}
456*5113495bSYour Name 
457*5113495bSYour Name 	return wmi_unified_set_mac_addr_rx_filter(wmi_handle, param);
458*5113495bSYour Name }
459*5113495bSYour Name 
target_if_p2p_register_tx_ops(struct wlan_lmac_if_tx_ops * tx_ops)460*5113495bSYour Name void target_if_p2p_register_tx_ops(struct wlan_lmac_if_tx_ops *tx_ops)
461*5113495bSYour Name {
462*5113495bSYour Name 	struct wlan_lmac_if_p2p_tx_ops *p2p_tx_ops;
463*5113495bSYour Name 
464*5113495bSYour Name 	if (!tx_ops) {
465*5113495bSYour Name 		target_if_err("lmac tx_ops is null");
466*5113495bSYour Name 		return;
467*5113495bSYour Name 	}
468*5113495bSYour Name 
469*5113495bSYour Name 	p2p_tx_ops = &tx_ops->p2p;
470*5113495bSYour Name 	p2p_tx_ops->set_ps = target_if_p2p_set_ps;
471*5113495bSYour Name 	p2p_tx_ops->set_noa = target_if_p2p_set_noa;
472*5113495bSYour Name 	p2p_tx_ops->reg_noa_ev_handler =
473*5113495bSYour Name 			target_if_p2p_register_noa_event_handler;
474*5113495bSYour Name 	p2p_tx_ops->unreg_noa_ev_handler =
475*5113495bSYour Name 			target_if_p2p_unregister_noa_event_handler;
476*5113495bSYour Name 	p2p_tx_ops->reg_mac_addr_rx_filter_handler =
477*5113495bSYour Name 		target_if_p2p_register_macaddr_rx_filter_evt_handler;
478*5113495bSYour Name 	p2p_tx_ops->set_mac_addr_rx_filter_cmd =
479*5113495bSYour Name 		target_if_p2p_set_mac_addr_rx_filter_cmd;
480*5113495bSYour Name 	target_if_mcc_quota_register_tx_ops(tx_ops);
481*5113495bSYour Name 
482*5113495bSYour Name 	/* register P2P listen offload callbacks */
483*5113495bSYour Name 	target_if_p2p_lo_register_tx_ops(p2p_tx_ops);
484*5113495bSYour Name }
485