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