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