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