xref: /wlan-driver/qcacld-3.0/components/p2p/dispatcher/src/wlan_p2p_tgt_api.c (revision 5113495b16420b49004c444715d2daae2066e7dc)
1*5113495bSYour Name /*
2*5113495bSYour Name  * Copyright (c) 2017-2021 The Linux Foundation. All rights reserved.
3*5113495bSYour Name  * Copyright (c) 2022 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: This file contains p2p south bound interface definitions
22*5113495bSYour Name  */
23*5113495bSYour Name 
24*5113495bSYour Name #include <wlan_objmgr_psoc_obj.h>
25*5113495bSYour Name #include <wlan_mgmt_txrx_utils_api.h>
26*5113495bSYour Name #include <scheduler_api.h>
27*5113495bSYour Name #include <wlan_objmgr_psoc_obj.h>
28*5113495bSYour Name #include <wlan_objmgr_global_obj.h>
29*5113495bSYour Name #include <wlan_objmgr_pdev_obj.h>
30*5113495bSYour Name #include <wlan_objmgr_vdev_obj.h>
31*5113495bSYour Name #include <wlan_objmgr_peer_obj.h>
32*5113495bSYour Name #include "wlan_p2p_tgt_api.h"
33*5113495bSYour Name #include "wlan_p2p_public_struct.h"
34*5113495bSYour Name #include "../../core/src/wlan_p2p_main.h"
35*5113495bSYour Name #include "../../core/src/wlan_p2p_roc.h"
36*5113495bSYour Name #include "../../core/src/wlan_p2p_off_chan_tx.h"
37*5113495bSYour Name 
38*5113495bSYour Name #define IEEE80211_FC0_TYPE_MASK              0x0c
39*5113495bSYour Name #define P2P_NOISE_FLOOR_DBM_DEFAULT          (-96)
40*5113495bSYour Name 
41*5113495bSYour Name static inline struct wlan_lmac_if_p2p_tx_ops *
wlan_psoc_get_p2p_tx_ops(struct wlan_objmgr_psoc * psoc)42*5113495bSYour Name wlan_psoc_get_p2p_tx_ops(struct wlan_objmgr_psoc *psoc)
43*5113495bSYour Name {
44*5113495bSYour Name 	return &(psoc->soc_cb.tx_ops->p2p);
45*5113495bSYour Name }
46*5113495bSYour Name 
47*5113495bSYour Name #ifdef FEATURE_P2P_LISTEN_OFFLOAD
tgt_p2p_register_lo_ev_handler(struct wlan_objmgr_psoc * psoc)48*5113495bSYour Name QDF_STATUS tgt_p2p_register_lo_ev_handler(
49*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc)
50*5113495bSYour Name {
51*5113495bSYour Name 	struct wlan_lmac_if_p2p_tx_ops *p2p_ops;
52*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_E_FAILURE;
53*5113495bSYour Name 
54*5113495bSYour Name 	p2p_ops = wlan_psoc_get_p2p_tx_ops(psoc);
55*5113495bSYour Name 	if (p2p_ops && p2p_ops->reg_lo_ev_handler) {
56*5113495bSYour Name 		status = p2p_ops->reg_lo_ev_handler(psoc, NULL);
57*5113495bSYour Name 		p2p_debug("register lo event, status:%d", status);
58*5113495bSYour Name 	}
59*5113495bSYour Name 
60*5113495bSYour Name 	return status;
61*5113495bSYour Name }
62*5113495bSYour Name 
tgt_p2p_unregister_lo_ev_handler(struct wlan_objmgr_psoc * psoc)63*5113495bSYour Name QDF_STATUS tgt_p2p_unregister_lo_ev_handler(
64*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc)
65*5113495bSYour Name {
66*5113495bSYour Name 	struct wlan_lmac_if_p2p_tx_ops *p2p_ops;
67*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_E_FAILURE;
68*5113495bSYour Name 
69*5113495bSYour Name 	p2p_ops = wlan_psoc_get_p2p_tx_ops(psoc);
70*5113495bSYour Name 	if (p2p_ops && p2p_ops->unreg_lo_ev_handler) {
71*5113495bSYour Name 		status = p2p_ops->unreg_lo_ev_handler(psoc, NULL);
72*5113495bSYour Name 		p2p_debug("unregister lo event, status:%d", status);
73*5113495bSYour Name 	}
74*5113495bSYour Name 
75*5113495bSYour Name 	return status;
76*5113495bSYour Name }
77*5113495bSYour Name 
tgt_p2p_lo_event_cb(struct wlan_objmgr_psoc * psoc,struct p2p_lo_event * event_info)78*5113495bSYour Name QDF_STATUS tgt_p2p_lo_event_cb(struct wlan_objmgr_psoc *psoc,
79*5113495bSYour Name 			       struct p2p_lo_event *event_info)
80*5113495bSYour Name {
81*5113495bSYour Name 	struct p2p_lo_stop_event *lo_stop_event;
82*5113495bSYour Name 	struct scheduler_msg msg = {0};
83*5113495bSYour Name 	struct p2p_soc_priv_obj *p2p_soc_obj;
84*5113495bSYour Name 	QDF_STATUS status;
85*5113495bSYour Name 
86*5113495bSYour Name 	p2p_debug("soc:%pK, event_info:%pK", psoc, event_info);
87*5113495bSYour Name 
88*5113495bSYour Name 	if (!psoc) {
89*5113495bSYour Name 		p2p_err("psoc context passed is NULL");
90*5113495bSYour Name 		if (event_info)
91*5113495bSYour Name 			qdf_mem_free(event_info);
92*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
93*5113495bSYour Name 	}
94*5113495bSYour Name 
95*5113495bSYour Name 	p2p_soc_obj = wlan_objmgr_psoc_get_comp_private_obj(psoc,
96*5113495bSYour Name 						WLAN_UMAC_COMP_P2P);
97*5113495bSYour Name 	if (!p2p_soc_obj) {
98*5113495bSYour Name 		p2p_err("p2p soc object is NULL");
99*5113495bSYour Name 		if (event_info)
100*5113495bSYour Name 			qdf_mem_free(event_info);
101*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
102*5113495bSYour Name 	}
103*5113495bSYour Name 
104*5113495bSYour Name 	if (!event_info) {
105*5113495bSYour Name 		p2p_err("invalid lo stop event information");
106*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
107*5113495bSYour Name 	}
108*5113495bSYour Name 
109*5113495bSYour Name 	lo_stop_event = qdf_mem_malloc(sizeof(*lo_stop_event));
110*5113495bSYour Name 	if (!lo_stop_event) {
111*5113495bSYour Name 		qdf_mem_free(event_info);
112*5113495bSYour Name 		return QDF_STATUS_E_NOMEM;
113*5113495bSYour Name 	}
114*5113495bSYour Name 
115*5113495bSYour Name 	lo_stop_event->p2p_soc_obj = p2p_soc_obj;
116*5113495bSYour Name 	lo_stop_event->lo_event = event_info;
117*5113495bSYour Name 	msg.type = P2P_EVENT_LO_STOPPED;
118*5113495bSYour Name 	msg.bodyptr = lo_stop_event;
119*5113495bSYour Name 	msg.callback = p2p_process_evt;
120*5113495bSYour Name 	msg.flush_callback = p2p_event_flush_callback;
121*5113495bSYour Name 	status = scheduler_post_message(QDF_MODULE_ID_P2P,
122*5113495bSYour Name 					QDF_MODULE_ID_P2P,
123*5113495bSYour Name 					QDF_MODULE_ID_TARGET_IF,
124*5113495bSYour Name 					&msg);
125*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
126*5113495bSYour Name 		qdf_mem_free(lo_stop_event->lo_event);
127*5113495bSYour Name 		qdf_mem_free(lo_stop_event);
128*5113495bSYour Name 		p2p_err("post msg fail:%d", status);
129*5113495bSYour Name 	}
130*5113495bSYour Name 
131*5113495bSYour Name 	return status;
132*5113495bSYour Name }
133*5113495bSYour Name #endif /* FEATURE_P2P_LISTEN_OFFLOAD */
134*5113495bSYour Name 
135*5113495bSYour Name QDF_STATUS
tgt_p2p_add_mac_addr_status_event_cb(struct wlan_objmgr_psoc * psoc,struct p2p_set_mac_filter_evt * event_info)136*5113495bSYour Name tgt_p2p_add_mac_addr_status_event_cb(struct wlan_objmgr_psoc *psoc,
137*5113495bSYour Name 				     struct p2p_set_mac_filter_evt *event_info)
138*5113495bSYour Name {
139*5113495bSYour Name 	struct p2p_mac_filter_rsp *mac_filter_rsp;
140*5113495bSYour Name 	struct scheduler_msg msg = {0};
141*5113495bSYour Name 	struct p2p_soc_priv_obj *p2p_soc_obj;
142*5113495bSYour Name 	QDF_STATUS status;
143*5113495bSYour Name 
144*5113495bSYour Name 	if (!psoc) {
145*5113495bSYour Name 		p2p_err("random_mac:psoc context passed is NULL");
146*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
147*5113495bSYour Name 	}
148*5113495bSYour Name 	if (!event_info) {
149*5113495bSYour Name 		p2p_err("random_mac:invalid event_info");
150*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
151*5113495bSYour Name 	}
152*5113495bSYour Name 
153*5113495bSYour Name 	p2p_soc_obj = wlan_objmgr_psoc_get_comp_private_obj(
154*5113495bSYour Name 				psoc, WLAN_UMAC_COMP_P2P);
155*5113495bSYour Name 	if (!p2p_soc_obj) {
156*5113495bSYour Name 		p2p_err("random_mac:p2p soc object is NULL");
157*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
158*5113495bSYour Name 	}
159*5113495bSYour Name 
160*5113495bSYour Name 	mac_filter_rsp = qdf_mem_malloc(sizeof(*mac_filter_rsp));
161*5113495bSYour Name 	if (!mac_filter_rsp)
162*5113495bSYour Name 		return QDF_STATUS_E_NOMEM;
163*5113495bSYour Name 
164*5113495bSYour Name 	mac_filter_rsp->p2p_soc_obj = p2p_soc_obj;
165*5113495bSYour Name 	mac_filter_rsp->vdev_id = event_info->vdev_id;
166*5113495bSYour Name 	mac_filter_rsp->status = event_info->status;
167*5113495bSYour Name 
168*5113495bSYour Name 	msg.type = P2P_EVENT_ADD_MAC_RSP;
169*5113495bSYour Name 	msg.bodyptr = mac_filter_rsp;
170*5113495bSYour Name 	msg.callback = p2p_process_evt;
171*5113495bSYour Name 	status = scheduler_post_message(QDF_MODULE_ID_P2P, QDF_MODULE_ID_P2P,
172*5113495bSYour Name 					QDF_MODULE_ID_TARGET_IF, &msg);
173*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status))
174*5113495bSYour Name 		qdf_mem_free(mac_filter_rsp);
175*5113495bSYour Name 
176*5113495bSYour Name 	return status;
177*5113495bSYour Name }
178*5113495bSYour Name 
tgt_p2p_register_macaddr_rx_filter_evt_handler(struct wlan_objmgr_psoc * psoc,bool reg)179*5113495bSYour Name QDF_STATUS tgt_p2p_register_macaddr_rx_filter_evt_handler(
180*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc, bool reg)
181*5113495bSYour Name {
182*5113495bSYour Name 	struct wlan_lmac_if_p2p_tx_ops *p2p_ops;
183*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_E_FAILURE;
184*5113495bSYour Name 
185*5113495bSYour Name 	p2p_ops = wlan_psoc_get_p2p_tx_ops(psoc);
186*5113495bSYour Name 	if (p2p_ops && p2p_ops->reg_mac_addr_rx_filter_handler) {
187*5113495bSYour Name 		status = p2p_ops->reg_mac_addr_rx_filter_handler(psoc, reg);
188*5113495bSYour Name 		p2p_debug("register mac addr rx filter event,  register %d status:%d",
189*5113495bSYour Name 			  reg, status);
190*5113495bSYour Name 	}
191*5113495bSYour Name 
192*5113495bSYour Name 	return status;
193*5113495bSYour Name }
194*5113495bSYour Name 
tgt_p2p_register_noa_ev_handler(struct wlan_objmgr_psoc * psoc)195*5113495bSYour Name QDF_STATUS tgt_p2p_register_noa_ev_handler(
196*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc)
197*5113495bSYour Name {
198*5113495bSYour Name 	struct wlan_lmac_if_p2p_tx_ops *p2p_ops;
199*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_E_FAILURE;
200*5113495bSYour Name 
201*5113495bSYour Name 	p2p_ops = wlan_psoc_get_p2p_tx_ops(psoc);
202*5113495bSYour Name 	if (p2p_ops && p2p_ops->reg_noa_ev_handler) {
203*5113495bSYour Name 		status = p2p_ops->reg_noa_ev_handler(psoc, NULL);
204*5113495bSYour Name 		p2p_debug("register noa event, status:%d", status);
205*5113495bSYour Name 	}
206*5113495bSYour Name 
207*5113495bSYour Name 	return status;
208*5113495bSYour Name }
209*5113495bSYour Name 
tgt_p2p_unregister_noa_ev_handler(struct wlan_objmgr_psoc * psoc)210*5113495bSYour Name QDF_STATUS tgt_p2p_unregister_noa_ev_handler(
211*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc)
212*5113495bSYour Name {
213*5113495bSYour Name 	struct wlan_lmac_if_p2p_tx_ops *p2p_ops;
214*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_E_FAILURE;
215*5113495bSYour Name 
216*5113495bSYour Name 	p2p_ops = wlan_psoc_get_p2p_tx_ops(psoc);
217*5113495bSYour Name 	if (p2p_ops && p2p_ops->unreg_noa_ev_handler) {
218*5113495bSYour Name 		status = p2p_ops->unreg_noa_ev_handler(psoc, NULL);
219*5113495bSYour Name 		p2p_debug("unregister noa event, status:%d", status);
220*5113495bSYour Name 	}
221*5113495bSYour Name 
222*5113495bSYour Name 	return status;
223*5113495bSYour Name }
224*5113495bSYour Name 
tgt_p2p_scan_event_cb(struct wlan_objmgr_vdev * vdev,struct scan_event * event,void * arg)225*5113495bSYour Name void tgt_p2p_scan_event_cb(struct wlan_objmgr_vdev *vdev,
226*5113495bSYour Name 	struct scan_event *event, void *arg)
227*5113495bSYour Name {
228*5113495bSYour Name 	p2p_scan_event_cb(vdev, event, arg);
229*5113495bSYour Name }
230*5113495bSYour Name 
tgt_p2p_mgmt_download_comp_cb(void * context,qdf_nbuf_t buf,bool free)231*5113495bSYour Name QDF_STATUS tgt_p2p_mgmt_download_comp_cb(void *context,
232*5113495bSYour Name 	qdf_nbuf_t buf, bool free)
233*5113495bSYour Name {
234*5113495bSYour Name 	p2p_debug("context:%pK, buf:%pK, free:%d", context,
235*5113495bSYour Name 		qdf_nbuf_data(buf), free);
236*5113495bSYour Name 
237*5113495bSYour Name 	qdf_nbuf_free(buf);
238*5113495bSYour Name 
239*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
240*5113495bSYour Name }
241*5113495bSYour Name 
tgt_p2p_mgmt_ota_comp_cb(void * context,qdf_nbuf_t buf,uint32_t status,void * tx_compl_params)242*5113495bSYour Name QDF_STATUS tgt_p2p_mgmt_ota_comp_cb(void *context, qdf_nbuf_t buf,
243*5113495bSYour Name 	uint32_t status, void *tx_compl_params)
244*5113495bSYour Name {
245*5113495bSYour Name 	struct p2p_tx_conf_event *tx_conf_event;
246*5113495bSYour Name 	struct scheduler_msg msg = {0};
247*5113495bSYour Name 	QDF_STATUS ret;
248*5113495bSYour Name 
249*5113495bSYour Name 	p2p_debug("context:%pK, buf:%pK, status:%d, tx complete params:%pK",
250*5113495bSYour Name 		context, buf, status, tx_compl_params);
251*5113495bSYour Name 
252*5113495bSYour Name 	if (!context) {
253*5113495bSYour Name 		p2p_err("invalid context");
254*5113495bSYour Name 		qdf_nbuf_free(buf);
255*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
256*5113495bSYour Name 	}
257*5113495bSYour Name 
258*5113495bSYour Name 	tx_conf_event = qdf_mem_malloc(sizeof(*tx_conf_event));
259*5113495bSYour Name 	if (!tx_conf_event) {
260*5113495bSYour Name 		qdf_nbuf_free(buf);
261*5113495bSYour Name 		return QDF_STATUS_E_NOMEM;
262*5113495bSYour Name 	}
263*5113495bSYour Name 
264*5113495bSYour Name 	tx_conf_event->status = status;
265*5113495bSYour Name 	tx_conf_event->nbuf = buf;
266*5113495bSYour Name 	tx_conf_event->p2p_soc_obj = (struct p2p_soc_priv_obj *)context;
267*5113495bSYour Name 	msg.type = P2P_EVENT_MGMT_TX_ACK_CNF;
268*5113495bSYour Name 	msg.bodyptr = tx_conf_event;
269*5113495bSYour Name 	msg.callback = p2p_process_evt;
270*5113495bSYour Name 	msg.flush_callback = p2p_event_flush_callback;
271*5113495bSYour Name 	ret = scheduler_post_message(QDF_MODULE_ID_P2P,
272*5113495bSYour Name 				     QDF_MODULE_ID_P2P,
273*5113495bSYour Name 				     QDF_MODULE_ID_TARGET_IF,
274*5113495bSYour Name 				     &msg);
275*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(ret)) {
276*5113495bSYour Name 		qdf_mem_free(tx_conf_event);
277*5113495bSYour Name 		qdf_nbuf_free(buf);
278*5113495bSYour Name 		p2p_err("post msg fail:%d", status);
279*5113495bSYour Name 	}
280*5113495bSYour Name 
281*5113495bSYour Name 	return ret;
282*5113495bSYour Name }
283*5113495bSYour Name 
tgt_p2p_mgmt_frame_rx_cb(struct wlan_objmgr_psoc * psoc,struct wlan_objmgr_peer * peer,qdf_nbuf_t buf,struct mgmt_rx_event_params * mgmt_rx_params,enum mgmt_frame_type frm_type)284*5113495bSYour Name QDF_STATUS tgt_p2p_mgmt_frame_rx_cb(struct wlan_objmgr_psoc *psoc,
285*5113495bSYour Name 	struct wlan_objmgr_peer *peer, qdf_nbuf_t buf,
286*5113495bSYour Name 	struct mgmt_rx_event_params *mgmt_rx_params,
287*5113495bSYour Name 	enum mgmt_frame_type frm_type)
288*5113495bSYour Name {
289*5113495bSYour Name 	struct p2p_rx_mgmt_frame *rx_mgmt;
290*5113495bSYour Name 	struct p2p_rx_mgmt_event *rx_mgmt_event;
291*5113495bSYour Name 	struct p2p_soc_priv_obj *p2p_soc_obj;
292*5113495bSYour Name 	struct scheduler_msg msg = {0};
293*5113495bSYour Name 	struct wlan_objmgr_vdev *vdev;
294*5113495bSYour Name 	uint32_t vdev_id;
295*5113495bSYour Name 	uint8_t *pdata;
296*5113495bSYour Name 	QDF_STATUS status;
297*5113495bSYour Name 
298*5113495bSYour Name 	p2p_debug("psoc:%pK, peer:%pK, type:%d", psoc, peer, frm_type);
299*5113495bSYour Name 
300*5113495bSYour Name 	if (!mgmt_rx_params) {
301*5113495bSYour Name 		p2p_err("mgmt rx params is NULL");
302*5113495bSYour Name 		qdf_nbuf_free(buf);
303*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
304*5113495bSYour Name 	}
305*5113495bSYour Name 
306*5113495bSYour Name 	p2p_soc_obj = wlan_objmgr_psoc_get_comp_private_obj(psoc,
307*5113495bSYour Name 			WLAN_UMAC_COMP_P2P);
308*5113495bSYour Name 	if (!p2p_soc_obj) {
309*5113495bSYour Name 		p2p_err("p2p ctx is NULL, drop this frame");
310*5113495bSYour Name 		qdf_nbuf_free(buf);
311*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
312*5113495bSYour Name 	}
313*5113495bSYour Name 
314*5113495bSYour Name 	if (!peer) {
315*5113495bSYour Name 		if (p2p_soc_obj->cur_roc_vdev_id == P2P_INVALID_VDEV_ID) {
316*5113495bSYour Name 			p2p_debug("vdev id of current roc invalid");
317*5113495bSYour Name 			qdf_nbuf_free(buf);
318*5113495bSYour Name 			return QDF_STATUS_E_FAILURE;
319*5113495bSYour Name 		} else {
320*5113495bSYour Name 			vdev_id = p2p_soc_obj->cur_roc_vdev_id;
321*5113495bSYour Name 		}
322*5113495bSYour Name 	} else {
323*5113495bSYour Name 		vdev = wlan_peer_get_vdev(peer);
324*5113495bSYour Name 		if (!vdev) {
325*5113495bSYour Name 			p2p_err("vdev is NULL in peer, drop this frame");
326*5113495bSYour Name 			qdf_nbuf_free(buf);
327*5113495bSYour Name 			return QDF_STATUS_E_FAILURE;
328*5113495bSYour Name 		}
329*5113495bSYour Name 		vdev_id = wlan_vdev_get_id(vdev);
330*5113495bSYour Name 	}
331*5113495bSYour Name 
332*5113495bSYour Name 	rx_mgmt_event = qdf_mem_malloc_atomic(sizeof(*rx_mgmt_event));
333*5113495bSYour Name 	if (!rx_mgmt_event) {
334*5113495bSYour Name 		p2p_debug_rl("Failed to allocate rx mgmt event");
335*5113495bSYour Name 		qdf_nbuf_free(buf);
336*5113495bSYour Name 		return QDF_STATUS_E_NOMEM;
337*5113495bSYour Name 	}
338*5113495bSYour Name 
339*5113495bSYour Name 	rx_mgmt = qdf_mem_malloc_atomic(sizeof(*rx_mgmt) +
340*5113495bSYour Name 			mgmt_rx_params->buf_len);
341*5113495bSYour Name 	if (!rx_mgmt) {
342*5113495bSYour Name 		p2p_debug_rl("Failed to allocate rx mgmt frame");
343*5113495bSYour Name 		qdf_nbuf_free(buf);
344*5113495bSYour Name 		return QDF_STATUS_E_NOMEM;
345*5113495bSYour Name 	}
346*5113495bSYour Name 
347*5113495bSYour Name 	pdata = (uint8_t *)qdf_nbuf_data(buf);
348*5113495bSYour Name 	rx_mgmt->frame_len = mgmt_rx_params->buf_len;
349*5113495bSYour Name 	rx_mgmt->rx_freq = mgmt_rx_params->chan_freq;
350*5113495bSYour Name 	rx_mgmt->vdev_id = vdev_id;
351*5113495bSYour Name 	rx_mgmt->frm_type = frm_type;
352*5113495bSYour Name 	rx_mgmt->rx_rssi = mgmt_rx_params->snr +
353*5113495bSYour Name 				P2P_NOISE_FLOOR_DBM_DEFAULT;
354*5113495bSYour Name 	rx_mgmt_event->rx_mgmt = rx_mgmt;
355*5113495bSYour Name 	rx_mgmt_event->p2p_soc_obj = p2p_soc_obj;
356*5113495bSYour Name 	qdf_mem_copy(rx_mgmt->buf, pdata, mgmt_rx_params->buf_len);
357*5113495bSYour Name 	msg.type = P2P_EVENT_RX_MGMT;
358*5113495bSYour Name 	msg.bodyptr = rx_mgmt_event;
359*5113495bSYour Name 	msg.callback = p2p_process_evt;
360*5113495bSYour Name 	msg.flush_callback = p2p_event_flush_callback;
361*5113495bSYour Name 	status = scheduler_post_message(QDF_MODULE_ID_P2P,
362*5113495bSYour Name 					QDF_MODULE_ID_P2P,
363*5113495bSYour Name 					QDF_MODULE_ID_TARGET_IF,
364*5113495bSYour Name 					&msg);
365*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
366*5113495bSYour Name 		qdf_mem_free(rx_mgmt_event->rx_mgmt);
367*5113495bSYour Name 		qdf_mem_free(rx_mgmt_event);
368*5113495bSYour Name 		p2p_err("post msg fail:%d", status);
369*5113495bSYour Name 	}
370*5113495bSYour Name 	qdf_nbuf_free(buf);
371*5113495bSYour Name 
372*5113495bSYour Name 	return status;
373*5113495bSYour Name }
374*5113495bSYour Name 
tgt_p2p_noa_event_cb(struct wlan_objmgr_psoc * psoc,struct p2p_noa_info * event_info)375*5113495bSYour Name QDF_STATUS  tgt_p2p_noa_event_cb(struct wlan_objmgr_psoc *psoc,
376*5113495bSYour Name 		struct p2p_noa_info *event_info)
377*5113495bSYour Name {
378*5113495bSYour Name 	struct p2p_noa_event *noa_event;
379*5113495bSYour Name 	struct scheduler_msg msg = {0};
380*5113495bSYour Name 	struct p2p_soc_priv_obj *p2p_soc_obj;
381*5113495bSYour Name 	QDF_STATUS status;
382*5113495bSYour Name 
383*5113495bSYour Name 	p2p_debug("soc:%pK, event_info:%pK", psoc, event_info);
384*5113495bSYour Name 
385*5113495bSYour Name 	if (!psoc) {
386*5113495bSYour Name 		p2p_err("psoc context passed is NULL");
387*5113495bSYour Name 		if (event_info)
388*5113495bSYour Name 			qdf_mem_free(event_info);
389*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
390*5113495bSYour Name 	}
391*5113495bSYour Name 
392*5113495bSYour Name 	p2p_soc_obj = wlan_objmgr_psoc_get_comp_private_obj(psoc,
393*5113495bSYour Name 			WLAN_UMAC_COMP_P2P);
394*5113495bSYour Name 	if (!p2p_soc_obj) {
395*5113495bSYour Name 		p2p_err("p2p soc object is NULL");
396*5113495bSYour Name 		if (event_info)
397*5113495bSYour Name 			qdf_mem_free(event_info);
398*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
399*5113495bSYour Name 	}
400*5113495bSYour Name 
401*5113495bSYour Name 	if (!event_info) {
402*5113495bSYour Name 		p2p_err("invalid noa event information");
403*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
404*5113495bSYour Name 	}
405*5113495bSYour Name 
406*5113495bSYour Name 	noa_event = qdf_mem_malloc(sizeof(*noa_event));
407*5113495bSYour Name 	if (!noa_event) {
408*5113495bSYour Name 		qdf_mem_free(event_info);
409*5113495bSYour Name 		return QDF_STATUS_E_NOMEM;
410*5113495bSYour Name 	}
411*5113495bSYour Name 
412*5113495bSYour Name 	noa_event->p2p_soc_obj = p2p_soc_obj;
413*5113495bSYour Name 	noa_event->noa_info = event_info;
414*5113495bSYour Name 	msg.type = P2P_EVENT_NOA;
415*5113495bSYour Name 	msg.bodyptr = noa_event;
416*5113495bSYour Name 	msg.callback = p2p_process_evt;
417*5113495bSYour Name 	msg.flush_callback = p2p_event_flush_callback;
418*5113495bSYour Name 	status = scheduler_post_message(QDF_MODULE_ID_P2P,
419*5113495bSYour Name 					QDF_MODULE_ID_P2P,
420*5113495bSYour Name 					QDF_MODULE_ID_TARGET_IF,
421*5113495bSYour Name 					&msg);
422*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
423*5113495bSYour Name 		qdf_mem_free(noa_event->noa_info);
424*5113495bSYour Name 		qdf_mem_free(noa_event);
425*5113495bSYour Name 		p2p_err("post msg fail:%d", status);
426*5113495bSYour Name 	}
427*5113495bSYour Name 
428*5113495bSYour Name 	return status;
429*5113495bSYour Name }
430