xref: /wlan-dirver/qca-wifi-host-cmn/umac/cp_stats/core/src/wlan_cp_stats_defs.h (revision 8cfe6b10058a04cafb17eed051f2ddf11bee8931)
1 /*
2  * Copyright (c) 2018-2019, 2021 The Linux Foundation. All rights reserved.
3  * Copyright (c) 2022-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 /**
21  * DOC: wlan_cp_stats_defs.h
22  *
23  * This header file maintains core definitions of control plane statistics
24  * component
25  */
26 
27 #ifndef __WLAN_CP_STATS_DEFS_H__
28 #define __WLAN_CP_STATS_DEFS_H__
29 
30 #ifdef QCA_SUPPORT_CP_STATS
31 #include <wlan_objmgr_cmn.h>
32 #include <wlan_objmgr_global_obj.h>
33 #include <wlan_objmgr_psoc_obj.h>
34 #include <wlan_objmgr_pdev_obj.h>
35 #include <wlan_objmgr_vdev_obj.h>
36 #include <wlan_objmgr_peer_obj.h>
37 #include "wlan_cp_stats_cmn_defs.h"
38 #include <wlan_cp_stats_utils_api.h>
39 #include <wlan_cp_stats_ext_type.h>
40 #include <wlan_cp_stats_public_structs.h>
41 #include <wlan_twt_public_structs.h>
42 
43 /* noise floor */
44 #define CP_STATS_TGT_NOISE_FLOOR_DBM (-96)
45 
46 #ifdef WLAN_SUPPORT_INFRA_CTRL_PATH_STATS
47 typedef void (*get_infra_cp_stats_cb)(struct infra_cp_stats_event *ev,
48 				      void *cookie);
49 #endif
50 
51 /**
52  * struct psoc_cp_stats - defines cp stats at psoc object
53  * @psoc_obj: pointer to psoc
54  * @psoc_comp_priv_obj: component's private object pointers
55  * @psoc_cp_stats_lock: lock to protect object
56  * @cmn_stats: stats common for AP and STA devices
57  * @obj_stats: stats specific to AP or STA devices
58  * @legacy_stats_cb: callback to update the stats received from FW through
59  * asynchronous events.
60  * @get_infra_cp_stats: callback to update infra CP stats
61  * @infra_cp_stats_req_context: context to pass @get_infra_cp_stats
62  */
63 struct psoc_cp_stats {
64 	struct wlan_objmgr_psoc *psoc_obj;
65 	void *psoc_comp_priv_obj[WLAN_CP_STATS_MAX_COMPONENTS];
66 	qdf_spinlock_t psoc_cp_stats_lock;
67 	struct psoc_cmn_cp_stats *cmn_stats;
68 	psoc_ext_cp_stats_t *obj_stats;
69 	void (*legacy_stats_cb)(void *stats);
70 #ifdef WLAN_SUPPORT_INFRA_CTRL_PATH_STATS
71 	void (*get_infra_cp_stats)(struct infra_cp_stats_event *ev,
72 				   void *cookie);
73 	void *infra_cp_stats_req_context;
74 #endif
75 };
76 
77 /**
78  * struct pdev_cp_stats - defines cp stats at pdev object
79  * @pdev_obj: pointer to pdev
80  * @pdev_stats: pointer to ic/mc specific stats
81  * @pdev_comp_priv_obj: component's private object pointers
82  * @pdev_cp_stats_lock: lock to protect object
83  */
84 struct pdev_cp_stats {
85 	struct wlan_objmgr_pdev  *pdev_obj;
86 	pdev_ext_cp_stats_t *pdev_stats;
87 	void *pdev_comp_priv_obj[WLAN_CP_STATS_MAX_COMPONENTS];
88 	qdf_spinlock_t pdev_cp_stats_lock;
89 };
90 
91 /**
92  * struct vdev_cp_stats - defines cp stats at vdev object
93  * @vdev_obj: pointer to vdev
94  * @vdev_stats: pointer to ic/mc specific stats
95  * @vdev_comp_priv_obj: component's private object pointers
96  * @vdev_cp_stats_lock:	lock to protect object
97  * @mcast_rx_pnerr_stats_inc: callback function to update rx PN error stats
98  */
99 struct vdev_cp_stats {
100 	struct wlan_objmgr_vdev *vdev_obj;
101 	vdev_ext_cp_stats_t *vdev_stats;
102 	void *vdev_comp_priv_obj[WLAN_CP_STATS_MAX_COMPONENTS];
103 	qdf_spinlock_t vdev_cp_stats_lock;
104 	void (*mcast_rx_pnerr_stats_inc)(
105 			struct wlan_objmgr_vdev *vdev,
106 			uint64_t val);
107 };
108 
109 /**
110  * struct peer_cp_stats - defines cp stats at peer object
111  * @peer_obj: pointer to peer
112  * @peer_stats: pointer to ic/mc specific stats
113  * @peer_comp_priv_obj: component's private object pointers
114  * @peer_cp_stats_lock:	lock to protect object
115  * @rx_pnerr_stats_inc: callback function to update rx PN error stats
116  * @twt_param: Pointer to peer twt session parameters
117  */
118 struct peer_cp_stats {
119 	struct wlan_objmgr_peer *peer_obj;
120 	peer_ext_cp_stats_t *peer_stats;
121 	void *peer_comp_priv_obj[WLAN_CP_STATS_MAX_COMPONENTS];
122 	qdf_spinlock_t peer_cp_stats_lock;
123 	void (*rx_pnerr_stats_inc)(struct wlan_objmgr_peer *peer, uint32_t val);
124 #if defined(WLAN_SUPPORT_TWT) && defined(WLAN_TWT_CONV_SUPPORTED)
125 	struct twt_session_stats_info twt_param[WLAN_MAX_TWT_SESSIONS_PER_PEER];
126 #endif
127 };
128 
129 /**
130  * struct cp_stats_context - defines cp stats global context object
131  * @csc_lock: lock to protect object
132  * @psoc_obj: pointer to psoc
133  * @psoc_cs: pointer to cp stats at psoc
134  * @cp_stats_ctx_init: callback pointer to init cp stats global ctx
135  * @cp_stats_ctx_deinit: callback pointer to deinit cp stats global ctx
136  * @cp_stats_psoc_obj_init:callback pointer to init cp stats obj on psoc create
137  * @cp_stats_psoc_obj_deinit:callback pointer to deinit cp stats obj on psoc
138  * destroy
139  * @cp_stats_pdev_obj_init:callback pointer to init cp stats obj on pdev create
140  * @cp_stats_pdev_obj_deinit:callback pointer to deinit cp stats obj on pdev
141  * destroy
142  * @cp_stats_vdev_obj_init:callback pointer to init cp stats obj on vdev create
143  * @cp_stats_vdev_obj_deinit:callback pointer to deinit cp stats obj on vdev
144  * destroy
145  * @cp_stats_peer_obj_init:callback pointer to init cp stats obj on peer create
146  * @cp_stats_peer_obj_deinit:callback pointer to deinit cp stats obj on peer
147  * destroy
148  * @cp_stats_comp_obj_config:callback pointer to attach/detach other umac comp
149  * @cp_stats_open: callback pointer for cp stats on psoc open
150  * @cp_stats_close: callback pointer for cp stats on psoc close
151  * @cp_stats_enable: callback pointer for cp stats on psoc enable
152  * @cp_stats_disable: callback pointer for cp stats on psoc disable
153  */
154 struct cp_stats_context {
155 	qdf_spinlock_t csc_lock;
156 	struct wlan_objmgr_psoc *psoc_obj;
157 	struct psoc_cp_stats    *psoc_cs;
158 	QDF_STATUS (*cp_stats_ctx_init)(struct cp_stats_context *ctx);
159 	QDF_STATUS (*cp_stats_ctx_deinit)(struct cp_stats_context *ctx);
160 	QDF_STATUS (*cp_stats_psoc_obj_init)(struct psoc_cp_stats *psoc_cs);
161 	QDF_STATUS (*cp_stats_psoc_obj_deinit)(struct psoc_cp_stats *psoc_cs);
162 	QDF_STATUS (*cp_stats_pdev_obj_init)(struct pdev_cp_stats *pdev_cs);
163 	QDF_STATUS (*cp_stats_pdev_obj_deinit)(struct pdev_cp_stats *pdev_cs);
164 	QDF_STATUS (*cp_stats_vdev_obj_init)(struct vdev_cp_stats *vdev_cs);
165 	QDF_STATUS (*cp_stats_vdev_obj_deinit)(struct vdev_cp_stats *vdev_cs);
166 	QDF_STATUS (*cp_stats_peer_obj_init)(struct peer_cp_stats *peer_cs);
167 	QDF_STATUS (*cp_stats_peer_obj_deinit)(struct peer_cp_stats *peer_cs);
168 	QDF_STATUS (*cp_stats_comp_obj_config)(
169 			enum wlan_objmgr_obj_type obj_type,
170 			enum wlan_cp_stats_cfg_state cfg_state,
171 			enum wlan_cp_stats_comp_id comp_id,
172 			void *cmn_obj,
173 			void *data);
174 	QDF_STATUS (*cp_stats_open)(struct wlan_objmgr_psoc *psoc);
175 	QDF_STATUS (*cp_stats_close)(struct wlan_objmgr_psoc *psoc);
176 	QDF_STATUS (*cp_stats_enable)(struct wlan_objmgr_psoc *psoc);
177 	QDF_STATUS (*cp_stats_disable)(struct wlan_objmgr_psoc *psoc);
178 };
179 
180 /**
181  * wlan_cp_stats_psoc_obj_lock() - private API to acquire spinlock at psoc
182  * @psoc: pointer to psoc cp stats object
183  *
184  * Return: void
185  */
186 static inline void wlan_cp_stats_psoc_obj_lock(struct psoc_cp_stats *psoc)
187 {
188 	qdf_spin_lock_bh(&psoc->psoc_cp_stats_lock);
189 }
190 
191 /**
192  * wlan_cp_stats_psoc_obj_unlock() - private API to release spinlock at psoc
193  * @psoc: pointer to psoc cp stats object
194  *
195  * Return: void
196  */
197 static inline void wlan_cp_stats_psoc_obj_unlock(struct psoc_cp_stats *psoc)
198 {
199 	qdf_spin_unlock_bh(&psoc->psoc_cp_stats_lock);
200 }
201 
202 /**
203  * wlan_cp_stats_pdev_obj_lock() - private API to acquire spinlock at pdev
204  * @pdev: pointer to pdev cp stats object
205  *
206  * Return: void
207  */
208 static inline void wlan_cp_stats_pdev_obj_lock(struct pdev_cp_stats *pdev)
209 {
210 	qdf_spin_lock_bh(&pdev->pdev_cp_stats_lock);
211 }
212 
213 /**
214  * wlan_cp_stats_pdev_obj_unlock() - private api to release spinlock at pdev
215  * @pdev: pointer to pdev cp stats object
216  *
217  * Return: void
218  */
219 static inline void wlan_cp_stats_pdev_obj_unlock(struct pdev_cp_stats *pdev)
220 {
221 	qdf_spin_unlock_bh(&pdev->pdev_cp_stats_lock);
222 }
223 
224 /**
225  * wlan_cp_stats_vdev_obj_lock() - private api to acquire spinlock at vdev
226  * @vdev: pointer to vdev cp stats object
227  *
228  * Return: void
229  */
230 static inline void wlan_cp_stats_vdev_obj_lock(struct vdev_cp_stats *vdev)
231 {
232 	qdf_spin_lock_bh(&vdev->vdev_cp_stats_lock);
233 }
234 
235 /**
236  * wlan_cp_stats_vdev_obj_unlock() - private api to release spinlock at vdev
237  * @vdev: pointer to vdev cp stats object
238  *
239  * Return: void
240  */
241 static inline void wlan_cp_stats_vdev_obj_unlock(struct vdev_cp_stats *vdev)
242 {
243 	qdf_spin_unlock_bh(&vdev->vdev_cp_stats_lock);
244 }
245 
246 /**
247  * wlan_cp_stats_peer_obj_lock() - private api to acquire spinlock at peer
248  * @peer: pointer to peer cp stats object
249  *
250  * Return: void
251  */
252 static inline void wlan_cp_stats_peer_obj_lock(struct peer_cp_stats *peer)
253 {
254 	qdf_spin_lock_bh(&peer->peer_cp_stats_lock);
255 }
256 
257 /**
258  * wlan_cp_stats_peer_obj_unlock() - private api to release spinlock at peer
259  * @peer: pointer to peer cp stats object
260  *
261  * Return: void
262  */
263 static inline void wlan_cp_stats_peer_obj_unlock(struct peer_cp_stats *peer)
264 {
265 	qdf_spin_unlock_bh(&peer->peer_cp_stats_lock);
266 }
267 
268 /**
269  * wlan_cp_stats_get_psoc_stats_obj() - API to get psoc_cp_stats from psoc
270  * @psoc: Reference to psoc global object
271  *
272  * This API used to get psoc specific cp_stats object from global psoc
273  * reference.
274  *
275  * Return : Reference to psoc_cp_stats object on success or NULL on failure
276  */
277 static inline
278 struct psoc_cp_stats *wlan_cp_stats_get_psoc_stats_obj(struct wlan_objmgr_psoc
279 							*psoc)
280 {
281 	struct cp_stats_context *csc;
282 
283 	if (!psoc)
284 		return NULL;
285 
286 	csc = wlan_objmgr_psoc_get_comp_private_obj(psoc,
287 						    WLAN_UMAC_COMP_CP_STATS);
288 
289 	if (!csc)
290 		return NULL;
291 
292 	return csc->psoc_cs;
293 }
294 
295 /**
296  * wlan_cp_stats_get_pdev_stats_obj() - API to get pdev_cp_stats from pdev
297  * @pdev: Reference to pdev global object
298  *
299  * This API used to get pdev specific cp_stats object from global pdev
300  * reference.
301  *
302  * Return : Reference to pdev_cp_stats object on success or NULL on failure
303  */
304 static inline
305 struct pdev_cp_stats *wlan_cp_stats_get_pdev_stats_obj(struct wlan_objmgr_pdev
306 							*pdev)
307 {
308 	struct pdev_cp_stats *pdev_cs = NULL;
309 
310 	if (pdev) {
311 		pdev_cs = wlan_objmgr_pdev_get_comp_private_obj
312 				(pdev, WLAN_UMAC_COMP_CP_STATS);
313 	}
314 
315 	return pdev_cs;
316 }
317 
318 /**
319  * wlan_cp_stats_get_vdev_stats_obj() - API to get vdev_cp_stats from vdev
320  * @vdev : Reference to vdev global object
321  *
322  * This API used to get vdev specific cp_stats object from global vdev
323  * reference.
324  *
325  * Return : Reference to vdev_cp_stats object on success or NULL on failure
326  */
327 static inline
328 struct vdev_cp_stats *wlan_cp_stats_get_vdev_stats_obj(struct wlan_objmgr_vdev
329 							*vdev)
330 {
331 	struct vdev_cp_stats *vdev_cs = NULL;
332 
333 	if (vdev) {
334 		vdev_cs = wlan_objmgr_vdev_get_comp_private_obj
335 				(vdev, WLAN_UMAC_COMP_CP_STATS);
336 	}
337 
338 	return vdev_cs;
339 }
340 
341 /**
342  * wlan_cp_stats_get_peer_stats_obj() - API to get peer_cp_stats from peer
343  * @peer: Reference to peer global object
344  *
345  * This API used to get peer specific cp_stats object from global peer
346  * reference.
347  *
348  * Return : Reference to peer_cp_stats object on success or NULL on failure
349  */
350 static inline
351 struct peer_cp_stats *wlan_cp_stats_get_peer_stats_obj(struct wlan_objmgr_peer
352 							*peer)
353 {
354 	struct peer_cp_stats *peer_cs = NULL;
355 
356 	if (peer) {
357 		peer_cs = wlan_objmgr_peer_get_comp_private_obj
358 				(peer, WLAN_UMAC_COMP_CP_STATS);
359 	}
360 
361 	return peer_cs;
362 }
363 
364 /**
365  * wlan_cp_stats_get_pdev_from_vdev() - API to get pdev_cp_stats obj from vdev
366  * @vdev: Reference to vdev global object
367  *
368  * This API used to get pdev specific cp_stats object from global vdev
369  * reference.
370  *
371  * Return: Reference to pdev_cp_stats object on success or NULL on failure
372  */
373 static inline
374 struct pdev_cp_stats *wlan_cp_stats_get_pdev_from_vdev(struct wlan_objmgr_vdev
375 							*vdev)
376 {
377 	struct wlan_objmgr_pdev *pdev;
378 	struct pdev_cp_stats *pdev_cs = NULL;
379 
380 	pdev = wlan_vdev_get_pdev(vdev);
381 	if (pdev) {
382 		pdev_cs = wlan_objmgr_pdev_get_comp_private_obj
383 				(pdev, WLAN_UMAC_COMP_CP_STATS);
384 	}
385 
386 	return pdev_cs;
387 }
388 
389 /**
390  * wlan_cp_stats_ctx_get_from_pdev() - API to get cp_stats ctx obj from pdev
391  * @pdev: Reference to pdev global object
392  *
393  * This API used to get cp_stats context object from global pdev reference.
394  *
395  * Return: Reference to cp_stats_context object on success or NULL on failure
396  */
397 static inline
398 struct cp_stats_context *wlan_cp_stats_ctx_get_from_pdev(struct wlan_objmgr_pdev
399 							*pdev)
400 {
401 	struct wlan_objmgr_psoc *psoc;
402 	struct cp_stats_context *csc = NULL;
403 
404 	if (!pdev)
405 		return NULL;
406 
407 	psoc = wlan_pdev_get_psoc(pdev);
408 	if (psoc) {
409 		csc = wlan_objmgr_psoc_get_comp_private_obj
410 				(psoc, WLAN_UMAC_COMP_CP_STATS);
411 	}
412 	return csc;
413 }
414 
415 /**
416  * wlan_cp_stats_ctx_get_from_vdev() - API to get cp_stats ctx obj from vdev
417  * @vdev: Reference to vdev global object
418  *
419  * This API used to get cp_stats context object from global vdev reference.
420  *
421  * Return: Reference to cp_stats_context object on success or NULL on failure
422  */
423 static inline
424 struct cp_stats_context *wlan_cp_stats_ctx_get_from_vdev(struct wlan_objmgr_vdev
425 							*vdev)
426 {
427 	struct wlan_objmgr_pdev *pdev;
428 
429 	if (!vdev)
430 		return NULL;
431 
432 	pdev = wlan_vdev_get_pdev(vdev);
433 	return wlan_cp_stats_ctx_get_from_pdev(pdev);
434 }
435 
436 /**
437  * wlan_cp_stats_ctx_get_from_peer() - API to get cp_stats ctx object from peer
438  * @peer: Reference to peer object
439  *
440  * This API used to get cp_stats context object from global peer reference.
441  *
442  * Return: Reference to cp_stats_context object on success or NULL on failure
443  */
444 static inline
445 struct cp_stats_context *wlan_cp_stats_ctx_get_from_peer(struct wlan_objmgr_peer
446 							*peer)
447 {
448 	struct wlan_objmgr_vdev *vdev;
449 
450 	vdev = wlan_peer_get_vdev(peer);
451 	return wlan_cp_stats_ctx_get_from_vdev(vdev);
452 }
453 
454 /**
455  * wlan_cp_stats_get_comp_id() - API to get cp_stats component id from umac
456  * component id
457  * @comp_id: umac comp id
458  *
459  * Return: wlan_cp_stats_comp_id
460  */
461 static inline enum wlan_cp_stats_comp_id
462 wlan_cp_stats_get_comp_id(enum wlan_umac_comp_id comp_id)
463 {
464 	enum wlan_cp_stats_comp_id cp_stats_comp_id =
465 		WLAN_CP_STATS_MAX_COMPONENTS;
466 
467 	if (comp_id == WLAN_UMAC_COMP_ATF)
468 		cp_stats_comp_id = WLAN_CP_STATS_ATF;
469 
470 	return cp_stats_comp_id;
471 }
472 
473 #endif /* QCA_SUPPORT_CP_STATS */
474 #endif /* __WLAN_CP_STATS_DEFS_H__ */
475