1 /*
2  * Copyright (c) 2016-2019, 2021 The Linux Foundation. All rights reserved.
3  * Copyright (c) 2021-2023 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 #ifndef _WLAN_OBJMGR_GLOBAL_OBJ_H_
23 #define _WLAN_OBJMGR_GLOBAL_OBJ_H_
24 
25 /**
26  * wlan_objmgr_global_obj_init() - global object initialization
27  *
28  * Creates global object, initializes with default values
29  *
30  * Return: SUCCESS  on successful creation,
31  *         FAILURE  on Mem alloc failure or allocated already
32  *
33  */
34 QDF_STATUS wlan_objmgr_global_obj_init(void);
35 
36 /**
37  * wlan_objmgr_global_obj_deinit() - global object deinitialization
38  *
39  * Deletes global object
40  *
41  * Return: SUCCESS  on successful deletion,
42  *         FAILURE  on object is not found
43  *
44  */
45 QDF_STATUS wlan_objmgr_global_obj_deinit(void);
46 
47 /**
48  * wlan_objmgr_global_obj_can_destroyed() - Checks whether global object
49  *					  can be destroyed
50  *
51  * Checks the psoc table of global object, if psoc table is empty
52  * returns the SUCCESS
53  *
54  * Return: SUCCESS  on can be destroyed,
55  *         FAILURE  on can't be destroyed
56  *
57  */
58 QDF_STATUS wlan_objmgr_global_obj_can_destroyed(void);
59 
60 /**
61  * wlan_objmgr_register_psoc_create_handler() - register psoc create handler
62  * @id: component id
63  * @handler: function pointer of the component
64  * @args: args, if component wants certain args to be passed on PSOC creation
65  *
66  * API, allows other UMAC components to register handler
67  * The registered handler would be invoked on PSOC creation
68  *
69  * Return: SUCCESS,
70  *         Failure (if registration fails, each failure has different error
71  *         code)
72  */
73 QDF_STATUS wlan_objmgr_register_psoc_create_handler(
74 		enum wlan_umac_comp_id id,
75 		wlan_objmgr_psoc_create_handler handler,
76 		void *args);
77 
78 /**
79  * wlan_objmgr_unregister_psoc_create_handler() - unregister psoc create handler
80  * @id: component id
81  * @handler: function pointer of the component
82  * @args: args, if component wants certain args to be passed on PSOC creation
83  *
84  * API, allows other UMAC components to unregister handler
85  *
86  * Return: SUCCESS,
87  *         Failure (if handler is not present, each failure has different error
88  *         code)
89  */
90 QDF_STATUS wlan_objmgr_unregister_psoc_create_handler(
91 		enum wlan_umac_comp_id id,
92 		wlan_objmgr_psoc_create_handler handler,
93 		void *args);
94 
95 /**
96  * wlan_objmgr_register_psoc_destroy_handler() - register destroy handler
97  * @id: component id
98  * @handler: function pointer of the component
99  * @args: args, if component wants certain args to be passed on PSOC deletion
100  *
101  * API, allows other UMAC components to register handler
102  * The registered handler would be invoked on PSOC deletion
103  *
104  * Return: SUCCESS,
105  *         Failure (if registration fails, each failure has different error
106  *         code)
107  */
108 QDF_STATUS wlan_objmgr_register_psoc_destroy_handler(
109 		enum wlan_umac_comp_id id,
110 		wlan_objmgr_psoc_destroy_handler handler,
111 		void *args);
112 
113 /**
114  * wlan_objmgr_unregister_psoc_destroy_handler() - unregister destroy handler
115  * @id: component id
116  * @handler: function pointer of the component
117  * @args: args, if component wants certain args to be passed on PSOC deletion
118  *
119  * API, allows other UMAC components to unregister handler
120  *
121  * Return: SUCCESS,
122  *         Failure (if handler is not present, each failure has different error
123  *         code)
124  */
125 QDF_STATUS wlan_objmgr_unregister_psoc_destroy_handler(
126 		enum wlan_umac_comp_id id,
127 		wlan_objmgr_psoc_destroy_handler handler,
128 		void *args);
129 
130 /**
131  * wlan_objmgr_register_psoc_status_handler() - register status handler
132  * @id: component id
133  * @handler: function pointer of the component
134  * @args: args, if component wants certain args to be passed on PSOC status
135  *         change
136  *
137  * API, allows other UMAC components to register handler
138  * The registered handler would be invoked on PSOC object status change
139  *
140  * Return: SUCCESS,
141  *         Failure (if registration fails, each failure has different error
142  *         code)
143  */
144 QDF_STATUS wlan_objmgr_register_psoc_status_handler(
145 		enum wlan_umac_comp_id id,
146 		wlan_objmgr_psoc_status_handler handler,
147 		void *args);
148 
149 /**
150  * wlan_objmgr_unregister_psoc_status_handler() - unregister status handler
151  * @id: component id
152  * @handler: function pointer of the component
153  * @args: args, if component wants certain args to be passed on PSOC status
154  *
155  * API, allows other UMAC components to unregister handler
156  *
157  * Return: SUCCESS,
158  *         Failure (if handler is not present, each failure has different error
159  *         code)
160  */
161 QDF_STATUS wlan_objmgr_unregister_psoc_status_handler(
162 		enum wlan_umac_comp_id id,
163 		wlan_objmgr_psoc_status_handler handler,
164 		void *args);
165 
166 /**
167  * wlan_objmgr_register_pdev_create_handler() - register pdev create handler
168  * @id: component id
169  * @handler: function pointer of the component
170  * @args: args, if component wants certain args to be passed on PDEV creation
171  *
172  * API, allows other UMAC components to register handler
173  * The registered handler would be invoked on PDEV creation
174  *
175  * Return: SUCCESS,
176  *         Failure (if registration fails, each failure has different error
177  *         code)
178  */
179 QDF_STATUS wlan_objmgr_register_pdev_create_handler(
180 		enum wlan_umac_comp_id id,
181 		wlan_objmgr_pdev_create_handler handler,
182 		void *args);
183 
184 /**
185  * wlan_objmgr_unregister_pdev_create_handler() - unregister pdev create handler
186  * @id: component id
187  * @handler: function pointer of the component
188  * @args: args, if component wants certain args to be passed on PDEV creation
189  *
190  * API, allows other UMAC components to unregister handler
191  *
192  * Return: SUCCESS,
193  *         Failure (if handler is not present, each failure has different error
194  *         code)
195  */
196 QDF_STATUS wlan_objmgr_unregister_pdev_create_handler(
197 		enum wlan_umac_comp_id id,
198 		wlan_objmgr_pdev_create_handler handler,
199 		void *args);
200 
201 /**
202  * wlan_objmgr_register_pdev_destroy_handler() - register pdev destroy handler
203  * @id: component id
204  * @handler: function pointer of the component
205  * @args: args, if component wants certain args to be passed on PDEV deletion
206  *
207  * API, allows other UMAC components to register handler
208  * The registered handler would be invoked on PDEV deletion
209  *
210  * Return: SUCCESS,
211  *         Failure (if registration fails, each failure has different error
212  *         code)
213  */
214 QDF_STATUS wlan_objmgr_register_pdev_destroy_handler(
215 		enum wlan_umac_comp_id id,
216 		wlan_objmgr_pdev_destroy_handler handler,
217 		void *args);
218 
219 /**
220  * wlan_objmgr_unregister_pdev_destroy_handler() - unregister pdev destroy handler
221  * @id: component id
222  * @handler: function pointer of the component
223  * @args: args, if component wants certain args to be passed on PDEV deletion
224  *
225  * API, allows other UMAC components to unregister handler
226  *
227  * Return: SUCCESS,
228  *         Failure (if handler is not present, each failure has different error
229  *         code)
230  */
231 QDF_STATUS wlan_objmgr_unregister_pdev_destroy_handler(
232 		enum wlan_umac_comp_id id,
233 		wlan_objmgr_pdev_destroy_handler handler,
234 		void *args);
235 
236 /**
237  * wlan_objmgr_register_pdev_status_handler() - register pdev status handler
238  * @id: component id
239  * @handler: function pointer of the component
240  * @args: args, if component wants certain args to be passed on PDEV status
241  *         change
242  *
243  * API, allows other UMAC components to register handler
244  * The registered handler would be invoked on PDEV object status change
245  *
246  * Return: SUCCESS,
247  *         Failure (if registration fails, each failure has different error
248  *         code)
249  */
250 QDF_STATUS wlan_objmgr_register_pdev_status_handler(
251 		enum wlan_umac_comp_id id,
252 		wlan_objmgr_pdev_status_handler handler,
253 		void *args);
254 
255 /**
256  * wlan_objmgr_unregister_pdev_status_handler() - unregister pdev status handler
257  * @id: component id
258  * @handler: function pointer of the component
259  * @args: args, if component wants certain args to be passed on PDEV status
260  *
261  * API, allows other UMAC components to unregister handler
262  *
263  * Return: SUCCESS,
264  *         Failure (if handler is not present, each failure has different error
265  *         code)
266  */
267 QDF_STATUS wlan_objmgr_unregister_pdev_status_handler(
268 		enum wlan_umac_comp_id id,
269 		wlan_objmgr_pdev_status_handler handler,
270 		void *args);
271 
272 /**
273  * wlan_objmgr_register_vdev_create_handler() - register vdev create handler
274  * @id: component id
275  * @handler: function pointer of the component
276  * @args: args, if component wants certain args to be passed on VDEV creation
277  *
278  * API, allows other UMAC components to register handler
279  * The registered handler would be invoked on VDEV creation
280  *
281  * Return: SUCCESS,
282  *         Failure (if registration fails, each failure has different error
283  *         code)
284  */
285 QDF_STATUS wlan_objmgr_register_vdev_create_handler(
286 		enum wlan_umac_comp_id id,
287 		wlan_objmgr_vdev_create_handler handler,
288 		void *args);
289 
290 /**
291  * wlan_objmgr_unregister_vdev_create_handler() - unregister vdev create handler
292  * @id: component id
293  * @handler: function pointer of the component
294  * @args: args, if component wants certain args to be passed on VDEV creation
295  *
296  * API, allows other UMAC components to unregister handler
297  *
298  * Return: SUCCESS,
299  *         Failure (if handler is not present, each failure has different error
300  *         code)
301  */
302 QDF_STATUS wlan_objmgr_unregister_vdev_create_handler(
303 		enum wlan_umac_comp_id id,
304 		wlan_objmgr_vdev_create_handler handler,
305 		void *args);
306 
307 /**
308  * wlan_objmgr_register_vdev_destroy_handler() - register vdev destroy handler
309  * @id: component id
310  * @handler: function pointer of the component
311  * @args: args, if component wants certain args to be passed on VDEV deletion
312  *
313  * API, allows other UMAC components to register handler
314  * The registered handler would be invoked on VDEV deletion
315  *
316  * Return: SUCCESS,
317  *         Failure (if registration fails, each failure has different error
318  *         code)
319  */
320 QDF_STATUS wlan_objmgr_register_vdev_destroy_handler(
321 		enum wlan_umac_comp_id id,
322 		wlan_objmgr_vdev_destroy_handler handler,
323 		void *args);
324 
325 /**
326  * wlan_objmgr_unregister_vdev_destroy_handler() - unregister vdev destroy handler
327  * @id: component id
328  * @handler: function pointer of the component
329  * @args: args, if component wants certain args to be passed on VDEV deletion
330  *
331  * API, allows other UMAC components to unregister handler
332  *
333  * Return: SUCCESS,
334  *         Failure (if handler is not present, each failure has different error
335  *         code)
336  */
337 QDF_STATUS wlan_objmgr_unregister_vdev_destroy_handler(
338 		enum wlan_umac_comp_id id,
339 		wlan_objmgr_vdev_destroy_handler handler,
340 		void *args);
341 
342 /**
343  * wlan_objmgr_register_vdev_status_handler() - register vdev status handler
344  * @id: component id
345  * @handler: function pointer of the component
346  * @args: args, if component wants certain args to be passed on VDEV status
347  *         change
348  *
349  * API, allows other UMAC components to register handler
350  * The registered handler would be invoked on VDEV object status change
351  *
352  * Return: SUCCESS,
353  *         Failure (if registration fails, each failure has different error
354  *         code)
355  */
356 QDF_STATUS wlan_objmgr_register_vdev_status_handler(
357 		enum wlan_umac_comp_id id,
358 		wlan_objmgr_vdev_status_handler handler,
359 		void *args);
360 
361 /**
362  * wlan_objmgr_unregister_vdev_status_handler() - unregister vdev status handler
363  * @id: component id
364  * @handler: function pointer of the component
365  * @args: args, if component wants certain args to be passed on VDEV status
366  *
367  * API, allows other UMAC components to unregister handler
368  *
369  * Return: SUCCESS,
370  *         Failure (if handler is not present, each failure has different error
371  *         code)
372  */
373 QDF_STATUS wlan_objmgr_unregister_vdev_status_handler(
374 		enum wlan_umac_comp_id id,
375 		wlan_objmgr_vdev_status_handler handler,
376 		void *args);
377 
378 /**
379  * wlan_objmgr_register_vdev_peer_free_notify_handler() - register vdev peer
380  *                                                        free handler
381  * @id: component id
382  * @handler: function pointer of the component
383  *
384  * API, allows other UMAC components to register handler
385  * The registered handler would be invoked on VDEV Peer gets freed
386  *
387  * Return: SUCCESS,
388  *         Failure (if registration fails, each failure has different error
389  *         code)
390  */
391 QDF_STATUS wlan_objmgr_register_vdev_peer_free_notify_handler(
392 		enum wlan_umac_comp_id id,
393 		wlan_objmgr_vdev_peer_free_notify_handler handler);
394 
395 /**
396  * wlan_objmgr_unregister_vdev_peer_free_notify_handler() - unregister vdev
397  *                                                          peer free handler
398  * @id: component id
399  * @handler: function pointer of the component
400  *
401  * API, allows other UMAC components to unregister handler
402  *
403  * Return: SUCCESS,
404  *         Failure (if handler is not present, each failure has different error
405  *         code)
406  */
407 QDF_STATUS wlan_objmgr_unregister_vdev_peer_free_notify_handler(
408 		enum wlan_umac_comp_id id,
409 		wlan_objmgr_vdev_peer_free_notify_handler handler);
410 
411 /**
412  * wlan_objmgr_register_peer_create_handler() - register peer create handler
413  * @id: component id
414  * @handler: function pointer of the component
415  * @args: args, if component wants certain args to be passed on PEER creation
416  *
417  * API, allows other UMAC components to register handler
418  * The registered handler would be invoked on PEER creation
419  *
420  * Return: SUCCESS,
421  *         Failure (if registration fails, each failure has different error
422  *         code)
423  */
424 QDF_STATUS wlan_objmgr_register_peer_create_handler(
425 		enum wlan_umac_comp_id id,
426 		wlan_objmgr_peer_create_handler handler,
427 		void *args);
428 
429 /**
430  * wlan_objmgr_unregister_peer_create_handler() - unregister peer create handler
431  * @id: component id
432  * @handler: function pointer of the component
433  * @args: args, if component wants certain args to be passed on PEER creation
434  *
435  * API, allows other UMAC components to unregister handler
436  *
437  * Return: SUCCESS,
438  *         Failure (if handler is not present, each failure has different error
439  *         code)
440  */
441 QDF_STATUS wlan_objmgr_unregister_peer_create_handler(
442 		enum wlan_umac_comp_id id,
443 		wlan_objmgr_peer_create_handler handler,
444 		void *args);
445 
446 /**
447  * wlan_objmgr_register_peer_destroy_handler() - register peer destroy handler
448  * @id: component id
449  * @handler: function pointer of the component
450  * @args: args, if component wants certain args to be passed on PEER deletion
451  *
452  * API, allows other UMAC components to register handler
453  * The registered handler would be invoked on PEER deletion
454  *
455  * Return: SUCCESS,
456  *         Failure (if registration fails, each failure has different error
457  *         code)
458  */
459 QDF_STATUS wlan_objmgr_register_peer_destroy_handler(
460 		enum wlan_umac_comp_id id,
461 		wlan_objmgr_peer_destroy_handler handler,
462 		void *args);
463 
464 /**
465  * wlan_objmgr_unregister_peer_destroy_handler() - unregister peer destroy handler
466  * @id: component id
467  * @handler: function pointer of the component
468  * @args: args, if component wants certain args to be passed on PEER deletion
469  *
470  * API, allows other UMAC components to unregister handler
471  *
472  * Return: SUCCESS,
473  *         Failure (if handler is not present, each failure has different error
474  *         code)
475  */
476 QDF_STATUS wlan_objmgr_unregister_peer_destroy_handler(
477 		enum wlan_umac_comp_id id,
478 		wlan_objmgr_peer_destroy_handler handler,
479 		void *args);
480 
481 /**
482  * wlan_objmgr_register_peer_status_handler() - register peer status handler
483  * @id: component id
484  * @handler: function pointer of the component
485  * @args: args, if component wants certain args to be passed on PEER status
486  *         change
487  *
488  * API, allows other UMAC components to register handler
489  * The registered handler would be invoked on PEER object status change
490  *
491  * Return: SUCCESS,
492  *         Failure (if registration fails, each failure has different error
493  *         code)
494  */
495 QDF_STATUS wlan_objmgr_register_peer_status_handler(
496 		enum wlan_umac_comp_id id,
497 		wlan_objmgr_peer_status_handler handler,
498 		void *args);
499 
500 /**
501  * wlan_objmgr_unregister_peer_status_handler() - unregister peer status handler
502  * @id: component id
503  * @handler: function pointer of the component
504  * @args: args, if component wants certain args to be passed on PEER status
505  *
506  * API, allows other UMAC components to unregister handler
507  *
508  * Return: SUCCESS,
509  *         Failure (if handler is not present, each failure has different error
510  *         code)
511  */
512 QDF_STATUS wlan_objmgr_unregister_peer_status_handler(
513 		enum wlan_umac_comp_id id,
514 		wlan_objmgr_peer_status_handler handler,
515 		void *args);
516 
517 /*
518  * APIs to operations on psoc
519  */
520 typedef void (*wlan_objmgr_psoc_handler)(struct wlan_objmgr_psoc *psoc,
521 					void *arg,
522 					uint8_t index);
523 
524 /**
525  * wlan_objmgr_iterate_psoc_list() - iterate through all psocs
526  *
527  * @handler: the handler will be called for each psoc
528  *           the handler should be implemented to perform required operation
529  * @arg:     arguments passed by caller
530  * @dbg_id: id of the caller
531  *
532  * API to be used for performing the operations on all psoc
533  * The "handler" here shouldn't take g_umac_glb_obj->global_lock lock when
534  * processing
535  *
536  * Return: SUCCESS/FAILURE
537  */
538 QDF_STATUS wlan_objmgr_iterate_psoc_list(
539 		wlan_objmgr_psoc_handler handler,
540 		void *arg, wlan_objmgr_ref_dbgid dbg_id);
541 
542 /**
543  * wlan_objmgr_get_psoc_by_id() - find psoc by psoc id
544  *
545  * @psoc_id: Id of PSOC to be retrieved
546  * @dbg_id: id of the caller
547  *
548  * API to find psoc object pointer by psoc id
549  *
550  * This API increments the ref count of the psoc object internally, the
551  * caller has to invoke the wlan_objmgr_psoc_release_ref() to decrement
552  * ref count
553  *
554  * Return: psoc pointer
555  *         NULL on FAILURE
556  */
557 struct wlan_objmgr_psoc
558 *wlan_objmgr_get_psoc_by_id(uint8_t psoc_id, wlan_objmgr_ref_dbgid dbg_id);
559 
560 #ifdef QCA_SUPPORT_DP_GLOBAL_CTX
561 /**
562  * wlan_objmgr_get_global_ctx() - Get global context from global umac object
563  *
564  * This API is used to get global context object from the global umac object
565  *
566  * Return: Pointer to global context
567  */
568 struct dp_global_context *wlan_objmgr_get_global_ctx(void);
569 
570 /**
571  * wlan_objmgr_set_global_ctx() - Set global context in global umac object
572  * @ctx: global context to be set
573  *
574  * This API is used to set global context object in the global umac object
575  *
576  * Return:
577  */
578 void wlan_objmgr_set_global_ctx(struct dp_global_context *ctx);
579 #endif
580 
581 #ifdef WLAN_FEATURE_11BE_MLO
582 /**
583  * wlan_objmgr_get_mlo_ctx() - Get MLO context from global umac object
584  *
585  * This API is used to get MLO context object from the global umac object
586  *
587  * Return: Pointer to the mlo context
588  */
589 struct mlo_mgr_context *wlan_objmgr_get_mlo_ctx(void);
590 
591 /**
592  * wlan_objmgr_set_mlo_ctx() - Set MLO context at global umac object
593  * @ctx: MLO context
594  *
595  * This API is used to set MLO context object at the global umac object
596  *
597  * Return: None
598  */
599 void wlan_objmgr_set_mlo_ctx(struct mlo_mgr_context *ctx);
600 
601 /**
602  * wlan_objmgr_set_dp_mlo_ctx() - set dp handle in mlo context
603  * @dp_handle: Data path module handle
604  * @grp_id: MLO group id which it belongs too
605  *
606  * Return: void
607  */
608 void wlan_objmgr_set_dp_mlo_ctx(void *dp_handle, uint8_t grp_id);
609 
610 /**
611  * wlan_objmgr_get_dp_mlo_ctx() - get dp handle from mlo_context
612  * @grp_id: MLO Group id which it belongs to
613  *
614  * Return: dp handle
615  */
616 void *wlan_objmgr_get_dp_mlo_ctx(uint8_t grp_id);
617 #else
wlan_objmgr_get_mlo_ctx(void)618 static inline struct mlo_mgr_context *wlan_objmgr_get_mlo_ctx(void)
619 {
620 	return NULL;
621 }
622 
wlan_objmgr_set_mlo_ctx(struct mlo_mgr_context * ctx)623 static inline void wlan_objmgr_set_mlo_ctx(struct mlo_mgr_context *ctx)
624 {}
625 
wlan_objmgr_get_dp_mlo_ctx(uint8_t grp_id)626 static inline void *wlan_objmgr_get_dp_mlo_ctx(uint8_t grp_id)
627 {
628 	return NULL;
629 }
630 
wlan_objmgr_set_dp_mlo_ctx(void * dp_handle,uint8_t grp_id)631 static inline void wlan_objmgr_set_dp_mlo_ctx(void *dp_handle, uint8_t grp_id)
632 {
633 }
634 #endif /* WLAN_FEATURE_11BE_MLO */
635 
636 #endif /* _WLAN_OBJMGR_GLOBAL_OBJ_H_*/
637