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