1 /*
2  * Copyright (c) 2016-2021 The Linux Foundation. All rights reserved.
3  * Copyright (c) 2021-2024 Qualcomm Innovation Center, Inc. All rights reserved.
4  *
5  * Permission to use, copy, modify, and/or distribute this software for
6  * any purpose with or without fee is hereby granted, provided that the
7  * above copyright notice and this permission notice appear in all
8  * copies.
9  *
10  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17  * PERFORMANCE OF THIS SOFTWARE.
18  */
19 /**
20  * DOC: Public APIs to perform operations on Global objects
21  */
22 
23 #include <wlan_objmgr_cmn.h>
24 #include <wlan_objmgr_global_obj.h>
25 #include <wlan_objmgr_psoc_obj.h>
26 #include <wlan_objmgr_pdev_obj.h>
27 #include <wlan_objmgr_vdev_obj.h>
28 #include <wlan_objmgr_peer_obj.h>
29 #include <wlan_objmgr_debug.h>
30 #include <qdf_mem.h>
31 #include <qdf_types.h>
32 #include <qdf_module.h>
33 #include "wlan_objmgr_global_obj_i.h"
34 #include "wlan_objmgr_psoc_obj_i.h"
35 #include "wlan_objmgr_pdev_obj_i.h"
36 #include "wlan_objmgr_vdev_obj_i.h"
37 #include <wlan_utility.h>
38 
39 /*
40  * APIs to Create/Delete Global object APIs
41  */
wlan_objmgr_psoc_object_status(struct wlan_objmgr_psoc * psoc)42 static QDF_STATUS wlan_objmgr_psoc_object_status(
43 			struct wlan_objmgr_psoc *psoc)
44 {
45 	uint8_t id;
46 	QDF_STATUS status = QDF_STATUS_SUCCESS;
47 
48 	wlan_psoc_obj_lock(psoc);
49 	/* Iterate through all components to derive the object status */
50 	for (id = 0; id < WLAN_UMAC_MAX_COMPONENTS; id++) {
51 		/* If component disabled, Ignore */
52 		if (psoc->obj_status[id] == QDF_STATUS_COMP_DISABLED)
53 			continue;
54 		/* If component operates in Async, status is Partially created,
55 		 * break
56 		 */
57 		else if (psoc->obj_status[id] == QDF_STATUS_COMP_ASYNC) {
58 			if (!psoc->soc_comp_priv_obj[id]) {
59 				status = QDF_STATUS_COMP_ASYNC;
60 				break;
61 			}
62 		/*
63 		 * If component failed to allocate its object, treat it as
64 		 * failure, complete object need to be cleaned up
65 		 */
66 		} else if ((psoc->obj_status[id] == QDF_STATUS_E_NOMEM) ||
67 			(psoc->obj_status[id] == QDF_STATUS_E_FAILURE)) {
68 			status = QDF_STATUS_E_FAILURE;
69 			break;
70 		}
71 	}
72 	wlan_psoc_obj_unlock(psoc);
73 
74 	return status;
75 }
76 
wlan_objmgr_psoc_peer_list_init(struct wlan_peer_list * peer_list)77 static void wlan_objmgr_psoc_peer_list_init(struct wlan_peer_list *peer_list)
78 {
79 	uint8_t i;
80 
81 	qdf_spinlock_create(&peer_list->peer_list_lock);
82 	for (i = 0; i < WLAN_PEER_HASHSIZE; i++)
83 		qdf_list_create(&peer_list->peer_hash[i],
84 			WLAN_UMAC_PSOC_MAX_PEERS +
85 			WLAN_MAX_PSOC_TEMP_PEERS);
86 }
87 
wlan_objmgr_psoc_peer_list_deinit(struct wlan_peer_list * peer_list)88 static void wlan_objmgr_psoc_peer_list_deinit(struct wlan_peer_list *peer_list)
89 {
90 	uint8_t i;
91 
92 	/* deinit the lock */
93 	qdf_spinlock_destroy(&peer_list->peer_list_lock);
94 	for (i = 0; i < WLAN_PEER_HASHSIZE; i++)
95 		qdf_list_destroy(&peer_list->peer_hash[i]);
96 }
97 
wlan_objmgr_psoc_obj_free(struct wlan_objmgr_psoc * psoc)98 static QDF_STATUS wlan_objmgr_psoc_obj_free(struct wlan_objmgr_psoc *psoc)
99 {
100 	/* Detach PSOC from global object's psoc list  */
101 	if (wlan_objmgr_psoc_object_detach(psoc) == QDF_STATUS_E_FAILURE) {
102 		obj_mgr_err("PSOC object detach failed");
103 		return QDF_STATUS_E_FAILURE;
104 	}
105 	wlan_objmgr_psoc_peer_list_deinit(&psoc->soc_objmgr.peer_list);
106 
107 	qdf_spinlock_destroy(&psoc->psoc_lock);
108 	qdf_mem_free(psoc);
109 
110 	return QDF_STATUS_SUCCESS;
111 }
112 
wlan_objmgr_psoc_obj_create(uint32_t phy_version,WLAN_DEV_TYPE dev_type)113 struct wlan_objmgr_psoc *wlan_objmgr_psoc_obj_create(uint32_t phy_version,
114 						WLAN_DEV_TYPE dev_type)
115 {
116 	uint8_t id;
117 	struct wlan_objmgr_psoc *psoc = NULL;
118 	wlan_objmgr_psoc_create_handler handler;
119 	wlan_objmgr_psoc_status_handler stat_handler;
120 	struct wlan_objmgr_psoc_objmgr *objmgr;
121 	QDF_STATUS obj_status;
122 	void *arg;
123 
124 	psoc = qdf_mem_malloc(sizeof(*psoc));
125 	if (!psoc)
126 		return NULL;
127 
128 	psoc->obj_state = WLAN_OBJ_STATE_ALLOCATED;
129 	qdf_spinlock_create(&psoc->psoc_lock);
130 	/* Initialize with default values */
131 	objmgr = &psoc->soc_objmgr;
132 	objmgr->wlan_pdev_count = 0;
133 	objmgr->wlan_vdev_count = 0;
134 	objmgr->max_vdev_count = WLAN_UMAC_PSOC_MAX_VDEVS;
135 	objmgr->wlan_peer_count = 0;
136 	objmgr->temp_peer_count = 0;
137 	objmgr->max_peer_count = WLAN_UMAC_PSOC_MAX_PEERS;
138 	qdf_atomic_init(&objmgr->ref_cnt);
139 	objmgr->print_cnt = 0;
140 	/* set phy version, dev_type in psoc */
141 	wlan_psoc_set_nif_phy_version(psoc, phy_version);
142 	wlan_psoc_set_dev_type(psoc, dev_type);
143 	/* Initialize peer list */
144 	wlan_objmgr_psoc_peer_list_init(&objmgr->peer_list);
145 	wlan_objmgr_psoc_get_ref(psoc, WLAN_OBJMGR_ID);
146 	/* Invoke registered create handlers */
147 	for (id = 0; id < WLAN_UMAC_MAX_COMPONENTS; id++) {
148 		handler = g_umac_glb_obj->psoc_create_handler[id];
149 		arg = g_umac_glb_obj->psoc_create_handler_arg[id];
150 		if (handler)
151 			psoc->obj_status[id] = handler(psoc, arg);
152 		else
153 			psoc->obj_status[id] = QDF_STATUS_COMP_DISABLED;
154 	}
155 	/* Derive object status */
156 	obj_status = wlan_objmgr_psoc_object_status(psoc);
157 
158 	if (obj_status == QDF_STATUS_SUCCESS) {
159 		/* Object status is SUCCESS, Object is created */
160 		psoc->obj_state = WLAN_OBJ_STATE_CREATED;
161 		for (id = 0; id < WLAN_UMAC_MAX_COMPONENTS; id++) {
162 			stat_handler = g_umac_glb_obj->psoc_status_handler[id];
163 			arg = g_umac_glb_obj->psoc_status_handler_arg[id];
164 			if (stat_handler)
165 				stat_handler(psoc, arg,
166 					     QDF_STATUS_SUCCESS);
167 		}
168 	} else if (obj_status == QDF_STATUS_COMP_ASYNC) {
169 		/*
170 		 * Few components operates in Asynchrous communction
171 		 * Object state partially created
172 		 */
173 		psoc->obj_state = WLAN_OBJ_STATE_PARTIALLY_CREATED;
174 	} else if (obj_status == QDF_STATUS_E_FAILURE) {
175 		/* Component object failed to be created, clean up the object */
176 		obj_mgr_err("PSOC component objects allocation failed");
177 		/* Clean up the psoc */
178 		wlan_objmgr_psoc_obj_delete(psoc);
179 		return NULL;
180 	}
181 
182 	if (wlan_objmgr_psoc_object_attach(psoc) !=
183 				QDF_STATUS_SUCCESS) {
184 		obj_mgr_err("PSOC object attach failed");
185 		wlan_objmgr_psoc_obj_delete(psoc);
186 		return NULL;
187 	}
188 	wlan_minidump_log(psoc, sizeof(*psoc), psoc,
189 			  WLAN_MD_OBJMGR_PSOC, "wlan_objmgr_psoc");
190 	obj_mgr_info("Created psoc %d", psoc->soc_objmgr.psoc_id);
191 
192 	return psoc;
193 }
194 qdf_export_symbol(wlan_objmgr_psoc_obj_create);
195 
wlan_objmgr_psoc_obj_destroy(struct wlan_objmgr_psoc * psoc)196 static QDF_STATUS wlan_objmgr_psoc_obj_destroy(struct wlan_objmgr_psoc *psoc)
197 {
198 	uint8_t id;
199 	wlan_objmgr_psoc_destroy_handler handler;
200 	QDF_STATUS obj_status;
201 	void *arg;
202 
203 	if (!psoc) {
204 		obj_mgr_err("psoc is NULL");
205 		return QDF_STATUS_E_FAILURE;
206 	}
207 	wlan_objmgr_notify_destroy(psoc, WLAN_PSOC_OP);
208 
209 	wlan_print_psoc_info(psoc);
210 	obj_mgr_info("Physically deleting psoc %d", psoc->soc_objmgr.psoc_id);
211 
212 	if (psoc->obj_state != WLAN_OBJ_STATE_LOGICALLY_DELETED) {
213 		obj_mgr_err("PSOC object delete is not invoked obj_state:%d",
214 			    psoc->obj_state);
215 		WLAN_OBJMGR_BUG(0);
216 	}
217 
218 	wlan_minidump_remove(psoc, sizeof(*psoc), psoc,
219 			     WLAN_MD_OBJMGR_PSOC, "wlan_objmgr_psoc");
220 
221 	/* Invoke registered create handlers */
222 	for (id = 0; id < WLAN_UMAC_MAX_COMPONENTS; id++) {
223 		handler = g_umac_glb_obj->psoc_destroy_handler[id];
224 		arg = g_umac_glb_obj->psoc_destroy_handler_arg[id];
225 		if (handler &&
226 		    (psoc->obj_status[id] == QDF_STATUS_SUCCESS ||
227 		     psoc->obj_status[id] == QDF_STATUS_COMP_ASYNC))
228 			psoc->obj_status[id] = handler(psoc, arg);
229 		else
230 			psoc->obj_status[id] = QDF_STATUS_COMP_DISABLED;
231 	}
232 	/* Derive object status */
233 	obj_status = wlan_objmgr_psoc_object_status(psoc);
234 
235 	if (obj_status == QDF_STATUS_E_FAILURE) {
236 		obj_mgr_err("PSOC component object free failed");
237 		/* Ideally should not happen
238 		 * This leads to memleak, BUG_ON to find which component
239 		 * delete notification failed and fix it.
240 		 */
241 		QDF_BUG(0);
242 		return QDF_STATUS_E_FAILURE;
243 	}
244 	/* Deletion is in progress */
245 	if (obj_status == QDF_STATUS_COMP_ASYNC) {
246 		psoc->obj_state = WLAN_OBJ_STATE_PARTIALLY_DELETED;
247 		return QDF_STATUS_COMP_ASYNC;
248 	}
249 
250 	/* Free psoc object */
251 	return wlan_objmgr_psoc_obj_free(psoc);
252 }
253 
254 
wlan_objmgr_psoc_obj_delete(struct wlan_objmgr_psoc * psoc)255 QDF_STATUS wlan_objmgr_psoc_obj_delete(struct wlan_objmgr_psoc *psoc)
256 {
257 	uint8_t print_idx;
258 
259 	if (!psoc) {
260 		obj_mgr_err("psoc is NULL");
261 		return QDF_STATUS_E_FAILURE;
262 	}
263 
264 	obj_mgr_info("Logically deleting psoc %d", psoc->soc_objmgr.psoc_id);
265 
266 	print_idx = qdf_get_pidx();
267 	wlan_objmgr_print_ref_ids(psoc->soc_objmgr.ref_id_dbg,
268 				  QDF_TRACE_LEVEL_DEBUG);
269 	/*
270 	 * Update PSOC object state to LOGICALLY DELETED
271 	 * It prevents further access of this object
272 	 */
273 	wlan_psoc_obj_lock(psoc);
274 	psoc->obj_state = WLAN_OBJ_STATE_LOGICALLY_DELETED;
275 	wlan_psoc_obj_unlock(psoc);
276 	wlan_objmgr_notify_log_delete(psoc, WLAN_PSOC_OP);
277 	wlan_objmgr_psoc_release_ref(psoc, WLAN_OBJMGR_ID);
278 
279 	return QDF_STATUS_SUCCESS;
280 }
281 qdf_export_symbol(wlan_objmgr_psoc_obj_delete);
282 
wlan_objmgr_psoc_component_obj_attach(struct wlan_objmgr_psoc * psoc,enum wlan_umac_comp_id id,void * comp_priv_obj,QDF_STATUS status)283 QDF_STATUS wlan_objmgr_psoc_component_obj_attach(
284 		struct wlan_objmgr_psoc *psoc,
285 		enum wlan_umac_comp_id id,
286 		void *comp_priv_obj,
287 		QDF_STATUS status)
288 {
289 	wlan_objmgr_psoc_status_handler stat_handler;
290 	void *arg = NULL;
291 	QDF_STATUS obj_status;
292 	uint8_t i;
293 
294 	/* component id is invalid */
295 	if (id >= WLAN_UMAC_MAX_COMPONENTS)
296 		return QDF_STATUS_MAXCOMP_FAIL;
297 
298 	wlan_psoc_obj_lock(psoc);
299 	/* If there is a valid entry, return failure */
300 	if (psoc->soc_comp_priv_obj[id]) {
301 		wlan_psoc_obj_unlock(psoc);
302 		return QDF_STATUS_E_FAILURE;
303 	}
304 	/* Save component's pointer and status */
305 	psoc->soc_comp_priv_obj[id] = comp_priv_obj;
306 	psoc->obj_status[id] = status;
307 
308 	wlan_psoc_obj_unlock(psoc);
309 
310 	if (psoc->obj_state != WLAN_OBJ_STATE_PARTIALLY_CREATED)
311 		return QDF_STATUS_SUCCESS;
312 	/* If PSOC object status is partially created means, this API is
313 	 * invoked with different context, this block should be executed for
314 	 * async components only
315 	 */
316 	/* Derive status */
317 	obj_status = wlan_objmgr_psoc_object_status(psoc);
318 	/* STATUS_SUCCESS means, object is CREATED */
319 	if (obj_status == QDF_STATUS_SUCCESS)
320 		psoc->obj_state = WLAN_OBJ_STATE_CREATED;
321 	/* update state as CREATION failed, caller has to delete the
322 	 * PSOC object
323 	 */
324 	else if (obj_status == QDF_STATUS_E_FAILURE)
325 		psoc->obj_state = WLAN_OBJ_STATE_CREATION_FAILED;
326 
327 	/* Notify components about the CREATION success/failure */
328 	if ((obj_status == QDF_STATUS_SUCCESS) ||
329 	    (obj_status == QDF_STATUS_E_FAILURE)) {
330 		/* notify object status */
331 		for (i = 0; i < WLAN_UMAC_MAX_COMPONENTS; i++) {
332 			stat_handler = g_umac_glb_obj->psoc_status_handler[i];
333 			arg = g_umac_glb_obj->psoc_status_handler_arg[i];
334 			if (stat_handler)
335 				stat_handler(psoc, arg, obj_status);
336 		}
337 	}
338 
339 	return QDF_STATUS_SUCCESS;
340 }
341 qdf_export_symbol(wlan_objmgr_psoc_component_obj_attach);
342 
wlan_objmgr_psoc_component_obj_detach(struct wlan_objmgr_psoc * psoc,enum wlan_umac_comp_id id,void * comp_priv_obj)343 QDF_STATUS wlan_objmgr_psoc_component_obj_detach(
344 		struct wlan_objmgr_psoc *psoc,
345 		enum wlan_umac_comp_id id,
346 		void *comp_priv_obj)
347 {
348 	QDF_STATUS obj_status;
349 
350 	/* component id is invalid */
351 	if (id >= WLAN_UMAC_MAX_COMPONENTS)
352 		return QDF_STATUS_MAXCOMP_FAIL;
353 
354 	wlan_psoc_obj_lock(psoc);
355 	/* If there is a valid entry, return failure */
356 	if (psoc->soc_comp_priv_obj[id] != comp_priv_obj) {
357 		psoc->obj_status[id] = QDF_STATUS_E_FAILURE;
358 		wlan_psoc_obj_unlock(psoc);
359 		return QDF_STATUS_E_FAILURE;
360 	}
361 	/* Reset pointers to NULL, update the status*/
362 	psoc->soc_comp_priv_obj[id] = NULL;
363 	psoc->obj_status[id] = QDF_STATUS_SUCCESS;
364 	wlan_psoc_obj_unlock(psoc);
365 
366 	/* If PSOC object status is partially created means, this API is
367 	 * invoked with different context, this block should be executed for
368 	 * async components only
369 	 */
370 	if ((psoc->obj_state == WLAN_OBJ_STATE_PARTIALLY_DELETED) ||
371 	    (psoc->obj_state == WLAN_OBJ_STATE_COMP_DEL_PROGRESS)) {
372 		/* Derive object status */
373 		obj_status = wlan_objmgr_psoc_object_status(psoc);
374 		if (obj_status == QDF_STATUS_SUCCESS) {
375 			/* Update the status as Deleted, if full object
376 			 * deletion is in progress
377 			 */
378 			if (psoc->obj_state == WLAN_OBJ_STATE_PARTIALLY_DELETED)
379 				psoc->obj_state = WLAN_OBJ_STATE_DELETED;
380 
381 			/* Move to creation state, since this component
382 			 * deletion alone requested
383 			 */
384 			if (psoc->obj_state == WLAN_OBJ_STATE_COMP_DEL_PROGRESS)
385 				psoc->obj_state = WLAN_OBJ_STATE_CREATED;
386 		/* Object status is failure */
387 		} else if (obj_status == QDF_STATUS_E_FAILURE) {
388 			/* Update the status as Deletion failed, if full object
389 			 * deletion is in progress
390 			 */
391 			if (psoc->obj_state == WLAN_OBJ_STATE_PARTIALLY_DELETED)
392 				psoc->obj_state =
393 					WLAN_OBJ_STATE_DELETION_FAILED;
394 
395 			/* Move to creation state, since this component
396 			 * deletion alone requested (do not block other
397 			 * components)
398 			 */
399 			if (psoc->obj_state == WLAN_OBJ_STATE_COMP_DEL_PROGRESS)
400 				psoc->obj_state = WLAN_OBJ_STATE_CREATED;
401 		}
402 
403 		/* Delete psoc object */
404 		if ((obj_status == QDF_STATUS_SUCCESS)  &&
405 		    (psoc->obj_state == WLAN_OBJ_STATE_DELETED)) {
406 			/* Free psoc object */
407 			return wlan_objmgr_psoc_obj_free(psoc);
408 		}
409 	}
410 
411 	return QDF_STATUS_SUCCESS;
412 }
413 qdf_export_symbol(wlan_objmgr_psoc_component_obj_detach);
414 
wlan_objmgr_iterate_obj_list(struct wlan_objmgr_psoc * psoc,enum wlan_objmgr_obj_type obj_type,wlan_objmgr_op_handler handler,void * arg,uint8_t lock_free_op,wlan_objmgr_ref_dbgid dbg_id)415 QDF_STATUS wlan_objmgr_iterate_obj_list(
416 		struct wlan_objmgr_psoc *psoc,
417 		enum wlan_objmgr_obj_type obj_type,
418 		wlan_objmgr_op_handler handler,
419 		void *arg, uint8_t lock_free_op,
420 		wlan_objmgr_ref_dbgid dbg_id)
421 {
422 	uint16_t obj_id;
423 	uint8_t i;
424 	struct wlan_objmgr_psoc_objmgr *objmgr = &psoc->soc_objmgr;
425 	struct wlan_peer_list *peer_list;
426 	struct wlan_objmgr_pdev *pdev;
427 	struct wlan_objmgr_vdev *vdev;
428 	struct wlan_objmgr_peer *peer;
429 	struct wlan_objmgr_peer *peer_next;
430 	uint16_t max_vdev_cnt;
431 
432 	switch (obj_type) {
433 	case WLAN_PDEV_OP:
434 		/* Iterate through PDEV list, invoke handler for each pdev */
435 		for (obj_id = 0; obj_id < WLAN_UMAC_MAX_PDEVS; obj_id++) {
436 			pdev = wlan_objmgr_get_pdev_by_id(psoc, obj_id, dbg_id);
437 			if (pdev) {
438 				handler(psoc, (void *)pdev, arg);
439 				wlan_objmgr_pdev_release_ref(pdev, dbg_id);
440 			}
441 		}
442 		break;
443 	case WLAN_VDEV_OP:
444 		/* Iterate through VDEV list, invoke handler for each vdev */
445 		max_vdev_cnt = wlan_psoc_get_max_vdev_count(psoc);
446 		for (obj_id = 0; obj_id < max_vdev_cnt; obj_id++) {
447 			vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc,
448 						obj_id, dbg_id);
449 			if (vdev) {
450 				handler(psoc, vdev, arg);
451 				wlan_objmgr_vdev_release_ref(vdev, dbg_id);
452 			}
453 		}
454 		break;
455 	case WLAN_PEER_OP:
456 		/* Iterate through PEER list, invoke handler for each peer */
457 		peer_list = &objmgr->peer_list;
458 		/* Since peer list has sublist, iterate through sublists */
459 		for (i = 0; i < WLAN_PEER_HASHSIZE; i++) {
460 			peer = wlan_psoc_peer_list_peek_active_head(peer_list,
461 					i, dbg_id);
462 			while (peer) {
463 				handler(psoc, (void *)peer, arg);
464 				/* Get next peer */
465 				peer_next =
466 					wlan_peer_get_next_active_peer_of_psoc(
467 						peer_list, i, peer, dbg_id);
468 				wlan_objmgr_peer_release_ref(peer,  dbg_id);
469 				peer = peer_next;
470 			}
471 		}
472 		break;
473 	default:
474 		break;
475 	}
476 
477 	return QDF_STATUS_SUCCESS;
478 }
479 qdf_export_symbol(wlan_objmgr_iterate_obj_list);
480 
wlan_objmgr_iterate_obj_list_all(struct wlan_objmgr_psoc * psoc,enum wlan_objmgr_obj_type obj_type,wlan_objmgr_op_handler handler,void * arg,uint8_t lock_free_op,wlan_objmgr_ref_dbgid dbg_id)481 QDF_STATUS wlan_objmgr_iterate_obj_list_all(
482 		struct wlan_objmgr_psoc *psoc,
483 		enum wlan_objmgr_obj_type obj_type,
484 		wlan_objmgr_op_handler handler,
485 		void *arg, uint8_t lock_free_op,
486 		wlan_objmgr_ref_dbgid dbg_id)
487 {
488 	uint16_t obj_id;
489 	uint8_t i;
490 	struct wlan_objmgr_psoc_objmgr *objmgr = &psoc->soc_objmgr;
491 	struct wlan_peer_list *peer_list;
492 	struct wlan_objmgr_pdev *pdev;
493 	struct wlan_objmgr_vdev *vdev;
494 	struct wlan_objmgr_peer *peer;
495 	struct wlan_objmgr_peer *peer_next;
496 	uint16_t max_vdev_cnt;
497 
498 	/* If caller requests for lock free operation, do not acquire,
499 	 * handler will handle the synchronization
500 	 */
501 
502 	switch (obj_type) {
503 	case WLAN_PDEV_OP:
504 		/* Iterate through PDEV list, invoke handler for each pdev */
505 		for (obj_id = 0; obj_id < WLAN_UMAC_MAX_PDEVS; obj_id++) {
506 			pdev = wlan_objmgr_get_pdev_by_id_no_state(psoc,
507 							obj_id, dbg_id);
508 			if (pdev) {
509 				handler(psoc, (void *)pdev, arg);
510 				wlan_objmgr_pdev_release_ref(pdev, dbg_id);
511 			}
512 		}
513 		break;
514 	case WLAN_VDEV_OP:
515 		/* Iterate through VDEV list, invoke handler for each vdev */
516 		max_vdev_cnt = wlan_psoc_get_max_vdev_count(psoc);
517 		for (obj_id = 0; obj_id < max_vdev_cnt; obj_id++) {
518 			vdev = wlan_objmgr_get_vdev_by_id_from_psoc_no_state(
519 					psoc, obj_id, dbg_id);
520 			if (vdev) {
521 				handler(psoc, vdev, arg);
522 				wlan_objmgr_vdev_release_ref(vdev, dbg_id);
523 			}
524 		}
525 		break;
526 	case WLAN_PEER_OP:
527 		/* Iterate through PEER list, invoke handler for each peer */
528 		peer_list = &objmgr->peer_list;
529 		/* Since peer list has sublist, iterate through sublists */
530 		for (i = 0; i < WLAN_PEER_HASHSIZE; i++) {
531 			peer = wlan_psoc_peer_list_peek_head_ref(peer_list, i,
532 									dbg_id);
533 
534 			while (peer) {
535 				handler(psoc, (void *)peer, arg);
536 				/* Get next peer */
537 				peer_next = wlan_peer_get_next_peer_of_psoc_ref(
538 								peer_list, i,
539 								peer, dbg_id);
540 				wlan_objmgr_peer_release_ref(peer, dbg_id);
541 				peer = peer_next;
542 			}
543 		}
544 		break;
545 	default:
546 		break;
547 	}
548 
549 	return QDF_STATUS_SUCCESS;
550 }
551 qdf_export_symbol(wlan_objmgr_iterate_obj_list_all);
552 
553 /**
554  * wlan_objmgr_iterate_obj_list_all_noref() - iterate through all psoc objects
555  *                                            without taking ref
556  * @psoc: PSOC object
557  * @obj_type: PDEV_OP/VDEV_OP/PEER_OP
558  * @handler: the handler will be called for each object of requested type
559  *            the handler should be implemented to perform required operation
560  * @arg:     arguments passed by caller
561  *
562  * API to be used for performing the operations on all PDEV/VDEV/PEER objects
563  * of psoc with lock protected
564  *
565  * Return: SUCCESS/FAILURE
566  */
wlan_objmgr_iterate_obj_list_all_noref(struct wlan_objmgr_psoc * psoc,enum wlan_objmgr_obj_type obj_type,wlan_objmgr_op_handler handler,void * arg)567 static QDF_STATUS wlan_objmgr_iterate_obj_list_all_noref(
568 		struct wlan_objmgr_psoc *psoc,
569 		enum wlan_objmgr_obj_type obj_type,
570 		wlan_objmgr_op_handler handler,
571 		void *arg)
572 {
573 	uint16_t obj_id;
574 	uint8_t i;
575 	struct wlan_objmgr_psoc_objmgr *objmgr = &psoc->soc_objmgr;
576 	struct wlan_peer_list *peer_list;
577 	qdf_list_t *obj_list;
578 	struct wlan_objmgr_pdev *pdev;
579 	struct wlan_objmgr_vdev *vdev;
580 	struct wlan_objmgr_peer *peer;
581 	struct wlan_objmgr_peer *peer_next;
582 	uint16_t max_vdev_cnt;
583 
584 	/* If caller requests for lock free operation, do not acquire,
585 	 * handler will handle the synchronization
586 	 */
587 	wlan_psoc_obj_lock(psoc);
588 
589 	switch (obj_type) {
590 	case WLAN_PDEV_OP:
591 		/* Iterate through PDEV list, invoke handler for each pdev */
592 		for (obj_id = 0; obj_id < WLAN_UMAC_MAX_PDEVS; obj_id++) {
593 			pdev = objmgr->wlan_pdev_list[obj_id];
594 			if (pdev)
595 				handler(psoc, (void *)pdev, arg);
596 		}
597 		break;
598 	case WLAN_VDEV_OP:
599 		/* Iterate through VDEV list, invoke handler for each vdev */
600 		max_vdev_cnt = wlan_psoc_get_max_vdev_count(psoc);
601 		for (obj_id = 0; obj_id < max_vdev_cnt; obj_id++) {
602 			vdev = objmgr->wlan_vdev_list[obj_id];
603 			if (vdev)
604 				handler(psoc, vdev, arg);
605 		}
606 		break;
607 	case WLAN_PEER_OP:
608 		/* Iterate through PEER list, invoke handler for each peer */
609 		peer_list = &objmgr->peer_list;
610 		/* psoc lock should be taken before list lock */
611 		qdf_spin_lock_bh(&peer_list->peer_list_lock);
612 		/* Since peer list has sublist, iterate through sublists */
613 		for (i = 0; i < WLAN_PEER_HASHSIZE; i++) {
614 			obj_list = &peer_list->peer_hash[i];
615 			peer = wlan_psoc_peer_list_peek_head(obj_list);
616 			while (peer) {
617 				/* Get next peer */
618 				peer_next = wlan_peer_get_next_peer_of_psoc(
619 								obj_list, peer);
620 				handler(psoc, (void *)peer, arg);
621 				peer = peer_next;
622 			}
623 		}
624 		qdf_spin_unlock_bh(&peer_list->peer_list_lock);
625 		break;
626 	default:
627 		break;
628 	}
629 	wlan_psoc_obj_unlock(psoc);
630 
631 	return QDF_STATUS_SUCCESS;
632 }
633 
wlan_objmgr_psoc_peer_delete(struct wlan_objmgr_psoc * psoc,void * obj,void * args)634 static void wlan_objmgr_psoc_peer_delete(struct wlan_objmgr_psoc *psoc,
635 					 void *obj, void *args)
636 {
637 	struct wlan_objmgr_peer *peer = (struct wlan_objmgr_peer *)obj;
638 
639 	wlan_objmgr_peer_obj_delete(peer);
640 }
641 
wlan_objmgr_psoc_vdev_delete(struct wlan_objmgr_psoc * psoc,void * obj,void * args)642 static void wlan_objmgr_psoc_vdev_delete(struct wlan_objmgr_psoc *psoc,
643 					 void *obj, void *args)
644 {
645 	struct wlan_objmgr_vdev *vdev = (struct wlan_objmgr_vdev *)obj;
646 
647 	wlan_objmgr_vdev_obj_delete(vdev);
648 }
649 
wlan_objmgr_psoc_pdev_delete(struct wlan_objmgr_psoc * psoc,void * obj,void * args)650 static void wlan_objmgr_psoc_pdev_delete(struct wlan_objmgr_psoc *psoc,
651 					 void *obj, void *args)
652 {
653 	struct wlan_objmgr_pdev *pdev = (struct wlan_objmgr_pdev *)obj;
654 
655 	wlan_objmgr_pdev_obj_delete(pdev);
656 }
657 
wlan_objmgr_free_all_objects_per_psoc(struct wlan_objmgr_psoc * psoc)658 QDF_STATUS wlan_objmgr_free_all_objects_per_psoc(
659 		struct wlan_objmgr_psoc *psoc)
660 {
661 	/* Free all peers */
662 	wlan_objmgr_iterate_obj_list(psoc, WLAN_PEER_OP,
663 				     wlan_objmgr_psoc_peer_delete, NULL, 1,
664 				     WLAN_OBJMGR_ID);
665 	/* Free all vdevs */
666 	wlan_objmgr_iterate_obj_list(psoc, WLAN_VDEV_OP,
667 				     wlan_objmgr_psoc_vdev_delete, NULL, 1,
668 				     WLAN_OBJMGR_ID);
669 	/* Free all PDEVs */
670 	wlan_objmgr_iterate_obj_list(psoc, WLAN_PDEV_OP,
671 				     wlan_objmgr_psoc_pdev_delete, NULL, 1,
672 				     WLAN_OBJMGR_ID);
673 
674 	return QDF_STATUS_SUCCESS;
675 }
676 
wlan_objmgr_trigger_psoc_comp_priv_object_creation(struct wlan_objmgr_psoc * psoc,enum wlan_umac_comp_id id)677 QDF_STATUS wlan_objmgr_trigger_psoc_comp_priv_object_creation(
678 		struct wlan_objmgr_psoc *psoc,
679 		enum wlan_umac_comp_id id)
680 {
681 	wlan_objmgr_psoc_create_handler handler;
682 	void *arg;
683 	QDF_STATUS obj_status = QDF_STATUS_SUCCESS;
684 
685 	/* Component id is invalid */
686 	if (id >= WLAN_UMAC_MAX_COMPONENTS)
687 		return QDF_STATUS_MAXCOMP_FAIL;
688 
689 	wlan_psoc_obj_lock(psoc);
690 	/* If component object is already created, delete old
691 	 * component object, then invoke creation
692 	 */
693 	if (psoc->soc_comp_priv_obj[id]) {
694 		wlan_psoc_obj_unlock(psoc);
695 		return QDF_STATUS_E_FAILURE;
696 	}
697 	wlan_psoc_obj_unlock(psoc);
698 	/* Invoke registered create handlers */
699 	handler = g_umac_glb_obj->psoc_create_handler[id];
700 	arg = g_umac_glb_obj->psoc_create_handler_arg[id];
701 	if (handler)
702 		psoc->obj_status[id] = handler(psoc, arg);
703 	else
704 		return QDF_STATUS_E_FAILURE;
705 
706 	/* If object status is created, then only handle this object status */
707 	if (psoc->obj_state == WLAN_OBJ_STATE_CREATED) {
708 		/* Derive object status */
709 		obj_status = wlan_objmgr_psoc_object_status(psoc);
710 		/* Move PSOC object state to Partially created state */
711 		if (obj_status == QDF_STATUS_COMP_ASYNC) {
712 			/*TODO atomic */
713 			psoc->obj_state = WLAN_OBJ_STATE_PARTIALLY_CREATED;
714 		}
715 	}
716 
717 	return obj_status;
718 }
719 
wlan_objmgr_trigger_psoc_comp_priv_object_deletion(struct wlan_objmgr_psoc * psoc,enum wlan_umac_comp_id id)720 QDF_STATUS wlan_objmgr_trigger_psoc_comp_priv_object_deletion(
721 		struct wlan_objmgr_psoc *psoc,
722 		enum wlan_umac_comp_id id)
723 {
724 	wlan_objmgr_psoc_destroy_handler handler;
725 	void *arg;
726 	QDF_STATUS obj_status = QDF_STATUS_SUCCESS;
727 
728 	/* component id is invalid */
729 	if (id >= WLAN_UMAC_MAX_COMPONENTS)
730 		return QDF_STATUS_MAXCOMP_FAIL;
731 
732 	wlan_psoc_obj_lock(psoc);
733 	/* Component object was never created, invalid operation */
734 	if (!psoc->soc_comp_priv_obj[id]) {
735 		wlan_psoc_obj_unlock(psoc);
736 		return QDF_STATUS_E_FAILURE;
737 	}
738 	wlan_psoc_obj_unlock(psoc);
739 	/* Invoke registered create handlers */
740 	handler = g_umac_glb_obj->psoc_destroy_handler[id];
741 	arg = g_umac_glb_obj->psoc_destroy_handler_arg[id];
742 	if (handler)
743 		psoc->obj_status[id] = handler(psoc, arg);
744 	else
745 		return QDF_STATUS_E_FAILURE;
746 
747 	/* If object status is created, then only handle this object status */
748 	if (psoc->obj_state == WLAN_OBJ_STATE_CREATED) {
749 		obj_status = wlan_objmgr_psoc_object_status(psoc);
750 			/* move object state to DEL progress */
751 		if (obj_status == QDF_STATUS_COMP_ASYNC)
752 			psoc->obj_state = WLAN_OBJ_STATE_COMP_DEL_PROGRESS;
753 	}
754 
755 	return obj_status;
756 }
757 
758 /* Util APIs */
759 
wlan_objmgr_psoc_pdev_attach(struct wlan_objmgr_psoc * psoc,struct wlan_objmgr_pdev * pdev)760 QDF_STATUS wlan_objmgr_psoc_pdev_attach(struct wlan_objmgr_psoc *psoc,
761 					struct wlan_objmgr_pdev *pdev)
762 {
763 	struct wlan_objmgr_psoc_objmgr *objmgr;
764 	uint8_t id = 0;
765 	QDF_STATUS status;
766 
767 	wlan_psoc_obj_lock(psoc);
768 	objmgr = &psoc->soc_objmgr;
769 	/*
770 	 * Derive pdev id from pdev map
771 	 * First free pdev id is assigned
772 	 */
773 	while ((id < WLAN_UMAC_MAX_PDEVS) &&
774 			(objmgr->wlan_pdev_id_map & (1<<id)))
775 		id++;
776 
777 	if (id == WLAN_UMAC_MAX_PDEVS) {
778 		status = QDF_STATUS_E_FAILURE;
779 	} else {
780 		/* Update the map for reserving the id */
781 		objmgr->wlan_pdev_id_map |= (1<<id);
782 		/* store pdev in pdev list */
783 		objmgr->wlan_pdev_list[id] = pdev;
784 		/* Increment pdev count */
785 		objmgr->wlan_pdev_count++;
786 		/* save pdev id */
787 		pdev->pdev_objmgr.wlan_pdev_id = id;
788 		status = QDF_STATUS_SUCCESS;
789 		/* Inrement psoc ref count to block its free before pdev */
790 		wlan_objmgr_psoc_get_ref(psoc, WLAN_OBJMGR_ID);
791 	}
792 	wlan_psoc_obj_unlock(psoc);
793 
794 	return status;
795 }
796 
wlan_objmgr_psoc_pdev_detach(struct wlan_objmgr_psoc * psoc,struct wlan_objmgr_pdev * pdev)797 QDF_STATUS wlan_objmgr_psoc_pdev_detach(struct wlan_objmgr_psoc *psoc,
798 						struct wlan_objmgr_pdev *pdev)
799 {
800 	struct wlan_objmgr_psoc_objmgr *objmgr;
801 	uint8_t id;
802 
803 	id = pdev->pdev_objmgr.wlan_pdev_id;
804 	/* If id is invalid, return */
805 	if (id >= WLAN_UMAC_MAX_PDEVS)
806 		return QDF_STATUS_E_FAILURE;
807 
808 	wlan_psoc_obj_lock(psoc);
809 	objmgr = &psoc->soc_objmgr;
810 	/* Free pdev id slot */
811 	objmgr->wlan_pdev_id_map &= ~(1<<id);
812 	objmgr->wlan_pdev_list[id] = NULL;
813 	objmgr->wlan_pdev_count--;
814 	pdev->pdev_objmgr.wlan_pdev_id = 0xff;
815 	wlan_psoc_obj_unlock(psoc);
816 	/* Release ref count of psoc */
817 	wlan_objmgr_psoc_release_ref(psoc, WLAN_OBJMGR_ID);
818 
819 	return QDF_STATUS_SUCCESS;
820 }
821 
wlan_objmgr_get_pdev_by_id(struct wlan_objmgr_psoc * psoc,uint8_t id,wlan_objmgr_ref_dbgid dbg_id)822 struct wlan_objmgr_pdev *wlan_objmgr_get_pdev_by_id(
823 		struct wlan_objmgr_psoc *psoc, uint8_t id,
824 		wlan_objmgr_ref_dbgid dbg_id)
825 {
826 	struct wlan_objmgr_psoc_objmgr *objmgr;
827 	struct wlan_objmgr_pdev *pdev = NULL;
828 
829 	/* If id is invalid, return */
830 	if (id >= WLAN_UMAC_MAX_PDEVS)
831 		return NULL;
832 
833 	wlan_psoc_obj_lock(psoc);
834 	objmgr = &psoc->soc_objmgr;
835 	/* get pdev from pdev list */
836 	pdev = objmgr->wlan_pdev_list[id];
837 	/* Do not return object, if it is not CREATED state */
838 	if (pdev) {
839 		if (wlan_objmgr_pdev_try_get_ref(pdev, dbg_id) !=
840 							QDF_STATUS_SUCCESS)
841 			pdev = NULL;
842 	}
843 
844 	wlan_psoc_obj_unlock(psoc);
845 
846 	return pdev;
847 }
848 qdf_export_symbol(wlan_objmgr_get_pdev_by_id);
849 
wlan_objmgr_get_pdev_by_id_no_state(struct wlan_objmgr_psoc * psoc,uint8_t id,wlan_objmgr_ref_dbgid dbg_id)850 struct wlan_objmgr_pdev *wlan_objmgr_get_pdev_by_id_no_state(
851 		struct wlan_objmgr_psoc *psoc, uint8_t id,
852 		wlan_objmgr_ref_dbgid dbg_id)
853 {
854 	struct wlan_objmgr_psoc_objmgr *objmgr;
855 	struct wlan_objmgr_pdev *pdev = NULL;
856 
857 	/* If id is invalid, return */
858 	if (id >= WLAN_UMAC_MAX_PDEVS)
859 		return NULL;
860 
861 	wlan_psoc_obj_lock(psoc);
862 	objmgr = &psoc->soc_objmgr;
863 	/* get pdev from pdev list */
864 	pdev = objmgr->wlan_pdev_list[id];
865 	/* Do not return object, if it is not CREATED state */
866 	if (pdev)
867 		wlan_objmgr_pdev_get_ref(pdev, dbg_id);
868 
869 	wlan_psoc_obj_unlock(psoc);
870 
871 	return pdev;
872 }
wlan_objmgr_psoc_vdev_attach(struct wlan_objmgr_psoc * psoc,struct wlan_objmgr_vdev * vdev)873 QDF_STATUS wlan_objmgr_psoc_vdev_attach(struct wlan_objmgr_psoc *psoc,
874 					struct wlan_objmgr_vdev *vdev)
875 {
876 	struct wlan_objmgr_psoc_objmgr *objmgr;
877 	uint8_t id = 0;
878 	QDF_STATUS status;
879 
880 	wlan_psoc_obj_lock(psoc);
881 	objmgr = &psoc->soc_objmgr;
882 	/* Find first free vdev id */
883 	while ((id < objmgr->max_vdev_count)) {
884 		if (qdf_test_bit(id, objmgr->wlan_vdev_id_map)) {
885 			id++;
886 			continue;
887 		}
888 		break;
889 	}
890 
891 	/* If no free slot, return failure */
892 	if (id < objmgr->max_vdev_count) {
893 		/* set free vdev id index */
894 		qdf_set_bit(id, objmgr->wlan_vdev_id_map);
895 		/* store vdev pointer in vdev list */
896 		objmgr->wlan_vdev_list[id] = vdev;
897 		/* increment vdev counter */
898 		objmgr->wlan_vdev_count++;
899 		/* save vdev id */
900 		vdev->vdev_objmgr.vdev_id = id;
901 		status = QDF_STATUS_SUCCESS;
902 	} else {
903 		status = QDF_STATUS_E_FAILURE;
904 	}
905 	wlan_psoc_obj_unlock(psoc);
906 
907 	return status;
908 }
909 
wlan_objmgr_psoc_vdev_detach(struct wlan_objmgr_psoc * psoc,struct wlan_objmgr_vdev * vdev)910 QDF_STATUS wlan_objmgr_psoc_vdev_detach(struct wlan_objmgr_psoc *psoc,
911 					struct wlan_objmgr_vdev *vdev)
912 {
913 	struct wlan_objmgr_psoc_objmgr *objmgr;
914 	uint8_t id = 0;
915 
916 	id = vdev->vdev_objmgr.vdev_id;
917 	/* Invalid vdev id */
918 	if (id >= wlan_psoc_get_max_vdev_count(psoc))
919 		return QDF_STATUS_E_FAILURE;
920 
921 	wlan_psoc_obj_lock(psoc);
922 	objmgr = &psoc->soc_objmgr;
923 	/* unset bit, to free the slot */
924 	qdf_clear_bit(id, objmgr->wlan_vdev_id_map);
925 	/* reset VDEV pointer to NULL in VDEV list array */
926 	objmgr->wlan_vdev_list[id] = NULL;
927 	/* decrement vdev count */
928 	objmgr->wlan_vdev_count--;
929 	vdev->vdev_objmgr.vdev_id = 0xff;
930 	wlan_psoc_obj_unlock(psoc);
931 
932 	return QDF_STATUS_SUCCESS;
933 }
934 
935 #ifdef WLAN_OBJMGR_REF_ID_TRACE
wlan_objmgr_get_vdev_by_id_from_psoc_debug(struct wlan_objmgr_psoc * psoc,uint8_t vdev_id,wlan_objmgr_ref_dbgid dbg_id,const char * func,int line)936 struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_id_from_psoc_debug(
937 			struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
938 			wlan_objmgr_ref_dbgid dbg_id,
939 			const char *func, int line)
940 {
941 	struct wlan_objmgr_vdev *vdev;
942 
943 	/* if PSOC is NULL, return */
944 	if (!psoc)
945 		return NULL;
946 	/* vdev id is invalid */
947 	if (vdev_id >= wlan_psoc_get_max_vdev_count(psoc))
948 		return NULL;
949 
950 	wlan_psoc_obj_lock(psoc);
951 	/* retrieve vdev pointer from vdev list */
952 	vdev = psoc->soc_objmgr.wlan_vdev_list[vdev_id];
953 	if (vdev) {
954 		if (wlan_objmgr_vdev_try_get_ref_debug(vdev, dbg_id,
955 						       func, line) !=
956 			QDF_STATUS_SUCCESS)
957 			vdev = NULL;
958 	}
959 	wlan_psoc_obj_unlock(psoc);
960 
961 	return vdev;
962 }
963 
964 qdf_export_symbol(wlan_objmgr_get_vdev_by_id_from_psoc_debug);
965 #else
wlan_objmgr_get_vdev_by_id_from_psoc(struct wlan_objmgr_psoc * psoc,uint8_t vdev_id,wlan_objmgr_ref_dbgid dbg_id)966 struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_id_from_psoc(
967 			struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
968 			wlan_objmgr_ref_dbgid dbg_id)
969 {
970 	struct wlan_objmgr_vdev *vdev;
971 
972 	/* if PSOC is NULL, return */
973 	if (!psoc)
974 		return NULL;
975 	/* vdev id is invalid */
976 	if (vdev_id >= wlan_psoc_get_max_vdev_count(psoc))
977 		return NULL;
978 
979 	wlan_psoc_obj_lock(psoc);
980 	/* retrieve vdev pointer from vdev list */
981 	vdev = psoc->soc_objmgr.wlan_vdev_list[vdev_id];
982 	if (vdev) {
983 		if (wlan_objmgr_vdev_try_get_ref(vdev, dbg_id) !=
984 							QDF_STATUS_SUCCESS)
985 			vdev = NULL;
986 	}
987 	wlan_psoc_obj_unlock(psoc);
988 
989 	return vdev;
990 }
991 
992 qdf_export_symbol(wlan_objmgr_get_vdev_by_id_from_psoc);
993 #endif
994 
995 #ifdef WLAN_OBJMGR_REF_ID_TRACE
wlan_objmgr_get_vdev_by_id_from_psoc_no_state_debug(struct wlan_objmgr_psoc * psoc,uint8_t vdev_id,wlan_objmgr_ref_dbgid dbg_id,const char * func,int line)996 struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_id_from_psoc_no_state_debug(
997 			struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
998 			wlan_objmgr_ref_dbgid dbg_id,
999 			const char *func, int line)
1000 {
1001 	struct wlan_objmgr_vdev *vdev;
1002 
1003 	/* if PSOC is NULL, return */
1004 	if (!psoc)
1005 		return NULL;
1006 	/* vdev id is invalid */
1007 	if (vdev_id >= wlan_psoc_get_max_vdev_count(psoc))
1008 		return NULL;
1009 
1010 	wlan_psoc_obj_lock(psoc);
1011 	/* retrieve vdev pointer from vdev list */
1012 	vdev = psoc->soc_objmgr.wlan_vdev_list[vdev_id];
1013 	if (vdev)
1014 		wlan_objmgr_vdev_get_ref_debug(vdev, dbg_id, func, line);
1015 
1016 	wlan_psoc_obj_unlock(psoc);
1017 
1018 	return vdev;
1019 }
1020 
1021 qdf_export_symbol(wlan_objmgr_get_vdev_by_id_from_psoc_no_state_debug);
1022 #else
wlan_objmgr_get_vdev_by_id_from_psoc_no_state(struct wlan_objmgr_psoc * psoc,uint8_t vdev_id,wlan_objmgr_ref_dbgid dbg_id)1023 struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_id_from_psoc_no_state(
1024 			struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
1025 			wlan_objmgr_ref_dbgid dbg_id)
1026 {
1027 	struct wlan_objmgr_vdev *vdev;
1028 
1029 	/* if PSOC is NULL, return */
1030 	if (!psoc)
1031 		return NULL;
1032 	/* vdev id is invalid */
1033 	if (vdev_id >= wlan_psoc_get_max_vdev_count(psoc))
1034 		return NULL;
1035 
1036 	wlan_psoc_obj_lock(psoc);
1037 	/* retrieve vdev pointer from vdev list */
1038 	vdev = psoc->soc_objmgr.wlan_vdev_list[vdev_id];
1039 	if (vdev)
1040 		wlan_objmgr_vdev_get_ref(vdev, dbg_id);
1041 
1042 	wlan_psoc_obj_unlock(psoc);
1043 
1044 	return vdev;
1045 }
1046 
1047 qdf_export_symbol(wlan_objmgr_get_vdev_by_id_from_psoc_no_state);
1048 #endif
1049 
1050 #ifdef WLAN_OBJMGR_REF_ID_TRACE
wlan_objmgr_get_vdev_by_id_from_psoc_not_log_del_debug(struct wlan_objmgr_psoc * psoc,uint8_t vdev_id,wlan_objmgr_ref_dbgid dbg_id,const char * func,int line)1051 struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_id_from_psoc_not_log_del_debug(
1052 			struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
1053 			wlan_objmgr_ref_dbgid dbg_id,
1054 			const char *func, int line)
1055 {
1056 	struct wlan_objmgr_vdev *vdev;
1057 
1058 	/* if PSOC is NULL, return */
1059 	if (!psoc)
1060 		return NULL;
1061 	/* vdev id is invalid */
1062 	if (vdev_id >= wlan_psoc_get_max_vdev_count(psoc))
1063 		return NULL;
1064 
1065 	wlan_psoc_obj_lock(psoc);
1066 	/* retrieve vdev pointer from vdev list */
1067 	vdev = psoc->soc_objmgr.wlan_vdev_list[vdev_id];
1068 	if (vdev && vdev->obj_state != WLAN_OBJ_STATE_LOGICALLY_DELETED)
1069 		wlan_objmgr_vdev_get_ref_debug(vdev, dbg_id, func, line);
1070 	else
1071 		vdev = NULL;
1072 	wlan_psoc_obj_unlock(psoc);
1073 
1074 	return vdev;
1075 }
1076 
1077 qdf_export_symbol(wlan_objmgr_get_vdev_by_id_from_psoc_not_log_del_debug);
1078 #else
wlan_objmgr_get_vdev_by_id_from_psoc_not_log_del(struct wlan_objmgr_psoc * psoc,uint8_t vdev_id,wlan_objmgr_ref_dbgid dbg_id)1079 struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_id_from_psoc_not_log_del(
1080 			struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
1081 			wlan_objmgr_ref_dbgid dbg_id)
1082 {
1083 	struct wlan_objmgr_vdev *vdev;
1084 
1085 	/* if PSOC is NULL, return */
1086 	if (!psoc)
1087 		return NULL;
1088 	/* vdev id is invalid */
1089 	if (vdev_id >= wlan_psoc_get_max_vdev_count(psoc))
1090 		return NULL;
1091 
1092 	wlan_psoc_obj_lock(psoc);
1093 	/* retrieve vdev pointer from vdev list */
1094 	vdev = psoc->soc_objmgr.wlan_vdev_list[vdev_id];
1095 
1096 	if (vdev && vdev->obj_state != WLAN_OBJ_STATE_LOGICALLY_DELETED)
1097 		wlan_objmgr_vdev_get_ref(vdev, dbg_id);
1098 	else
1099 		vdev = NULL;
1100 	wlan_psoc_obj_unlock(psoc);
1101 
1102 	return vdev;
1103 }
1104 
1105 qdf_export_symbol(wlan_objmgr_get_vdev_by_id_from_psoc_not_log_del);
1106 #endif
1107 
1108 #ifdef WLAN_OBJMGR_REF_ID_TRACE
wlan_objmgr_get_vdev_by_opmode_from_psoc_debug(struct wlan_objmgr_psoc * psoc,enum QDF_OPMODE opmode,wlan_objmgr_ref_dbgid dbg_id,const char * func,int line)1109 struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_opmode_from_psoc_debug(
1110 			struct wlan_objmgr_psoc *psoc,
1111 			enum QDF_OPMODE opmode,
1112 			wlan_objmgr_ref_dbgid dbg_id,
1113 			const char *func, int line)
1114 {
1115 	struct wlan_objmgr_vdev *vdev = NULL;
1116 	int vdev_cnt = 0;
1117 	uint16_t max_vdev_cnt;
1118 
1119 	/* if PSOC is NULL, return */
1120 	if (!psoc)
1121 		return NULL;
1122 
1123 	wlan_psoc_obj_lock(psoc);
1124 
1125 	max_vdev_cnt = wlan_psoc_get_max_vdev_count(psoc);
1126 	/* retrieve vdev pointer from vdev list */
1127 	while (vdev_cnt < max_vdev_cnt) {
1128 		vdev = psoc->soc_objmgr.wlan_vdev_list[vdev_cnt];
1129 		vdev_cnt++;
1130 		if (!vdev)
1131 			continue;
1132 		wlan_vdev_obj_lock(vdev);
1133 		if (vdev->vdev_mlme.vdev_opmode == opmode) {
1134 			wlan_vdev_obj_unlock(vdev);
1135 			if (wlan_objmgr_vdev_try_get_ref_debug(vdev, dbg_id,
1136 							       func, line) !=
1137 				QDF_STATUS_SUCCESS) {
1138 				vdev = NULL;
1139 				continue;
1140 			}
1141 			break;
1142 		}
1143 		wlan_vdev_obj_unlock(vdev);
1144 		vdev = NULL;
1145 	}
1146 	wlan_psoc_obj_unlock(psoc);
1147 
1148 	return vdev;
1149 }
1150 #else
wlan_objmgr_get_vdev_by_opmode_from_psoc(struct wlan_objmgr_psoc * psoc,enum QDF_OPMODE opmode,wlan_objmgr_ref_dbgid dbg_id)1151 struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_opmode_from_psoc(
1152 			struct wlan_objmgr_psoc *psoc,
1153 			enum QDF_OPMODE opmode,
1154 			wlan_objmgr_ref_dbgid dbg_id)
1155 {
1156 	struct wlan_objmgr_vdev *vdev = NULL;
1157 	int vdev_cnt = 0;
1158 	uint16_t max_vdev_cnt;
1159 
1160 	/* if PSOC is NULL, return */
1161 	if (!psoc)
1162 		return NULL;
1163 
1164 	wlan_psoc_obj_lock(psoc);
1165 
1166 	max_vdev_cnt = wlan_psoc_get_max_vdev_count(psoc);
1167 	/* retrieve vdev pointer from vdev list */
1168 	while (vdev_cnt < max_vdev_cnt) {
1169 		vdev = psoc->soc_objmgr.wlan_vdev_list[vdev_cnt];
1170 		vdev_cnt++;
1171 		if (!vdev)
1172 			continue;
1173 		wlan_vdev_obj_lock(vdev);
1174 		if (vdev->vdev_mlme.vdev_opmode == opmode) {
1175 			wlan_vdev_obj_unlock(vdev);
1176 			if (wlan_objmgr_vdev_try_get_ref(vdev, dbg_id) !=
1177 							QDF_STATUS_SUCCESS) {
1178 				vdev = NULL;
1179 				continue;
1180 			}
1181 			break;
1182 		}
1183 		wlan_vdev_obj_unlock(vdev);
1184 		vdev = NULL;
1185 	}
1186 	wlan_psoc_obj_unlock(psoc);
1187 
1188 	return vdev;
1189 }
1190 #endif
1191 
1192 #ifdef WLAN_OBJMGR_REF_ID_TRACE
wlan_objmgr_get_vdev_by_macaddr_from_psoc_debug(struct wlan_objmgr_psoc * psoc,uint8_t pdev_id,const uint8_t * macaddr,wlan_objmgr_ref_dbgid dbg_id,const char * func,int line)1193 struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_macaddr_from_psoc_debug(
1194 		struct wlan_objmgr_psoc *psoc, uint8_t pdev_id,
1195 		const uint8_t *macaddr, wlan_objmgr_ref_dbgid dbg_id,
1196 		const char *func, int line)
1197 {
1198 	struct wlan_objmgr_vdev *vdev;
1199 	struct wlan_objmgr_pdev *pdev;
1200 
1201 	/* if PSOC is NULL, return */
1202 	if (!psoc)
1203 		return NULL;
1204 
1205 	if (!macaddr)
1206 		return NULL;
1207 
1208 	pdev = wlan_objmgr_get_pdev_by_id(psoc, pdev_id, dbg_id);
1209 	if (!pdev) {
1210 		obj_mgr_err("pdev is null");
1211 		return NULL;
1212 	}
1213 	vdev = wlan_objmgr_get_vdev_by_macaddr_from_pdev_debug(pdev, macaddr,
1214 							       dbg_id,
1215 							       func, line);
1216 	wlan_objmgr_pdev_release_ref(pdev, dbg_id);
1217 
1218 	return vdev;
1219 }
1220 
1221 qdf_export_symbol(wlan_objmgr_get_vdev_by_macaddr_from_psoc_debug);
1222 #else
wlan_objmgr_get_vdev_by_macaddr_from_psoc(struct wlan_objmgr_psoc * psoc,uint8_t pdev_id,const uint8_t * macaddr,wlan_objmgr_ref_dbgid dbg_id)1223 struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_macaddr_from_psoc(
1224 		struct wlan_objmgr_psoc *psoc, uint8_t pdev_id,
1225 		const uint8_t *macaddr, wlan_objmgr_ref_dbgid dbg_id)
1226 {
1227 	struct wlan_objmgr_vdev *vdev;
1228 	struct wlan_objmgr_pdev *pdev;
1229 
1230 	/* if PSOC is NULL, return */
1231 	if (!psoc)
1232 		return NULL;
1233 
1234 	if (!macaddr)
1235 		return NULL;
1236 
1237 	pdev = wlan_objmgr_get_pdev_by_id(psoc, pdev_id, dbg_id);
1238 	if (!pdev) {
1239 		obj_mgr_err("pdev is null");
1240 		return NULL;
1241 	}
1242 	vdev = wlan_objmgr_get_vdev_by_macaddr_from_pdev(pdev, macaddr, dbg_id);
1243 	wlan_objmgr_pdev_release_ref(pdev, dbg_id);
1244 
1245 	return vdev;
1246 }
1247 
1248 qdf_export_symbol(wlan_objmgr_get_vdev_by_macaddr_from_psoc);
1249 #endif
1250 
1251 #ifdef WLAN_OBJMGR_REF_ID_TRACE
1252 struct wlan_objmgr_vdev
wlan_objmgr_get_vdev_by_macaddr_from_psoc_no_state_debug(struct wlan_objmgr_psoc * psoc,uint8_t pdev_id,const uint8_t * macaddr,wlan_objmgr_ref_dbgid dbg_id,const char * func,int line)1253 	*wlan_objmgr_get_vdev_by_macaddr_from_psoc_no_state_debug(
1254 		struct wlan_objmgr_psoc *psoc, uint8_t pdev_id,
1255 		const uint8_t *macaddr, wlan_objmgr_ref_dbgid dbg_id,
1256 		const char *func, int line)
1257 {
1258 	struct wlan_objmgr_vdev *vdev;
1259 	struct wlan_objmgr_pdev *pdev;
1260 
1261 	/* if PSOC is NULL, return */
1262 	if (!psoc)
1263 		return NULL;
1264 
1265 	if (!macaddr)
1266 		return NULL;
1267 
1268 	pdev = wlan_objmgr_get_pdev_by_id(psoc, pdev_id, dbg_id);
1269 	if (!pdev) {
1270 		obj_mgr_err("pdev is null");
1271 		return NULL;
1272 	}
1273 	vdev = wlan_objmgr_get_vdev_by_macaddr_from_pdev_no_state_debug(pdev,
1274 									macaddr,
1275 									dbg_id,
1276 									func,
1277 									line);
1278 	wlan_objmgr_pdev_release_ref(pdev, dbg_id);
1279 
1280 	return vdev;
1281 }
1282 
1283 qdf_export_symbol(wlan_objmgr_get_vdev_by_macaddr_from_psoc_no_state_debug);
1284 #else
wlan_objmgr_get_vdev_by_macaddr_from_psoc_no_state(struct wlan_objmgr_psoc * psoc,uint8_t pdev_id,const uint8_t * macaddr,wlan_objmgr_ref_dbgid dbg_id)1285 struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_macaddr_from_psoc_no_state(
1286 		struct wlan_objmgr_psoc *psoc, uint8_t pdev_id,
1287 		const uint8_t *macaddr, wlan_objmgr_ref_dbgid dbg_id)
1288 {
1289 	struct wlan_objmgr_vdev *vdev;
1290 	struct wlan_objmgr_pdev *pdev;
1291 
1292 	/* if PSOC is NULL, return */
1293 	if (!psoc)
1294 		return NULL;
1295 
1296 	if (!macaddr)
1297 		return NULL;
1298 
1299 	pdev = wlan_objmgr_get_pdev_by_id(psoc, pdev_id, dbg_id);
1300 	if (!pdev) {
1301 		obj_mgr_err("pdev is null");
1302 		return NULL;
1303 	}
1304 	vdev = wlan_objmgr_get_vdev_by_macaddr_from_pdev_no_state(pdev, macaddr, dbg_id);
1305 	wlan_objmgr_pdev_release_ref(pdev, dbg_id);
1306 
1307 	return vdev;
1308 }
1309 
1310 qdf_export_symbol(wlan_objmgr_get_vdev_by_macaddr_from_psoc_no_state);
1311 #endif
1312 
wlan_obj_psoc_peerlist_add_tail(qdf_list_t * obj_list,struct wlan_objmgr_peer * obj)1313 static void wlan_obj_psoc_peerlist_add_tail(qdf_list_t *obj_list,
1314 				struct wlan_objmgr_peer *obj)
1315 {
1316 	qdf_list_insert_back(obj_list, &obj->psoc_peer);
1317 }
1318 
wlan_obj_psoc_peerlist_remove_peer(qdf_list_t * obj_list,struct wlan_objmgr_peer * peer)1319 static QDF_STATUS wlan_obj_psoc_peerlist_remove_peer(
1320 				qdf_list_t *obj_list,
1321 				struct wlan_objmgr_peer *peer)
1322 {
1323 	qdf_list_node_t *psoc_node = NULL;
1324 
1325 	if (!peer)
1326 		return QDF_STATUS_E_FAILURE;
1327 	/* get vdev list node element */
1328 	psoc_node = &peer->psoc_peer;
1329 	/* list is empty, return failure */
1330 	if (qdf_list_remove_node(obj_list, psoc_node) != QDF_STATUS_SUCCESS)
1331 		return QDF_STATUS_E_FAILURE;
1332 
1333 	return QDF_STATUS_SUCCESS;
1334 }
1335 
wlan_peer_bssid_match(struct wlan_objmgr_peer * peer,uint8_t * bssid)1336 static QDF_STATUS wlan_peer_bssid_match(struct wlan_objmgr_peer *peer,
1337 				     uint8_t *bssid)
1338 {
1339 	struct wlan_objmgr_vdev *vdev = wlan_peer_get_vdev(peer);
1340 	uint8_t *peer_bssid = wlan_vdev_mlme_get_macaddr(vdev);
1341 
1342 	if (WLAN_ADDR_EQ(peer_bssid, bssid) == QDF_STATUS_SUCCESS)
1343 		return QDF_STATUS_SUCCESS;
1344 	else
1345 		return QDF_STATUS_E_FAILURE;
1346 }
1347 
1348 #ifdef WLAN_OBJMGR_REF_ID_TRACE
1349 /**
1350  * wlan_obj_psoc_peerlist_get_peer_by_pdev_id_debug() - get peer from
1351  *                                                      psoc peer list
1352  * @obj_list: Peer object list
1353  * @macaddr: MAC address
1354  * @pdev_id: Pdev id
1355  * @dbg_id: id of the caller
1356  * @func: function name
1357  * @line: line number
1358  *
1359  * API to finds peer object pointer by MAC addr and pdev id from hash list
1360  *
1361  * Return: peer pointer
1362  *         NULL on FAILURE
1363  */
1364 static struct wlan_objmgr_peer
wlan_obj_psoc_peerlist_get_peer_by_pdev_id_debug(qdf_list_t * obj_list,const uint8_t * macaddr,uint8_t pdev_id,wlan_objmgr_ref_dbgid dbg_id,const char * func,int line)1365 	*wlan_obj_psoc_peerlist_get_peer_by_pdev_id_debug(
1366 				qdf_list_t *obj_list, const uint8_t *macaddr,
1367 				uint8_t pdev_id, wlan_objmgr_ref_dbgid dbg_id,
1368 				const char *func, int line)
1369 {
1370 	struct wlan_objmgr_peer *peer;
1371 	struct wlan_objmgr_peer *peer_temp;
1372 
1373 	/* Iterate through hash list to get the peer */
1374 	peer = wlan_psoc_peer_list_peek_head(obj_list);
1375 	while (peer) {
1376 		/* For peer, macaddr is key */
1377 		if ((WLAN_ADDR_EQ(wlan_peer_get_macaddr(peer), macaddr)
1378 			== QDF_STATUS_SUCCESS) &&
1379 				(wlan_peer_get_pdev_id(peer) == pdev_id)) {
1380 			if (wlan_objmgr_peer_try_get_ref_debug(peer, dbg_id,
1381 							       func, line) ==
1382 			    QDF_STATUS_SUCCESS) {
1383 				return peer;
1384 			}
1385 		}
1386 		/* Move to next peer */
1387 		peer_temp = peer;
1388 		peer = wlan_peer_get_next_peer_of_psoc(obj_list, peer_temp);
1389 	}
1390 
1391 	/* Not found, return NULL */
1392 	return NULL;
1393 }
1394 #else
1395 /**
1396  * wlan_obj_psoc_peerlist_get_peer_by_pdev_id() - get peer from
1397  *                                                      psoc peer list
1398  * @obj_list: Peer object list
1399  * @macaddr: MAC address
1400  * @pdev_id: Pdev id
1401  * @dbg_id: id of the caller
1402  *
1403  * API to finds peer object pointer by MAC addr and pdev id from hash list
1404  *
1405  * Return: peer pointer
1406  *         NULL on FAILURE
1407  */
wlan_obj_psoc_peerlist_get_peer_by_pdev_id(qdf_list_t * obj_list,const uint8_t * macaddr,uint8_t pdev_id,wlan_objmgr_ref_dbgid dbg_id)1408 static struct wlan_objmgr_peer *wlan_obj_psoc_peerlist_get_peer_by_pdev_id(
1409 				qdf_list_t *obj_list, const uint8_t *macaddr,
1410 				uint8_t pdev_id, wlan_objmgr_ref_dbgid dbg_id)
1411 {
1412 	struct wlan_objmgr_peer *peer;
1413 	struct wlan_objmgr_peer *peer_temp;
1414 
1415 	/* Iterate through hash list to get the peer */
1416 	peer = wlan_psoc_peer_list_peek_head(obj_list);
1417 	while (peer) {
1418 		/* For peer, macaddr is key */
1419 		if ((WLAN_ADDR_EQ(wlan_peer_get_macaddr(peer), macaddr)
1420 			== QDF_STATUS_SUCCESS) &&
1421 				(wlan_peer_get_pdev_id(peer) == pdev_id)) {
1422 			if (wlan_objmgr_peer_try_get_ref(peer, dbg_id) ==
1423 							QDF_STATUS_SUCCESS) {
1424 				return peer;
1425 			}
1426 		}
1427 		/* Move to next peer */
1428 		peer_temp = peer;
1429 		peer = wlan_peer_get_next_peer_of_psoc(obj_list, peer_temp);
1430 	}
1431 
1432 	/* Not found, return NULL */
1433 	return NULL;
1434 }
1435 #endif
1436 
1437 #ifdef WLAN_OBJMGR_REF_ID_TRACE
1438 /**
1439  * wlan_obj_psoc_peerlist_get_peer_debug() - get peer from psoc peer list
1440  * @obj_list: Peer object list
1441  * @macaddr: MAC address
1442  * @dbg_id: id of the caller
1443  * @func: function name
1444  * @line: line number
1445  *
1446  * API to finds peer object pointer by MAC addr from hash list
1447  *
1448  * Return: peer pointer
1449  *         NULL on FAILURE
1450  */
wlan_obj_psoc_peerlist_get_peer_debug(qdf_list_t * obj_list,uint8_t * macaddr,wlan_objmgr_ref_dbgid dbg_id,const char * func,int line)1451 static struct wlan_objmgr_peer *wlan_obj_psoc_peerlist_get_peer_debug(
1452 		qdf_list_t *obj_list, uint8_t *macaddr,
1453 		wlan_objmgr_ref_dbgid dbg_id,
1454 		const char *func, int line)
1455 {
1456 	struct wlan_objmgr_peer *peer;
1457 	struct wlan_objmgr_peer *peer_temp;
1458 
1459 	/* Iterate through hash list to get the peer */
1460 	peer = wlan_psoc_peer_list_peek_head(obj_list);
1461 	while (peer) {
1462 		/* For peer, macaddr is key */
1463 		if (WLAN_ADDR_EQ(wlan_peer_get_macaddr(peer), macaddr)
1464 				== QDF_STATUS_SUCCESS) {
1465 			if (wlan_objmgr_peer_try_get_ref_debug(peer, dbg_id,
1466 							       func, line) ==
1467 			    QDF_STATUS_SUCCESS) {
1468 				return peer;
1469 			}
1470 		}
1471 		/* Move to next peer */
1472 		peer_temp = peer;
1473 		peer = wlan_peer_get_next_peer_of_psoc(obj_list, peer_temp);
1474 	}
1475 
1476 	/* Not found, return NULL */
1477 	return NULL;
1478 }
1479 #else
1480 /**
1481  * wlan_obj_psoc_peerlist_get_peer() - get peer from psoc peer list
1482  * @obj_list: Peer object list
1483  * @macaddr: MAC address
1484  * @dbg_id: id of the caller
1485  *
1486  * API to finds peer object pointer by MAC addr from hash list
1487  *
1488  * Return: peer pointer
1489  *         NULL on FAILURE
1490  */
wlan_obj_psoc_peerlist_get_peer(qdf_list_t * obj_list,uint8_t * macaddr,wlan_objmgr_ref_dbgid dbg_id)1491 static struct wlan_objmgr_peer *wlan_obj_psoc_peerlist_get_peer(
1492 		qdf_list_t *obj_list, uint8_t *macaddr,
1493 		wlan_objmgr_ref_dbgid dbg_id)
1494 {
1495 	struct wlan_objmgr_peer *peer;
1496 	struct wlan_objmgr_peer *peer_temp;
1497 
1498 	/* Iterate through hash list to get the peer */
1499 	peer = wlan_psoc_peer_list_peek_head(obj_list);
1500 	while (peer) {
1501 		/* For peer, macaddr is key */
1502 		if (WLAN_ADDR_EQ(wlan_peer_get_macaddr(peer), macaddr)
1503 				== QDF_STATUS_SUCCESS) {
1504 			if (wlan_objmgr_peer_try_get_ref(peer, dbg_id) ==
1505 					QDF_STATUS_SUCCESS) {
1506 				return peer;
1507 			}
1508 		}
1509 		/* Move to next peer */
1510 		peer_temp = peer;
1511 		peer = wlan_peer_get_next_peer_of_psoc(obj_list, peer_temp);
1512 	}
1513 
1514 	/* Not found, return NULL */
1515 	return NULL;
1516 }
1517 #endif
1518 
1519 #ifdef WLAN_OBJMGR_REF_ID_TRACE
1520 /**
1521  * wlan_obj_psoc_peerlist_get_peer_logically_deleted_debug() - get peer
1522  * from psoc peer list
1523  * @obj_list: Peer object list
1524  * @macaddr: MAC address
1525  * @dbg_id: id of the caller
1526  * @func: function name
1527  * @line: line number
1528  *
1529  * API to finds peer object pointer of logically deleted peer
1530  *
1531  * Return: peer pointer
1532  *         NULL on FAILURE
1533  */
1534 static struct wlan_objmgr_peer *
wlan_obj_psoc_peerlist_get_peer_logically_deleted_debug(qdf_list_t * obj_list,uint8_t * macaddr,wlan_objmgr_ref_dbgid dbg_id,const char * func,int line)1535 		wlan_obj_psoc_peerlist_get_peer_logically_deleted_debug(
1536 				qdf_list_t *obj_list, uint8_t *macaddr,
1537 				wlan_objmgr_ref_dbgid dbg_id,
1538 				const char *func, int line)
1539 {
1540 	struct wlan_objmgr_peer *peer;
1541 	struct wlan_objmgr_peer *peer_temp;
1542 
1543 	/* Iterate through hash list to get the peer */
1544 	peer = wlan_psoc_peer_list_peek_head(obj_list);
1545 	while (peer) {
1546 		/* For peer, macaddr is key */
1547 		if (WLAN_ADDR_EQ(wlan_peer_get_macaddr(peer), macaddr)
1548 			== QDF_STATUS_SUCCESS) {
1549 			/* Return peer in logically deleted state */
1550 			if (peer->obj_state ==
1551 					WLAN_OBJ_STATE_LOGICALLY_DELETED) {
1552 				wlan_objmgr_peer_get_ref_debug(peer, dbg_id,
1553 							       func, line);
1554 
1555 				return peer;
1556 			}
1557 
1558 		}
1559 		/* Move to next peer */
1560 		peer_temp = peer;
1561 		peer = wlan_peer_get_next_peer_of_psoc(obj_list, peer_temp);
1562 	}
1563 
1564 	/* Not found, return NULL */
1565 	return NULL;
1566 }
1567 #else
1568 /**
1569  * wlan_obj_psoc_peerlist_get_peer_logically_deleted() - get peer
1570  * from psoc peer list
1571  * @obj_list: Peer object list
1572  * @macaddr: MAC address
1573  * @dbg_id: id of the caller
1574  *
1575  * API to finds peer object pointer of logically deleted peer
1576  *
1577  * Return: peer pointer
1578  *         NULL on FAILURE
1579  */
1580 static struct wlan_objmgr_peer *
wlan_obj_psoc_peerlist_get_peer_logically_deleted(qdf_list_t * obj_list,uint8_t * macaddr,wlan_objmgr_ref_dbgid dbg_id)1581 			wlan_obj_psoc_peerlist_get_peer_logically_deleted(
1582 				qdf_list_t *obj_list, uint8_t *macaddr,
1583 				wlan_objmgr_ref_dbgid dbg_id)
1584 {
1585 	struct wlan_objmgr_peer *peer;
1586 	struct wlan_objmgr_peer *peer_temp;
1587 
1588 	/* Iterate through hash list to get the peer */
1589 	peer = wlan_psoc_peer_list_peek_head(obj_list);
1590 	while (peer) {
1591 		/* For peer, macaddr is key */
1592 		if (WLAN_ADDR_EQ(wlan_peer_get_macaddr(peer), macaddr)
1593 			== QDF_STATUS_SUCCESS) {
1594 			/* Return peer in logically deleted state */
1595 			if (peer->obj_state ==
1596 					WLAN_OBJ_STATE_LOGICALLY_DELETED) {
1597 				wlan_objmgr_peer_get_ref(peer, dbg_id);
1598 
1599 				return peer;
1600 			}
1601 		}
1602 		/* Move to next peer */
1603 		peer_temp = peer;
1604 		peer = wlan_peer_get_next_peer_of_psoc(obj_list, peer_temp);
1605 	}
1606 
1607 	/* Not found, return NULL */
1608 	return NULL;
1609 }
1610 #endif
1611 
1612 #ifdef WLAN_OBJMGR_REF_ID_TRACE
1613 static struct wlan_objmgr_peer
wlan_obj_psoc_peerlist_get_peer_by_mac_n_bssid_no_state_debug(qdf_list_t * obj_list,uint8_t * macaddr,uint8_t * bssid,uint8_t pdev_id,wlan_objmgr_ref_dbgid dbg_id,const char * func,int line)1614 		*wlan_obj_psoc_peerlist_get_peer_by_mac_n_bssid_no_state_debug(
1615 					qdf_list_t *obj_list, uint8_t *macaddr,
1616 					uint8_t *bssid,
1617 					uint8_t pdev_id,
1618 					wlan_objmgr_ref_dbgid dbg_id,
1619 					const char *func, int line)
1620 {
1621 	struct wlan_objmgr_peer *peer;
1622 	struct wlan_objmgr_peer *peer_temp;
1623 
1624 	/* Iterate through hash list to get the peer */
1625 	peer = wlan_psoc_peer_list_peek_head(obj_list);
1626 	while (peer) {
1627 		/* For peer, macaddr is key */
1628 		if (WLAN_ADDR_EQ(wlan_peer_get_macaddr(peer), macaddr)
1629 			== QDF_STATUS_SUCCESS) {
1630 			/*
1631 			 *  BSSID match is requested by caller, check BSSID
1632 			 *  (vdev mac == bssid) --  return peer
1633 			 *  (vdev mac != bssid) --  perform next iteration
1634 			 */
1635 			if ((wlan_peer_bssid_match(peer, bssid) ==
1636 				QDF_STATUS_SUCCESS) &&
1637 				(wlan_peer_get_pdev_id(peer) == pdev_id)) {
1638 				wlan_objmgr_peer_get_ref_debug(peer, dbg_id,
1639 							       func, line);
1640 
1641 				return peer;
1642 			}
1643 		}
1644 		/* Move to next peer */
1645 		peer_temp = peer;
1646 		peer = wlan_peer_get_next_peer_of_psoc(obj_list, peer_temp);
1647 	}
1648 
1649 	/* Not found, return NULL */
1650 	return NULL;
1651 }
1652 #else
1653 static struct wlan_objmgr_peer
wlan_obj_psoc_peerlist_get_peer_by_mac_n_bssid_no_state(qdf_list_t * obj_list,uint8_t * macaddr,uint8_t * bssid,uint8_t pdev_id,wlan_objmgr_ref_dbgid dbg_id)1654 		*wlan_obj_psoc_peerlist_get_peer_by_mac_n_bssid_no_state(
1655 					qdf_list_t *obj_list, uint8_t *macaddr,
1656 					uint8_t *bssid,
1657 					uint8_t pdev_id,
1658 					wlan_objmgr_ref_dbgid dbg_id)
1659 {
1660 	struct wlan_objmgr_peer *peer;
1661 	struct wlan_objmgr_peer *peer_temp;
1662 
1663 	/* Iterate through hash list to get the peer */
1664 	peer = wlan_psoc_peer_list_peek_head(obj_list);
1665 	while (peer) {
1666 		/* For peer, macaddr is key */
1667 		if (WLAN_ADDR_EQ(wlan_peer_get_macaddr(peer), macaddr)
1668 			== QDF_STATUS_SUCCESS) {
1669 			/*
1670 			 *  BSSID match is requested by caller, check BSSID
1671 			 *  (vdev mac == bssid) --  return peer
1672 			 *  (vdev mac != bssid) --  perform next iteration
1673 			 */
1674 			if ((wlan_peer_bssid_match(peer, bssid) ==
1675 				QDF_STATUS_SUCCESS) &&
1676 				(wlan_peer_get_pdev_id(peer) == pdev_id)) {
1677 				wlan_objmgr_peer_get_ref(peer, dbg_id);
1678 
1679 				return peer;
1680 			}
1681 		}
1682 		/* Move to next peer */
1683 		peer_temp = peer;
1684 		peer = wlan_peer_get_next_peer_of_psoc(obj_list, peer_temp);
1685 	}
1686 
1687 	/* Not found, return NULL */
1688 	return NULL;
1689 }
1690 #endif
1691 
1692 #ifdef WLAN_OBJMGR_REF_ID_TRACE
1693 /**
1694  * wlan_obj_psoc_peerlist_get_peer_by_mac_n_bssid_debug() - get peer
1695  *                                                    from psoc peer
1696  *                                                    list using mac and vdev
1697  *                                                    self mac
1698  * @obj_list: Peer object list
1699  * @macaddr: MAC address
1700  * @bssid: BSSID address
1701  * @pdev_id: Pdev id
1702  * @dbg_id: id of the caller
1703  * @func: function name
1704  * @line: line number
1705  *
1706  * API to finds peer object pointer by MAC addr and BSSID from
1707  * peer hash list, bssid check is done on matching peer
1708  *
1709  * Return: peer pointer
1710  *         NULL on FAILURE
1711  */
1712 static struct wlan_objmgr_peer
wlan_obj_psoc_peerlist_get_peer_by_mac_n_bssid_debug(qdf_list_t * obj_list,uint8_t * macaddr,uint8_t * bssid,uint8_t pdev_id,wlan_objmgr_ref_dbgid dbg_id,const char * func,int line)1713 		*wlan_obj_psoc_peerlist_get_peer_by_mac_n_bssid_debug(
1714 					qdf_list_t *obj_list, uint8_t *macaddr,
1715 					uint8_t *bssid, uint8_t pdev_id,
1716 					wlan_objmgr_ref_dbgid dbg_id,
1717 					const char *func, int line)
1718 {
1719 	struct wlan_objmgr_peer *peer;
1720 	struct wlan_objmgr_peer *peer_temp;
1721 
1722 	/* Iterate through hash list to get the peer */
1723 	peer = wlan_psoc_peer_list_peek_head(obj_list);
1724 	while (peer) {
1725 		/* For peer, macaddr is key */
1726 		if (WLAN_ADDR_EQ(wlan_peer_get_macaddr(peer), macaddr)
1727 			== QDF_STATUS_SUCCESS) {
1728 			/*
1729 			 *  BSSID match is requested by caller, check BSSID
1730 			 *  (vdev mac == bssid) --  return peer
1731 			 *  (vdev mac != bssid) --  perform next iteration
1732 			 */
1733 			if ((wlan_peer_bssid_match(peer, bssid) ==
1734 				QDF_STATUS_SUCCESS) &&
1735 				(wlan_peer_get_pdev_id(peer) == pdev_id)) {
1736 				if (wlan_objmgr_peer_try_get_ref_debug(peer,
1737 								       dbg_id,
1738 								       func,
1739 								       line)
1740 					== QDF_STATUS_SUCCESS) {
1741 					return peer;
1742 				}
1743 			}
1744 		}
1745 		/* Move to next peer */
1746 		peer_temp = peer;
1747 		peer = wlan_peer_get_next_peer_of_psoc(obj_list, peer_temp);
1748 	}
1749 	/* Not found, return NULL */
1750 	return NULL;
1751 }
1752 #else
1753 /**
1754  * wlan_obj_psoc_peerlist_get_peer_by_mac_n_bssid() - get peer
1755  *                                                    from psoc peer
1756  *                                                    list using mac and vdev
1757  *                                                    self mac
1758  * @obj_list: Peer object list
1759  * @macaddr: MAC address
1760  * @bssid: BSSID address
1761  * @pdev_id: Pdev id
1762  * @dbg_id: id of the caller
1763  *
1764  * API to finds peer object pointer by MAC addr and BSSID from
1765  * peer hash list, bssid check is done on matching peer
1766  *
1767  * Return: peer pointer
1768  *         NULL on FAILURE
1769  */
wlan_obj_psoc_peerlist_get_peer_by_mac_n_bssid(qdf_list_t * obj_list,uint8_t * macaddr,uint8_t * bssid,uint8_t pdev_id,wlan_objmgr_ref_dbgid dbg_id)1770 static struct wlan_objmgr_peer *wlan_obj_psoc_peerlist_get_peer_by_mac_n_bssid(
1771 					qdf_list_t *obj_list, uint8_t *macaddr,
1772 					uint8_t *bssid, uint8_t pdev_id,
1773 					wlan_objmgr_ref_dbgid dbg_id)
1774 {
1775 	struct wlan_objmgr_peer *peer;
1776 	struct wlan_objmgr_peer *peer_temp;
1777 
1778 	/* Iterate through hash list to get the peer */
1779 	peer = wlan_psoc_peer_list_peek_head(obj_list);
1780 	while (peer) {
1781 		/* For peer, macaddr is key */
1782 		if (WLAN_ADDR_EQ(wlan_peer_get_macaddr(peer), macaddr)
1783 			== QDF_STATUS_SUCCESS) {
1784 			/*
1785 			 *  BSSID match is requested by caller, check BSSID
1786 			 *  (vdev mac == bssid) --  return peer
1787 			 *  (vdev mac != bssid) --  perform next iteration
1788 			 */
1789 			if ((wlan_peer_bssid_match(peer, bssid) ==
1790 				QDF_STATUS_SUCCESS) &&
1791 				(wlan_peer_get_pdev_id(peer) == pdev_id)) {
1792 				if (wlan_objmgr_peer_try_get_ref(peer, dbg_id)
1793 					== QDF_STATUS_SUCCESS) {
1794 					return peer;
1795 				}
1796 			}
1797 		}
1798 		/* Move to next peer */
1799 		peer_temp = peer;
1800 		peer = wlan_peer_get_next_peer_of_psoc(obj_list, peer_temp);
1801 	}
1802 	/* Not found, return NULL */
1803 	return NULL;
1804 }
1805 #endif
1806 
1807 #ifdef WLAN_OBJMGR_REF_ID_TRACE
wlan_obj_psoc_peerlist_get_peer_no_state_debug(qdf_list_t * obj_list,uint8_t * macaddr,uint8_t pdev_id,wlan_objmgr_ref_dbgid dbg_id,const char * func,int line)1808 static struct wlan_objmgr_peer *wlan_obj_psoc_peerlist_get_peer_no_state_debug(
1809 				qdf_list_t *obj_list, uint8_t *macaddr,
1810 				uint8_t pdev_id, wlan_objmgr_ref_dbgid dbg_id,
1811 				const char *func, int line)
1812 {
1813 	struct wlan_objmgr_peer *peer;
1814 	struct wlan_objmgr_peer *peer_temp;
1815 
1816 	/* Iterate through hash list to get the peer */
1817 	peer = wlan_psoc_peer_list_peek_head(obj_list);
1818 	while (peer) {
1819 		/* For peer, macaddr and pdev_id is key */
1820 		if ((WLAN_ADDR_EQ(wlan_peer_get_macaddr(peer), macaddr)
1821 			== QDF_STATUS_SUCCESS) &&
1822 				(wlan_peer_get_pdev_id(peer) == pdev_id)) {
1823 			wlan_objmgr_peer_get_ref_debug(peer, dbg_id, func,
1824 						       line);
1825 
1826 			return peer;
1827 		}
1828 		/* Move to next peer */
1829 		peer_temp = peer;
1830 		peer = wlan_peer_get_next_peer_of_psoc(obj_list, peer_temp);
1831 	}
1832 
1833 	/* Not found, return NULL */
1834 	return NULL;
1835 }
1836 #else
wlan_obj_psoc_peerlist_get_peer_no_state(qdf_list_t * obj_list,uint8_t * macaddr,uint8_t pdev_id,wlan_objmgr_ref_dbgid dbg_id)1837 static struct wlan_objmgr_peer *wlan_obj_psoc_peerlist_get_peer_no_state(
1838 				qdf_list_t *obj_list, uint8_t *macaddr,
1839 				uint8_t pdev_id, wlan_objmgr_ref_dbgid dbg_id)
1840 {
1841 	struct wlan_objmgr_peer *peer;
1842 	struct wlan_objmgr_peer *peer_temp;
1843 
1844 	/* Iterate through hash list to get the peer */
1845 	peer = wlan_psoc_peer_list_peek_head(obj_list);
1846 	while (peer) {
1847 		/* For peer, macaddr and pdev_id is key */
1848 		if ((WLAN_ADDR_EQ(wlan_peer_get_macaddr(peer), macaddr)
1849 			== QDF_STATUS_SUCCESS) &&
1850 				(wlan_peer_get_pdev_id(peer) == pdev_id)) {
1851 			wlan_objmgr_peer_get_ref(peer, dbg_id);
1852 
1853 			return peer;
1854 		}
1855 		/* Move to next peer */
1856 		peer_temp = peer;
1857 		peer = wlan_peer_get_next_peer_of_psoc(obj_list, peer_temp);
1858 	}
1859 
1860 	/* Not found, return NULL */
1861 	return NULL;
1862 }
1863 #endif
1864 
1865 #ifdef WLAN_OBJMGR_REF_ID_TRACE
1866 /**
1867  * wlan_obj_psoc_populate_logically_del_peerlist_by_mac_n_bssid_debug() -
1868  *                                           get peer
1869  *                                           from psoc peer list using
1870  *                                           mac and vdev self mac
1871  * @obj_list: peer object list
1872  * @macaddr: MAC address
1873  * @bssid: BSSID address
1874  * @pdev_id: pdev id
1875  * @dbg_id: id of the caller
1876  * @func: function name
1877  * @line: line number
1878  *
1879  * API to finds peer object pointer by MAC addr and BSSID from
1880  * peer hash list for a node which is in logically deleted state,
1881  * bssid check is done on matching peer
1882  *
1883  * Caller to free the list allocated in this function
1884  *
1885  * Return: list of peer pointers
1886  *         NULL on FAILURE
1887  */
1888 static qdf_list_t
wlan_obj_psoc_populate_logically_del_peerlist_by_mac_n_bssid_debug(qdf_list_t * obj_list,uint8_t * macaddr,uint8_t * bssid,uint8_t pdev_id,wlan_objmgr_ref_dbgid dbg_id,const char * func,int line)1889 	*wlan_obj_psoc_populate_logically_del_peerlist_by_mac_n_bssid_debug(
1890 				qdf_list_t *obj_list, uint8_t *macaddr,
1891 				uint8_t *bssid, uint8_t pdev_id,
1892 				wlan_objmgr_ref_dbgid dbg_id,
1893 				const char *func, int line)
1894 {
1895 	struct wlan_objmgr_peer *peer;
1896 	struct wlan_objmgr_peer *peer_temp;
1897 	struct wlan_logically_del_peer *peer_list = NULL;
1898 	qdf_list_t *logical_del_peer_list = NULL;
1899 	bool lock_released = false;
1900 
1901 	logical_del_peer_list = qdf_mem_malloc(sizeof(*logical_del_peer_list));
1902 	if (!logical_del_peer_list)
1903 		return NULL;
1904 
1905 	qdf_list_create(logical_del_peer_list, WLAN_UMAC_PSOC_MAX_PEERS);
1906 
1907 	/* Iterate through hash list to get the peer */
1908 	peer = wlan_psoc_peer_list_peek_head(obj_list);
1909 	while (peer) {
1910 		wlan_peer_obj_lock(peer);
1911 		/* For peer, macaddr and pdev id are keys */
1912 		if ((WLAN_ADDR_EQ(wlan_peer_get_macaddr(peer), macaddr)
1913 			== QDF_STATUS_SUCCESS) &&
1914 				(wlan_peer_get_pdev_id(peer) == pdev_id)) {
1915 			/*
1916 			 *  if BSSID not NULL,
1917 			 *  then match is requested by caller, check BSSID
1918 			 *  (vdev mac == bssid) --  return peer
1919 			 *  (vdev mac != bssid) --  perform next iteration
1920 			 */
1921 			if ((!bssid) ||
1922 			    (wlan_peer_bssid_match(peer, bssid) ==
1923 				 QDF_STATUS_SUCCESS)) {
1924 				/* Return peer in logically deleted state */
1925 				if ((peer->obj_state ==
1926 					WLAN_OBJ_STATE_LOGICALLY_DELETED) &&
1927 				     qdf_atomic_read(
1928 						&peer->peer_objmgr.ref_cnt)) {
1929 					wlan_objmgr_peer_get_ref_debug(peer,
1930 								       dbg_id,
1931 								       func,
1932 								       line);
1933 					wlan_peer_obj_unlock(peer);
1934 					lock_released = true;
1935 
1936 					peer_list =
1937 					qdf_mem_malloc(
1938 					sizeof(struct wlan_logically_del_peer));
1939 					if (!peer_list) {
1940 						wlan_objmgr_peer_release_ref(peer, dbg_id);
1941 						/* Lock is already released */
1942 						WLAN_OBJMGR_BUG(0);
1943 						break;
1944 					}
1945 
1946 					peer_list->peer = peer;
1947 
1948 					qdf_list_insert_front(
1949 						logical_del_peer_list,
1950 							&peer_list->list);
1951 				}
1952 			}
1953 		}
1954 
1955 		if (!lock_released)
1956 			wlan_peer_obj_unlock(peer);
1957 
1958 		/* Move to next peer */
1959 		peer_temp = peer;
1960 		peer = wlan_peer_get_next_peer_of_psoc(obj_list, peer_temp);
1961 		lock_released = false;
1962 	}
1963 
1964 	/* Not found, return NULL */
1965 	if (qdf_list_empty(logical_del_peer_list)) {
1966 		qdf_mem_free(logical_del_peer_list);
1967 		return NULL;
1968 	} else {
1969 		return logical_del_peer_list;
1970 	}
1971 }
1972 #else
1973 /**
1974  * wlan_obj_psoc_populate_logically_del_peerlist_by_mac_n_bssid() -
1975  *                                           get peer
1976  *                                           from psoc peer list using
1977  *                                           mac and vdev self mac
1978  * @obj_list: peer object list
1979  * @macaddr: MAC address
1980  * @bssid: BSSID address
1981  * @pdev_id: pdev id
1982  * @dbg_id: id of the caller
1983  *
1984  * API to finds peer object pointer by MAC addr and BSSID from
1985  * peer hash list for a node which is in logically deleted state,
1986  * bssid check is done on matching peer
1987  *
1988  * Caller to free the list allocated in this function
1989  *
1990  * Return: list of peer pointers
1991  *         NULL on FAILURE
1992  */
1993 static qdf_list_t
wlan_obj_psoc_populate_logically_del_peerlist_by_mac_n_bssid(qdf_list_t * obj_list,uint8_t * macaddr,uint8_t * bssid,uint8_t pdev_id,wlan_objmgr_ref_dbgid dbg_id)1994 	*wlan_obj_psoc_populate_logically_del_peerlist_by_mac_n_bssid(
1995 				qdf_list_t *obj_list, uint8_t *macaddr,
1996 				uint8_t *bssid, uint8_t pdev_id,
1997 				wlan_objmgr_ref_dbgid dbg_id)
1998 {
1999 	struct wlan_objmgr_peer *peer;
2000 	struct wlan_objmgr_peer *peer_temp;
2001 	struct wlan_logically_del_peer *peer_list = NULL;
2002 	qdf_list_t *logical_del_peer_list = NULL;
2003 	bool lock_released = false;
2004 
2005 	logical_del_peer_list = qdf_mem_malloc(sizeof(*logical_del_peer_list));
2006 	if (!logical_del_peer_list)
2007 		return NULL;
2008 
2009 	qdf_list_create(logical_del_peer_list, WLAN_UMAC_PSOC_MAX_PEERS);
2010 
2011 	/* Iterate through hash list to get the peer */
2012 	peer = wlan_psoc_peer_list_peek_head(obj_list);
2013 	while (peer) {
2014 		wlan_peer_obj_lock(peer);
2015 		/* For peer, macaddr and pdev id are keys */
2016 		if ((WLAN_ADDR_EQ(wlan_peer_get_macaddr(peer), macaddr)
2017 			== QDF_STATUS_SUCCESS) &&
2018 				(wlan_peer_get_pdev_id(peer) == pdev_id)) {
2019 			/*
2020 			 *  if BSSID not NULL,
2021 			 *  then match is requested by caller, check BSSID
2022 			 *  (vdev mac == bssid) --  return peer
2023 			 *  (vdev mac != bssid) --  perform next iteration
2024 			 */
2025 			if ((!bssid) ||
2026 			    (wlan_peer_bssid_match(peer, bssid) ==
2027 				 QDF_STATUS_SUCCESS)) {
2028 				/* Return peer in logically deleted state */
2029 				if ((peer->obj_state ==
2030 					WLAN_OBJ_STATE_LOGICALLY_DELETED) &&
2031 				     qdf_atomic_read(
2032 						&peer->peer_objmgr.ref_cnt)) {
2033 					wlan_objmgr_peer_get_ref(peer, dbg_id);
2034 					wlan_peer_obj_unlock(peer);
2035 					lock_released = true;
2036 
2037 					peer_list =
2038 					qdf_mem_malloc(
2039 					sizeof(struct wlan_logically_del_peer));
2040 					if (!peer_list) {
2041 						wlan_objmgr_peer_release_ref(peer, dbg_id);
2042 						/* Lock is already released */
2043 						WLAN_OBJMGR_BUG(0);
2044 						break;
2045 					}
2046 
2047 					peer_list->peer = peer;
2048 
2049 					qdf_list_insert_front(
2050 						logical_del_peer_list,
2051 							&peer_list->list);
2052 				}
2053 			}
2054 		}
2055 
2056 		if (!lock_released)
2057 			wlan_peer_obj_unlock(peer);
2058 
2059 		/* Move to next peer */
2060 		peer_temp = peer;
2061 		peer = wlan_peer_get_next_peer_of_psoc(obj_list, peer_temp);
2062 		lock_released = false;
2063 	}
2064 
2065 	/* Not found, return NULL */
2066 	if (qdf_list_empty(logical_del_peer_list)) {
2067 		qdf_mem_free(logical_del_peer_list);
2068 		return NULL;
2069 	} else {
2070 		return logical_del_peer_list;
2071 	}
2072 }
2073 #endif
2074 
wlan_objmgr_psoc_peer_attach(struct wlan_objmgr_psoc * psoc,struct wlan_objmgr_peer * peer)2075 QDF_STATUS wlan_objmgr_psoc_peer_attach(struct wlan_objmgr_psoc *psoc,
2076 					struct wlan_objmgr_peer *peer)
2077 {
2078 	struct wlan_objmgr_psoc_objmgr *objmgr;
2079 	uint8_t hash_index;
2080 	struct wlan_peer_list *peer_list;
2081 
2082 	wlan_psoc_obj_lock(psoc);
2083 	objmgr = &psoc->soc_objmgr;
2084 	/* Max temporary peer limit is reached, return failure */
2085 	if (peer->peer_mlme.peer_type == WLAN_PEER_STA_TEMP ||
2086 	    peer->peer_mlme.peer_type == WLAN_PEER_MLO_TEMP) {
2087 		if (objmgr->temp_peer_count >= WLAN_MAX_PSOC_TEMP_PEERS) {
2088 			wlan_psoc_obj_unlock(psoc);
2089 			return QDF_STATUS_E_FAILURE;
2090 		}
2091 	} else {
2092 		/* Max peer limit is reached, return failure */
2093 		if (objmgr->wlan_peer_count
2094 			>= wlan_psoc_get_max_peer_count(psoc)) {
2095 			wlan_psoc_obj_unlock(psoc);
2096 			return QDF_STATUS_E_FAILURE;
2097 		}
2098 	}
2099 
2100 	/* Derive hash index from mac address */
2101 	hash_index = WLAN_PEER_HASH(peer->macaddr);
2102 	peer_list = &objmgr->peer_list;
2103 	/* psoc lock should be taken before list lock */
2104 	qdf_spin_lock_bh(&peer_list->peer_list_lock);
2105 	/* add peer to hash peer list */
2106 	wlan_obj_psoc_peerlist_add_tail(
2107 			&peer_list->peer_hash[hash_index],
2108 							peer);
2109 	qdf_spin_unlock_bh(&peer_list->peer_list_lock);
2110 	/* Increment peer count */
2111 	if (peer->peer_mlme.peer_type == WLAN_PEER_STA_TEMP ||
2112 	    peer->peer_mlme.peer_type == WLAN_PEER_MLO_TEMP)
2113 		objmgr->temp_peer_count++;
2114 	else
2115 		objmgr->wlan_peer_count++;
2116 
2117 	wlan_psoc_obj_unlock(psoc);
2118 
2119 	return QDF_STATUS_SUCCESS;
2120 }
2121 
wlan_objmgr_psoc_peer_detach(struct wlan_objmgr_psoc * psoc,struct wlan_objmgr_peer * peer)2122 QDF_STATUS wlan_objmgr_psoc_peer_detach(struct wlan_objmgr_psoc *psoc,
2123 					struct wlan_objmgr_peer *peer)
2124 {
2125 	struct wlan_objmgr_psoc_objmgr *objmgr;
2126 	uint8_t hash_index;
2127 	struct wlan_peer_list *peer_list;
2128 
2129 	wlan_psoc_obj_lock(psoc);
2130 	objmgr = &psoc->soc_objmgr;
2131 	/* if list is empty, return */
2132 	if (objmgr->wlan_peer_count == 0) {
2133 		wlan_psoc_obj_unlock(psoc);
2134 		return QDF_STATUS_E_FAILURE;
2135 	}
2136 	/* Get hash index, to locate the actual peer list */
2137 	hash_index = WLAN_PEER_HASH(peer->macaddr);
2138 	peer_list = &objmgr->peer_list;
2139 	/* psoc lock should be taken before list lock */
2140 	qdf_spin_lock_bh(&peer_list->peer_list_lock);
2141 	/* removes the peer from peer_list */
2142 	if (wlan_obj_psoc_peerlist_remove_peer(
2143 				&peer_list->peer_hash[hash_index],
2144 						peer) ==
2145 				QDF_STATUS_E_FAILURE) {
2146 		qdf_spin_unlock_bh(&peer_list->peer_list_lock);
2147 		wlan_psoc_obj_unlock(psoc);
2148 		obj_mgr_err("Failed to detach peer");
2149 		return QDF_STATUS_E_FAILURE;
2150 	}
2151 	qdf_spin_unlock_bh(&peer_list->peer_list_lock);
2152 	/* Decrement peer count */
2153 	if (peer->peer_mlme.peer_type == WLAN_PEER_STA_TEMP ||
2154 	    peer->peer_mlme.peer_type == WLAN_PEER_MLO_TEMP)
2155 		objmgr->temp_peer_count--;
2156 	else
2157 		objmgr->wlan_peer_count--;
2158 	wlan_psoc_obj_unlock(psoc);
2159 
2160 	return QDF_STATUS_SUCCESS;
2161 }
2162 
2163 #ifdef WLAN_OBJMGR_REF_ID_TRACE
wlan_objmgr_get_peer_debug(struct wlan_objmgr_psoc * psoc,uint8_t pdev_id,const uint8_t * macaddr,wlan_objmgr_ref_dbgid dbg_id,const char * func,int line)2164 struct wlan_objmgr_peer *wlan_objmgr_get_peer_debug(
2165 			struct wlan_objmgr_psoc *psoc, uint8_t pdev_id,
2166 			const uint8_t *macaddr, wlan_objmgr_ref_dbgid dbg_id,
2167 			const char *func, int line)
2168 {
2169 	struct wlan_objmgr_psoc_objmgr *objmgr;
2170 	uint8_t hash_index;
2171 	struct wlan_objmgr_peer *peer = NULL;
2172 	struct wlan_peer_list *peer_list;
2173 
2174 	if (pdev_id >= WLAN_UMAC_MAX_PDEVS)
2175 		QDF_ASSERT(0);
2176 
2177 	if (!macaddr)
2178 		return NULL;
2179 
2180 	/* psoc lock should be taken before peer list lock */
2181 	wlan_psoc_obj_lock(psoc);
2182 	objmgr = &psoc->soc_objmgr;
2183 	/* List is empty, return NULL */
2184 	if (objmgr->wlan_peer_count == 0) {
2185 		wlan_psoc_obj_unlock(psoc);
2186 		return NULL;
2187 	}
2188 	/* reduce the search window, with hash key */
2189 	hash_index = WLAN_PEER_HASH(macaddr);
2190 	peer_list = &objmgr->peer_list;
2191 	qdf_spin_lock_bh(&peer_list->peer_list_lock);
2192 	/* Iterate through peer list, get peer */
2193 	peer = wlan_obj_psoc_peerlist_get_peer_by_pdev_id_debug(
2194 		&peer_list->peer_hash[hash_index], macaddr,
2195 		pdev_id, dbg_id, func, line);
2196 	qdf_spin_unlock_bh(&peer_list->peer_list_lock);
2197 	wlan_psoc_obj_unlock(psoc);
2198 
2199 	return peer;
2200 }
2201 
2202 qdf_export_symbol(wlan_objmgr_get_peer_debug);
2203 #else
wlan_objmgr_get_peer(struct wlan_objmgr_psoc * psoc,uint8_t pdev_id,const uint8_t * macaddr,wlan_objmgr_ref_dbgid dbg_id)2204 struct wlan_objmgr_peer *wlan_objmgr_get_peer(
2205 			struct wlan_objmgr_psoc *psoc, uint8_t pdev_id,
2206 			const uint8_t *macaddr, wlan_objmgr_ref_dbgid dbg_id)
2207 {
2208 	struct wlan_objmgr_psoc_objmgr *objmgr;
2209 	uint8_t hash_index;
2210 	struct wlan_objmgr_peer *peer = NULL;
2211 	struct wlan_peer_list *peer_list;
2212 
2213 	if (pdev_id >= WLAN_UMAC_MAX_PDEVS)
2214 		QDF_ASSERT(0);
2215 
2216 	if (!macaddr)
2217 		return NULL;
2218 
2219 	/* psoc lock should be taken before peer list lock */
2220 	wlan_psoc_obj_lock(psoc);
2221 	objmgr = &psoc->soc_objmgr;
2222 	/* List is empty, return NULL */
2223 	if (objmgr->wlan_peer_count == 0) {
2224 		wlan_psoc_obj_unlock(psoc);
2225 		return NULL;
2226 	}
2227 	/* reduce the search window, with hash key */
2228 	hash_index = WLAN_PEER_HASH(macaddr);
2229 	peer_list = &objmgr->peer_list;
2230 	qdf_spin_lock_bh(&peer_list->peer_list_lock);
2231 	/* Iterate through peer list, get peer */
2232 	peer = wlan_obj_psoc_peerlist_get_peer_by_pdev_id(
2233 		&peer_list->peer_hash[hash_index], macaddr, pdev_id, dbg_id);
2234 	qdf_spin_unlock_bh(&peer_list->peer_list_lock);
2235 	wlan_psoc_obj_unlock(psoc);
2236 
2237 	return peer;
2238 }
2239 
2240 qdf_export_symbol(wlan_objmgr_get_peer);
2241 #endif
2242 
2243 #ifdef WLAN_OBJMGR_REF_ID_TRACE
wlan_objmgr_get_peer_by_mac_debug(struct wlan_objmgr_psoc * psoc,uint8_t * macaddr,wlan_objmgr_ref_dbgid dbg_id,const char * func,int line)2244 struct wlan_objmgr_peer *wlan_objmgr_get_peer_by_mac_debug(
2245 		struct wlan_objmgr_psoc *psoc, uint8_t *macaddr,
2246 		wlan_objmgr_ref_dbgid dbg_id,
2247 		const char *func, int line)
2248 {
2249 	struct wlan_objmgr_psoc_objmgr *objmgr;
2250 	uint8_t hash_index;
2251 	struct wlan_objmgr_peer *peer = NULL;
2252 	struct wlan_peer_list *peer_list;
2253 
2254 	if (!macaddr)
2255 		return NULL;
2256 	if (!psoc)
2257 		return NULL;
2258 
2259 	/* psoc lock should be taken before peer list lock */
2260 	wlan_psoc_obj_lock(psoc);
2261 	objmgr = &psoc->soc_objmgr;
2262 	/* List is empty, return NULL */
2263 	if (objmgr->wlan_peer_count == 0) {
2264 		wlan_psoc_obj_unlock(psoc);
2265 		return NULL;
2266 	}
2267 	/* reduce the search window, with hash key */
2268 	hash_index = WLAN_PEER_HASH(macaddr);
2269 	peer_list = &objmgr->peer_list;
2270 	qdf_spin_lock_bh(&peer_list->peer_list_lock);
2271 	/* Iterate through peer list, get peer */
2272 	peer = wlan_obj_psoc_peerlist_get_peer_debug(
2273 			&peer_list->peer_hash[hash_index],
2274 			macaddr, dbg_id, func, line);
2275 	qdf_spin_unlock_bh(&peer_list->peer_list_lock);
2276 	wlan_psoc_obj_unlock(psoc);
2277 
2278 	return peer;
2279 }
2280 
2281 qdf_export_symbol(wlan_objmgr_get_peer_by_mac_debug);
2282 #else
wlan_objmgr_get_peer_by_mac(struct wlan_objmgr_psoc * psoc,uint8_t * macaddr,wlan_objmgr_ref_dbgid dbg_id)2283 struct wlan_objmgr_peer *wlan_objmgr_get_peer_by_mac(
2284 		struct wlan_objmgr_psoc *psoc, uint8_t *macaddr,
2285 		wlan_objmgr_ref_dbgid dbg_id)
2286 {
2287 	struct wlan_objmgr_psoc_objmgr *objmgr;
2288 	uint8_t hash_index;
2289 	struct wlan_objmgr_peer *peer = NULL;
2290 	struct wlan_peer_list *peer_list;
2291 
2292 	if (!macaddr)
2293 		return NULL;
2294 	if (!psoc)
2295 		return NULL;
2296 
2297 	/* psoc lock should be taken before peer list lock */
2298 	wlan_psoc_obj_lock(psoc);
2299 	objmgr = &psoc->soc_objmgr;
2300 	/* List is empty, return NULL */
2301 	if (objmgr->wlan_peer_count == 0) {
2302 		wlan_psoc_obj_unlock(psoc);
2303 		return NULL;
2304 	}
2305 	/* reduce the search window, with hash key */
2306 	hash_index = WLAN_PEER_HASH(macaddr);
2307 	peer_list = &objmgr->peer_list;
2308 	qdf_spin_lock_bh(&peer_list->peer_list_lock);
2309 	/* Iterate through peer list, get peer */
2310 	peer = wlan_obj_psoc_peerlist_get_peer(
2311 			&peer_list->peer_hash[hash_index], macaddr, dbg_id);
2312 	qdf_spin_unlock_bh(&peer_list->peer_list_lock);
2313 	wlan_psoc_obj_unlock(psoc);
2314 
2315 	return peer;
2316 }
2317 
2318 qdf_export_symbol(wlan_objmgr_get_peer_by_mac);
2319 #endif
2320 
2321 #ifdef WLAN_OBJMGR_REF_ID_TRACE
wlan_objmgr_get_peer_logically_deleted_debug(struct wlan_objmgr_psoc * psoc,uint8_t * macaddr,wlan_objmgr_ref_dbgid dbg_id,const char * func,int line)2322 struct wlan_objmgr_peer *wlan_objmgr_get_peer_logically_deleted_debug(
2323 			struct wlan_objmgr_psoc *psoc, uint8_t *macaddr,
2324 			wlan_objmgr_ref_dbgid dbg_id,
2325 			const char *func, int line)
2326 {
2327 	struct wlan_objmgr_psoc_objmgr *objmgr;
2328 	uint8_t hash_index;
2329 	struct wlan_objmgr_peer *peer = NULL;
2330 	struct wlan_peer_list *peer_list;
2331 
2332 	/* psoc lock should be taken before peer list lock */
2333 	wlan_psoc_obj_lock(psoc);
2334 	objmgr = &psoc->soc_objmgr;
2335 	/* List is empty, return NULL */
2336 	if (objmgr->wlan_peer_count == 0) {
2337 		wlan_psoc_obj_unlock(psoc);
2338 		return NULL;
2339 	}
2340 	/* reduce the search window, with hash key */
2341 	hash_index = WLAN_PEER_HASH(macaddr);
2342 	peer_list = &objmgr->peer_list;
2343 	qdf_spin_lock_bh(&peer_list->peer_list_lock);
2344 	/* Iterate through peer list, get peer */
2345 	peer = wlan_obj_psoc_peerlist_get_peer_logically_deleted_debug(
2346 		&peer_list->peer_hash[hash_index], macaddr, dbg_id,
2347 		func, line);
2348 	qdf_spin_unlock_bh(&peer_list->peer_list_lock);
2349 	wlan_psoc_obj_unlock(psoc);
2350 
2351 	return peer;
2352 }
2353 #else
wlan_objmgr_get_peer_logically_deleted(struct wlan_objmgr_psoc * psoc,uint8_t * macaddr,wlan_objmgr_ref_dbgid dbg_id)2354 struct wlan_objmgr_peer *wlan_objmgr_get_peer_logically_deleted(
2355 			struct wlan_objmgr_psoc *psoc, uint8_t *macaddr,
2356 			wlan_objmgr_ref_dbgid dbg_id)
2357 {
2358 	struct wlan_objmgr_psoc_objmgr *objmgr;
2359 	uint8_t hash_index;
2360 	struct wlan_objmgr_peer *peer = NULL;
2361 	struct wlan_peer_list *peer_list;
2362 
2363 	/* psoc lock should be taken before peer list lock */
2364 	wlan_psoc_obj_lock(psoc);
2365 	objmgr = &psoc->soc_objmgr;
2366 	/* List is empty, return NULL */
2367 	if (objmgr->wlan_peer_count == 0) {
2368 		wlan_psoc_obj_unlock(psoc);
2369 		return NULL;
2370 	}
2371 	/* reduce the search window, with hash key */
2372 	hash_index = WLAN_PEER_HASH(macaddr);
2373 	peer_list = &objmgr->peer_list;
2374 	qdf_spin_lock_bh(&peer_list->peer_list_lock);
2375 	/* Iterate through peer list, get peer */
2376 	peer = wlan_obj_psoc_peerlist_get_peer_logically_deleted(
2377 		&peer_list->peer_hash[hash_index], macaddr, dbg_id);
2378 	qdf_spin_unlock_bh(&peer_list->peer_list_lock);
2379 	wlan_psoc_obj_unlock(psoc);
2380 
2381 	return peer;
2382 }
2383 #endif
2384 
2385 #ifdef WLAN_OBJMGR_REF_ID_TRACE
wlan_objmgr_get_peer_by_mac_n_vdev_no_state_debug(struct wlan_objmgr_psoc * psoc,uint8_t pdev_id,uint8_t * bssid,uint8_t * macaddr,wlan_objmgr_ref_dbgid dbg_id,const char * func,int line)2386 struct wlan_objmgr_peer *wlan_objmgr_get_peer_by_mac_n_vdev_no_state_debug(
2387 			struct wlan_objmgr_psoc *psoc, uint8_t pdev_id,
2388 			uint8_t *bssid, uint8_t *macaddr,
2389 			wlan_objmgr_ref_dbgid dbg_id,
2390 			const char *func, int line)
2391 {
2392 	struct wlan_objmgr_psoc_objmgr *objmgr;
2393 	uint8_t hash_index;
2394 	struct wlan_objmgr_peer *peer = NULL;
2395 	struct wlan_peer_list *peer_list;
2396 
2397 	/* psoc lock should be taken before peer list lock */
2398 	wlan_psoc_obj_lock(psoc);
2399 	objmgr = &psoc->soc_objmgr;
2400 	/* List is empty, return NULL */
2401 	if (objmgr->wlan_peer_count == 0) {
2402 		wlan_psoc_obj_unlock(psoc);
2403 		return NULL;
2404 	}
2405 	/* reduce the search window, with hash key */
2406 	hash_index = WLAN_PEER_HASH(macaddr);
2407 	peer_list = &objmgr->peer_list;
2408 	qdf_spin_lock_bh(&peer_list->peer_list_lock);
2409 	/* Iterate through peer list, get peer */
2410 	peer = wlan_obj_psoc_peerlist_get_peer_by_mac_n_bssid_no_state_debug(
2411 		&peer_list->peer_hash[hash_index], macaddr, bssid,
2412 		pdev_id, dbg_id, func, line);
2413 	qdf_spin_unlock_bh(&peer_list->peer_list_lock);
2414 	wlan_psoc_obj_unlock(psoc);
2415 
2416 	return peer;
2417 }
2418 
2419 qdf_export_symbol(wlan_objmgr_get_peer_by_mac_n_vdev_no_state_debug);
2420 #else
wlan_objmgr_get_peer_by_mac_n_vdev_no_state(struct wlan_objmgr_psoc * psoc,uint8_t pdev_id,uint8_t * bssid,uint8_t * macaddr,wlan_objmgr_ref_dbgid dbg_id)2421 struct wlan_objmgr_peer *wlan_objmgr_get_peer_by_mac_n_vdev_no_state(
2422 			struct wlan_objmgr_psoc *psoc, uint8_t pdev_id,
2423 			uint8_t *bssid, uint8_t *macaddr,
2424 			wlan_objmgr_ref_dbgid dbg_id)
2425 {
2426 	struct wlan_objmgr_psoc_objmgr *objmgr;
2427 	uint8_t hash_index;
2428 	struct wlan_objmgr_peer *peer = NULL;
2429 	struct wlan_peer_list *peer_list;
2430 
2431 	/* psoc lock should be taken before peer list lock */
2432 	wlan_psoc_obj_lock(psoc);
2433 	objmgr = &psoc->soc_objmgr;
2434 	/* List is empty, return NULL */
2435 	if (objmgr->wlan_peer_count == 0) {
2436 		wlan_psoc_obj_unlock(psoc);
2437 		return NULL;
2438 	}
2439 	/* reduce the search window, with hash key */
2440 	hash_index = WLAN_PEER_HASH(macaddr);
2441 	peer_list = &objmgr->peer_list;
2442 	qdf_spin_lock_bh(&peer_list->peer_list_lock);
2443 	/* Iterate through peer list, get peer */
2444 	peer = wlan_obj_psoc_peerlist_get_peer_by_mac_n_bssid_no_state(
2445 		&peer_list->peer_hash[hash_index], macaddr, bssid,
2446 		pdev_id, dbg_id);
2447 	qdf_spin_unlock_bh(&peer_list->peer_list_lock);
2448 	wlan_psoc_obj_unlock(psoc);
2449 
2450 	return peer;
2451 }
2452 
2453 qdf_export_symbol(wlan_objmgr_get_peer_by_mac_n_vdev_no_state);
2454 #endif
2455 
2456 #ifdef WLAN_OBJMGR_REF_ID_TRACE
wlan_objmgr_get_peer_by_mac_n_vdev_debug(struct wlan_objmgr_psoc * psoc,uint8_t pdev_id,uint8_t * bssid,uint8_t * macaddr,wlan_objmgr_ref_dbgid dbg_id,const char * func,int line)2457 struct wlan_objmgr_peer *wlan_objmgr_get_peer_by_mac_n_vdev_debug(
2458 			struct wlan_objmgr_psoc *psoc, uint8_t pdev_id,
2459 			uint8_t *bssid, uint8_t *macaddr,
2460 			wlan_objmgr_ref_dbgid dbg_id,
2461 			const char *func, int line)
2462 {
2463 	struct wlan_objmgr_psoc_objmgr *objmgr;
2464 	uint8_t hash_index;
2465 	struct wlan_objmgr_peer *peer = NULL;
2466 	struct wlan_peer_list *peer_list;
2467 
2468 	/* psoc lock should be taken before peer list lock */
2469 	wlan_psoc_obj_lock(psoc);
2470 	objmgr = &psoc->soc_objmgr;
2471 	/* List is empty, return NULL */
2472 	if (objmgr->wlan_peer_count == 0) {
2473 		wlan_psoc_obj_unlock(psoc);
2474 		return NULL;
2475 	}
2476 	/* reduce the search window, with hash key */
2477 	hash_index = WLAN_PEER_HASH(macaddr);
2478 	peer_list = &objmgr->peer_list;
2479 	qdf_spin_lock_bh(&peer_list->peer_list_lock);
2480 	/* Iterate through peer list, get peer */
2481 	peer = wlan_obj_psoc_peerlist_get_peer_by_mac_n_bssid_debug(
2482 		&peer_list->peer_hash[hash_index], macaddr, bssid,
2483 		pdev_id, dbg_id, func, line);
2484 	qdf_spin_unlock_bh(&peer_list->peer_list_lock);
2485 	wlan_psoc_obj_unlock(psoc);
2486 
2487 	return peer;
2488 }
2489 
2490 qdf_export_symbol(wlan_objmgr_get_peer_by_mac_n_vdev_debug);
2491 #else
wlan_objmgr_get_peer_by_mac_n_vdev(struct wlan_objmgr_psoc * psoc,uint8_t pdev_id,uint8_t * bssid,uint8_t * macaddr,wlan_objmgr_ref_dbgid dbg_id)2492 struct wlan_objmgr_peer *wlan_objmgr_get_peer_by_mac_n_vdev(
2493 			struct wlan_objmgr_psoc *psoc, uint8_t pdev_id,
2494 			uint8_t *bssid, uint8_t *macaddr,
2495 			wlan_objmgr_ref_dbgid dbg_id)
2496 {
2497 	struct wlan_objmgr_psoc_objmgr *objmgr;
2498 	uint8_t hash_index;
2499 	struct wlan_objmgr_peer *peer = NULL;
2500 	struct wlan_peer_list *peer_list;
2501 
2502 	/* psoc lock should be taken before peer list lock */
2503 	wlan_psoc_obj_lock(psoc);
2504 	objmgr = &psoc->soc_objmgr;
2505 	/* List is empty, return NULL */
2506 	if (objmgr->wlan_peer_count == 0) {
2507 		wlan_psoc_obj_unlock(psoc);
2508 		return NULL;
2509 	}
2510 	/* reduce the search window, with hash key */
2511 	hash_index = WLAN_PEER_HASH(macaddr);
2512 	peer_list = &objmgr->peer_list;
2513 	qdf_spin_lock_bh(&peer_list->peer_list_lock);
2514 	/* Iterate through peer list, get peer */
2515 	peer = wlan_obj_psoc_peerlist_get_peer_by_mac_n_bssid(
2516 		&peer_list->peer_hash[hash_index], macaddr, bssid,
2517 		pdev_id, dbg_id);
2518 	qdf_spin_unlock_bh(&peer_list->peer_list_lock);
2519 	wlan_psoc_obj_unlock(psoc);
2520 
2521 	return peer;
2522 }
2523 
2524 qdf_export_symbol(wlan_objmgr_get_peer_by_mac_n_vdev);
2525 #endif
2526 
2527 #ifdef WLAN_OBJMGR_REF_ID_TRACE
wlan_objmgr_get_peer_nolock_debug(struct wlan_objmgr_psoc * psoc,uint8_t pdev_id,uint8_t * macaddr,wlan_objmgr_ref_dbgid dbg_id,const char * func,int line)2528 struct wlan_objmgr_peer *wlan_objmgr_get_peer_nolock_debug(
2529 			struct wlan_objmgr_psoc *psoc, uint8_t pdev_id,
2530 			uint8_t *macaddr, wlan_objmgr_ref_dbgid dbg_id,
2531 			const char *func, int line)
2532 {
2533 	struct wlan_objmgr_psoc_objmgr *objmgr;
2534 	uint8_t hash_index;
2535 	struct wlan_objmgr_peer *peer = NULL;
2536 	struct wlan_peer_list *peer_list;
2537 
2538 	/* psoc lock should be taken before peer list lock */
2539 	objmgr = &psoc->soc_objmgr;
2540 	/* List is empty, return NULL */
2541 	if (objmgr->wlan_peer_count == 0)
2542 		return NULL;
2543 
2544 	/* reduce the search window, with hash key */
2545 	hash_index = WLAN_PEER_HASH(macaddr);
2546 	peer_list = &objmgr->peer_list;
2547 	/* Iterate through peer list, get peer */
2548 	peer = wlan_obj_psoc_peerlist_get_peer_by_pdev_id_debug(
2549 		&peer_list->peer_hash[hash_index], macaddr,
2550 		pdev_id, dbg_id, func, line);
2551 
2552 	return peer;
2553 }
2554 
2555 qdf_export_symbol(wlan_objmgr_get_peer_nolock_debug);
2556 #else
wlan_objmgr_get_peer_nolock(struct wlan_objmgr_psoc * psoc,uint8_t pdev_id,uint8_t * macaddr,wlan_objmgr_ref_dbgid dbg_id)2557 struct wlan_objmgr_peer *wlan_objmgr_get_peer_nolock(
2558 			struct wlan_objmgr_psoc *psoc, uint8_t pdev_id,
2559 			uint8_t *macaddr, wlan_objmgr_ref_dbgid dbg_id)
2560 {
2561 	struct wlan_objmgr_psoc_objmgr *objmgr;
2562 	uint8_t hash_index;
2563 	struct wlan_objmgr_peer *peer = NULL;
2564 	struct wlan_peer_list *peer_list;
2565 
2566 	/* psoc lock should be taken before peer list lock */
2567 	objmgr = &psoc->soc_objmgr;
2568 	/* List is empty, return NULL */
2569 	if (objmgr->wlan_peer_count == 0)
2570 		return NULL;
2571 
2572 	/* reduce the search window, with hash key */
2573 	hash_index = WLAN_PEER_HASH(macaddr);
2574 	peer_list = &objmgr->peer_list;
2575 	/* Iterate through peer list, get peer */
2576 	peer = wlan_obj_psoc_peerlist_get_peer_by_pdev_id(
2577 		&peer_list->peer_hash[hash_index], macaddr, pdev_id, dbg_id);
2578 
2579 	return peer;
2580 }
2581 
2582 qdf_export_symbol(wlan_objmgr_get_peer_nolock);
2583 #endif
2584 
2585 #ifdef WLAN_OBJMGR_REF_ID_TRACE
wlan_objmgr_get_peer_no_state_debug(struct wlan_objmgr_psoc * psoc,uint8_t pdev_id,uint8_t * macaddr,wlan_objmgr_ref_dbgid dbg_id,const char * func,int line)2586 struct wlan_objmgr_peer *wlan_objmgr_get_peer_no_state_debug(
2587 			struct wlan_objmgr_psoc *psoc, uint8_t pdev_id,
2588 			uint8_t *macaddr, wlan_objmgr_ref_dbgid dbg_id,
2589 			const char *func, int line)
2590 {
2591 	struct wlan_objmgr_psoc_objmgr *objmgr;
2592 	uint8_t hash_index;
2593 	struct wlan_objmgr_peer *peer = NULL;
2594 	struct wlan_peer_list *peer_list;
2595 
2596 	/* psoc lock should be taken before peer list lock */
2597 	wlan_psoc_obj_lock(psoc);
2598 	objmgr = &psoc->soc_objmgr;
2599 	/* List is empty, return NULL */
2600 	if (objmgr->wlan_peer_count == 0) {
2601 		wlan_psoc_obj_unlock(psoc);
2602 		return NULL;
2603 	}
2604 	/* reduce the search window, with hash key */
2605 	hash_index = WLAN_PEER_HASH(macaddr);
2606 	peer_list = &objmgr->peer_list;
2607 	qdf_spin_lock_bh(&peer_list->peer_list_lock);
2608 	/* Iterate through peer list, get peer */
2609 	peer = wlan_obj_psoc_peerlist_get_peer_no_state_debug(
2610 		&peer_list->peer_hash[hash_index], macaddr,
2611 		pdev_id, dbg_id, func, line);
2612 	qdf_spin_unlock_bh(&peer_list->peer_list_lock);
2613 	wlan_psoc_obj_unlock(psoc);
2614 
2615 	return peer;
2616 }
2617 
2618 qdf_export_symbol(wlan_objmgr_get_peer_no_state_debug);
2619 #else
wlan_objmgr_get_peer_no_state(struct wlan_objmgr_psoc * psoc,uint8_t pdev_id,uint8_t * macaddr,wlan_objmgr_ref_dbgid dbg_id)2620 struct wlan_objmgr_peer *wlan_objmgr_get_peer_no_state(
2621 			struct wlan_objmgr_psoc *psoc, uint8_t pdev_id,
2622 			uint8_t *macaddr, wlan_objmgr_ref_dbgid dbg_id)
2623 {
2624 	struct wlan_objmgr_psoc_objmgr *objmgr;
2625 	uint8_t hash_index;
2626 	struct wlan_objmgr_peer *peer = NULL;
2627 	struct wlan_peer_list *peer_list;
2628 
2629 	/* psoc lock should be taken before peer list lock */
2630 	wlan_psoc_obj_lock(psoc);
2631 	objmgr = &psoc->soc_objmgr;
2632 	/* List is empty, return NULL */
2633 	if (objmgr->wlan_peer_count == 0) {
2634 		wlan_psoc_obj_unlock(psoc);
2635 		return NULL;
2636 	}
2637 	/* reduce the search window, with hash key */
2638 	hash_index = WLAN_PEER_HASH(macaddr);
2639 	peer_list = &objmgr->peer_list;
2640 	qdf_spin_lock_bh(&peer_list->peer_list_lock);
2641 	/* Iterate through peer list, get peer */
2642 	peer = wlan_obj_psoc_peerlist_get_peer_no_state(
2643 		&peer_list->peer_hash[hash_index], macaddr, pdev_id, dbg_id);
2644 	qdf_spin_unlock_bh(&peer_list->peer_list_lock);
2645 	wlan_psoc_obj_unlock(psoc);
2646 
2647 	return peer;
2648 }
2649 
2650 qdf_export_symbol(wlan_objmgr_get_peer_no_state);
2651 #endif
2652 
2653 #ifdef WLAN_OBJMGR_REF_ID_TRACE
wlan_objmgr_populate_logically_deleted_peerlist_by_mac_n_vdev_debug(struct wlan_objmgr_psoc * psoc,uint8_t pdev_id,uint8_t * bssid,uint8_t * macaddr,wlan_objmgr_ref_dbgid dbg_id,const char * func,int line)2654 qdf_list_t *wlan_objmgr_populate_logically_deleted_peerlist_by_mac_n_vdev_debug(
2655 			struct wlan_objmgr_psoc *psoc, uint8_t pdev_id,
2656 			uint8_t *bssid, uint8_t *macaddr,
2657 			wlan_objmgr_ref_dbgid dbg_id,
2658 			const char *func, int line)
2659 {
2660 	struct wlan_objmgr_psoc_objmgr *objmgr;
2661 	uint8_t hash_index;
2662 	struct wlan_peer_list *peer_list = NULL;
2663 	qdf_list_t *logical_del_peer_list = NULL;
2664 
2665 	/* psoc lock should be taken before peer list lock */
2666 	wlan_psoc_obj_lock(psoc);
2667 	objmgr = &psoc->soc_objmgr;
2668 	/* List is empty, return NULL */
2669 	if (objmgr->wlan_peer_count == 0) {
2670 		wlan_psoc_obj_unlock(psoc);
2671 		return NULL;
2672 	}
2673 	/* reduce the search window, with hash key */
2674 	hash_index = WLAN_PEER_HASH(macaddr);
2675 	peer_list = &objmgr->peer_list;
2676 	qdf_spin_lock_bh(&peer_list->peer_list_lock);
2677 
2678 	/* Iterate through peer list, get peer */
2679 	logical_del_peer_list =
2680 	wlan_obj_psoc_populate_logically_del_peerlist_by_mac_n_bssid_debug(
2681 			&peer_list->peer_hash[hash_index], macaddr,
2682 			bssid, pdev_id, dbg_id, func, line);
2683 
2684 	qdf_spin_unlock_bh(&peer_list->peer_list_lock);
2685 	wlan_psoc_obj_unlock(psoc);
2686 
2687 	return logical_del_peer_list;
2688 }
2689 
2690 qdf_export_symbol(wlan_objmgr_populate_logically_deleted_peerlist_by_mac_n_vdev_debug);
2691 #else
wlan_objmgr_populate_logically_deleted_peerlist_by_mac_n_vdev(struct wlan_objmgr_psoc * psoc,uint8_t pdev_id,uint8_t * bssid,uint8_t * macaddr,wlan_objmgr_ref_dbgid dbg_id)2692 qdf_list_t *wlan_objmgr_populate_logically_deleted_peerlist_by_mac_n_vdev(
2693 			struct wlan_objmgr_psoc *psoc, uint8_t pdev_id,
2694 			uint8_t *bssid, uint8_t *macaddr,
2695 			wlan_objmgr_ref_dbgid dbg_id)
2696 {
2697 	struct wlan_objmgr_psoc_objmgr *objmgr;
2698 	uint8_t hash_index;
2699 	struct wlan_peer_list *peer_list = NULL;
2700 	qdf_list_t *logical_del_peer_list = NULL;
2701 
2702 	/* psoc lock should be taken before peer list lock */
2703 	wlan_psoc_obj_lock(psoc);
2704 	objmgr = &psoc->soc_objmgr;
2705 	/* List is empty, return NULL */
2706 	if (objmgr->wlan_peer_count == 0) {
2707 		wlan_psoc_obj_unlock(psoc);
2708 		return NULL;
2709 	}
2710 	/* reduce the search window, with hash key */
2711 	hash_index = WLAN_PEER_HASH(macaddr);
2712 	peer_list = &objmgr->peer_list;
2713 	qdf_spin_lock_bh(&peer_list->peer_list_lock);
2714 
2715 	/* Iterate through peer list, get peer */
2716 	logical_del_peer_list =
2717 		wlan_obj_psoc_populate_logically_del_peerlist_by_mac_n_bssid(
2718 			&peer_list->peer_hash[hash_index], macaddr,
2719 			bssid, pdev_id, dbg_id);
2720 
2721 	qdf_spin_unlock_bh(&peer_list->peer_list_lock);
2722 	wlan_psoc_obj_unlock(psoc);
2723 
2724 	return logical_del_peer_list;
2725 }
2726 
2727 qdf_export_symbol(wlan_objmgr_populate_logically_deleted_peerlist_by_mac_n_vdev);
2728 #endif
2729 
wlan_objmgr_psoc_get_comp_private_obj(struct wlan_objmgr_psoc * psoc,enum wlan_umac_comp_id id)2730 void *wlan_objmgr_psoc_get_comp_private_obj(struct wlan_objmgr_psoc *psoc,
2731 					enum wlan_umac_comp_id id)
2732 {
2733 	void *comp_private_obj;
2734 
2735 	/* component id is invalid */
2736 	if (id >= WLAN_UMAC_MAX_COMPONENTS) {
2737 		QDF_BUG(0);
2738 		return NULL;
2739 	}
2740 
2741 	if (!psoc) {
2742 		QDF_BUG(0);
2743 		return NULL;
2744 	}
2745 
2746 	comp_private_obj = psoc->soc_comp_priv_obj[id];
2747 
2748 	return comp_private_obj;
2749 }
2750 qdf_export_symbol(wlan_objmgr_psoc_get_comp_private_obj);
2751 
wlan_objmgr_psoc_get_ref(struct wlan_objmgr_psoc * psoc,wlan_objmgr_ref_dbgid id)2752 void wlan_objmgr_psoc_get_ref(struct wlan_objmgr_psoc *psoc,
2753 						wlan_objmgr_ref_dbgid id)
2754 {
2755 	if (!psoc) {
2756 		obj_mgr_err("psoc obj is NULL for id:%d", id);
2757 		QDF_ASSERT(0);
2758 		return;
2759 	}
2760 	/* Increment ref count */
2761 	qdf_atomic_inc(&psoc->soc_objmgr.ref_cnt);
2762 	qdf_atomic_inc(&psoc->soc_objmgr.ref_id_dbg[id]);
2763 	return;
2764 }
2765 qdf_export_symbol(wlan_objmgr_psoc_get_ref);
2766 
wlan_objmgr_psoc_try_get_ref(struct wlan_objmgr_psoc * psoc,wlan_objmgr_ref_dbgid id)2767 QDF_STATUS wlan_objmgr_psoc_try_get_ref(struct wlan_objmgr_psoc *psoc,
2768 						wlan_objmgr_ref_dbgid id)
2769 {
2770 	if (!psoc) {
2771 		obj_mgr_err("psoc obj is NULL for id:%d", id);
2772 		QDF_ASSERT(0);
2773 		return QDF_STATUS_E_FAILURE;
2774 	}
2775 
2776 	wlan_psoc_obj_lock(psoc);
2777 	if (psoc->obj_state != WLAN_OBJ_STATE_CREATED) {
2778 		wlan_psoc_obj_unlock(psoc);
2779 		if (psoc->soc_objmgr.print_cnt++ <=
2780 				WLAN_OBJMGR_RATELIMIT_THRESH)
2781 			obj_mgr_err(
2782 			"[Ref id: %d] psoc is not in Created state(%d)",
2783 					id, psoc->obj_state);
2784 
2785 		return QDF_STATUS_E_RESOURCES;
2786 	}
2787 
2788 	/* Increment ref count */
2789 	wlan_objmgr_psoc_get_ref(psoc, id);
2790 	wlan_psoc_obj_unlock(psoc);
2791 
2792 	return QDF_STATUS_SUCCESS;
2793 }
2794 qdf_export_symbol(wlan_objmgr_psoc_try_get_ref);
2795 
wlan_objmgr_psoc_release_ref(struct wlan_objmgr_psoc * psoc,wlan_objmgr_ref_dbgid id)2796 void wlan_objmgr_psoc_release_ref(struct wlan_objmgr_psoc *psoc,
2797 						wlan_objmgr_ref_dbgid id)
2798 {
2799 	if (!psoc) {
2800 		obj_mgr_err("psoc obj is NULL for id:%d", id);
2801 		QDF_ASSERT(0);
2802 		return;
2803 	}
2804 
2805 	if (!qdf_atomic_read(&psoc->soc_objmgr.ref_id_dbg[id])) {
2806 		obj_mgr_err("psoc ref cnt was not taken by %d", id);
2807 		wlan_objmgr_print_ref_ids(psoc->soc_objmgr.ref_id_dbg,
2808 					  QDF_TRACE_LEVEL_FATAL);
2809 		WLAN_OBJMGR_BUG(0);
2810 	}
2811 
2812 	if (!qdf_atomic_read(&psoc->soc_objmgr.ref_cnt)) {
2813 		obj_mgr_err("psoc ref cnt is 0");
2814 		WLAN_OBJMGR_BUG(0);
2815 		return;
2816 	}
2817 
2818 	qdf_atomic_dec(&psoc->soc_objmgr.ref_id_dbg[id]);
2819 	/* Decrement ref count, free psoc, if ref count == 0 */
2820 	if (qdf_atomic_dec_and_test(&psoc->soc_objmgr.ref_cnt))
2821 		wlan_objmgr_psoc_obj_destroy(psoc);
2822 
2823 	return;
2824 }
2825 qdf_export_symbol(wlan_objmgr_psoc_release_ref);
2826 
wlan_objmgr_psoc_peer_ref_print(struct wlan_objmgr_psoc * psoc,void * obj,void * args)2827 static void wlan_objmgr_psoc_peer_ref_print(struct wlan_objmgr_psoc *psoc,
2828 					 void *obj, void *args)
2829 {
2830 	struct wlan_objmgr_peer *peer = (struct wlan_objmgr_peer *)obj;
2831 	WLAN_OBJ_STATE obj_state;
2832 	uint8_t vdev_id;
2833 	uint8_t *macaddr;
2834 
2835 	wlan_peer_obj_lock(peer);
2836 	macaddr = wlan_peer_get_macaddr(peer);
2837 	obj_state = peer->obj_state;
2838 	vdev_id = wlan_vdev_get_id(wlan_peer_get_vdev(peer));
2839 	wlan_peer_obj_unlock(peer);
2840 
2841 	obj_mgr_alert("Peer MAC:" QDF_MAC_ADDR_FMT "state:%d vdev_id:%d",
2842 		      QDF_MAC_ADDR_REF(macaddr), obj_state, vdev_id);
2843 	wlan_objmgr_print_peer_ref_ids(peer, QDF_TRACE_LEVEL_FATAL);
2844 }
2845 
wlan_objmgr_psoc_vdev_ref_print(struct wlan_objmgr_psoc * psoc,void * obj,void * args)2846 static void wlan_objmgr_psoc_vdev_ref_print(struct wlan_objmgr_psoc *psoc,
2847 					 void *obj, void *args)
2848 {
2849 	struct wlan_objmgr_vdev *vdev = (struct wlan_objmgr_vdev *)obj;
2850 	WLAN_OBJ_STATE obj_state;
2851 	uint8_t id;
2852 
2853 	wlan_vdev_obj_lock(vdev);
2854 	id = wlan_vdev_get_id(vdev);
2855 	obj_state =  vdev->obj_state;
2856 	wlan_vdev_obj_unlock(vdev);
2857 	obj_mgr_alert("Vdev ID is %d, state %d", id, obj_state);
2858 
2859 	wlan_objmgr_print_ref_ids(vdev->vdev_objmgr.ref_id_dbg,
2860 				  QDF_TRACE_LEVEL_FATAL);
2861 }
2862 
wlan_objmgr_psoc_pdev_ref_print(struct wlan_objmgr_psoc * psoc,void * obj,void * args)2863 static void wlan_objmgr_psoc_pdev_ref_print(struct wlan_objmgr_psoc *psoc,
2864 					 void *obj, void *args)
2865 {
2866 	struct wlan_objmgr_pdev *pdev = (struct wlan_objmgr_pdev *)obj;
2867 	uint8_t id;
2868 
2869 	wlan_pdev_obj_lock(pdev);
2870 	id = wlan_objmgr_pdev_get_pdev_id(pdev);
2871 	wlan_pdev_obj_unlock(pdev);
2872 	obj_mgr_alert("pdev ID is %d", id);
2873 
2874 	wlan_objmgr_print_ref_ids(pdev->pdev_objmgr.ref_id_dbg,
2875 				  QDF_TRACE_LEVEL_FATAL);
2876 }
2877 
wlan_objmgr_print_ref_all_objects_per_psoc(struct wlan_objmgr_psoc * psoc)2878 QDF_STATUS wlan_objmgr_print_ref_all_objects_per_psoc(
2879 		struct wlan_objmgr_psoc *psoc)
2880 {
2881 	obj_mgr_alert("Ref counts of PEER");
2882 	wlan_objmgr_iterate_obj_list_all_noref(psoc, WLAN_PEER_OP,
2883 				wlan_objmgr_psoc_peer_ref_print, NULL);
2884 	obj_mgr_alert("Ref counts of VDEV");
2885 	wlan_objmgr_iterate_obj_list_all_noref(psoc, WLAN_VDEV_OP,
2886 				wlan_objmgr_psoc_vdev_ref_print, NULL);
2887 	obj_mgr_alert("Ref counts of PDEV");
2888 	wlan_objmgr_iterate_obj_list_all_noref(psoc, WLAN_PDEV_OP,
2889 				wlan_objmgr_psoc_pdev_ref_print, NULL);
2890 
2891 	obj_mgr_alert(" Ref counts of PSOC");
2892 	wlan_objmgr_print_ref_ids(psoc->soc_objmgr.ref_id_dbg,
2893 				  QDF_TRACE_LEVEL_FATAL);
2894 
2895 	return QDF_STATUS_SUCCESS;
2896 }
2897 qdf_export_symbol(wlan_objmgr_print_ref_all_objects_per_psoc);
2898 
wlan_objmgr_psoc_set_user_config(struct wlan_objmgr_psoc * psoc,struct wlan_objmgr_psoc_user_config * user_config_data)2899 QDF_STATUS wlan_objmgr_psoc_set_user_config(struct wlan_objmgr_psoc *psoc,
2900 		struct wlan_objmgr_psoc_user_config *user_config_data)
2901 {
2902 	if (!user_config_data) {
2903 		obj_mgr_err("user_config_data is NULL");
2904 		QDF_BUG(0);
2905 		return QDF_STATUS_E_FAILURE;
2906 	}
2907 	wlan_psoc_obj_lock(psoc);
2908 	qdf_mem_copy(&psoc->soc_nif.user_config, user_config_data,
2909 		     sizeof(psoc->soc_nif.user_config));
2910 	wlan_psoc_obj_unlock(psoc);
2911 
2912 	return QDF_STATUS_SUCCESS;
2913 }
2914 
wlan_objmgr_psoc_check_for_pdev_leaks(struct wlan_objmgr_psoc * psoc)2915 uint32_t wlan_objmgr_psoc_check_for_pdev_leaks(struct wlan_objmgr_psoc *psoc)
2916 {
2917 	struct wlan_objmgr_psoc_objmgr *_psoc;
2918 	struct wlan_objmgr_pdev *pdev;
2919 	int pdev_id;
2920 	uint32_t leaks = 0;
2921 
2922 	QDF_BUG(psoc);
2923 	if (!psoc)
2924 		return leaks;
2925 
2926 	wlan_psoc_obj_lock(psoc);
2927 	_psoc = &psoc->soc_objmgr;
2928 	if (!_psoc->wlan_pdev_count) {
2929 		wlan_psoc_obj_unlock(psoc);
2930 		return leaks;
2931 	}
2932 
2933 	obj_mgr_alert("objmgr pdev leaks detected for psoc %u!",
2934 		      _psoc->psoc_id);
2935 	obj_mgr_alert("----------------------------------------------------");
2936 	obj_mgr_alert("Pdev Id   Refs   Module");
2937 	obj_mgr_alert("----------------------------------------------------");
2938 
2939 	wlan_objmgr_for_each_psoc_pdev(psoc, pdev_id, pdev) {
2940 		qdf_atomic_t *ref_id_dbg;
2941 		int ref_id;
2942 		int32_t refs;
2943 
2944 		wlan_pdev_obj_lock(pdev);
2945 		ref_id_dbg = pdev->pdev_objmgr.ref_id_dbg;
2946 		wlan_objmgr_for_each_refs(ref_id_dbg, ref_id, refs) {
2947 			leaks++;
2948 			obj_mgr_alert("%7u   %4u   %s(%d)",
2949 				      pdev_id, refs,
2950 				      string_from_dbgid(ref_id), ref_id);
2951 		}
2952 		wlan_pdev_obj_unlock(pdev);
2953 	}
2954 
2955 	wlan_psoc_obj_unlock(psoc);
2956 	return leaks;
2957 }
2958 qdf_export_symbol(wlan_objmgr_psoc_check_for_pdev_leaks);
2959 
wlan_objmgr_psoc_check_for_vdev_leaks(struct wlan_objmgr_psoc * psoc)2960 uint32_t wlan_objmgr_psoc_check_for_vdev_leaks(struct wlan_objmgr_psoc *psoc)
2961 {
2962 	struct wlan_objmgr_psoc_objmgr *_psoc;
2963 	struct wlan_objmgr_vdev *vdev;
2964 	int vdev_id;
2965 	uint32_t leaks = 0;
2966 
2967 	QDF_BUG(psoc);
2968 	if (!psoc)
2969 		return leaks;
2970 
2971 	wlan_psoc_obj_lock(psoc);
2972 	_psoc = &psoc->soc_objmgr;
2973 	if (!_psoc->wlan_vdev_count) {
2974 		wlan_psoc_obj_unlock(psoc);
2975 		return leaks;
2976 	}
2977 
2978 	obj_mgr_alert("objmgr vdev leaks detected for psoc %u!",
2979 		      _psoc->psoc_id);
2980 	obj_mgr_alert("----------------------------------------------------");
2981 	obj_mgr_alert("Vdev Id   Refs   Module");
2982 	obj_mgr_alert("----------------------------------------------------");
2983 
2984 	wlan_objmgr_for_each_psoc_vdev(psoc, vdev_id, vdev) {
2985 		qdf_atomic_t *ref_id_dbg;
2986 		int ref_id;
2987 		int32_t refs;
2988 
2989 		wlan_vdev_obj_lock(vdev);
2990 		ref_id_dbg = vdev->vdev_objmgr.ref_id_dbg;
2991 		wlan_objmgr_for_each_refs(ref_id_dbg, ref_id, refs) {
2992 			leaks++;
2993 			obj_mgr_alert("%7u   %4u   %s(%d)",
2994 				      vdev_id, refs, string_from_dbgid(ref_id),
2995 				      ref_id);
2996 		}
2997 		wlan_vdev_obj_unlock(vdev);
2998 	}
2999 
3000 	wlan_psoc_obj_unlock(psoc);
3001 	return leaks;
3002 }
3003 qdf_export_symbol(wlan_objmgr_psoc_check_for_vdev_leaks);
3004 
3005 #ifdef WLAN_OBJMGR_REF_ID_DEBUG
3006 static void
wlan_objmgr_print_peer_ref_leaks(struct wlan_objmgr_peer * peer,int vdev_id)3007 wlan_objmgr_print_peer_ref_leaks(struct wlan_objmgr_peer *peer, int vdev_id)
3008 {
3009 	qdf_atomic_t *ref_id_dbg;
3010 	int32_t refs;
3011 	int ref_id;
3012 
3013 	ref_id_dbg = peer->peer_objmgr.ref_id_dbg;
3014 	wlan_objmgr_for_each_refs(ref_id_dbg, ref_id, refs) {
3015 		obj_mgr_alert(QDF_MAC_ADDR_FMT " %7u   %4u   %s(%d)",
3016 			      QDF_MAC_ADDR_REF(peer->macaddr),
3017 			      vdev_id,
3018 			      refs,
3019 			      string_from_dbgid(ref_id), ref_id);
3020 	}
3021 }
3022 #else
3023 static inline void
wlan_objmgr_print_peer_ref_leaks(struct wlan_objmgr_peer * peer,int vdev_id)3024 wlan_objmgr_print_peer_ref_leaks(struct wlan_objmgr_peer *peer, int vdev_id)
3025 {
3026 	obj_mgr_alert(QDF_MAC_ADDR_FMT " %7u   %4u   %s",
3027 		      QDF_MAC_ADDR_REF(peer->macaddr),
3028 		      vdev_id,
3029 		      qdf_atomic_read(&peer->peer_objmgr.ref_cnt),
3030 		      "TOTAL_REF_COUNT");
3031 }
3032 #endif
3033 
wlan_objmgr_psoc_check_for_peer_leaks(struct wlan_objmgr_psoc * psoc)3034 uint32_t wlan_objmgr_psoc_check_for_peer_leaks(struct wlan_objmgr_psoc *psoc)
3035 {
3036 	struct wlan_objmgr_psoc_objmgr *_psoc;
3037 	struct wlan_objmgr_vdev *vdev;
3038 	int vdev_id;
3039 	uint32_t leaks = 0;
3040 
3041 	QDF_BUG(psoc);
3042 	if (!psoc)
3043 		return leaks;
3044 
3045 	wlan_psoc_obj_lock(psoc);
3046 	_psoc = &psoc->soc_objmgr;
3047 	if (!_psoc->temp_peer_count && !_psoc->wlan_peer_count) {
3048 		wlan_psoc_obj_unlock(psoc);
3049 		return leaks;
3050 	}
3051 
3052 	obj_mgr_alert("objmgr peer leaks detected for psoc %u!",
3053 		      _psoc->psoc_id);
3054 	obj_mgr_alert("----------------------------------------------------");
3055 	obj_mgr_alert("Peer MAC          Vdev Id   Refs   Module");
3056 	obj_mgr_alert("----------------------------------------------------");
3057 
3058 	wlan_objmgr_for_each_psoc_vdev(psoc, vdev_id, vdev) {
3059 		struct wlan_objmgr_peer *peer;
3060 
3061 		wlan_vdev_obj_lock(vdev);
3062 		wlan_objmgr_for_each_vdev_peer(vdev, peer) {
3063 			wlan_peer_obj_lock(peer);
3064 			leaks += qdf_atomic_read(&peer->peer_objmgr.ref_cnt);
3065 			wlan_objmgr_print_peer_ref_leaks(peer, vdev_id);
3066 			wlan_peer_obj_unlock(peer);
3067 		}
3068 		wlan_vdev_obj_unlock(vdev);
3069 	}
3070 
3071 	wlan_psoc_obj_unlock(psoc);
3072 	return leaks;
3073 }
3074 qdf_export_symbol(wlan_objmgr_psoc_check_for_peer_leaks);
3075 
wlan_objmgr_psoc_check_for_leaks(struct wlan_objmgr_psoc * psoc)3076 void wlan_objmgr_psoc_check_for_leaks(struct wlan_objmgr_psoc *psoc)
3077 {
3078 	struct wlan_objmgr_psoc_objmgr *_psoc;
3079 	uint32_t peer_leaks = 0;
3080 	uint32_t vdev_leaks = 0;
3081 	uint32_t pdev_leaks = 0;
3082 
3083 	_psoc = &psoc->soc_objmgr;
3084 
3085 	peer_leaks = wlan_objmgr_psoc_check_for_peer_leaks(psoc);
3086 	vdev_leaks = wlan_objmgr_psoc_check_for_vdev_leaks(psoc);
3087 	pdev_leaks = wlan_objmgr_psoc_check_for_pdev_leaks(psoc);
3088 
3089 	if (peer_leaks || vdev_leaks || pdev_leaks) {
3090 		QDF_DEBUG_PANIC("%u objmgr peer leaks %u objmgr vdev leaks"
3091 				"%u objmgr pdev leaks detected for psoc %u!",
3092 				peer_leaks, vdev_leaks, pdev_leaks,
3093 				_psoc->psoc_id);
3094 	}
3095 }
3096 
3097 qdf_export_symbol(wlan_objmgr_psoc_check_for_leaks);
3098 
3099 #ifdef WLAN_OBJMGR_DEBUG
wlan_print_psoc_info(struct wlan_objmgr_psoc * psoc)3100 void wlan_print_psoc_info(struct wlan_objmgr_psoc *psoc)
3101 {
3102 	struct wlan_objmgr_psoc_objmgr *psoc_objmgr;
3103 	struct wlan_objmgr_pdev *pdev;
3104 	struct wlan_objmgr_vdev *vdev;
3105 	uint16_t index = 0;
3106 
3107 	psoc_objmgr = &psoc->soc_objmgr;
3108 
3109 	obj_mgr_debug("psoc: %pK", psoc);
3110 	obj_mgr_debug("psoc_id: %d", psoc_objmgr->psoc_id);
3111 	obj_mgr_debug("wlan_pdev_count: %d", psoc_objmgr->wlan_pdev_count);
3112 	obj_mgr_debug("wlan_pdev_id_map: 0x%x", psoc_objmgr->wlan_pdev_id_map);
3113 	obj_mgr_debug("wlan_vdev_count: %d", psoc_objmgr->wlan_vdev_count);
3114 	obj_mgr_debug("max_vdev_count: %d", psoc_objmgr->max_vdev_count);
3115 	obj_mgr_debug("wlan_peer_count: %d", psoc_objmgr->wlan_peer_count);
3116 	obj_mgr_debug("max_peer_count: %d", psoc_objmgr->max_peer_count);
3117 	obj_mgr_debug("temp_peer_count: %d", psoc_objmgr->temp_peer_count);
3118 	obj_mgr_debug("ref_cnt: %d", qdf_atomic_read(&psoc_objmgr->ref_cnt));
3119 	obj_mgr_debug("qdf_dev: %pK", psoc_objmgr->qdf_dev);
3120 
3121 	obj_mgr_debug("wlan_vdev_id_map:");
3122 	obj_mgr_debug_hex(psoc_objmgr->wlan_vdev_id_map,
3123 			  sizeof(psoc_objmgr->wlan_vdev_id_map));
3124 
3125 	wlan_objmgr_for_each_psoc_pdev(psoc, index, pdev) {
3126 		obj_mgr_debug("wlan_pdev_list[%d]: %pK", index, pdev);
3127 		wlan_print_pdev_info(pdev);
3128 	}
3129 
3130 	wlan_objmgr_for_each_psoc_vdev(psoc, index, vdev) {
3131 		obj_mgr_debug("wlan_vdev_list[%d]: %pK", index, vdev);
3132 		wlan_print_vdev_info(vdev);
3133 	}
3134 }
3135 
3136 qdf_export_symbol(wlan_print_psoc_info);
3137 #endif
3138