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