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