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