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