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