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