xref: /wlan-driver/qca-wifi-host-cmn/umac/mlo_mgr/src/wlan_mlo_mgr_aid.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 
18*5113495bSYour Name #include "wlan_mlo_mgr_main.h"
19*5113495bSYour Name #include "qdf_types.h"
20*5113495bSYour Name #include "wlan_cmn.h"
21*5113495bSYour Name #include <include/wlan_vdev_mlme.h>
22*5113495bSYour Name #include "wlan_mlo_mgr_ap.h"
23*5113495bSYour Name #include "wlan_mlo_mgr_cmn.h"
24*5113495bSYour Name 
mlo_peer_set_aid_bit(struct wlan_ml_vdev_aid_mgr * ml_aid_mgr,uint16_t assoc_id_ix)25*5113495bSYour Name static void mlo_peer_set_aid_bit(struct wlan_ml_vdev_aid_mgr *ml_aid_mgr,
26*5113495bSYour Name 				 uint16_t assoc_id_ix)
27*5113495bSYour Name {
28*5113495bSYour Name 	uint16_t ix;
29*5113495bSYour Name 	struct wlan_vdev_aid_mgr *vdev_aid_mgr;
30*5113495bSYour Name 
31*5113495bSYour Name 	/* Mark this bit as AID assigned */
32*5113495bSYour Name 	for (ix = 0; ix < WLAN_UMAC_MLO_MAX_VDEVS; ix++) {
33*5113495bSYour Name 		vdev_aid_mgr = ml_aid_mgr->aid_mgr[ix];
34*5113495bSYour Name 		if (vdev_aid_mgr)
35*5113495bSYour Name 			qdf_set_bit(assoc_id_ix, vdev_aid_mgr->aid_bitmap);
36*5113495bSYour Name 	}
37*5113495bSYour Name }
38*5113495bSYour Name 
wlan_mlo_check_aid_free(struct wlan_ml_vdev_aid_mgr * ml_aid_mgr,uint16_t assoc_idx,bool skip_link,uint8_t link_ix)39*5113495bSYour Name static bool wlan_mlo_check_aid_free(struct wlan_ml_vdev_aid_mgr *ml_aid_mgr,
40*5113495bSYour Name 				    uint16_t assoc_idx, bool skip_link,
41*5113495bSYour Name 				    uint8_t link_ix)
42*5113495bSYour Name {
43*5113495bSYour Name 	uint16_t j;
44*5113495bSYour Name 	struct wlan_vdev_aid_mgr *vdev_aid_mgr;
45*5113495bSYour Name 
46*5113495bSYour Name 	for (j = 0; j < WLAN_UMAC_MLO_MAX_VDEVS; j++) {
47*5113495bSYour Name 		if (skip_link && j == link_ix)
48*5113495bSYour Name 			continue;
49*5113495bSYour Name 
50*5113495bSYour Name 		vdev_aid_mgr = ml_aid_mgr->aid_mgr[j];
51*5113495bSYour Name 		if (vdev_aid_mgr &&
52*5113495bSYour Name 		    qdf_test_bit(assoc_idx, vdev_aid_mgr->aid_bitmap))
53*5113495bSYour Name 			break;
54*5113495bSYour Name 
55*5113495bSYour Name 		/* AID is free */
56*5113495bSYour Name 		if (j == WLAN_UMAC_MLO_MAX_VDEVS - 1)
57*5113495bSYour Name 			return true;
58*5113495bSYour Name 	}
59*5113495bSYour Name 
60*5113495bSYour Name 	return false;
61*5113495bSYour Name }
62*5113495bSYour Name 
wlan_mlo_aid_idx_check(uint16_t start_idx,uint16_t end_idx,uint16_t curr_idx)63*5113495bSYour Name static bool wlan_mlo_aid_idx_check(uint16_t start_idx, uint16_t end_idx,
64*5113495bSYour Name 				   uint16_t curr_idx)
65*5113495bSYour Name {
66*5113495bSYour Name 	if (start_idx < end_idx)
67*5113495bSYour Name 		return (curr_idx < end_idx);
68*5113495bSYour Name 
69*5113495bSYour Name 	return (curr_idx >= end_idx);
70*5113495bSYour Name }
71*5113495bSYour Name 
wlan_mlo_aid_idx_update(uint16_t start_idx,uint16_t end_idx,uint16_t curr_idx)72*5113495bSYour Name static int32_t wlan_mlo_aid_idx_update(uint16_t start_idx, uint16_t end_idx,
73*5113495bSYour Name 				       uint16_t curr_idx)
74*5113495bSYour Name {
75*5113495bSYour Name 	if (start_idx < end_idx)
76*5113495bSYour Name 		return (curr_idx + 1);
77*5113495bSYour Name 
78*5113495bSYour Name 	if (curr_idx >= end_idx)
79*5113495bSYour Name 		return ((int32_t)curr_idx - 1);
80*5113495bSYour Name 
81*5113495bSYour Name 	mlo_err("AID index is out of sync");
82*5113495bSYour Name 	QDF_BUG(0);
83*5113495bSYour Name 	return 0;
84*5113495bSYour Name }
85*5113495bSYour Name 
wlan_mlo_alloc_aid(struct wlan_ml_vdev_aid_mgr * ml_aid_mgr,uint16_t start_idx,uint16_t end_idx,uint8_t link_ix,bool is_mlo_peer)86*5113495bSYour Name static uint16_t wlan_mlo_alloc_aid(struct wlan_ml_vdev_aid_mgr *ml_aid_mgr,
87*5113495bSYour Name 				   uint16_t start_idx, uint16_t end_idx,
88*5113495bSYour Name 				   uint8_t link_ix, bool is_mlo_peer)
89*5113495bSYour Name {
90*5113495bSYour Name 	uint16_t assoc_id = (uint16_t)-1;
91*5113495bSYour Name 	struct wlan_vdev_aid_mgr *vdev_aid_mgr;
92*5113495bSYour Name 	uint16_t first_aid = 0;
93*5113495bSYour Name 	uint16_t assoc_idx = start_idx;
94*5113495bSYour Name 	int32_t signed_assoc_idx = assoc_idx;
95*5113495bSYour Name 
96*5113495bSYour Name 	while (wlan_mlo_aid_idx_check(start_idx, end_idx, assoc_idx)) {
97*5113495bSYour Name 		if (qdf_test_bit(assoc_idx, ml_aid_mgr->aid_bitmap)) {
98*5113495bSYour Name 			signed_assoc_idx = wlan_mlo_aid_idx_update(start_idx,
99*5113495bSYour Name 								   end_idx,
100*5113495bSYour Name 								   assoc_idx);
101*5113495bSYour Name 			if (signed_assoc_idx < 0)
102*5113495bSYour Name 				break;
103*5113495bSYour Name 
104*5113495bSYour Name 			assoc_idx = signed_assoc_idx;
105*5113495bSYour Name 			continue;
106*5113495bSYour Name 		}
107*5113495bSYour Name 
108*5113495bSYour Name 		if (is_mlo_peer) {
109*5113495bSYour Name 			if (wlan_mlo_check_aid_free(ml_aid_mgr, assoc_idx,
110*5113495bSYour Name 						    false, link_ix)) {
111*5113495bSYour Name 				/* associd available */
112*5113495bSYour Name 				mlo_peer_set_aid_bit(ml_aid_mgr, assoc_idx);
113*5113495bSYour Name 				qdf_set_bit(assoc_idx, ml_aid_mgr->aid_bitmap);
114*5113495bSYour Name 				assoc_id = assoc_idx + 1;
115*5113495bSYour Name 				break;
116*5113495bSYour Name 			}
117*5113495bSYour Name 		} else {
118*5113495bSYour Name 			vdev_aid_mgr = ml_aid_mgr->aid_mgr[link_ix];
119*5113495bSYour Name 			if (!vdev_aid_mgr)
120*5113495bSYour Name 				break;
121*5113495bSYour Name 
122*5113495bSYour Name 			if (qdf_test_bit(assoc_idx, vdev_aid_mgr->aid_bitmap)) {
123*5113495bSYour Name 				signed_assoc_idx =
124*5113495bSYour Name 					wlan_mlo_aid_idx_update(start_idx,
125*5113495bSYour Name 								end_idx,
126*5113495bSYour Name 								assoc_idx);
127*5113495bSYour Name 				if (signed_assoc_idx < 0)
128*5113495bSYour Name 					break;
129*5113495bSYour Name 
130*5113495bSYour Name 				assoc_idx = signed_assoc_idx;
131*5113495bSYour Name 				continue;
132*5113495bSYour Name 			}
133*5113495bSYour Name 
134*5113495bSYour Name 			if (!first_aid)
135*5113495bSYour Name 				first_aid = assoc_idx + 1;
136*5113495bSYour Name 
137*5113495bSYour Name 			/* Check whether this bit used by other VDEV
138*5113495bSYour Name 			 * Non-MLO peers
139*5113495bSYour Name 			 */
140*5113495bSYour Name 			if (!wlan_mlo_check_aid_free(ml_aid_mgr, assoc_idx,
141*5113495bSYour Name 						     true, link_ix)) {
142*5113495bSYour Name 				/* Assoc ID is used by other link, return this
143*5113495bSYour Name 				 * aid to caller
144*5113495bSYour Name 				 */
145*5113495bSYour Name 				assoc_id = assoc_idx + 1;
146*5113495bSYour Name 				vdev_aid_mgr = ml_aid_mgr->aid_mgr[link_ix];
147*5113495bSYour Name 				qdf_set_bit(assoc_idx,
148*5113495bSYour Name 					    vdev_aid_mgr->aid_bitmap);
149*5113495bSYour Name 				first_aid = 0;
150*5113495bSYour Name 				break;
151*5113495bSYour Name 			}
152*5113495bSYour Name 		}
153*5113495bSYour Name 
154*5113495bSYour Name 		signed_assoc_idx = wlan_mlo_aid_idx_update(start_idx,
155*5113495bSYour Name 							   end_idx, assoc_idx);
156*5113495bSYour Name 		if (signed_assoc_idx < 0)
157*5113495bSYour Name 			break;
158*5113495bSYour Name 		assoc_idx = signed_assoc_idx;
159*5113495bSYour Name 	}
160*5113495bSYour Name 
161*5113495bSYour Name 	if ((!is_mlo_peer) && first_aid) {
162*5113495bSYour Name 		vdev_aid_mgr = ml_aid_mgr->aid_mgr[link_ix];
163*5113495bSYour Name 		qdf_set_bit(first_aid - 1, vdev_aid_mgr->aid_bitmap);
164*5113495bSYour Name 		assoc_id = first_aid;
165*5113495bSYour Name 	}
166*5113495bSYour Name 
167*5113495bSYour Name 	return assoc_id;
168*5113495bSYour Name }
169*5113495bSYour Name 
170*5113495bSYour Name #ifdef WLAN_FEATURE_11BE
171*5113495bSYour Name #define AID_NUM_BUCKET 3
_wlan_mlo_peer_alloc_aid(struct wlan_ml_vdev_aid_mgr * ml_aid_mgr,bool is_mlo_peer,bool t2lm_peer,uint8_t link_ix)172*5113495bSYour Name static uint16_t _wlan_mlo_peer_alloc_aid(
173*5113495bSYour Name 		struct wlan_ml_vdev_aid_mgr *ml_aid_mgr,
174*5113495bSYour Name 		bool is_mlo_peer, bool t2lm_peer,
175*5113495bSYour Name 		uint8_t link_ix)
176*5113495bSYour Name {
177*5113495bSYour Name 	uint16_t assoc_id = (uint16_t)-1;
178*5113495bSYour Name 	uint16_t start_aid, aid_end1, aid_end2, tot_aid;
179*5113495bSYour Name 	uint16_t pool_1_max_aid;
180*5113495bSYour Name 
181*5113495bSYour Name 	start_aid = ml_aid_mgr->start_aid;
182*5113495bSYour Name 	if (start_aid > ml_aid_mgr->max_aid) {
183*5113495bSYour Name 		mlo_err("MAX AID %d is less than start aid %d ",
184*5113495bSYour Name 			ml_aid_mgr->max_aid, start_aid);
185*5113495bSYour Name 		return assoc_id;
186*5113495bSYour Name 	}
187*5113495bSYour Name 
188*5113495bSYour Name 	tot_aid = ml_aid_mgr->max_aid - start_aid;
189*5113495bSYour Name 	pool_1_max_aid = tot_aid / AID_NUM_BUCKET;
190*5113495bSYour Name 	aid_end1 = pool_1_max_aid + start_aid;
191*5113495bSYour Name 	aid_end2 = pool_1_max_aid + pool_1_max_aid + start_aid;
192*5113495bSYour Name 
193*5113495bSYour Name 	mlo_debug("max_aid = %d start_aid = %d tot_aid = %d pool_1_max_aid = %d aid_end1 = %d aid_end2 = %d",
194*5113495bSYour Name 		  ml_aid_mgr->max_aid, start_aid, tot_aid, pool_1_max_aid,
195*5113495bSYour Name 		  aid_end1, aid_end2);
196*5113495bSYour Name 	if ((start_aid > aid_end1) || (aid_end1 > aid_end2)) {
197*5113495bSYour Name 		assoc_id = wlan_mlo_alloc_aid(ml_aid_mgr, start_aid,
198*5113495bSYour Name 					      ml_aid_mgr->max_aid, link_ix,
199*5113495bSYour Name 					      is_mlo_peer);
200*5113495bSYour Name 		return assoc_id;
201*5113495bSYour Name 	}
202*5113495bSYour Name 	mlo_debug("T2LM peer = %d", t2lm_peer);
203*5113495bSYour Name 
204*5113495bSYour Name 	if (t2lm_peer) {
205*5113495bSYour Name 		assoc_id = wlan_mlo_alloc_aid(ml_aid_mgr, aid_end1,
206*5113495bSYour Name 					      aid_end2, link_ix,
207*5113495bSYour Name 					      is_mlo_peer);
208*5113495bSYour Name 
209*5113495bSYour Name 		if (assoc_id != (uint16_t)-1)
210*5113495bSYour Name 			return assoc_id;
211*5113495bSYour Name 
212*5113495bSYour Name 		assoc_id = wlan_mlo_alloc_aid(ml_aid_mgr, aid_end2,
213*5113495bSYour Name 					      ml_aid_mgr->max_aid,
214*5113495bSYour Name 					      link_ix, is_mlo_peer);
215*5113495bSYour Name 
216*5113495bSYour Name 		if (assoc_id != (uint16_t)-1)
217*5113495bSYour Name 			return assoc_id;
218*5113495bSYour Name 
219*5113495bSYour Name 		assoc_id = wlan_mlo_alloc_aid(ml_aid_mgr, aid_end1,
220*5113495bSYour Name 					      start_aid, link_ix,
221*5113495bSYour Name 					      is_mlo_peer);
222*5113495bSYour Name 	} else {
223*5113495bSYour Name 		assoc_id = wlan_mlo_alloc_aid(ml_aid_mgr, start_aid,
224*5113495bSYour Name 					      aid_end1, link_ix,
225*5113495bSYour Name 					      is_mlo_peer);
226*5113495bSYour Name 
227*5113495bSYour Name 		if (assoc_id != (uint16_t)-1)
228*5113495bSYour Name 			return assoc_id;
229*5113495bSYour Name 
230*5113495bSYour Name 		assoc_id = wlan_mlo_alloc_aid(ml_aid_mgr, aid_end2,
231*5113495bSYour Name 					      ml_aid_mgr->max_aid,
232*5113495bSYour Name 					      link_ix, is_mlo_peer);
233*5113495bSYour Name 
234*5113495bSYour Name 		if (assoc_id != (uint16_t)-1)
235*5113495bSYour Name 			return assoc_id;
236*5113495bSYour Name 
237*5113495bSYour Name 		assoc_id = wlan_mlo_alloc_aid(ml_aid_mgr, aid_end2,
238*5113495bSYour Name 					      aid_end1, link_ix,
239*5113495bSYour Name 					      is_mlo_peer);
240*5113495bSYour Name 	}
241*5113495bSYour Name 
242*5113495bSYour Name 	return assoc_id;
243*5113495bSYour Name }
244*5113495bSYour Name #else
_wlan_mlo_peer_alloc_aid(struct wlan_ml_vdev_aid_mgr * ml_aid_mgr,bool is_mlo_peer,bool t2lm_peer,uint8_t link_ix)245*5113495bSYour Name static uint16_t _wlan_mlo_peer_alloc_aid(
246*5113495bSYour Name 		struct wlan_ml_vdev_aid_mgr *ml_aid_mgr,
247*5113495bSYour Name 		bool is_mlo_peer, bool t2lm_peer,
248*5113495bSYour Name 		uint8_t link_ix)
249*5113495bSYour Name {
250*5113495bSYour Name 	uint16_t assoc_id = (uint16_t)-1;
251*5113495bSYour Name 
252*5113495bSYour Name 	assoc_id = wlan_mlo_alloc_aid(ml_aid_mgr, ml_aid_mgr->start_aid,
253*5113495bSYour Name 				      ml_aid_mgr->max_aid,
254*5113495bSYour Name 				      link_ix, is_mlo_peer);
255*5113495bSYour Name 
256*5113495bSYour Name 	return assoc_id;
257*5113495bSYour Name }
258*5113495bSYour Name #endif
259*5113495bSYour Name 
wlan_mlo_peer_alloc_aid(struct wlan_ml_vdev_aid_mgr * ml_aid_mgr,bool is_mlo_peer,bool t2lm_peer,uint8_t link_ix)260*5113495bSYour Name static uint16_t wlan_mlo_peer_alloc_aid(
261*5113495bSYour Name 		struct wlan_ml_vdev_aid_mgr *ml_aid_mgr,
262*5113495bSYour Name 		bool is_mlo_peer, bool t2lm_peer,
263*5113495bSYour Name 		uint8_t link_ix)
264*5113495bSYour Name {
265*5113495bSYour Name 	uint16_t assoc_id = (uint16_t)-1;
266*5113495bSYour Name 	struct mlo_mgr_context *mlo_mgr_ctx = wlan_objmgr_get_mlo_ctx();
267*5113495bSYour Name 
268*5113495bSYour Name 	if (!mlo_mgr_ctx) {
269*5113495bSYour Name 		mlo_err(" MLO mgr context is NULL, assoc id alloc failed");
270*5113495bSYour Name 		return assoc_id;
271*5113495bSYour Name 	}
272*5113495bSYour Name 
273*5113495bSYour Name 	if (!is_mlo_peer && link_ix == MLO_INVALID_LINK_IDX) {
274*5113495bSYour Name 		mlo_err(" is MLO peer %d, link_ix %d", is_mlo_peer, link_ix);
275*5113495bSYour Name 		return assoc_id;
276*5113495bSYour Name 	}
277*5113495bSYour Name 	/* TODO check locking strategy */
278*5113495bSYour Name 	ml_aid_lock_acquire(mlo_mgr_ctx);
279*5113495bSYour Name 
280*5113495bSYour Name 	assoc_id = _wlan_mlo_peer_alloc_aid(ml_aid_mgr, is_mlo_peer,
281*5113495bSYour Name 					    t2lm_peer, link_ix);
282*5113495bSYour Name 	if (assoc_id == (uint16_t)-1)
283*5113495bSYour Name 		mlo_err("MLO aid allocation failed (reached max)");
284*5113495bSYour Name 
285*5113495bSYour Name 	ml_aid_lock_release(mlo_mgr_ctx);
286*5113495bSYour Name 
287*5113495bSYour Name 	return assoc_id;
288*5113495bSYour Name }
289*5113495bSYour Name 
wlan_mlme_peer_alloc_aid(struct wlan_vdev_aid_mgr * vdev_aid_mgr,bool no_lock)290*5113495bSYour Name static uint16_t wlan_mlme_peer_alloc_aid(
291*5113495bSYour Name 		struct wlan_vdev_aid_mgr *vdev_aid_mgr,
292*5113495bSYour Name 		bool no_lock)
293*5113495bSYour Name {
294*5113495bSYour Name 	uint16_t assoc_id = (uint16_t)-1;
295*5113495bSYour Name 	uint16_t i;
296*5113495bSYour Name 	uint16_t start_aid;
297*5113495bSYour Name 	struct mlo_mgr_context *mlo_mgr_ctx = wlan_objmgr_get_mlo_ctx();
298*5113495bSYour Name 
299*5113495bSYour Name 	if (!mlo_mgr_ctx)
300*5113495bSYour Name 		return assoc_id;
301*5113495bSYour Name 
302*5113495bSYour Name 	if (!no_lock)
303*5113495bSYour Name 		ml_aid_lock_acquire(mlo_mgr_ctx);
304*5113495bSYour Name 
305*5113495bSYour Name 	start_aid = vdev_aid_mgr->start_aid;
306*5113495bSYour Name 	for (i = start_aid; i < vdev_aid_mgr->max_aid; i++) {
307*5113495bSYour Name 		if (qdf_test_bit(i, vdev_aid_mgr->aid_bitmap))
308*5113495bSYour Name 			continue;
309*5113495bSYour Name 
310*5113495bSYour Name 		assoc_id = i + 1;
311*5113495bSYour Name 		qdf_set_bit(i, vdev_aid_mgr->aid_bitmap);
312*5113495bSYour Name 		break;
313*5113495bSYour Name 	}
314*5113495bSYour Name 
315*5113495bSYour Name 	if (!no_lock)
316*5113495bSYour Name 		ml_aid_lock_release(mlo_mgr_ctx);
317*5113495bSYour Name 
318*5113495bSYour Name 	if (i == vdev_aid_mgr->max_aid)
319*5113495bSYour Name 		return (uint16_t)-1;
320*5113495bSYour Name 
321*5113495bSYour Name 	return assoc_id;
322*5113495bSYour Name }
323*5113495bSYour Name 
wlan_mlo_peer_set_aid(struct wlan_ml_vdev_aid_mgr * ml_aid_mgr,bool is_mlo_peer,uint8_t link_ix,uint16_t assoc_id)324*5113495bSYour Name static QDF_STATUS wlan_mlo_peer_set_aid(
325*5113495bSYour Name 		struct wlan_ml_vdev_aid_mgr *ml_aid_mgr,
326*5113495bSYour Name 		bool is_mlo_peer,
327*5113495bSYour Name 		uint8_t link_ix,
328*5113495bSYour Name 		uint16_t assoc_id)
329*5113495bSYour Name {
330*5113495bSYour Name 	uint16_t j;
331*5113495bSYour Name 	struct wlan_vdev_aid_mgr *vdev_aid_mgr;
332*5113495bSYour Name 	struct mlo_mgr_context *mlo_mgr_ctx = wlan_objmgr_get_mlo_ctx();
333*5113495bSYour Name 
334*5113495bSYour Name 	if (!mlo_mgr_ctx)
335*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
336*5113495bSYour Name 
337*5113495bSYour Name 	if (!is_mlo_peer && link_ix == 0xff)
338*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
339*5113495bSYour Name 	/* TODO check locking strategy */
340*5113495bSYour Name 	ml_aid_lock_acquire(mlo_mgr_ctx);
341*5113495bSYour Name 
342*5113495bSYour Name 	if (qdf_test_bit(WLAN_AID(assoc_id) - 1,  ml_aid_mgr->aid_bitmap)) {
343*5113495bSYour Name 		ml_aid_lock_release(mlo_mgr_ctx);
344*5113495bSYour Name 		mlo_err("Assoc id %d is not available on ml aid mgr", assoc_id);
345*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
346*5113495bSYour Name 	}
347*5113495bSYour Name 
348*5113495bSYour Name 	if (is_mlo_peer) {
349*5113495bSYour Name 		if ((assoc_id < ml_aid_mgr->start_aid) ||
350*5113495bSYour Name 		    (assoc_id >= ml_aid_mgr->max_aid)) {
351*5113495bSYour Name 			ml_aid_lock_release(mlo_mgr_ctx);
352*5113495bSYour Name 			mlo_err("Assoc id %d is not in bounds, start aid %d, max aid %d",
353*5113495bSYour Name 				assoc_id, ml_aid_mgr->start_aid,
354*5113495bSYour Name 				ml_aid_mgr->max_aid);
355*5113495bSYour Name 			return QDF_STATUS_E_FAILURE;
356*5113495bSYour Name 		}
357*5113495bSYour Name 		for (j = 0; j < WLAN_UMAC_MLO_MAX_VDEVS; j++) {
358*5113495bSYour Name 			vdev_aid_mgr = ml_aid_mgr->aid_mgr[j];
359*5113495bSYour Name 			if (vdev_aid_mgr &&
360*5113495bSYour Name 			    qdf_test_bit(WLAN_AID(assoc_id) - 1,
361*5113495bSYour Name 					 vdev_aid_mgr->aid_bitmap)) {
362*5113495bSYour Name 				ml_aid_lock_release(mlo_mgr_ctx);
363*5113495bSYour Name 				mlo_err("Assoc id %d is not available on link vdev %d",
364*5113495bSYour Name 					assoc_id, j);
365*5113495bSYour Name 				return QDF_STATUS_E_FAILURE;
366*5113495bSYour Name 			}
367*5113495bSYour Name 			/* AID is free */
368*5113495bSYour Name 			if (j == WLAN_UMAC_MLO_MAX_VDEVS - 1)
369*5113495bSYour Name 				mlo_peer_set_aid_bit(ml_aid_mgr,
370*5113495bSYour Name 						     WLAN_AID(assoc_id) - 1);
371*5113495bSYour Name 		}
372*5113495bSYour Name 		qdf_set_bit(WLAN_AID(assoc_id) - 1, ml_aid_mgr->aid_bitmap);
373*5113495bSYour Name 	} else {
374*5113495bSYour Name 		vdev_aid_mgr = ml_aid_mgr->aid_mgr[link_ix];
375*5113495bSYour Name 		if (!vdev_aid_mgr) {
376*5113495bSYour Name 			ml_aid_lock_release(mlo_mgr_ctx);
377*5113495bSYour Name 			return QDF_STATUS_E_FAILURE;
378*5113495bSYour Name 		}
379*5113495bSYour Name 		if ((assoc_id < vdev_aid_mgr->start_aid) ||
380*5113495bSYour Name 		    (assoc_id >= vdev_aid_mgr->max_aid)) {
381*5113495bSYour Name 			ml_aid_lock_release(mlo_mgr_ctx);
382*5113495bSYour Name 			mlo_err("Assoc id %d is not in bounds, start aid %d, max aid %d",
383*5113495bSYour Name 				assoc_id, vdev_aid_mgr->start_aid,
384*5113495bSYour Name 				vdev_aid_mgr->max_aid);
385*5113495bSYour Name 			return QDF_STATUS_E_FAILURE;
386*5113495bSYour Name 		}
387*5113495bSYour Name 
388*5113495bSYour Name 		if (qdf_test_bit(WLAN_AID(assoc_id) - 1,
389*5113495bSYour Name 				 vdev_aid_mgr->aid_bitmap)) {
390*5113495bSYour Name 			ml_aid_lock_release(mlo_mgr_ctx);
391*5113495bSYour Name 			mlo_err("Assoc id %d is not available on vdev aid mgr",
392*5113495bSYour Name 				assoc_id);
393*5113495bSYour Name 			return QDF_STATUS_E_FAILURE;
394*5113495bSYour Name 		}
395*5113495bSYour Name 
396*5113495bSYour Name 		qdf_set_bit(WLAN_AID(assoc_id) - 1, vdev_aid_mgr->aid_bitmap);
397*5113495bSYour Name 	}
398*5113495bSYour Name 
399*5113495bSYour Name 	ml_aid_lock_release(mlo_mgr_ctx);
400*5113495bSYour Name 
401*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
402*5113495bSYour Name }
403*5113495bSYour Name 
wlan_mlme_peer_set_aid(struct wlan_vdev_aid_mgr * vdev_aid_mgr,bool no_lock,uint16_t assoc_id)404*5113495bSYour Name static QDF_STATUS wlan_mlme_peer_set_aid(
405*5113495bSYour Name 		struct wlan_vdev_aid_mgr *vdev_aid_mgr,
406*5113495bSYour Name 		bool no_lock, uint16_t assoc_id)
407*5113495bSYour Name {
408*5113495bSYour Name 	struct mlo_mgr_context *mlo_mgr_ctx = wlan_objmgr_get_mlo_ctx();
409*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_E_FAILURE;
410*5113495bSYour Name 
411*5113495bSYour Name 	if (!mlo_mgr_ctx)
412*5113495bSYour Name 		return status;
413*5113495bSYour Name 
414*5113495bSYour Name 	if (!no_lock)
415*5113495bSYour Name 		ml_aid_lock_acquire(mlo_mgr_ctx);
416*5113495bSYour Name 
417*5113495bSYour Name 	if ((assoc_id < vdev_aid_mgr->start_aid) ||
418*5113495bSYour Name 	    (assoc_id >= vdev_aid_mgr->max_aid)) {
419*5113495bSYour Name 		if (!no_lock)
420*5113495bSYour Name 			ml_aid_lock_release(mlo_mgr_ctx);
421*5113495bSYour Name 
422*5113495bSYour Name 		mlo_err("Assoc id %d is not in bounds, start aid %d, max aid %d",
423*5113495bSYour Name 			assoc_id, vdev_aid_mgr->start_aid,
424*5113495bSYour Name 			vdev_aid_mgr->max_aid);
425*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
426*5113495bSYour Name 	}
427*5113495bSYour Name 
428*5113495bSYour Name 	if (!qdf_test_bit(WLAN_AID(assoc_id) - 1, vdev_aid_mgr->aid_bitmap)) {
429*5113495bSYour Name 		qdf_set_bit(WLAN_AID(assoc_id) - 1, vdev_aid_mgr->aid_bitmap);
430*5113495bSYour Name 		status = QDF_STATUS_SUCCESS;
431*5113495bSYour Name 	}
432*5113495bSYour Name 
433*5113495bSYour Name 	if (!no_lock)
434*5113495bSYour Name 		ml_aid_lock_release(mlo_mgr_ctx);
435*5113495bSYour Name 
436*5113495bSYour Name 	return status;
437*5113495bSYour Name }
438*5113495bSYour Name 
wlan_mlo_peer_free_aid(struct wlan_ml_vdev_aid_mgr * ml_aid_mgr,uint8_t link_ix,uint16_t assoc_id)439*5113495bSYour Name QDF_STATUS wlan_mlo_peer_free_aid(
440*5113495bSYour Name 		struct wlan_ml_vdev_aid_mgr *ml_aid_mgr,
441*5113495bSYour Name 		uint8_t link_ix,
442*5113495bSYour Name 		uint16_t assoc_id)
443*5113495bSYour Name {
444*5113495bSYour Name 	uint16_t  j;
445*5113495bSYour Name 	struct wlan_vdev_aid_mgr *vdev_aid_mgr;
446*5113495bSYour Name 	struct mlo_mgr_context *mlo_mgr_ctx = wlan_objmgr_get_mlo_ctx();
447*5113495bSYour Name 	uint16_t assoc_id_ix;
448*5113495bSYour Name 
449*5113495bSYour Name 	if (!mlo_mgr_ctx)
450*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
451*5113495bSYour Name 
452*5113495bSYour Name 	/* TODO check locking strategy */
453*5113495bSYour Name 	ml_aid_lock_acquire(mlo_mgr_ctx);
454*5113495bSYour Name 	assoc_id_ix = WLAN_AID(assoc_id) - 1;
455*5113495bSYour Name 	if (qdf_test_bit(assoc_id_ix, ml_aid_mgr->aid_bitmap)) {
456*5113495bSYour Name 		qdf_clear_bit(assoc_id_ix, ml_aid_mgr->aid_bitmap);
457*5113495bSYour Name 		for (j = 0; j < WLAN_UMAC_MLO_MAX_VDEVS; j++) {
458*5113495bSYour Name 			vdev_aid_mgr = ml_aid_mgr->aid_mgr[j];
459*5113495bSYour Name 			if (vdev_aid_mgr &&
460*5113495bSYour Name 			    qdf_test_bit(assoc_id_ix,
461*5113495bSYour Name 					 vdev_aid_mgr->aid_bitmap)) {
462*5113495bSYour Name 				qdf_clear_bit(assoc_id_ix,
463*5113495bSYour Name 					      vdev_aid_mgr->aid_bitmap);
464*5113495bSYour Name 			}
465*5113495bSYour Name 		}
466*5113495bSYour Name 	} else {
467*5113495bSYour Name 		if ((link_ix != 0xff) && (link_ix < WLAN_UMAC_MLO_MAX_VDEVS)) {
468*5113495bSYour Name 			vdev_aid_mgr = ml_aid_mgr->aid_mgr[link_ix];
469*5113495bSYour Name 			if (vdev_aid_mgr)
470*5113495bSYour Name 				qdf_clear_bit(assoc_id_ix,
471*5113495bSYour Name 					      vdev_aid_mgr->aid_bitmap);
472*5113495bSYour Name 		} else {
473*5113495bSYour Name 			mlo_err("AID free failed, link ix(%d) is invalid for assoc_id %d",
474*5113495bSYour Name 				link_ix, assoc_id);
475*5113495bSYour Name 		}
476*5113495bSYour Name 	}
477*5113495bSYour Name 
478*5113495bSYour Name 	ml_aid_lock_release(mlo_mgr_ctx);
479*5113495bSYour Name 
480*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
481*5113495bSYour Name }
482*5113495bSYour Name 
wlan_mlme_peer_aid_is_set(struct wlan_vdev_aid_mgr * vdev_aid_mgr,bool no_lock,uint16_t assoc_id)483*5113495bSYour Name static int wlan_mlme_peer_aid_is_set(struct wlan_vdev_aid_mgr *vdev_aid_mgr,
484*5113495bSYour Name 				     bool no_lock, uint16_t assoc_id)
485*5113495bSYour Name {
486*5113495bSYour Name 	struct mlo_mgr_context *mlo_mgr_ctx = wlan_objmgr_get_mlo_ctx();
487*5113495bSYour Name 	int isset = 0;
488*5113495bSYour Name 
489*5113495bSYour Name 	if (!mlo_mgr_ctx)
490*5113495bSYour Name 		return isset;
491*5113495bSYour Name 
492*5113495bSYour Name 	if (!no_lock)
493*5113495bSYour Name 		ml_aid_lock_acquire(mlo_mgr_ctx);
494*5113495bSYour Name 
495*5113495bSYour Name 	isset = qdf_test_bit(WLAN_AID(assoc_id) - 1, vdev_aid_mgr->aid_bitmap);
496*5113495bSYour Name 
497*5113495bSYour Name 	if (!no_lock)
498*5113495bSYour Name 		ml_aid_lock_release(mlo_mgr_ctx);
499*5113495bSYour Name 
500*5113495bSYour Name 	return isset;
501*5113495bSYour Name }
502*5113495bSYour Name 
wlan_mlme_peer_free_aid(struct wlan_vdev_aid_mgr * vdev_aid_mgr,bool no_lock,uint16_t assoc_id)503*5113495bSYour Name void wlan_mlme_peer_free_aid(
504*5113495bSYour Name 		struct wlan_vdev_aid_mgr *vdev_aid_mgr,
505*5113495bSYour Name 		bool no_lock, uint16_t assoc_id)
506*5113495bSYour Name {
507*5113495bSYour Name 	struct mlo_mgr_context *mlo_mgr_ctx = wlan_objmgr_get_mlo_ctx();
508*5113495bSYour Name 
509*5113495bSYour Name 	if (!mlo_mgr_ctx)
510*5113495bSYour Name 		return;
511*5113495bSYour Name 
512*5113495bSYour Name 	if (!no_lock)
513*5113495bSYour Name 		ml_aid_lock_acquire(mlo_mgr_ctx);
514*5113495bSYour Name 
515*5113495bSYour Name 	qdf_clear_bit(WLAN_AID(assoc_id) - 1, vdev_aid_mgr->aid_bitmap);
516*5113495bSYour Name 
517*5113495bSYour Name 	if (!no_lock)
518*5113495bSYour Name 		ml_aid_lock_release(mlo_mgr_ctx);
519*5113495bSYour Name }
520*5113495bSYour Name 
wlan_mlme_get_aid_count(struct wlan_objmgr_vdev * vdev)521*5113495bSYour Name uint16_t wlan_mlme_get_aid_count(struct wlan_objmgr_vdev *vdev)
522*5113495bSYour Name {
523*5113495bSYour Name 	uint16_t i;
524*5113495bSYour Name 	uint16_t aid_count = 0;
525*5113495bSYour Name 	struct wlan_vdev_aid_mgr *vdev_aid_mgr;
526*5113495bSYour Name 
527*5113495bSYour Name 	vdev_aid_mgr = wlan_vdev_mlme_get_aid_mgr(vdev);
528*5113495bSYour Name 	if (!vdev_aid_mgr)
529*5113495bSYour Name 		return (uint16_t)-1;
530*5113495bSYour Name 
531*5113495bSYour Name 	for (i = 0; i < vdev_aid_mgr->max_aid; i++) {
532*5113495bSYour Name 		if (qdf_test_bit(i, vdev_aid_mgr->aid_bitmap))
533*5113495bSYour Name 			aid_count++;
534*5113495bSYour Name 	}
535*5113495bSYour Name 
536*5113495bSYour Name 	return aid_count;
537*5113495bSYour Name }
538*5113495bSYour Name 
539*5113495bSYour Name #ifdef WLAN_FEATURE_11BE
mlo_peer_t2lm_enabled(struct wlan_mlo_peer_context * ml_peer)540*5113495bSYour Name static bool mlo_peer_t2lm_enabled(struct wlan_mlo_peer_context *ml_peer)
541*5113495bSYour Name {
542*5113495bSYour Name 	if (ml_peer->t2lm_policy.t2lm_enable_val > WLAN_T2LM_NOT_SUPPORTED &&
543*5113495bSYour Name 	    ml_peer->t2lm_policy.t2lm_enable_val < WLAN_T2LM_ENABLE_INVALID)
544*5113495bSYour Name 		return true;
545*5113495bSYour Name 
546*5113495bSYour Name 	return false;
547*5113495bSYour Name }
548*5113495bSYour Name #else
mlo_peer_t2lm_enabled(struct wlan_mlo_peer_context * ml_peer)549*5113495bSYour Name static bool mlo_peer_t2lm_enabled(struct wlan_mlo_peer_context *ml_peer)
550*5113495bSYour Name {
551*5113495bSYour Name 	return false;
552*5113495bSYour Name }
553*5113495bSYour Name #endif
554*5113495bSYour Name 
mlo_peer_allocate_aid(struct wlan_mlo_dev_context * ml_dev,struct wlan_mlo_peer_context * ml_peer)555*5113495bSYour Name QDF_STATUS mlo_peer_allocate_aid(
556*5113495bSYour Name 		struct wlan_mlo_dev_context *ml_dev,
557*5113495bSYour Name 		struct wlan_mlo_peer_context *ml_peer)
558*5113495bSYour Name {
559*5113495bSYour Name 	uint16_t assoc_id = (uint16_t)-1;
560*5113495bSYour Name 	struct wlan_ml_vdev_aid_mgr *ml_aid_mgr;
561*5113495bSYour Name 	struct wlan_mlo_ap *ap_ctx;
562*5113495bSYour Name 	bool t2lm_peer = false;
563*5113495bSYour Name 
564*5113495bSYour Name 	ap_ctx = ml_dev->ap_ctx;
565*5113495bSYour Name 	if (!ap_ctx) {
566*5113495bSYour Name 		mlo_err("MLD ID %d ap_ctx is NULL", ml_dev->mld_id);
567*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
568*5113495bSYour Name 	}
569*5113495bSYour Name 
570*5113495bSYour Name 	ml_aid_mgr = ap_ctx->ml_aid_mgr;
571*5113495bSYour Name 	if (!ml_aid_mgr) {
572*5113495bSYour Name 		mlo_err("MLD ID %d aid mgr is NULL", ml_dev->mld_id);
573*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
574*5113495bSYour Name 	}
575*5113495bSYour Name 
576*5113495bSYour Name 	t2lm_peer = mlo_peer_t2lm_enabled(ml_peer);
577*5113495bSYour Name 
578*5113495bSYour Name 	assoc_id = wlan_mlo_peer_alloc_aid(ml_aid_mgr, true, t2lm_peer, 0xff);
579*5113495bSYour Name 	if (assoc_id == (uint16_t)-1) {
580*5113495bSYour Name 		mlo_err("MLD ID %d AID alloc failed", ml_dev->mld_id);
581*5113495bSYour Name 		return QDF_STATUS_E_NOENT;
582*5113495bSYour Name 	}
583*5113495bSYour Name 
584*5113495bSYour Name 	ml_peer->assoc_id = assoc_id;
585*5113495bSYour Name 
586*5113495bSYour Name 	mlo_debug("MLD ID %d ML Peer " QDF_MAC_ADDR_FMT " ML assoc id %d",
587*5113495bSYour Name 		  ml_dev->mld_id,
588*5113495bSYour Name 		  QDF_MAC_ADDR_REF(ml_peer->peer_mld_addr.bytes), assoc_id);
589*5113495bSYour Name 
590*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
591*5113495bSYour Name }
592*5113495bSYour Name 
mlo_peer_free_aid(struct wlan_mlo_dev_context * ml_dev,struct wlan_mlo_peer_context * ml_peer)593*5113495bSYour Name QDF_STATUS mlo_peer_free_aid(struct wlan_mlo_dev_context *ml_dev,
594*5113495bSYour Name 			     struct wlan_mlo_peer_context *ml_peer)
595*5113495bSYour Name {
596*5113495bSYour Name 	struct wlan_ml_vdev_aid_mgr *ml_aid_mgr;
597*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_SUCCESS;
598*5113495bSYour Name 
599*5113495bSYour Name 	if (!ml_dev->ap_ctx) {
600*5113495bSYour Name 		mlo_err("ml_dev->ap_ctx is null");
601*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
602*5113495bSYour Name 	}
603*5113495bSYour Name 
604*5113495bSYour Name 	if (!ml_peer) {
605*5113495bSYour Name 		mlo_err("ml_peer is null");
606*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
607*5113495bSYour Name 	}
608*5113495bSYour Name 
609*5113495bSYour Name 	ml_aid_mgr = ml_dev->ap_ctx->ml_aid_mgr;
610*5113495bSYour Name 	if (!ml_aid_mgr) {
611*5113495bSYour Name 		mlo_err(" Free failed, ml_aid_mgr is NULL");
612*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
613*5113495bSYour Name 	}
614*5113495bSYour Name 
615*5113495bSYour Name 	if (!ml_peer->assoc_id) {
616*5113495bSYour Name 		mlo_info("MLD ID %d ML Peer " QDF_MAC_ADDR_FMT " ML assoc id is 0",
617*5113495bSYour Name 			 ml_dev->mld_id,
618*5113495bSYour Name 			 QDF_MAC_ADDR_REF(ml_peer->peer_mld_addr.bytes));
619*5113495bSYour Name 		return status;
620*5113495bSYour Name 	}
621*5113495bSYour Name 
622*5113495bSYour Name 	wlan_mlo_peer_free_aid(ml_aid_mgr, 0xff, ml_peer->assoc_id);
623*5113495bSYour Name 
624*5113495bSYour Name 	return status;
625*5113495bSYour Name }
626*5113495bSYour Name 
mlo_get_aid(struct wlan_objmgr_vdev * vdev)627*5113495bSYour Name uint16_t mlo_get_aid(struct wlan_objmgr_vdev *vdev)
628*5113495bSYour Name {
629*5113495bSYour Name 	struct wlan_mlo_dev_context *ml_dev;
630*5113495bSYour Name 	uint16_t assoc_id = (uint16_t)-1;
631*5113495bSYour Name 	struct wlan_ml_vdev_aid_mgr *ml_aid_mgr;
632*5113495bSYour Name 	struct wlan_mlo_ap *ap_ctx;
633*5113495bSYour Name 
634*5113495bSYour Name 	ml_dev = vdev->mlo_dev_ctx;
635*5113495bSYour Name 
636*5113495bSYour Name 	if (!ml_dev)
637*5113495bSYour Name 		return assoc_id;
638*5113495bSYour Name 
639*5113495bSYour Name 	ap_ctx = ml_dev->ap_ctx;
640*5113495bSYour Name 	if (!ap_ctx)
641*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
642*5113495bSYour Name 
643*5113495bSYour Name 	ml_aid_mgr = ap_ctx->ml_aid_mgr;
644*5113495bSYour Name 	if (!ml_aid_mgr)
645*5113495bSYour Name 		return assoc_id;
646*5113495bSYour Name 
647*5113495bSYour Name 	return wlan_mlo_peer_alloc_aid(ml_aid_mgr, true, false, 0xff);
648*5113495bSYour Name }
649*5113495bSYour Name 
mlo_free_aid(struct wlan_objmgr_vdev * vdev,uint16_t assoc_id)650*5113495bSYour Name QDF_STATUS mlo_free_aid(struct wlan_objmgr_vdev *vdev, uint16_t assoc_id)
651*5113495bSYour Name {
652*5113495bSYour Name 	struct wlan_mlo_dev_context *ml_dev;
653*5113495bSYour Name 	struct wlan_ml_vdev_aid_mgr *ml_aid_mgr;
654*5113495bSYour Name 	struct wlan_mlo_ap *ap_ctx;
655*5113495bSYour Name 
656*5113495bSYour Name 	ml_dev = vdev->mlo_dev_ctx;
657*5113495bSYour Name 
658*5113495bSYour Name 	if (!ml_dev)
659*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
660*5113495bSYour Name 
661*5113495bSYour Name 	ap_ctx = ml_dev->ap_ctx;
662*5113495bSYour Name 	if (!ap_ctx)
663*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
664*5113495bSYour Name 
665*5113495bSYour Name 	ml_aid_mgr = ap_ctx->ml_aid_mgr;
666*5113495bSYour Name 	if (!ml_aid_mgr)
667*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
668*5113495bSYour Name 
669*5113495bSYour Name 	return wlan_mlo_peer_free_aid(ml_aid_mgr, 0xff, assoc_id);
670*5113495bSYour Name }
671*5113495bSYour Name 
mlo_peer_set_aid(struct wlan_mlo_dev_context * ml_dev,uint16_t assoc_id)672*5113495bSYour Name static QDF_STATUS mlo_peer_set_aid(struct wlan_mlo_dev_context *ml_dev,
673*5113495bSYour Name 				   uint16_t assoc_id)
674*5113495bSYour Name {
675*5113495bSYour Name 	struct wlan_ml_vdev_aid_mgr *ml_aid_mgr;
676*5113495bSYour Name 	QDF_STATUS status;
677*5113495bSYour Name 	struct wlan_mlo_ap *ap_ctx;
678*5113495bSYour Name 
679*5113495bSYour Name 	ap_ctx = ml_dev->ap_ctx;
680*5113495bSYour Name 	if (!ap_ctx)
681*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
682*5113495bSYour Name 
683*5113495bSYour Name 	ml_aid_mgr = ap_ctx->ml_aid_mgr;
684*5113495bSYour Name 	if (!ml_aid_mgr)
685*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
686*5113495bSYour Name 
687*5113495bSYour Name 	status = wlan_mlo_peer_set_aid(ml_aid_mgr, true, 0xff, assoc_id);
688*5113495bSYour Name 
689*5113495bSYour Name 	return status;
690*5113495bSYour Name }
691*5113495bSYour Name 
mlo_set_aid(struct wlan_objmgr_vdev * vdev,uint16_t assoc_id)692*5113495bSYour Name QDF_STATUS mlo_set_aid(struct wlan_objmgr_vdev *vdev, uint16_t assoc_id)
693*5113495bSYour Name {
694*5113495bSYour Name 	struct wlan_mlo_dev_context *ml_dev;
695*5113495bSYour Name 
696*5113495bSYour Name 	ml_dev = vdev->mlo_dev_ctx;
697*5113495bSYour Name 
698*5113495bSYour Name 	if (!ml_dev)
699*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
700*5113495bSYour Name 
701*5113495bSYour Name 	return mlo_peer_set_aid(ml_dev, assoc_id);
702*5113495bSYour Name }
703*5113495bSYour Name 
mlme_is_aid_set(struct wlan_objmgr_vdev * vdev,uint16_t assoc_id)704*5113495bSYour Name int mlme_is_aid_set(struct wlan_objmgr_vdev *vdev, uint16_t assoc_id)
705*5113495bSYour Name {
706*5113495bSYour Name 	struct wlan_vdev_aid_mgr *vdev_aid_mgr;
707*5113495bSYour Name 	bool no_lock = true;
708*5113495bSYour Name 
709*5113495bSYour Name 	vdev_aid_mgr = wlan_vdev_mlme_get_aid_mgr(vdev);
710*5113495bSYour Name 	if (vdev_aid_mgr) {
711*5113495bSYour Name 		if (qdf_atomic_read(&vdev_aid_mgr->ref_cnt) > 1)
712*5113495bSYour Name 			no_lock = false;
713*5113495bSYour Name 
714*5113495bSYour Name 		return wlan_mlme_peer_aid_is_set(vdev_aid_mgr, no_lock,
715*5113495bSYour Name 						 assoc_id);
716*5113495bSYour Name 	}
717*5113495bSYour Name 
718*5113495bSYour Name 	return 0;
719*5113495bSYour Name }
720*5113495bSYour Name 
mlme_get_aid(struct wlan_objmgr_vdev * vdev)721*5113495bSYour Name uint16_t mlme_get_aid(struct wlan_objmgr_vdev *vdev)
722*5113495bSYour Name {
723*5113495bSYour Name 	struct wlan_mlo_dev_context *ml_dev;
724*5113495bSYour Name 	uint16_t assoc_id = (uint16_t)-1;
725*5113495bSYour Name 	struct wlan_ml_vdev_aid_mgr *ml_aid_mgr;
726*5113495bSYour Name 	struct wlan_vdev_aid_mgr *vdev_aid_mgr;
727*5113495bSYour Name 	bool no_lock = true;
728*5113495bSYour Name 	uint8_t link_id;
729*5113495bSYour Name 
730*5113495bSYour Name 	ml_dev = vdev->mlo_dev_ctx;
731*5113495bSYour Name 
732*5113495bSYour Name 	if (!ml_dev) {
733*5113495bSYour Name 		vdev_aid_mgr = wlan_vdev_mlme_get_aid_mgr(vdev);
734*5113495bSYour Name 		if (vdev_aid_mgr) {
735*5113495bSYour Name 			if (qdf_atomic_read(&vdev_aid_mgr->ref_cnt) > 1)
736*5113495bSYour Name 				no_lock = false;
737*5113495bSYour Name 			return wlan_mlme_peer_alloc_aid(vdev_aid_mgr, no_lock);
738*5113495bSYour Name 		}
739*5113495bSYour Name 		return assoc_id;
740*5113495bSYour Name 	}
741*5113495bSYour Name 
742*5113495bSYour Name 	ml_aid_mgr = ml_dev->ap_ctx->ml_aid_mgr;
743*5113495bSYour Name 	if (!ml_aid_mgr)
744*5113495bSYour Name 		return assoc_id;
745*5113495bSYour Name 
746*5113495bSYour Name 	link_id = mlo_get_link_vdev_ix(ml_dev, vdev);
747*5113495bSYour Name 
748*5113495bSYour Name 	assoc_id = wlan_mlo_peer_alloc_aid(ml_aid_mgr, false, false, link_id);
749*5113495bSYour Name 
750*5113495bSYour Name 	return assoc_id;
751*5113495bSYour Name }
752*5113495bSYour Name 
mlme_set_aid(struct wlan_objmgr_vdev * vdev,uint16_t assoc_id)753*5113495bSYour Name QDF_STATUS mlme_set_aid(struct wlan_objmgr_vdev *vdev,
754*5113495bSYour Name 			uint16_t assoc_id)
755*5113495bSYour Name {
756*5113495bSYour Name 	struct wlan_mlo_dev_context *ml_dev;
757*5113495bSYour Name 	struct wlan_ml_vdev_aid_mgr *ml_aid_mgr;
758*5113495bSYour Name 	struct wlan_vdev_aid_mgr *vdev_aid_mgr;
759*5113495bSYour Name 	bool no_lock = true;
760*5113495bSYour Name 	uint8_t link_id;
761*5113495bSYour Name 
762*5113495bSYour Name 	ml_dev = vdev->mlo_dev_ctx;
763*5113495bSYour Name 
764*5113495bSYour Name 	if (!ml_dev) {
765*5113495bSYour Name 		vdev_aid_mgr = wlan_vdev_mlme_get_aid_mgr(vdev);
766*5113495bSYour Name 		if (vdev_aid_mgr) {
767*5113495bSYour Name 			if (qdf_atomic_read(&vdev_aid_mgr->ref_cnt) > 1)
768*5113495bSYour Name 				no_lock = false;
769*5113495bSYour Name 
770*5113495bSYour Name 			return wlan_mlme_peer_set_aid(vdev_aid_mgr, no_lock,
771*5113495bSYour Name 						      assoc_id);
772*5113495bSYour Name 		} else {
773*5113495bSYour Name 			return QDF_STATUS_E_FAILURE;
774*5113495bSYour Name 		}
775*5113495bSYour Name 	}
776*5113495bSYour Name 
777*5113495bSYour Name 	ml_aid_mgr = ml_dev->ap_ctx->ml_aid_mgr;
778*5113495bSYour Name 	if (!ml_aid_mgr)
779*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
780*5113495bSYour Name 
781*5113495bSYour Name 	link_id = mlo_get_link_vdev_ix(ml_dev, vdev);
782*5113495bSYour Name 
783*5113495bSYour Name 	return wlan_mlo_peer_set_aid(ml_aid_mgr, false, link_id, assoc_id);
784*5113495bSYour Name }
785*5113495bSYour Name 
mlme_free_aid(struct wlan_objmgr_vdev * vdev,uint16_t assoc_id)786*5113495bSYour Name void mlme_free_aid(struct wlan_objmgr_vdev *vdev, uint16_t assoc_id)
787*5113495bSYour Name {
788*5113495bSYour Name 	struct wlan_mlo_dev_context *ml_dev;
789*5113495bSYour Name 	struct wlan_ml_vdev_aid_mgr *ml_aid_mgr;
790*5113495bSYour Name 	struct wlan_vdev_aid_mgr *vdev_aid_mgr;
791*5113495bSYour Name 	bool no_lock = true;
792*5113495bSYour Name 	uint8_t link_id;
793*5113495bSYour Name 
794*5113495bSYour Name 	ml_dev = vdev->mlo_dev_ctx;
795*5113495bSYour Name 
796*5113495bSYour Name 	if (!ml_dev) {
797*5113495bSYour Name 		vdev_aid_mgr = wlan_vdev_mlme_get_aid_mgr(vdev);
798*5113495bSYour Name 		if (vdev_aid_mgr) {
799*5113495bSYour Name 			if (qdf_atomic_read(&vdev_aid_mgr->ref_cnt) > 1)
800*5113495bSYour Name 				no_lock = false;
801*5113495bSYour Name 
802*5113495bSYour Name 			wlan_mlme_peer_free_aid(vdev_aid_mgr, no_lock,
803*5113495bSYour Name 						assoc_id);
804*5113495bSYour Name 		}
805*5113495bSYour Name 		return;
806*5113495bSYour Name 	}
807*5113495bSYour Name 
808*5113495bSYour Name 	if (!ml_dev->ap_ctx)
809*5113495bSYour Name 		return;
810*5113495bSYour Name 
811*5113495bSYour Name 	ml_aid_mgr = ml_dev->ap_ctx->ml_aid_mgr;
812*5113495bSYour Name 	if (!ml_aid_mgr)
813*5113495bSYour Name 		return;
814*5113495bSYour Name 
815*5113495bSYour Name 	link_id = mlo_get_link_vdev_ix(ml_dev, vdev);
816*5113495bSYour Name 
817*5113495bSYour Name 	wlan_mlo_peer_free_aid(ml_aid_mgr, link_id, assoc_id);
818*5113495bSYour Name }
819*5113495bSYour Name 
wlan_vdev_mlme_aid_mgr_max_aid_set(struct wlan_objmgr_vdev * vdev,uint16_t max_aid)820*5113495bSYour Name void wlan_vdev_mlme_aid_mgr_max_aid_set(struct wlan_objmgr_vdev *vdev,
821*5113495bSYour Name 					uint16_t max_aid)
822*5113495bSYour Name {
823*5113495bSYour Name 	struct wlan_vdev_aid_mgr *aid_mgr;
824*5113495bSYour Name 	struct wlan_vdev_aid_mgr *vdev_aid_mgr;
825*5113495bSYour Name 	struct wlan_ml_vdev_aid_mgr *ml_aid_mgr;
826*5113495bSYour Name 	struct wlan_mlo_dev_context *ml_dev;
827*5113495bSYour Name 	uint16_t j, max_sta_count = 0;
828*5113495bSYour Name 	uint16_t aidmgr_sta_count = 0;
829*5113495bSYour Name 
830*5113495bSYour Name 	aid_mgr = wlan_vdev_mlme_get_aid_mgr(vdev);
831*5113495bSYour Name 	if (!aid_mgr || !max_aid)
832*5113495bSYour Name 		return;
833*5113495bSYour Name 
834*5113495bSYour Name 	mlo_debug("VDEV mgr max aid %d", max_aid);
835*5113495bSYour Name 
836*5113495bSYour Name 	aid_mgr->max_aid = max_aid;
837*5113495bSYour Name 	ml_dev = vdev->mlo_dev_ctx;
838*5113495bSYour Name 	if (ml_dev) {
839*5113495bSYour Name 		ml_aid_mgr = ml_dev->ap_ctx->ml_aid_mgr;
840*5113495bSYour Name 		if (!ml_aid_mgr)
841*5113495bSYour Name 			return;
842*5113495bSYour Name 
843*5113495bSYour Name 		/* Derive lower max_aid */
844*5113495bSYour Name 		for (j = 0; j < WLAN_UMAC_MLO_MAX_VDEVS; j++) {
845*5113495bSYour Name 			vdev_aid_mgr = ml_aid_mgr->aid_mgr[j];
846*5113495bSYour Name 			if (!vdev_aid_mgr)
847*5113495bSYour Name 				continue;
848*5113495bSYour Name 
849*5113495bSYour Name 			aidmgr_sta_count = vdev_aid_mgr->max_aid -
850*5113495bSYour Name 					   vdev_aid_mgr->start_aid;
851*5113495bSYour Name 			if (!max_sta_count) {
852*5113495bSYour Name 				max_sta_count = aidmgr_sta_count;
853*5113495bSYour Name 				continue;
854*5113495bSYour Name 			}
855*5113495bSYour Name 
856*5113495bSYour Name 			if (max_sta_count > aidmgr_sta_count)
857*5113495bSYour Name 				max_sta_count = aidmgr_sta_count;
858*5113495bSYour Name 		}
859*5113495bSYour Name 
860*5113495bSYour Name 		ml_aid_mgr->max_aid = ml_aid_mgr->start_aid + max_sta_count;
861*5113495bSYour Name 		mlo_debug("MLO mgr max aid %d", ml_aid_mgr->max_aid);
862*5113495bSYour Name 	}
863*5113495bSYour Name }
864*5113495bSYour Name 
wlan_vdev_mlme_set_start_aid(struct wlan_objmgr_vdev * vdev,uint16_t start_aid)865*5113495bSYour Name QDF_STATUS wlan_vdev_mlme_set_start_aid(struct wlan_objmgr_vdev *vdev,
866*5113495bSYour Name 					uint16_t start_aid)
867*5113495bSYour Name {
868*5113495bSYour Name 	struct wlan_vdev_aid_mgr *vdev_aid_mgr;
869*5113495bSYour Name 	struct wlan_ml_vdev_aid_mgr *ml_aid_mgr;
870*5113495bSYour Name 	struct wlan_mlo_dev_context *ml_dev;
871*5113495bSYour Name 	uint16_t j, max_aid_start = 0;
872*5113495bSYour Name 
873*5113495bSYour Name 	vdev_aid_mgr = wlan_vdev_mlme_get_aid_mgr(vdev);
874*5113495bSYour Name 	if (!vdev_aid_mgr)
875*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
876*5113495bSYour Name 
877*5113495bSYour Name 	vdev_aid_mgr->start_aid = start_aid;
878*5113495bSYour Name 	mlo_debug("VDEV mgr start aid %d", start_aid);
879*5113495bSYour Name 
880*5113495bSYour Name 	ml_dev = vdev->mlo_dev_ctx;
881*5113495bSYour Name 	if (ml_dev) {
882*5113495bSYour Name 		ml_aid_mgr = ml_dev->ap_ctx->ml_aid_mgr;
883*5113495bSYour Name 		if (!ml_aid_mgr)
884*5113495bSYour Name 			return QDF_STATUS_E_FAILURE;
885*5113495bSYour Name 
886*5113495bSYour Name 		/* Derive higher start_aid */
887*5113495bSYour Name 		for (j = 0; j < WLAN_UMAC_MLO_MAX_VDEVS; j++) {
888*5113495bSYour Name 			vdev_aid_mgr = ml_aid_mgr->aid_mgr[j];
889*5113495bSYour Name 			if (!vdev_aid_mgr)
890*5113495bSYour Name 				continue;
891*5113495bSYour Name 
892*5113495bSYour Name 			if (max_aid_start < vdev_aid_mgr->start_aid)
893*5113495bSYour Name 				max_aid_start = vdev_aid_mgr->start_aid;
894*5113495bSYour Name 		}
895*5113495bSYour Name 
896*5113495bSYour Name 		ml_aid_mgr->start_aid = max_aid_start;
897*5113495bSYour Name 		mlo_debug("MLO mgr start aid %d", max_aid_start);
898*5113495bSYour Name 	}
899*5113495bSYour Name 
900*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
901*5113495bSYour Name }
902*5113495bSYour Name 
wlan_vdev_mlme_get_start_aid(struct wlan_objmgr_vdev * vdev)903*5113495bSYour Name uint16_t wlan_vdev_mlme_get_start_aid(struct wlan_objmgr_vdev *vdev)
904*5113495bSYour Name {
905*5113495bSYour Name 	struct wlan_vdev_aid_mgr *vdev_aid_mgr;
906*5113495bSYour Name 
907*5113495bSYour Name 	vdev_aid_mgr = wlan_vdev_mlme_get_aid_mgr(vdev);
908*5113495bSYour Name 	if (!vdev_aid_mgr)
909*5113495bSYour Name 		return 0;
910*5113495bSYour Name 
911*5113495bSYour Name 	return vdev_aid_mgr->start_aid;
912*5113495bSYour Name }
913*5113495bSYour Name 
wlan_vdev_aid_mgr_init(uint16_t max_aid)914*5113495bSYour Name struct wlan_vdev_aid_mgr *wlan_vdev_aid_mgr_init(uint16_t max_aid)
915*5113495bSYour Name {
916*5113495bSYour Name 	struct wlan_vdev_aid_mgr *aid_mgr;
917*5113495bSYour Name 
918*5113495bSYour Name 	aid_mgr = qdf_mem_malloc(sizeof(struct wlan_vdev_aid_mgr));
919*5113495bSYour Name 	if (!aid_mgr)
920*5113495bSYour Name 		return NULL;
921*5113495bSYour Name 
922*5113495bSYour Name 	aid_mgr->start_aid = 0;
923*5113495bSYour Name 	aid_mgr->max_aid = max_aid;
924*5113495bSYour Name 	qdf_atomic_init(&aid_mgr->ref_cnt);
925*5113495bSYour Name 	/* Take reference before returning */
926*5113495bSYour Name 	qdf_atomic_inc(&aid_mgr->ref_cnt);
927*5113495bSYour Name 
928*5113495bSYour Name 	return aid_mgr;
929*5113495bSYour Name }
930*5113495bSYour Name 
wlan_vdev_aid_mgr_free(struct wlan_vdev_aid_mgr * aid_mgr)931*5113495bSYour Name void wlan_vdev_aid_mgr_free(struct wlan_vdev_aid_mgr *aid_mgr)
932*5113495bSYour Name {
933*5113495bSYour Name 	if (!aid_mgr)
934*5113495bSYour Name 		return;
935*5113495bSYour Name 
936*5113495bSYour Name 	if (!qdf_atomic_dec_and_test(&aid_mgr->ref_cnt))
937*5113495bSYour Name 		return;
938*5113495bSYour Name 
939*5113495bSYour Name 	aid_mgr->max_aid = 0;
940*5113495bSYour Name 	qdf_mem_free(aid_mgr);
941*5113495bSYour Name }
942*5113495bSYour Name 
wlan_mlo_vdev_init_mbss_aid_mgr(struct wlan_mlo_dev_context * ml_dev,struct wlan_objmgr_vdev * vdev,struct wlan_objmgr_vdev * tx_vdev)943*5113495bSYour Name QDF_STATUS wlan_mlo_vdev_init_mbss_aid_mgr(struct wlan_mlo_dev_context *ml_dev,
944*5113495bSYour Name 					   struct wlan_objmgr_vdev *vdev,
945*5113495bSYour Name 					   struct wlan_objmgr_vdev *tx_vdev)
946*5113495bSYour Name {
947*5113495bSYour Name 	struct wlan_vdev_aid_mgr *aid_mgr;
948*5113495bSYour Name 	struct wlan_vdev_aid_mgr *txvdev_aid_mgr;
949*5113495bSYour Name 	struct wlan_objmgr_vdev *vdev_iter;
950*5113495bSYour Name 	struct wlan_ml_vdev_aid_mgr *ml_aid_mgr;
951*5113495bSYour Name 	uint16_t start_aid = 0;
952*5113495bSYour Name 	uint8_t i;
953*5113495bSYour Name 
954*5113495bSYour Name 	if (!ml_dev) {
955*5113495bSYour Name 		mlo_err("ML DEV pointer is NULL");
956*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
957*5113495bSYour Name 	}
958*5113495bSYour Name 
959*5113495bSYour Name 	ml_aid_mgr = ml_dev->ap_ctx->ml_aid_mgr;
960*5113495bSYour Name 	if (!ml_aid_mgr) {
961*5113495bSYour Name 		mlo_err("AID mgr of ML VDEV(%d) is invalid", ml_dev->mld_id);
962*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
963*5113495bSYour Name 	}
964*5113495bSYour Name 
965*5113495bSYour Name 	txvdev_aid_mgr = wlan_vdev_mlme_get_aid_mgr(tx_vdev);
966*5113495bSYour Name 	if (!txvdev_aid_mgr) {
967*5113495bSYour Name 		mlo_err("AID mgr of Tx VDEV%d is invalid",
968*5113495bSYour Name 			wlan_vdev_get_id(tx_vdev));
969*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
970*5113495bSYour Name 	}
971*5113495bSYour Name 
972*5113495bSYour Name 	aid_mgr = wlan_vdev_mlme_get_aid_mgr(vdev);
973*5113495bSYour Name 
974*5113495bSYour Name 	for (i = 0; i < WLAN_UMAC_MLO_MAX_VDEVS; i++) {
975*5113495bSYour Name 		vdev_iter = ml_dev->wlan_vdev_list[i];
976*5113495bSYour Name 		if (!vdev_iter)
977*5113495bSYour Name 			continue;
978*5113495bSYour Name 
979*5113495bSYour Name 		if (vdev != vdev_iter)
980*5113495bSYour Name 			continue;
981*5113495bSYour Name 
982*5113495bSYour Name 		start_aid = wlan_vdev_mlme_get_start_aid(tx_vdev);
983*5113495bSYour Name 		/* Update start_aid, which updates MLO Dev start aid */
984*5113495bSYour Name 		wlan_vdev_mlme_set_start_aid(vdev, start_aid);
985*5113495bSYour Name 
986*5113495bSYour Name 		qdf_atomic_inc(&txvdev_aid_mgr->ref_cnt);
987*5113495bSYour Name 		wlan_vdev_mlme_set_aid_mgr(vdev,
988*5113495bSYour Name 					   txvdev_aid_mgr);
989*5113495bSYour Name 		ml_aid_mgr->aid_mgr[i] = txvdev_aid_mgr;
990*5113495bSYour Name 
991*5113495bSYour Name 		if (aid_mgr) {
992*5113495bSYour Name 			mlo_info("AID mgr is freed for vdev %d with txvdev %d",
993*5113495bSYour Name 				 wlan_vdev_get_id(vdev),
994*5113495bSYour Name 				 wlan_vdev_get_id(tx_vdev));
995*5113495bSYour Name 			wlan_vdev_aid_mgr_free(aid_mgr);
996*5113495bSYour Name 		}
997*5113495bSYour Name 
998*5113495bSYour Name 		mlo_debug("AID mgr replaced for vdev %d with txvdev %d",
999*5113495bSYour Name 			  wlan_vdev_get_id(vdev), wlan_vdev_get_id(tx_vdev));
1000*5113495bSYour Name 	}
1001*5113495bSYour Name 
1002*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1003*5113495bSYour Name }
1004*5113495bSYour Name 
wlan_mlo_vdev_deinit_mbss_aid_mgr(struct wlan_mlo_dev_context * mldev,struct wlan_objmgr_vdev * vdev,struct wlan_objmgr_vdev * tx_vdev)1005*5113495bSYour Name QDF_STATUS wlan_mlo_vdev_deinit_mbss_aid_mgr(struct wlan_mlo_dev_context *mldev,
1006*5113495bSYour Name 					     struct wlan_objmgr_vdev *vdev,
1007*5113495bSYour Name 					     struct wlan_objmgr_vdev *tx_vdev)
1008*5113495bSYour Name {
1009*5113495bSYour Name 	struct wlan_vdev_aid_mgr *aid_mgr;
1010*5113495bSYour Name 	struct wlan_vdev_aid_mgr *txvdev_aid_mgr;
1011*5113495bSYour Name 	struct wlan_objmgr_vdev *vdev_iter;
1012*5113495bSYour Name 	struct wlan_ml_vdev_aid_mgr *ml_aid_mgr;
1013*5113495bSYour Name 	uint8_t i;
1014*5113495bSYour Name 
1015*5113495bSYour Name 	if (!mldev) {
1016*5113495bSYour Name 		mlo_err("ML DEV pointer is NULL");
1017*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
1018*5113495bSYour Name 	}
1019*5113495bSYour Name 
1020*5113495bSYour Name 	ml_aid_mgr = mldev->ap_ctx->ml_aid_mgr;
1021*5113495bSYour Name 	if (!ml_aid_mgr) {
1022*5113495bSYour Name 		mlo_err("AID mgr of ML VDEV(%d) is invalid", mldev->mld_id);
1023*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
1024*5113495bSYour Name 	}
1025*5113495bSYour Name 
1026*5113495bSYour Name 	txvdev_aid_mgr = wlan_vdev_mlme_get_aid_mgr(tx_vdev);
1027*5113495bSYour Name 	if (!txvdev_aid_mgr) {
1028*5113495bSYour Name 		mlo_err("AID mgr of Tx VDEV%d is invalid",
1029*5113495bSYour Name 			wlan_vdev_get_id(tx_vdev));
1030*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
1031*5113495bSYour Name 	}
1032*5113495bSYour Name 
1033*5113495bSYour Name 	aid_mgr = wlan_vdev_mlme_get_aid_mgr(vdev);
1034*5113495bSYour Name 	if (!aid_mgr) {
1035*5113495bSYour Name 		mlo_err("AID mgr of VDEV%d is invalid",
1036*5113495bSYour Name 			wlan_vdev_get_id(vdev));
1037*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
1038*5113495bSYour Name 	}
1039*5113495bSYour Name 
1040*5113495bSYour Name 	if (aid_mgr != txvdev_aid_mgr) {
1041*5113495bSYour Name 		mlo_err("AID mgr of VDEV%d and tx vdev(%d) aid mgr doesn't match",
1042*5113495bSYour Name 			wlan_vdev_get_id(vdev), wlan_vdev_get_id(tx_vdev));
1043*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
1044*5113495bSYour Name 	}
1045*5113495bSYour Name 
1046*5113495bSYour Name 	for (i = 0; i < WLAN_UMAC_MLO_MAX_VDEVS; i++) {
1047*5113495bSYour Name 		vdev_iter = mldev->wlan_vdev_list[i];
1048*5113495bSYour Name 		if (!vdev_iter)
1049*5113495bSYour Name 			continue;
1050*5113495bSYour Name 
1051*5113495bSYour Name 		if (vdev != vdev_iter)
1052*5113495bSYour Name 			continue;
1053*5113495bSYour Name 
1054*5113495bSYour Name 		aid_mgr = wlan_vdev_aid_mgr_init(ml_aid_mgr->max_aid);
1055*5113495bSYour Name 		if (!aid_mgr) {
1056*5113495bSYour Name 			mlo_err("AID bitmap allocation failed for VDEV%d",
1057*5113495bSYour Name 				wlan_vdev_get_id(vdev));
1058*5113495bSYour Name 			QDF_BUG(0);
1059*5113495bSYour Name 			return QDF_STATUS_E_NOMEM;
1060*5113495bSYour Name 		}
1061*5113495bSYour Name 
1062*5113495bSYour Name 		wlan_vdev_mlme_set_aid_mgr(vdev, aid_mgr);
1063*5113495bSYour Name 		ml_aid_mgr->aid_mgr[i] = aid_mgr;
1064*5113495bSYour Name 
1065*5113495bSYour Name 		wlan_vdev_aid_mgr_free(txvdev_aid_mgr);
1066*5113495bSYour Name 
1067*5113495bSYour Name 		mlo_debug("AID mgr restored for vdev %d (txvdev %d)",
1068*5113495bSYour Name 			  wlan_vdev_get_id(vdev), wlan_vdev_get_id(tx_vdev));
1069*5113495bSYour Name 	}
1070*5113495bSYour Name 
1071*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1072*5113495bSYour Name }
1073*5113495bSYour Name 
wlan_mlme_vdev_init_mbss_aid_mgr(struct wlan_objmgr_vdev * vdev,struct wlan_objmgr_vdev * tx_vdev)1074*5113495bSYour Name QDF_STATUS wlan_mlme_vdev_init_mbss_aid_mgr(struct wlan_objmgr_vdev *vdev,
1075*5113495bSYour Name 					    struct wlan_objmgr_vdev *tx_vdev)
1076*5113495bSYour Name {
1077*5113495bSYour Name 	struct wlan_vdev_aid_mgr *aid_mgr;
1078*5113495bSYour Name 	struct wlan_vdev_aid_mgr *txvdev_aid_mgr;
1079*5113495bSYour Name 
1080*5113495bSYour Name 	txvdev_aid_mgr = wlan_vdev_mlme_get_aid_mgr(tx_vdev);
1081*5113495bSYour Name 	if (!txvdev_aid_mgr) {
1082*5113495bSYour Name 		mlo_err("AID mgr of Tx VDEV%d is invalid",
1083*5113495bSYour Name 			wlan_vdev_get_id(tx_vdev));
1084*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
1085*5113495bSYour Name 	}
1086*5113495bSYour Name 
1087*5113495bSYour Name 	aid_mgr = wlan_vdev_mlme_get_aid_mgr(vdev);
1088*5113495bSYour Name 
1089*5113495bSYour Name 	qdf_atomic_inc(&txvdev_aid_mgr->ref_cnt);
1090*5113495bSYour Name 	wlan_vdev_mlme_set_aid_mgr(vdev,
1091*5113495bSYour Name 				   txvdev_aid_mgr);
1092*5113495bSYour Name 
1093*5113495bSYour Name 	if (aid_mgr) {
1094*5113495bSYour Name 		mlo_info("AID mgr is freed for vdev %d with txvdev %d",
1095*5113495bSYour Name 			 wlan_vdev_get_id(vdev), wlan_vdev_get_id(tx_vdev));
1096*5113495bSYour Name 		wlan_vdev_aid_mgr_free(aid_mgr);
1097*5113495bSYour Name 	}
1098*5113495bSYour Name 
1099*5113495bSYour Name 	mlo_debug("AID mgr replaced for vdev %d with txvdev %d",
1100*5113495bSYour Name 		  wlan_vdev_get_id(vdev), wlan_vdev_get_id(tx_vdev));
1101*5113495bSYour Name 
1102*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1103*5113495bSYour Name }
1104*5113495bSYour Name 
wlan_mlme_vdev_deinit_mbss_aid_mgr(struct wlan_objmgr_vdev * vdev,struct wlan_objmgr_vdev * tx_vdev)1105*5113495bSYour Name QDF_STATUS wlan_mlme_vdev_deinit_mbss_aid_mgr(struct wlan_objmgr_vdev *vdev,
1106*5113495bSYour Name 					      struct wlan_objmgr_vdev *tx_vdev)
1107*5113495bSYour Name {
1108*5113495bSYour Name 	struct wlan_vdev_aid_mgr *aid_mgr;
1109*5113495bSYour Name 	struct wlan_vdev_aid_mgr *txvdev_aid_mgr;
1110*5113495bSYour Name 
1111*5113495bSYour Name 	txvdev_aid_mgr = wlan_vdev_mlme_get_aid_mgr(tx_vdev);
1112*5113495bSYour Name 	if (!txvdev_aid_mgr) {
1113*5113495bSYour Name 		mlo_err("AID mgr of Tx VDEV%d is invalid",
1114*5113495bSYour Name 			wlan_vdev_get_id(tx_vdev));
1115*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
1116*5113495bSYour Name 	}
1117*5113495bSYour Name 
1118*5113495bSYour Name 	aid_mgr = wlan_vdev_mlme_get_aid_mgr(vdev);
1119*5113495bSYour Name 	if (!aid_mgr) {
1120*5113495bSYour Name 		mlo_err("AID mgr of VDEV%d is invalid",
1121*5113495bSYour Name 			wlan_vdev_get_id(vdev));
1122*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
1123*5113495bSYour Name 	}
1124*5113495bSYour Name 
1125*5113495bSYour Name 	if (aid_mgr != txvdev_aid_mgr) {
1126*5113495bSYour Name 		mlo_err("AID mgr of VDEV%d and tx vdev(%d) aid mgr doesn't match",
1127*5113495bSYour Name 			wlan_vdev_get_id(vdev), wlan_vdev_get_id(tx_vdev));
1128*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
1129*5113495bSYour Name 	}
1130*5113495bSYour Name 
1131*5113495bSYour Name 	aid_mgr = wlan_vdev_aid_mgr_init(txvdev_aid_mgr->max_aid);
1132*5113495bSYour Name 	if (!aid_mgr) {
1133*5113495bSYour Name 		mlo_err("AID bitmap allocation failed for VDEV%d",
1134*5113495bSYour Name 			wlan_vdev_get_id(vdev));
1135*5113495bSYour Name 		QDF_BUG(0);
1136*5113495bSYour Name 		return QDF_STATUS_E_NOMEM;
1137*5113495bSYour Name 	}
1138*5113495bSYour Name 
1139*5113495bSYour Name 	wlan_vdev_mlme_set_aid_mgr(vdev, aid_mgr);
1140*5113495bSYour Name 
1141*5113495bSYour Name 	wlan_vdev_aid_mgr_free(txvdev_aid_mgr);
1142*5113495bSYour Name 
1143*5113495bSYour Name 	mlo_debug("AID mgr restored for vdev %d (txvdev %d)",
1144*5113495bSYour Name 		  wlan_vdev_get_id(vdev), wlan_vdev_get_id(tx_vdev));
1145*5113495bSYour Name 
1146*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1147*5113495bSYour Name }
1148*5113495bSYour Name 
wlan_mlo_vdev_alloc_aid_mgr(struct wlan_mlo_dev_context * ml_dev,struct wlan_objmgr_vdev * vdev)1149*5113495bSYour Name QDF_STATUS wlan_mlo_vdev_alloc_aid_mgr(struct wlan_mlo_dev_context *ml_dev,
1150*5113495bSYour Name 				       struct wlan_objmgr_vdev *vdev)
1151*5113495bSYour Name {
1152*5113495bSYour Name 	uint8_t i;
1153*5113495bSYour Name 	struct wlan_objmgr_vdev *vdev_iter;
1154*5113495bSYour Name 	struct wlan_ml_vdev_aid_mgr *ml_aidmgr;
1155*5113495bSYour Name 	struct wlan_vdev_aid_mgr *aid_mgr = NULL;
1156*5113495bSYour Name 	uint16_t max_aid = WLAN_UMAC_MAX_AID;
1157*5113495bSYour Name 
1158*5113495bSYour Name 	if (!ml_dev->ap_ctx) {
1159*5113495bSYour Name 		mlo_err(" ML AP context is not initialized");
1160*5113495bSYour Name 		QDF_BUG(0);
1161*5113495bSYour Name 		return QDF_STATUS_E_NOMEM;
1162*5113495bSYour Name 	}
1163*5113495bSYour Name 	ml_aidmgr = ml_dev->ap_ctx->ml_aid_mgr;
1164*5113495bSYour Name 	if (!ml_aidmgr) {
1165*5113495bSYour Name 		mlo_err(" ML AID mgr allocation failed");
1166*5113495bSYour Name 		return QDF_STATUS_E_NOMEM;
1167*5113495bSYour Name 	}
1168*5113495bSYour Name 
1169*5113495bSYour Name 	for (i = 0; i < WLAN_UMAC_MLO_MAX_VDEVS; i++) {
1170*5113495bSYour Name 		vdev_iter = ml_dev->wlan_vdev_list[i];
1171*5113495bSYour Name 		if (!vdev_iter)
1172*5113495bSYour Name 			continue;
1173*5113495bSYour Name 
1174*5113495bSYour Name 		if (vdev != vdev_iter)
1175*5113495bSYour Name 			continue;
1176*5113495bSYour Name 
1177*5113495bSYour Name 		/* if it is already allocated, assign it to ML AID mgr */
1178*5113495bSYour Name 		aid_mgr = wlan_vdev_mlme_get_aid_mgr(vdev);
1179*5113495bSYour Name 		if (!aid_mgr) {
1180*5113495bSYour Name 			aid_mgr = wlan_vdev_aid_mgr_init(max_aid);
1181*5113495bSYour Name 			if (aid_mgr) {
1182*5113495bSYour Name 				wlan_vdev_mlme_set_aid_mgr(vdev, aid_mgr);
1183*5113495bSYour Name 			} else {
1184*5113495bSYour Name 				mlo_err("AID bitmap allocation failed for VDEV%d",
1185*5113495bSYour Name 					wlan_vdev_get_id(vdev));
1186*5113495bSYour Name 				return QDF_STATUS_E_NOMEM;
1187*5113495bSYour Name 			}
1188*5113495bSYour Name 		}
1189*5113495bSYour Name 
1190*5113495bSYour Name 		ml_aidmgr->aid_mgr[i] = aid_mgr;
1191*5113495bSYour Name 		break;
1192*5113495bSYour Name 	}
1193*5113495bSYour Name 
1194*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1195*5113495bSYour Name }
1196*5113495bSYour Name 
wlan_mlo_vdev_free_aid_mgr(struct wlan_mlo_dev_context * ml_dev,struct wlan_objmgr_vdev * vdev)1197*5113495bSYour Name QDF_STATUS wlan_mlo_vdev_free_aid_mgr(struct wlan_mlo_dev_context *ml_dev,
1198*5113495bSYour Name 				      struct wlan_objmgr_vdev *vdev)
1199*5113495bSYour Name {
1200*5113495bSYour Name 	uint8_t i;
1201*5113495bSYour Name 	struct wlan_objmgr_vdev *vdev_iter;
1202*5113495bSYour Name 	struct wlan_ml_vdev_aid_mgr *ml_aidmgr;
1203*5113495bSYour Name 
1204*5113495bSYour Name 	if (!ml_dev->ap_ctx) {
1205*5113495bSYour Name 		mlo_err(" ML AP context is not initialized");
1206*5113495bSYour Name 		QDF_BUG(0);
1207*5113495bSYour Name 		return QDF_STATUS_E_NOMEM;
1208*5113495bSYour Name 	}
1209*5113495bSYour Name 	ml_aidmgr = ml_dev->ap_ctx->ml_aid_mgr;
1210*5113495bSYour Name 	if (!ml_aidmgr) {
1211*5113495bSYour Name 		mlo_err(" ML AID mgr allocation failed");
1212*5113495bSYour Name 		return QDF_STATUS_E_NOMEM;
1213*5113495bSYour Name 	}
1214*5113495bSYour Name 
1215*5113495bSYour Name 	for (i = 0; i < WLAN_UMAC_MLO_MAX_VDEVS; i++) {
1216*5113495bSYour Name 		vdev_iter = ml_dev->wlan_vdev_list[i];
1217*5113495bSYour Name 		if (!vdev_iter)
1218*5113495bSYour Name 			continue;
1219*5113495bSYour Name 
1220*5113495bSYour Name 		if (vdev != vdev_iter)
1221*5113495bSYour Name 			continue;
1222*5113495bSYour Name 
1223*5113495bSYour Name 		wlan_vdev_aid_mgr_free(ml_aidmgr->aid_mgr[i]);
1224*5113495bSYour Name 		ml_aidmgr->aid_mgr[i] = NULL;
1225*5113495bSYour Name 		wlan_vdev_mlme_set_aid_mgr(vdev, NULL);
1226*5113495bSYour Name 		break;
1227*5113495bSYour Name 	}
1228*5113495bSYour Name 
1229*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1230*5113495bSYour Name }
1231*5113495bSYour Name 
wlan_mlo_vdev_aid_mgr_init(struct wlan_mlo_dev_context * ml_dev)1232*5113495bSYour Name QDF_STATUS wlan_mlo_vdev_aid_mgr_init(struct wlan_mlo_dev_context *ml_dev)
1233*5113495bSYour Name {
1234*5113495bSYour Name 	uint8_t i;
1235*5113495bSYour Name 	struct wlan_objmgr_vdev *vdev;
1236*5113495bSYour Name 	struct wlan_ml_vdev_aid_mgr *ml_aidmgr;
1237*5113495bSYour Name 	uint16_t max_aid = WLAN_UMAC_MAX_AID;
1238*5113495bSYour Name 	struct wlan_vdev_aid_mgr *aid_mgr = NULL;
1239*5113495bSYour Name 
1240*5113495bSYour Name 	ml_aidmgr = qdf_mem_malloc(sizeof(struct wlan_ml_vdev_aid_mgr));
1241*5113495bSYour Name 	if (!ml_aidmgr) {
1242*5113495bSYour Name 		ml_dev->ap_ctx->ml_aid_mgr = NULL;
1243*5113495bSYour Name 		mlo_err(" ML AID mgr allocation failed");
1244*5113495bSYour Name 		return QDF_STATUS_E_NOMEM;
1245*5113495bSYour Name 	}
1246*5113495bSYour Name 
1247*5113495bSYour Name 	ml_aidmgr->start_aid = 0;
1248*5113495bSYour Name 	ml_aidmgr->max_aid = max_aid;
1249*5113495bSYour Name 	ml_dev->ap_ctx->ml_aid_mgr = ml_aidmgr;
1250*5113495bSYour Name 
1251*5113495bSYour Name 	for (i = 0; i < WLAN_UMAC_MLO_MAX_VDEVS; i++) {
1252*5113495bSYour Name 		vdev = ml_dev->wlan_vdev_list[i];
1253*5113495bSYour Name 		if (!vdev)
1254*5113495bSYour Name 			continue;
1255*5113495bSYour Name 
1256*5113495bSYour Name 		aid_mgr = wlan_vdev_mlme_get_aid_mgr(vdev);
1257*5113495bSYour Name 		if (!aid_mgr)
1258*5113495bSYour Name 			aid_mgr = wlan_vdev_aid_mgr_init(max_aid);
1259*5113495bSYour Name 
1260*5113495bSYour Name 		ml_aidmgr->aid_mgr[i] = aid_mgr;
1261*5113495bSYour Name 		if (!ml_aidmgr->aid_mgr[i]) {
1262*5113495bSYour Name 			mlo_err("AID bitmap allocation failed for VDEV%d",
1263*5113495bSYour Name 				wlan_vdev_get_id(vdev));
1264*5113495bSYour Name 			goto free_ml_aid_mgr;
1265*5113495bSYour Name 		}
1266*5113495bSYour Name 		wlan_vdev_mlme_set_aid_mgr(vdev, ml_aidmgr->aid_mgr[i]);
1267*5113495bSYour Name 	}
1268*5113495bSYour Name 
1269*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1270*5113495bSYour Name 
1271*5113495bSYour Name free_ml_aid_mgr:
1272*5113495bSYour Name 	wlan_mlo_vdev_aid_mgr_deinit(ml_dev);
1273*5113495bSYour Name 
1274*5113495bSYour Name 	return QDF_STATUS_E_NOMEM;
1275*5113495bSYour Name }
1276*5113495bSYour Name 
wlan_mlo_vdev_aid_mgr_deinit(struct wlan_mlo_dev_context * ml_dev)1277*5113495bSYour Name void wlan_mlo_vdev_aid_mgr_deinit(struct wlan_mlo_dev_context *ml_dev)
1278*5113495bSYour Name {
1279*5113495bSYour Name 	uint8_t i;
1280*5113495bSYour Name 	struct wlan_ml_vdev_aid_mgr *ml_aid_mgr;
1281*5113495bSYour Name 	int32_t n;
1282*5113495bSYour Name 
1283*5113495bSYour Name 	ml_aid_mgr = ml_dev->ap_ctx->ml_aid_mgr;
1284*5113495bSYour Name 	if (!ml_aid_mgr)
1285*5113495bSYour Name 		return;
1286*5113495bSYour Name 
1287*5113495bSYour Name 	for (i = 0; i < WLAN_UMAC_MLO_MAX_VDEVS; i++) {
1288*5113495bSYour Name 
1289*5113495bSYour Name 		if (ml_aid_mgr->aid_mgr[i]) {
1290*5113495bSYour Name 			n = qdf_atomic_read(&ml_aid_mgr->aid_mgr[i]->ref_cnt);
1291*5113495bSYour Name 			mlo_info("AID mgr ref cnt %d", n);
1292*5113495bSYour Name 		} else {
1293*5113495bSYour Name 			mlo_err("ID %d, doesn't have associated AID mgr", i);
1294*5113495bSYour Name 			continue;
1295*5113495bSYour Name 		}
1296*5113495bSYour Name 		wlan_vdev_aid_mgr_free(ml_aid_mgr->aid_mgr[i]);
1297*5113495bSYour Name 		ml_aid_mgr->aid_mgr[i] = NULL;
1298*5113495bSYour Name 	}
1299*5113495bSYour Name 
1300*5113495bSYour Name 	qdf_mem_free(ml_aid_mgr);
1301*5113495bSYour Name 	ml_dev->ap_ctx->ml_aid_mgr = NULL;
1302*5113495bSYour Name }
1303