xref: /wlan-dirver/qca-wifi-host-cmn/umac/cp_stats/core/src/wlan_cp_stats_defs.h (revision 6ecd284e5a94a1c96e26d571dd47419ac305990d)
1 /*
2  * Copyright (c) 2018 The Linux Foundation. All rights reserved.
3  *
4  * Permission to use, copy, modify, and/or distribute this software for
5  * any purpose with or without fee is hereby granted, provided that the
6  * above copyright notice and this permission notice appear in all
7  * copies.
8  *
9  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
10  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
11  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
12  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
13  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
14  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
15  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
16  * PERFORMANCE OF THIS SOFTWARE.
17  */
18 
19 /**
20  * DOC: wlan_cp_stats_defs.h
21  *
22  * This header file maintains core definitions of control plane statistics
23  * component
24  */
25 
26 #ifndef __WLAN_CP_STATS_DEFS_H__
27 #define __WLAN_CP_STATS_DEFS_H__
28 
29 #ifdef QCA_SUPPORT_CP_STATS
30 #include <wlan_objmgr_cmn.h>
31 #include <wlan_objmgr_global_obj.h>
32 #include <wlan_objmgr_psoc_obj.h>
33 #include <wlan_objmgr_pdev_obj.h>
34 #include <wlan_objmgr_vdev_obj.h>
35 #include <wlan_objmgr_peer_obj.h>
36 #include "wlan_cp_stats_cmn_defs.h"
37 #include <wlan_cp_stats_utils_api.h>
38 
39 /**
40  * struct psoc_cp_stats - defines cp stats at psoc object
41  * @psoc_obj: pointer to psoc
42  * @psoc_comp_priv_obj[]: component's private object pointers
43  * @psoc_cp_stats_lock: lock to protect object
44  * @cmn_stats: stats common for AP and STA devices
45  * @obj_stats: stats specific to AP or STA devices
46  */
47 struct psoc_cp_stats {
48 	struct wlan_objmgr_psoc *psoc_obj;
49 	void *psoc_comp_priv_obj[WLAN_CP_STATS_MAX_COMPONENTS];
50 	qdf_spinlock_t psoc_cp_stats_lock;
51 	struct psoc_cmn_cp_stats *cmn_stats;
52 	void *obj_stats;
53 };
54 
55 /**
56  * struct pdev_cp_stats - defines cp stats at pdev object
57  * @pdev_obj: pointer to pdev
58  * @pdev_stats: pointer to ic/mc specific stats
59  * @pdev_comp_priv_obj[]: component's private object pointers
60  * @pdev_cp_stats_lock:	lock to protect object
61  */
62 struct pdev_cp_stats {
63 	struct wlan_objmgr_pdev  *pdev_obj;
64 	void                     *pdev_stats;
65 	void *pdev_comp_priv_obj[WLAN_CP_STATS_MAX_COMPONENTS];
66 	qdf_spinlock_t pdev_cp_stats_lock;
67 };
68 
69 /**
70  * struct vdev_cp_stats - defines cp stats at vdev object
71  * @vdev_obj: pointer to vdev
72  * @vdev_stats: pointer to ic/mc specific stats
73  * @vdev_comp_priv_obj[]: component's private object pointers
74  * @vdev_cp_stats_lock:	lock to protect object
75  */
76 struct vdev_cp_stats {
77 	struct wlan_objmgr_vdev  *vdev_obj;
78 	void                     *vdev_stats;
79 	void *vdev_comp_priv_obj[WLAN_CP_STATS_MAX_COMPONENTS];
80 	qdf_spinlock_t vdev_cp_stats_lock;
81 };
82 
83 /**
84  * struct peer_cp_stats - defines cp stats at peer object
85  * @peer_obj: pointer to peer
86  * @peer_stats: pointer to ic/mc specific stats
87  * @peer_comp_priv_obj[]: component's private object pointers
88  * @peer_cp_stats_lock:	lock to protect object
89  */
90 struct peer_cp_stats {
91 	struct wlan_objmgr_peer  *peer_obj;
92 	void                     *peer_stats;
93 	void *peer_comp_priv_obj[WLAN_CP_STATS_MAX_COMPONENTS];
94 	qdf_spinlock_t peer_cp_stats_lock;
95 };
96 
97 /**
98  * struct cp_stats_context - defines cp stats global context object
99  * @csc_lock: lock to protect object
100  * @psoc_obj: pointer to psoc
101  * @psoc_cs: pointer to cp stats at psoc
102  * @cp_stats_ctx_init: callback pointer to init cp stats global ctx
103  * @cp_stats_ctx_deinit: callback pointer to deinit cp stats global ctx
104  * @cp_stats_psoc_obj_init:callback pointer to init cp stats obj on psoc create
105  * @cp_stats_psoc_obj_deinit:callback pointer to deinit cp stats obj on psoc
106  * destroy
107  * @cp_stats_pdev_obj_init:callback pointer to init cp stats obj on pdev create
108  * @cp_stats_pdev_obj_deinit:callback pointer to deinit cp stats obj on pdev
109  * destroy
110  * @cp_stats_vdev_obj_init:callback pointer to init cp stats obj on vdev create
111  * @cp_stats_vdev_obj_deinit:callback pointer to deinit cp stats obj on vdev
112  * destroy
113  * @cp_stats_peer_obj_init:callback pointer to init cp stats obj on peer create
114  * @cp_stats_peer_obj_deinit:callback pointer to deinit cp stats obj on peer
115  * destroy
116  * @cp_stats_comp_obj_config:callback pointer to attach/detach other umac comp
117  * @cp_stats_open: callback pointer for cp stats on psoc open
118  * @cp_stats_close: callback pointer for cp stats on psoc close
119  * @cp_stats_enable: callback pointer for cp stats on psoc enable
120  * @cp_stats_disable: callback pointer for cp stats on psoc disable
121  */
122 struct cp_stats_context {
123 	qdf_spinlock_t csc_lock;
124 	struct wlan_objmgr_psoc *psoc_obj;
125 	struct psoc_cp_stats    *psoc_cs;
126 	QDF_STATUS (*cp_stats_ctx_init)(struct cp_stats_context *ctx);
127 	QDF_STATUS (*cp_stats_ctx_deinit)(struct cp_stats_context *ctx);
128 	QDF_STATUS (*cp_stats_psoc_obj_init)(struct psoc_cp_stats *psoc_cs);
129 	QDF_STATUS (*cp_stats_psoc_obj_deinit)(struct psoc_cp_stats *psoc_cs);
130 	QDF_STATUS (*cp_stats_pdev_obj_init)(struct pdev_cp_stats *pdev_cs);
131 	QDF_STATUS (*cp_stats_pdev_obj_deinit)(struct pdev_cp_stats *pdev_cs);
132 	QDF_STATUS (*cp_stats_vdev_obj_init)(struct vdev_cp_stats *vdev_cs);
133 	QDF_STATUS (*cp_stats_vdev_obj_deinit)(struct vdev_cp_stats *vdev_cs);
134 	QDF_STATUS (*cp_stats_peer_obj_init)(struct peer_cp_stats *peer_cs);
135 	QDF_STATUS (*cp_stats_peer_obj_deinit)(struct peer_cp_stats *peer_cs);
136 	QDF_STATUS (*cp_stats_comp_obj_config)(
137 			enum wlan_objmgr_obj_type obj_type,
138 			enum wlan_cp_stats_cfg_state cfg_state,
139 			enum wlan_cp_stats_comp_id comp_id,
140 			void *cmn_obj,
141 			void *data);
142 	QDF_STATUS (*cp_stats_open)(struct wlan_objmgr_psoc *psoc);
143 	QDF_STATUS (*cp_stats_close)(struct wlan_objmgr_psoc *psoc);
144 	QDF_STATUS (*cp_stats_enable)(struct wlan_objmgr_psoc *psoc);
145 	QDF_STATUS (*cp_stats_disable)(struct wlan_objmgr_psoc *psoc);
146 };
147 
148 /**
149  * wlan_cp_stats_psoc_obj_lock() - private API to acquire spinlock at psoc
150  * @psoc: pointer to psoc cp stats object
151  *
152  * Return: void
153  */
154 static inline void wlan_cp_stats_psoc_obj_lock(struct psoc_cp_stats *psoc)
155 {
156 	qdf_spin_lock_bh(&psoc->psoc_cp_stats_lock);
157 }
158 
159 /**
160  * wlan_cp_stats_psoc_obj_unlock() - private API to release spinlock at psoc
161  * @psoc: pointer to psoc cp stats object
162  *
163  * Return: void
164  */
165 static inline void wlan_cp_stats_psoc_obj_unlock(struct psoc_cp_stats *psoc)
166 {
167 	qdf_spin_unlock_bh(&psoc->psoc_cp_stats_lock);
168 }
169 
170 /**
171  * wlan_cp_stats_pdev_obj_lock() - private API to acquire spinlock at pdev
172  * @pdev: pointer to pdev cp stats object
173  *
174  * Return: void
175  */
176 static inline void wlan_cp_stats_pdev_obj_lock(struct pdev_cp_stats *pdev)
177 {
178 	qdf_spin_lock_bh(&pdev->pdev_cp_stats_lock);
179 }
180 
181 /**
182  * wlan_cp_stats_pdev_obj_unlock() - private api to release spinlock at pdev
183  * @pdev: pointer to pdev cp stats object
184  *
185  * Return: void
186  */
187 static inline void wlan_cp_stats_pdev_obj_unlock(struct pdev_cp_stats *pdev)
188 {
189 	qdf_spin_unlock_bh(&pdev->pdev_cp_stats_lock);
190 }
191 
192 /**
193  * wlan_cp_stats_vdev_obj_lock() - private api to acquire spinlock at vdev
194  * @vdev: pointer to vdev cp stats object
195  *
196  * Return: void
197  */
198 static inline void wlan_cp_stats_vdev_obj_lock(struct vdev_cp_stats *vdev)
199 {
200 	qdf_spin_lock_bh(&vdev->vdev_cp_stats_lock);
201 }
202 
203 /**
204  * wlan_cp_stats_vdev_obj_unlock() - private api to release spinlock at vdev
205  * @vdev: pointer to vdev cp stats object
206  *
207  * Return: void
208  */
209 static inline void wlan_cp_stats_vdev_obj_unlock(struct vdev_cp_stats *vdev)
210 {
211 	qdf_spin_unlock_bh(&vdev->vdev_cp_stats_lock);
212 }
213 
214 /**
215  * wlan_cp_stats_peer_obj_lock() - private api to acquire spinlock at peer
216  * @peer: pointer to peer cp stats object
217  *
218  * Return: void
219  */
220 static inline void wlan_cp_stats_peer_obj_lock(struct peer_cp_stats *peer)
221 {
222 	qdf_spin_lock_bh(&peer->peer_cp_stats_lock);
223 }
224 
225 /**
226  * wlan_cp_stats_peer_obj_unlock() - private api to release spinlock at peer
227  * @peer: pointer to peer cp stats object
228  *
229  * Return: void
230  */
231 static inline void wlan_cp_stats_peer_obj_unlock(struct peer_cp_stats *peer)
232 {
233 	qdf_spin_unlock_bh(&peer->peer_cp_stats_lock);
234 }
235 
236 /**
237  * wlan_cp_stats_get_psoc_stats_obj() - API to get psoc_cp_stats from psoc
238  * @psoc: Reference to psoc global object
239  *
240  * This API used to get psoc specific cp_stats object from global psoc
241  * reference.
242  *
243  * Return : Reference to psoc_cp_stats object on success or NULL on failure
244  */
245 static inline
246 struct psoc_cp_stats *wlan_cp_stats_get_psoc_stats_obj(struct wlan_objmgr_psoc
247 							*psoc)
248 {
249 	struct cp_stats_context *csc;
250 
251 	if (!psoc)
252 		return NULL;
253 
254 	csc = wlan_objmgr_psoc_get_comp_private_obj(psoc,
255 						    WLAN_UMAC_COMP_CP_STATS);
256 
257 	if (!csc)
258 		return NULL;
259 
260 	return csc->psoc_cs;
261 }
262 
263 /**
264  * wlan_cp_stats_get_pdev_stats_obj() - API to get pdev_cp_stats from pdev
265  * @pdev: Reference to pdev global object
266  *
267  * This API used to get pdev specific cp_stats object from global pdev
268  * reference.
269  *
270  * Return : Reference to pdev_cp_stats object on success or NULL on failure
271  */
272 static inline
273 struct pdev_cp_stats *wlan_cp_stats_get_pdev_stats_obj(struct wlan_objmgr_pdev
274 							*pdev)
275 {
276 	struct pdev_cp_stats *pdev_cs = NULL;
277 
278 	if (pdev) {
279 		pdev_cs = wlan_objmgr_pdev_get_comp_private_obj
280 				(pdev, WLAN_UMAC_COMP_CP_STATS);
281 	}
282 
283 	return pdev_cs;
284 }
285 
286 /**
287  * wlan_cp_stats_get_vdev_stats_obj() - API to get vdev_cp_stats from vdev
288  * @vdev : Reference to vdev global object
289  *
290  * This API used to get vdev specific cp_stats object from global vdev
291  * reference.
292  *
293  * Return : Reference to vdev_cp_stats object on success or NULL on failure
294  */
295 static inline
296 struct vdev_cp_stats *wlan_cp_stats_get_vdev_stats_obj(struct wlan_objmgr_vdev
297 							*vdev)
298 {
299 	struct vdev_cp_stats *vdev_cs = NULL;
300 
301 	if (vdev) {
302 		vdev_cs = wlan_objmgr_vdev_get_comp_private_obj
303 				(vdev, WLAN_UMAC_COMP_CP_STATS);
304 	}
305 
306 	return vdev_cs;
307 }
308 
309 /**
310  * wlan_cp_stats_get_peer_stats_obj() - API to get peer_cp_stats from peer
311  * @peer: Reference to peer global object
312  *
313  * This API used to get peer specific cp_stats object from global peer
314  * reference.
315  *
316  * Return : Reference to peer_cp_stats object on success or NULL on failure
317  */
318 static inline
319 struct peer_cp_stats *wlan_cp_stats_get_peer_stats_obj(struct wlan_objmgr_peer
320 							*peer)
321 {
322 	struct peer_cp_stats *peer_cs = NULL;
323 
324 	if (peer) {
325 		peer_cs = wlan_objmgr_peer_get_comp_private_obj
326 				(peer, WLAN_UMAC_COMP_CP_STATS);
327 	}
328 
329 	return peer_cs;
330 }
331 
332 /**
333  * wlan_cp_stats_get_pdev_from_vdev() - API to get pdev_cp_stats obj from vdev
334  * @vdev: Reference to vdev global object
335  *
336  * This API used to get pdev specific cp_stats object from global vdev
337  * reference.
338  *
339  * Return: Reference to pdev_cp_stats object on success or NULL on failure
340  */
341 static inline
342 struct pdev_cp_stats *wlan_cp_stats_get_pdev_from_vdev(struct wlan_objmgr_vdev
343 							*vdev)
344 {
345 	struct wlan_objmgr_pdev *pdev;
346 	struct pdev_cp_stats *pdev_cs = NULL;
347 
348 	pdev = wlan_vdev_get_pdev(vdev);
349 	if (pdev) {
350 		pdev_cs = wlan_objmgr_pdev_get_comp_private_obj
351 				(pdev, WLAN_UMAC_COMP_CP_STATS);
352 	}
353 
354 	return pdev_cs;
355 }
356 
357 /**
358  * wlan_cp_stats_ctx_get_from_pdev() - API to get cp_stats ctx obj from pdev
359  * @pdev: Reference to pdev global object
360  *
361  * This API used to get cp_stats context object from global pdev reference.
362  *
363  * Return: Reference to cp_stats_context object on success or NULL on failure
364  */
365 static inline
366 struct cp_stats_context *wlan_cp_stats_ctx_get_from_pdev(struct wlan_objmgr_pdev
367 							*pdev)
368 {
369 	struct wlan_objmgr_psoc *psoc;
370 	struct cp_stats_context *csc = NULL;
371 
372 	if (!pdev)
373 		return NULL;
374 
375 	psoc = wlan_pdev_get_psoc(pdev);
376 	if (psoc) {
377 		csc = wlan_objmgr_psoc_get_comp_private_obj
378 				(psoc, WLAN_UMAC_COMP_CP_STATS);
379 	}
380 	return csc;
381 }
382 
383 /**
384  * wlan_cp_stats_ctx_get_from_vdev() - API to get cp_stats ctx obj from vdev
385  * @vdev: Reference to vdev global object
386  *
387  * This API used to get cp_stats context object from global vdev reference.
388  *
389  * Return: Reference to cp_stats_context object on success or NULL on failure
390  */
391 static inline
392 struct cp_stats_context *wlan_cp_stats_ctx_get_from_vdev(struct wlan_objmgr_vdev
393 							*vdev)
394 {
395 	struct wlan_objmgr_pdev *pdev;
396 
397 	if (!vdev)
398 		return NULL;
399 
400 	pdev = wlan_vdev_get_pdev(vdev);
401 	return wlan_cp_stats_ctx_get_from_pdev(pdev);
402 }
403 
404 /**
405  * wlan_cp_stats_ctx_get_from_peer() - API to get cp_stats ctx object from peer
406  * @peer: Reference to peer object
407  *
408  * This API used to get cp_stats context object from global peer reference.
409  *
410  * Return: Reference to cp_stats_context object on success or NULL on failure
411  */
412 static inline
413 struct cp_stats_context *wlan_cp_stats_ctx_get_from_peer(struct wlan_objmgr_peer
414 							*peer)
415 {
416 	struct wlan_objmgr_vdev *vdev;
417 
418 	vdev = wlan_peer_get_vdev(peer);
419 	return wlan_cp_stats_ctx_get_from_vdev(vdev);
420 }
421 
422 /**
423  * wlan_cp_stats_get_comp_id() - API to get cp_stats component id from umac
424  * component id
425  * @comp_id: umac comp id
426  *
427  * Return: wlan_cp_stats_comp_id
428  */
429 static inline enum wlan_cp_stats_comp_id
430 wlan_cp_stats_get_comp_id(enum wlan_umac_comp_id comp_id)
431 {
432 	enum wlan_cp_stats_comp_id cp_stats_comp_id =
433 		WLAN_CP_STATS_MAX_COMPONENTS;
434 
435 	if (comp_id == WLAN_UMAC_COMP_ATF)
436 		cp_stats_comp_id = WLAN_CP_STATS_ATF;
437 
438 	return cp_stats_comp_id;
439 }
440 
441 #endif /* QCA_SUPPORT_CP_STATS */
442 #endif /* __WLAN_CP_STATS_DEFS_H__ */
443