xref: /wlan-driver/qca-wifi-host-cmn/umac/mlo_mgr/src/wlan_mlo_mgr_msgq.c (revision 5113495b16420b49004c444715d2daae2066e7dc)
1*5113495bSYour Name /*
2*5113495bSYour Name  * Copyright (c) 2021, The Linux Foundation. All rights reserved.
3*5113495bSYour Name  * Copyright (c) 2021-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 any
6*5113495bSYour Name  * purpose with or without fee is hereby granted, provided that the above
7*5113495bSYour Name  * copyright notice and this permission notice appear in all copies.
8*5113495bSYour Name  *
9*5113495bSYour Name  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10*5113495bSYour Name  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11*5113495bSYour Name  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12*5113495bSYour Name  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13*5113495bSYour Name  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14*5113495bSYour Name  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15*5113495bSYour Name  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16*5113495bSYour Name  */
17*5113495bSYour Name #include "wlan_mlo_mgr_main.h"
18*5113495bSYour Name #include "qdf_types.h"
19*5113495bSYour Name #include "wlan_cmn.h"
20*5113495bSYour Name #include "wlan_mlo_mgr_cmn.h"
21*5113495bSYour Name #include "wlan_mlo_mgr_msgq.h"
22*5113495bSYour Name #include "wlan_mlo_mgr_peer.h"
23*5113495bSYour Name 
24*5113495bSYour Name #ifndef MLO_MSGQ_SUPPORT
mlo_msgq_post(enum mlo_msg_type type,struct wlan_mlo_dev_context * ml_dev,void * payload)25*5113495bSYour Name QDF_STATUS mlo_msgq_post(enum mlo_msg_type type,
26*5113495bSYour Name 			 struct wlan_mlo_dev_context *ml_dev,
27*5113495bSYour Name 			 void *payload)
28*5113495bSYour Name {
29*5113495bSYour Name 	struct peer_create_notif_s *peer_create;
30*5113495bSYour Name 	struct peer_assoc_notify_s *peer_assoc;
31*5113495bSYour Name 	struct peer_assoc_fail_notify_s *peer_assoc_fail;
32*5113495bSYour Name 	struct peer_discon_notify_s *peer_disconn;
33*5113495bSYour Name 	struct peer_deauth_notify_s *peer_deauth;
34*5113495bSYour Name 	struct peer_auth_process_notif_s *peer_auth;
35*5113495bSYour Name 
36*5113495bSYour Name 	switch (type) {
37*5113495bSYour Name 	case MLO_PEER_CREATE:
38*5113495bSYour Name 		peer_create = (struct peer_create_notif_s *)payload;
39*5113495bSYour Name 
40*5113495bSYour Name 		mlo_mlme_peer_create(peer_create->vdev_link,
41*5113495bSYour Name 				     peer_create->ml_peer,
42*5113495bSYour Name 				     &peer_create->addr, peer_create->frm_buf);
43*5113495bSYour Name 		qdf_nbuf_free(peer_create->frm_buf);
44*5113495bSYour Name 		wlan_mlo_peer_release_ref(peer_create->ml_peer);
45*5113495bSYour Name 		wlan_objmgr_vdev_release_ref(peer_create->vdev_link,
46*5113495bSYour Name 					     WLAN_MLO_MGR_ID);
47*5113495bSYour Name 		break;
48*5113495bSYour Name 
49*5113495bSYour Name 	case MLO_BRIDGE_PEER_CREATE:
50*5113495bSYour Name 		peer_create = (struct peer_create_notif_s *)payload;
51*5113495bSYour Name 
52*5113495bSYour Name 		mlo_mlme_bridge_peer_create(peer_create->vdev_link,
53*5113495bSYour Name 					    peer_create->ml_peer,
54*5113495bSYour Name 					    &peer_create->addr,
55*5113495bSYour Name 					    peer_create->frm_buf);
56*5113495bSYour Name 		wlan_mlo_peer_release_ref(peer_create->ml_peer);
57*5113495bSYour Name 		wlan_objmgr_vdev_release_ref(peer_create->vdev_link,
58*5113495bSYour Name 					     WLAN_MLO_MGR_ID);
59*5113495bSYour Name 		break;
60*5113495bSYour Name 
61*5113495bSYour Name 	case MLO_PEER_ASSOC:
62*5113495bSYour Name 		peer_assoc = (struct peer_assoc_notify_s *)payload;
63*5113495bSYour Name 		mlo_mlme_peer_assoc(peer_assoc->peer);
64*5113495bSYour Name 		wlan_objmgr_peer_release_ref(peer_assoc->peer,
65*5113495bSYour Name 					     WLAN_MLO_MGR_ID);
66*5113495bSYour Name 		break;
67*5113495bSYour Name 
68*5113495bSYour Name 	case MLO_PEER_ASSOC_FAIL:
69*5113495bSYour Name 		peer_assoc_fail = (struct peer_assoc_fail_notify_s *)payload;
70*5113495bSYour Name 		mlo_mlme_peer_assoc_fail(peer_assoc_fail->peer);
71*5113495bSYour Name 		wlan_objmgr_peer_release_ref(peer_assoc_fail->peer,
72*5113495bSYour Name 					     WLAN_MLO_MGR_ID);
73*5113495bSYour Name 		break;
74*5113495bSYour Name 
75*5113495bSYour Name 	case MLO_PEER_DISCONNECT:
76*5113495bSYour Name 		peer_disconn = (struct peer_discon_notify_s *)payload;
77*5113495bSYour Name 		mlo_mlme_peer_delete(peer_disconn->peer);
78*5113495bSYour Name 		wlan_objmgr_peer_release_ref(peer_disconn->peer,
79*5113495bSYour Name 					     WLAN_MLO_MGR_ID);
80*5113495bSYour Name 		break;
81*5113495bSYour Name 
82*5113495bSYour Name 	case MLO_PEER_DEAUTH:
83*5113495bSYour Name 		peer_deauth = (struct peer_deauth_notify_s *)payload;
84*5113495bSYour Name 		mlo_mlme_peer_deauth(peer_deauth->peer,
85*5113495bSYour Name 				     peer_deauth->is_disassoc);
86*5113495bSYour Name 		wlan_objmgr_peer_release_ref(peer_deauth->peer,
87*5113495bSYour Name 					     WLAN_MLO_MGR_ID);
88*5113495bSYour Name 		break;
89*5113495bSYour Name 
90*5113495bSYour Name 	case MLO_PEER_PENDING_AUTH:
91*5113495bSYour Name 		peer_auth = (struct peer_auth_process_notif_s *)payload;
92*5113495bSYour Name 		mlo_mlme_peer_process_auth(peer_auth->auth_params);
93*5113495bSYour Name 		break;
94*5113495bSYour Name 
95*5113495bSYour Name 	case MLO_PEER_REASSOC:
96*5113495bSYour Name 		peer_create = (struct peer_create_notif_s *)payload;
97*5113495bSYour Name 		mlo_mlme_peer_reassoc(peer_create->vdev_link,
98*5113495bSYour Name 				      peer_create->ml_peer, &peer_create->addr,
99*5113495bSYour Name 				      peer_create->frm_buf);
100*5113495bSYour Name 		qdf_nbuf_free(peer_create->frm_buf);
101*5113495bSYour Name 		wlan_mlo_peer_release_ref(peer_create->ml_peer);
102*5113495bSYour Name 		wlan_objmgr_vdev_release_ref(peer_create->vdev_link,
103*5113495bSYour Name 					     WLAN_MLO_MGR_ID);
104*5113495bSYour Name 		break;
105*5113495bSYour Name 
106*5113495bSYour Name 	default:
107*5113495bSYour Name 		break;
108*5113495bSYour Name 	}
109*5113495bSYour Name 
110*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
111*5113495bSYour Name }
112*5113495bSYour Name 
mlo_msgq_init(void)113*5113495bSYour Name void mlo_msgq_init(void)
114*5113495bSYour Name {
115*5113495bSYour Name }
116*5113495bSYour Name 
mlo_msgq_free(void)117*5113495bSYour Name void mlo_msgq_free(void)
118*5113495bSYour Name {
119*5113495bSYour Name }
120*5113495bSYour Name #else
mlo_msgq_timer_start(void)121*5113495bSYour Name static void mlo_msgq_timer_start(void)
122*5113495bSYour Name {
123*5113495bSYour Name 	struct ctxt_switch_mgr *msgq_ctx;
124*5113495bSYour Name 	struct mlo_mgr_context *mlo_ctx = wlan_objmgr_get_mlo_ctx();
125*5113495bSYour Name 	bool start_timer = true;
126*5113495bSYour Name 
127*5113495bSYour Name 	if (!mlo_ctx)
128*5113495bSYour Name 		return;
129*5113495bSYour Name 
130*5113495bSYour Name 	msgq_ctx = mlo_ctx->msgq_ctx;
131*5113495bSYour Name 
132*5113495bSYour Name 	qdf_spin_lock_bh(&msgq_ctx->ctxt_lock);
133*5113495bSYour Name 	if (!msgq_ctx->timer_started)
134*5113495bSYour Name 		msgq_ctx->timer_started = true;
135*5113495bSYour Name 	else
136*5113495bSYour Name 		start_timer = false;
137*5113495bSYour Name 	qdf_spin_unlock_bh(&msgq_ctx->ctxt_lock);
138*5113495bSYour Name 
139*5113495bSYour Name 	if (start_timer)
140*5113495bSYour Name 		qdf_timer_start(&msgq_ctx->ctxt_mgr_timer, 0);
141*5113495bSYour Name }
142*5113495bSYour Name 
mlo_msgq_timer_stop(void)143*5113495bSYour Name static void mlo_msgq_timer_stop(void)
144*5113495bSYour Name {
145*5113495bSYour Name 	struct ctxt_switch_mgr *msgq_ctx;
146*5113495bSYour Name 	struct mlo_mgr_context *mlo_ctx = wlan_objmgr_get_mlo_ctx();
147*5113495bSYour Name 
148*5113495bSYour Name 	if (!mlo_ctx)
149*5113495bSYour Name 		return;
150*5113495bSYour Name 
151*5113495bSYour Name 	msgq_ctx = mlo_ctx->msgq_ctx;
152*5113495bSYour Name 
153*5113495bSYour Name 	qdf_timer_stop(&msgq_ctx->ctxt_mgr_timer);
154*5113495bSYour Name 
155*5113495bSYour Name 	qdf_spin_lock_bh(&msgq_ctx->ctxt_lock);
156*5113495bSYour Name 	msgq_ctx->timer_started = false;
157*5113495bSYour Name 	qdf_spin_unlock_bh(&msgq_ctx->ctxt_lock);
158*5113495bSYour Name }
159*5113495bSYour Name 
mlo_msgq_post(enum mlo_msg_type type,struct wlan_mlo_dev_context * ml_dev,void * payload)160*5113495bSYour Name QDF_STATUS mlo_msgq_post(enum mlo_msg_type type,
161*5113495bSYour Name 			 struct wlan_mlo_dev_context *ml_dev,
162*5113495bSYour Name 			 void *payload)
163*5113495bSYour Name {
164*5113495bSYour Name 	struct mlo_ctxt_switch_msg_s *msg;
165*5113495bSYour Name 	struct peer_create_notif_s *peer_create, *peer_create_l;
166*5113495bSYour Name 	struct peer_assoc_notify_s *peer_assoc, *peer_assoc_l;
167*5113495bSYour Name 	struct peer_assoc_fail_notify_s *peer_assoc_fail, *peer_assoc_fail_l;
168*5113495bSYour Name 	struct peer_discon_notify_s *peer_disconn, *peer_disconn_l;
169*5113495bSYour Name 	struct peer_deauth_notify_s *peer_deauth, *peer_deauth_l;
170*5113495bSYour Name 	struct peer_auth_process_notif_s *peer_auth, *peer_auth_l;
171*5113495bSYour Name 	struct ctxt_switch_mgr *msgq_ctx;
172*5113495bSYour Name 	struct mlo_mgr_context *mlo_ctx = wlan_objmgr_get_mlo_ctx();
173*5113495bSYour Name 
174*5113495bSYour Name 	if (!mlo_ctx)
175*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
176*5113495bSYour Name 
177*5113495bSYour Name 	msgq_ctx = mlo_ctx->msgq_ctx;
178*5113495bSYour Name 
179*5113495bSYour Name 	if (!msgq_ctx->allow_msg)
180*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
181*5113495bSYour Name 
182*5113495bSYour Name 	msg = qdf_mem_malloc(sizeof(*msg));
183*5113495bSYour Name 	if (!msg)
184*5113495bSYour Name 		return QDF_STATUS_E_NOMEM;
185*5113495bSYour Name 
186*5113495bSYour Name 	msg->type = type;
187*5113495bSYour Name 	msg->ml_dev = ml_dev;
188*5113495bSYour Name 
189*5113495bSYour Name 	switch (type) {
190*5113495bSYour Name 	case MLO_PEER_CREATE:
191*5113495bSYour Name 		peer_create = &msg->m.peer_create;
192*5113495bSYour Name 		peer_create_l = (struct peer_create_notif_s *)payload;
193*5113495bSYour Name 		peer_create->frm_buf = peer_create_l->frm_buf;
194*5113495bSYour Name 		peer_create->ml_peer = peer_create_l->ml_peer;
195*5113495bSYour Name 		peer_create->vdev_link = peer_create_l->vdev_link;
196*5113495bSYour Name 		qdf_copy_macaddr(&peer_create->addr, &peer_create_l->addr);
197*5113495bSYour Name 		break;
198*5113495bSYour Name 
199*5113495bSYour Name 	case MLO_BRIDGE_PEER_CREATE:
200*5113495bSYour Name 		peer_create = &msg->m.peer_create;
201*5113495bSYour Name 		peer_create_l = (struct peer_create_notif_s *)payload;
202*5113495bSYour Name 		peer_create->frm_buf = peer_create_l->frm_buf;
203*5113495bSYour Name 		peer_create->ml_peer = peer_create_l->ml_peer;
204*5113495bSYour Name 		peer_create->vdev_link = peer_create_l->vdev_link;
205*5113495bSYour Name 		qdf_copy_macaddr(&peer_create->addr, &peer_create_l->addr);
206*5113495bSYour Name 		break;
207*5113495bSYour Name 
208*5113495bSYour Name 	case MLO_PEER_ASSOC:
209*5113495bSYour Name 		peer_assoc = &msg->m.peer_assoc;
210*5113495bSYour Name 		peer_assoc_l = (struct peer_assoc_notify_s *)payload;
211*5113495bSYour Name 		peer_assoc->peer = peer_assoc_l->peer;
212*5113495bSYour Name 		break;
213*5113495bSYour Name 
214*5113495bSYour Name 	case MLO_PEER_ASSOC_FAIL:
215*5113495bSYour Name 		peer_assoc_fail = &msg->m.peer_assoc_fail;
216*5113495bSYour Name 		peer_assoc_fail_l = (struct peer_assoc_fail_notify_s *)payload;
217*5113495bSYour Name 		peer_assoc_fail->peer = peer_assoc_fail_l->peer;
218*5113495bSYour Name 		break;
219*5113495bSYour Name 
220*5113495bSYour Name 	case MLO_PEER_DISCONNECT:
221*5113495bSYour Name 		peer_disconn = &msg->m.peer_disconn;
222*5113495bSYour Name 		peer_disconn_l = (struct peer_discon_notify_s *)payload;
223*5113495bSYour Name 		peer_disconn->peer = peer_disconn_l->peer;
224*5113495bSYour Name 		break;
225*5113495bSYour Name 
226*5113495bSYour Name 	case MLO_PEER_DEAUTH:
227*5113495bSYour Name 		peer_deauth = &msg->m.peer_deauth;
228*5113495bSYour Name 		peer_deauth_l = (struct peer_deauth_notify_s *)payload;
229*5113495bSYour Name 		peer_deauth->peer = peer_deauth_l->peer;
230*5113495bSYour Name 		peer_deauth->is_disassoc = peer_deauth_l->is_disassoc;
231*5113495bSYour Name 		break;
232*5113495bSYour Name 
233*5113495bSYour Name 	case MLO_PEER_PENDING_AUTH:
234*5113495bSYour Name 		peer_auth = &msg->m.peer_auth;
235*5113495bSYour Name 		peer_auth_l = (struct peer_auth_process_notif_s *)payload;
236*5113495bSYour Name 		peer_auth->auth_params = peer_auth_l->auth_params;
237*5113495bSYour Name 		break;
238*5113495bSYour Name 
239*5113495bSYour Name 	case MLO_PEER_REASSOC:
240*5113495bSYour Name 		peer_create = &msg->m.peer_create;
241*5113495bSYour Name 		peer_create_l = (struct peer_create_notif_s *)payload;
242*5113495bSYour Name 		peer_create->frm_buf = peer_create_l->frm_buf;
243*5113495bSYour Name 		peer_create->ml_peer = peer_create_l->ml_peer;
244*5113495bSYour Name 		peer_create->vdev_link = peer_create_l->vdev_link;
245*5113495bSYour Name 		qdf_copy_macaddr(&peer_create->addr, &peer_create_l->addr);
246*5113495bSYour Name 		break;
247*5113495bSYour Name 
248*5113495bSYour Name 	default:
249*5113495bSYour Name 		break;
250*5113495bSYour Name 	}
251*5113495bSYour Name 
252*5113495bSYour Name 	qdf_spin_lock_bh(&msgq_ctx->ctxt_lock);
253*5113495bSYour Name 	qdf_list_insert_back(&msgq_ctx->msgq_list, &msg->node);
254*5113495bSYour Name 	qdf_spin_unlock_bh(&msgq_ctx->ctxt_lock);
255*5113495bSYour Name 	mlo_msgq_timer_start();
256*5113495bSYour Name 
257*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
258*5113495bSYour Name }
259*5113495bSYour Name 
mlo_msgq_msg_process_hdlr(struct mlo_ctxt_switch_msg_s * msg)260*5113495bSYour Name static void mlo_msgq_msg_process_hdlr(struct mlo_ctxt_switch_msg_s *msg)
261*5113495bSYour Name {
262*5113495bSYour Name 	enum mlo_msg_type type;
263*5113495bSYour Name 	struct peer_create_notif_s *peer_create;
264*5113495bSYour Name 	struct peer_assoc_notify_s *peer_assoc;
265*5113495bSYour Name 	struct peer_assoc_fail_notify_s *peer_assoc_fail;
266*5113495bSYour Name 	struct peer_discon_notify_s *peer_disconn;
267*5113495bSYour Name 	struct peer_deauth_notify_s *peer_deauth;
268*5113495bSYour Name 	struct peer_auth_process_notif_s *peer_auth;
269*5113495bSYour Name 
270*5113495bSYour Name 	type = msg->type;
271*5113495bSYour Name 	switch (type) {
272*5113495bSYour Name 	case MLO_PEER_CREATE:
273*5113495bSYour Name 		peer_create = &msg->m.peer_create;
274*5113495bSYour Name 		mlo_mlme_peer_create(peer_create->vdev_link,
275*5113495bSYour Name 				     peer_create->ml_peer,
276*5113495bSYour Name 				     &peer_create->addr, peer_create->frm_buf);
277*5113495bSYour Name 		qdf_nbuf_free(peer_create->frm_buf);
278*5113495bSYour Name 		wlan_mlo_peer_release_ref(peer_create->ml_peer);
279*5113495bSYour Name 		wlan_objmgr_vdev_release_ref(peer_create->vdev_link,
280*5113495bSYour Name 					     WLAN_MLO_MGR_ID);
281*5113495bSYour Name 		break;
282*5113495bSYour Name 
283*5113495bSYour Name 	case MLO_BRIDGE_PEER_CREATE:
284*5113495bSYour Name 		peer_create = &msg->m.peer_create;
285*5113495bSYour Name 		mlo_mlme_bridge_peer_create(peer_create->vdev_link,
286*5113495bSYour Name 					    peer_create->ml_peer,
287*5113495bSYour Name 					    &peer_create->addr,
288*5113495bSYour Name 					    peer_create->frm_buf);
289*5113495bSYour Name 		wlan_mlo_peer_release_ref(peer_create->ml_peer);
290*5113495bSYour Name 		wlan_objmgr_vdev_release_ref(peer_create->vdev_link,
291*5113495bSYour Name 					     WLAN_MLO_MGR_ID);
292*5113495bSYour Name 		break;
293*5113495bSYour Name 
294*5113495bSYour Name 	case MLO_PEER_ASSOC:
295*5113495bSYour Name 		peer_assoc = &msg->m.peer_assoc;
296*5113495bSYour Name 		mlo_mlme_peer_assoc(peer_assoc->peer);
297*5113495bSYour Name 		wlan_objmgr_peer_release_ref(peer_assoc->peer,
298*5113495bSYour Name 					     WLAN_MLO_MGR_ID);
299*5113495bSYour Name 		break;
300*5113495bSYour Name 
301*5113495bSYour Name 	case MLO_PEER_ASSOC_FAIL:
302*5113495bSYour Name 		peer_assoc_fail = &msg->m.peer_assoc_fail;
303*5113495bSYour Name 		mlo_mlme_peer_assoc_fail(peer_assoc_fail->peer);
304*5113495bSYour Name 		wlan_objmgr_peer_release_ref(peer_assoc_fail->peer,
305*5113495bSYour Name 					     WLAN_MLO_MGR_ID);
306*5113495bSYour Name 		break;
307*5113495bSYour Name 
308*5113495bSYour Name 	case MLO_PEER_DISCONNECT:
309*5113495bSYour Name 		peer_disconn = &msg->m.peer_disconn;
310*5113495bSYour Name 		mlo_mlme_peer_delete(peer_disconn->peer);
311*5113495bSYour Name 		wlan_objmgr_peer_release_ref(peer_disconn->peer,
312*5113495bSYour Name 					     WLAN_MLO_MGR_ID);
313*5113495bSYour Name 		break;
314*5113495bSYour Name 
315*5113495bSYour Name 	case MLO_PEER_DEAUTH:
316*5113495bSYour Name 		peer_deauth = &msg->m.peer_deauth;
317*5113495bSYour Name 		mlo_mlme_peer_deauth(peer_deauth->peer);
318*5113495bSYour Name 		wlan_objmgr_peer_release_ref(peer_deauth->peer,
319*5113495bSYour Name 					     WLAN_MLO_MGR_ID);
320*5113495bSYour Name 		break;
321*5113495bSYour Name 
322*5113495bSYour Name 	case MLO_PEER_PENDING_AUTH:
323*5113495bSYour Name 		peer_auth = &msg->m.peer_auth;
324*5113495bSYour Name 		mlo_mlme_peer_process_auth(peer_auth->auth_params);
325*5113495bSYour Name 		break;
326*5113495bSYour Name 
327*5113495bSYour Name 	case MLO_PEER_REASSOC:
328*5113495bSYour Name 		peer_create = &msg->m.peer_create;
329*5113495bSYour Name 		mlo_mlme_peer_reassoc(peer_create->vdev_link,
330*5113495bSYour Name 				      peer_create->ml_peer, &peer_create->addr,
331*5113495bSYour Name 				      peer_create->frm_buf);
332*5113495bSYour Name 		qdf_nbuf_free(peer_create->frm_buf);
333*5113495bSYour Name 		wlan_mlo_peer_release_ref(peer_create->ml_peer);
334*5113495bSYour Name 		wlan_objmgr_vdev_release_ref(peer_create->vdev_link,
335*5113495bSYour Name 					     WLAN_MLO_MGR_ID);
336*5113495bSYour Name 		break;
337*5113495bSYour Name 
338*5113495bSYour Name 	default:
339*5113495bSYour Name 		break;
340*5113495bSYour Name 	}
341*5113495bSYour Name 	qdf_mem_free(msg);
342*5113495bSYour Name }
343*5113495bSYour Name 
mlo_msgq_msg_flush_hdlr(struct mlo_ctxt_switch_msg_s * msg)344*5113495bSYour Name static void mlo_msgq_msg_flush_hdlr(struct mlo_ctxt_switch_msg_s *msg)
345*5113495bSYour Name {
346*5113495bSYour Name 	enum mlo_msg_type type;
347*5113495bSYour Name 	struct peer_create_notif_s *peer_create;
348*5113495bSYour Name 	struct peer_assoc_notify_s *peer_assoc;
349*5113495bSYour Name 	struct peer_assoc_fail_notify_s *peer_assoc_fail;
350*5113495bSYour Name 	struct peer_discon_notify_s *peer_disconn;
351*5113495bSYour Name 	struct peer_deauth_notify_s *peer_deauth;
352*5113495bSYour Name 
353*5113495bSYour Name 	type = msg->type;
354*5113495bSYour Name 	switch (type) {
355*5113495bSYour Name 	case MLO_PEER_CREATE:
356*5113495bSYour Name 		peer_create = &msg->m.peer_create;
357*5113495bSYour Name 		qdf_nbuf_free(peer_create->frm_buf);
358*5113495bSYour Name 		wlan_mlo_peer_release_ref(peer_create->ml_peer);
359*5113495bSYour Name 		wlan_objmgr_vdev_release_ref(peer_create->vdev_link,
360*5113495bSYour Name 					     WLAN_MLO_MGR_ID);
361*5113495bSYour Name 		break;
362*5113495bSYour Name 
363*5113495bSYour Name 	case MLO_BRIDGE_PEER_CREATE:
364*5113495bSYour Name 		peer_create = &msg->m.peer_create;
365*5113495bSYour Name 		wlan_mlo_peer_release_ref(peer_create->ml_peer);
366*5113495bSYour Name 		wlan_objmgr_vdev_release_ref(peer_create->vdev_link,
367*5113495bSYour Name 					     WLAN_MLO_MGR_ID);
368*5113495bSYour Name 		break;
369*5113495bSYour Name 
370*5113495bSYour Name 	case MLO_PEER_ASSOC:
371*5113495bSYour Name 		peer_assoc = &msg->m.peer_assoc;
372*5113495bSYour Name 		wlan_objmgr_peer_release_ref(peer_assoc->peer,
373*5113495bSYour Name 					     WLAN_MLO_MGR_ID);
374*5113495bSYour Name 		break;
375*5113495bSYour Name 
376*5113495bSYour Name 	case MLO_PEER_ASSOC_FAIL:
377*5113495bSYour Name 		peer_assoc_fail = &msg->m.peer_assoc_fail;
378*5113495bSYour Name 		wlan_objmgr_peer_release_ref(peer_assoc_fail->peer,
379*5113495bSYour Name 					     WLAN_MLO_MGR_ID);
380*5113495bSYour Name 		break;
381*5113495bSYour Name 
382*5113495bSYour Name 	case MLO_PEER_DISCONNECT:
383*5113495bSYour Name 		peer_disconn = &msg->m.peer_disconn;
384*5113495bSYour Name 		wlan_objmgr_peer_release_ref(peer_disconn->peer,
385*5113495bSYour Name 					     WLAN_MLO_MGR_ID);
386*5113495bSYour Name 		break;
387*5113495bSYour Name 
388*5113495bSYour Name 	case MLO_PEER_DEAUTH:
389*5113495bSYour Name 		peer_deauth = &msg->m.peer_deauth;
390*5113495bSYour Name 		wlan_objmgr_peer_release_ref(peer_deauth->peer,
391*5113495bSYour Name 					     WLAN_MLO_MGR_ID);
392*5113495bSYour Name 		break;
393*5113495bSYour Name 
394*5113495bSYour Name 	case MLO_PEER_PENDING_AUTH:
395*5113495bSYour Name 		peer_auth = &msg->m.peer_auth;
396*5113495bSYour Name 		mlo_peer_free_auth_param(peer_auth->auth_params);
397*5113495bSYour Name 		break;
398*5113495bSYour Name 
399*5113495bSYour Name 	default:
400*5113495bSYour Name 		break;
401*5113495bSYour Name 	}
402*5113495bSYour Name 	qdf_mem_free(msg);
403*5113495bSYour Name }
404*5113495bSYour Name 
mlo_msgq_msg_flush(void)405*5113495bSYour Name static void mlo_msgq_msg_flush(void)
406*5113495bSYour Name {
407*5113495bSYour Name 	struct ctxt_switch_mgr *msgq_ctx;
408*5113495bSYour Name 	struct mlo_mgr_context *mlo_ctx = wlan_objmgr_get_mlo_ctx();
409*5113495bSYour Name 	qdf_list_node_t *msgbuf_node = NULL;
410*5113495bSYour Name 	struct mlo_ctxt_switch_msg_s *msg;
411*5113495bSYour Name 	QDF_STATUS status;
412*5113495bSYour Name 
413*5113495bSYour Name 	if (!mlo_ctx)
414*5113495bSYour Name 		return;
415*5113495bSYour Name 
416*5113495bSYour Name 	msgq_ctx = mlo_ctx->msgq_ctx;
417*5113495bSYour Name 	do {
418*5113495bSYour Name 		msg = NULL;
419*5113495bSYour Name 		qdf_spin_lock_bh(&msgq_ctx->ctxt_lock);
420*5113495bSYour Name 		status = qdf_list_peek_front(&msgq_ctx->msgq_list,
421*5113495bSYour Name 					     &msgbuf_node);
422*5113495bSYour Name 		if (status != QDF_STATUS_E_EMPTY) {
423*5113495bSYour Name 			qdf_list_remove_node(&msgq_ctx->msgq_list,
424*5113495bSYour Name 					     msgbuf_node);
425*5113495bSYour Name 			msg = qdf_container_of(msgbuf_node,
426*5113495bSYour Name 					       struct mlo_ctxt_switch_msg_s,
427*5113495bSYour Name 					       node);
428*5113495bSYour Name 		}
429*5113495bSYour Name 		qdf_spin_unlock_bh(&msgq_ctx->ctxt_lock);
430*5113495bSYour Name 
431*5113495bSYour Name 		if (!msg)
432*5113495bSYour Name 			break;
433*5113495bSYour Name 
434*5113495bSYour Name 		mlo_msgq_msg_flush_hdlr(msg);
435*5113495bSYour Name 
436*5113495bSYour Name 	} while (true);
437*5113495bSYour Name }
438*5113495bSYour Name 
mlo_msgq_msg_handler(void * arg)439*5113495bSYour Name static void mlo_msgq_msg_handler(void *arg)
440*5113495bSYour Name {
441*5113495bSYour Name 	struct ctxt_switch_mgr *msgq_ctx;
442*5113495bSYour Name 	struct mlo_mgr_context *mlo_ctx = wlan_objmgr_get_mlo_ctx();
443*5113495bSYour Name 	qdf_list_node_t *msgbuf_node = NULL;
444*5113495bSYour Name 	struct mlo_ctxt_switch_msg_s *msg;
445*5113495bSYour Name 	QDF_STATUS status;
446*5113495bSYour Name 
447*5113495bSYour Name 	if (!mlo_ctx)
448*5113495bSYour Name 		return;
449*5113495bSYour Name 
450*5113495bSYour Name 	msgq_ctx = mlo_ctx->msgq_ctx;
451*5113495bSYour Name 	do {
452*5113495bSYour Name 		msg = NULL;
453*5113495bSYour Name 		qdf_spin_lock_bh(&msgq_ctx->ctxt_lock);
454*5113495bSYour Name 		status = qdf_list_peek_front(&msgq_ctx->msgq_list,
455*5113495bSYour Name 					     &msgbuf_node);
456*5113495bSYour Name 		if (status != QDF_STATUS_E_EMPTY) {
457*5113495bSYour Name 			qdf_list_remove_node(&msgq_ctx->msgq_list,
458*5113495bSYour Name 					     msgbuf_node);
459*5113495bSYour Name 			msg = qdf_container_of(msgbuf_node,
460*5113495bSYour Name 					       struct mlo_ctxt_switch_msg_s,
461*5113495bSYour Name 					       node);
462*5113495bSYour Name 		} else {
463*5113495bSYour Name 			msgq_ctx->timer_started = false;
464*5113495bSYour Name 		}
465*5113495bSYour Name 		qdf_spin_unlock_bh(&msgq_ctx->ctxt_lock);
466*5113495bSYour Name 
467*5113495bSYour Name 		if (!msg)
468*5113495bSYour Name 			break;
469*5113495bSYour Name 
470*5113495bSYour Name 		mlo_msgq_msg_process_hdlr(msg);
471*5113495bSYour Name 
472*5113495bSYour Name 	} while (true);
473*5113495bSYour Name }
474*5113495bSYour Name 
mlo_msgq_init(void)475*5113495bSYour Name void mlo_msgq_init(void)
476*5113495bSYour Name {
477*5113495bSYour Name 	struct ctxt_switch_mgr *msgq_ctx;
478*5113495bSYour Name 	struct mlo_mgr_context *mlo_ctx = wlan_objmgr_get_mlo_ctx();
479*5113495bSYour Name 
480*5113495bSYour Name 	msgq_ctx = qdf_mem_malloc(sizeof(*msgq_ctx));
481*5113495bSYour Name 	if (!msgq_ctx) {
482*5113495bSYour Name 		mlo_err(" message queue context allocation failed");
483*5113495bSYour Name 		return;
484*5113495bSYour Name 	}
485*5113495bSYour Name 
486*5113495bSYour Name 	qdf_spinlock_create(&msgq_ctx->ctxt_lock);
487*5113495bSYour Name 	/* Initialize timer with timeout handler */
488*5113495bSYour Name 	qdf_timer_init(NULL, &msgq_ctx->ctxt_mgr_timer,
489*5113495bSYour Name 		       mlo_msgq_msg_handler,
490*5113495bSYour Name 		       NULL, QDF_TIMER_TYPE_WAKE_APPS);
491*5113495bSYour Name 
492*5113495bSYour Name 	msgq_ctx->timer_started = false;
493*5113495bSYour Name 	msgq_ctx->allow_msg = true;
494*5113495bSYour Name 	qdf_list_create(&msgq_ctx->msgq_list, MLO_MAX_MSGQ_SIZE);
495*5113495bSYour Name 
496*5113495bSYour Name 	mlo_ctx->msgq_ctx = msgq_ctx;
497*5113495bSYour Name }
498*5113495bSYour Name 
mlo_msgq_free(void)499*5113495bSYour Name void mlo_msgq_free(void)
500*5113495bSYour Name {
501*5113495bSYour Name 	struct ctxt_switch_mgr *msgq_ctx;
502*5113495bSYour Name 	struct mlo_mgr_context *mlo_ctx = wlan_objmgr_get_mlo_ctx();
503*5113495bSYour Name 
504*5113495bSYour Name 	if (!mlo_ctx)
505*5113495bSYour Name 		return;
506*5113495bSYour Name 
507*5113495bSYour Name 	msgq_ctx = mlo_ctx->msgq_ctx;
508*5113495bSYour Name 
509*5113495bSYour Name 	msgq_ctx->timer_started = false;
510*5113495bSYour Name 	msgq_ctx->allow_msg = false;
511*5113495bSYour Name 	mlo_msgq_msg_flush();
512*5113495bSYour Name 	qdf_list_destroy(&msgq_ctx->msgq_list);
513*5113495bSYour Name 	qdf_timer_free(&msgq_ctx->ctxt_mgr_timer);
514*5113495bSYour Name 	qdf_spinlock_destroy(&msgq_ctx->ctxt_lock);
515*5113495bSYour Name 	qdf_mem_free(msgq_ctx);
516*5113495bSYour Name }
517*5113495bSYour Name #endif
518