1 /* 2 * Copyright (c) 2018-2019, 2021 The Linux Foundation. All rights reserved. 3 * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved. 4 * 5 * Permission to use, copy, modify, and/or distribute this software for 6 * any purpose with or without fee is hereby granted, provided that the 7 * above copyright notice and this permission notice appear in all 8 * copies. 9 * 10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL 11 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED 12 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE 13 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL 14 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR 15 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 16 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 17 * PERFORMANCE OF THIS SOFTWARE. 18 */ 19 20 /** 21 * DOC: wlan_cp_stats_defs.h 22 * 23 * This header file maintains core definitions of control plane statistics 24 * component 25 */ 26 27 #ifndef __WLAN_CP_STATS_DEFS_H__ 28 #define __WLAN_CP_STATS_DEFS_H__ 29 30 #ifdef QCA_SUPPORT_CP_STATS 31 #include <wlan_objmgr_cmn.h> 32 #include <wlan_objmgr_global_obj.h> 33 #include <wlan_objmgr_psoc_obj.h> 34 #include <wlan_objmgr_pdev_obj.h> 35 #include <wlan_objmgr_vdev_obj.h> 36 #include <wlan_objmgr_peer_obj.h> 37 #include "wlan_cp_stats_cmn_defs.h" 38 #include <wlan_cp_stats_utils_api.h> 39 #include <wlan_cp_stats_ext_type.h> 40 #include <wlan_cp_stats_public_structs.h> 41 #include <wlan_twt_public_structs.h> 42 43 /* noise floor */ 44 #define CP_STATS_TGT_NOISE_FLOOR_DBM (-96) 45 46 #ifdef WLAN_SUPPORT_INFRA_CTRL_PATH_STATS 47 typedef void (*get_infra_cp_stats_cb)(struct infra_cp_stats_event *ev, 48 void *cookie); 49 #endif 50 51 /** 52 * struct psoc_cp_stats - defines cp stats at psoc object 53 * @psoc_obj: pointer to psoc 54 * @psoc_comp_priv_obj[]: component's private object pointers 55 * @psoc_cp_stats_lock: lock to protect object 56 * @cmn_stats: stats common for AP and STA devices 57 * @obj_stats: stats specific to AP or STA devices 58 * @legacy_stats_cb: callback to update the stats received from FW through 59 * asynchronous events. 60 */ 61 struct psoc_cp_stats { 62 struct wlan_objmgr_psoc *psoc_obj; 63 void *psoc_comp_priv_obj[WLAN_CP_STATS_MAX_COMPONENTS]; 64 qdf_spinlock_t psoc_cp_stats_lock; 65 struct psoc_cmn_cp_stats *cmn_stats; 66 psoc_ext_cp_stats_t *obj_stats; 67 void (*legacy_stats_cb)(void *stats); 68 #ifdef WLAN_SUPPORT_INFRA_CTRL_PATH_STATS 69 void (*get_infra_cp_stats)(struct infra_cp_stats_event *ev, 70 void *cookie); 71 void *infra_cp_stats_req_context; 72 #endif 73 }; 74 75 /** 76 * struct pdev_cp_stats - defines cp stats at pdev object 77 * @pdev_obj: pointer to pdev 78 * @pdev_stats: pointer to ic/mc specific stats 79 * @pdev_comp_priv_obj[]: component's private object pointers 80 * @pdev_cp_stats_lock: lock to protect object 81 */ 82 struct pdev_cp_stats { 83 struct wlan_objmgr_pdev *pdev_obj; 84 pdev_ext_cp_stats_t *pdev_stats; 85 void *pdev_comp_priv_obj[WLAN_CP_STATS_MAX_COMPONENTS]; 86 qdf_spinlock_t pdev_cp_stats_lock; 87 }; 88 89 /** 90 * struct vdev_cp_stats - defines cp stats at vdev object 91 * @vdev_obj: pointer to vdev 92 * @vdev_stats: pointer to ic/mc specific stats 93 * @vdev_comp_priv_obj[]: component's private object pointers 94 * @vdev_cp_stats_lock: lock to protect object 95 * @mcast_rx_pnerr_stats_inc: callback function to update rx PN error stats 96 */ 97 struct vdev_cp_stats { 98 struct wlan_objmgr_vdev *vdev_obj; 99 vdev_ext_cp_stats_t *vdev_stats; 100 void *vdev_comp_priv_obj[WLAN_CP_STATS_MAX_COMPONENTS]; 101 qdf_spinlock_t vdev_cp_stats_lock; 102 void (*mcast_rx_pnerr_stats_inc)( 103 struct wlan_objmgr_vdev *vdev, 104 uint64_t val); 105 }; 106 107 /** 108 * struct peer_cp_stats - defines cp stats at peer object 109 * @peer_obj: pointer to peer 110 * @peer_stats: pointer to ic/mc specific stats 111 * @peer_comp_priv_obj[]: component's private object pointers 112 * @peer_cp_stats_lock: lock to protect object 113 * @rx_pnerr_stats_inc: callback function to update rx PN error stats 114 * @twt_param: Pointer to peer twt session parameters 115 */ 116 struct peer_cp_stats { 117 struct wlan_objmgr_peer *peer_obj; 118 peer_ext_cp_stats_t *peer_stats; 119 void *peer_comp_priv_obj[WLAN_CP_STATS_MAX_COMPONENTS]; 120 qdf_spinlock_t peer_cp_stats_lock; 121 void (*rx_pnerr_stats_inc)(struct wlan_objmgr_peer *peer, uint32_t val); 122 #if defined(WLAN_SUPPORT_TWT) && defined(WLAN_TWT_CONV_SUPPORTED) 123 struct twt_session_stats_info twt_param[WLAN_MAX_TWT_SESSIONS_PER_PEER]; 124 #endif 125 }; 126 127 /** 128 * struct cp_stats_context - defines cp stats global context object 129 * @csc_lock: lock to protect object 130 * @psoc_obj: pointer to psoc 131 * @psoc_cs: pointer to cp stats at psoc 132 * @cp_stats_ctx_init: callback pointer to init cp stats global ctx 133 * @cp_stats_ctx_deinit: callback pointer to deinit cp stats global ctx 134 * @cp_stats_psoc_obj_init:callback pointer to init cp stats obj on psoc create 135 * @cp_stats_psoc_obj_deinit:callback pointer to deinit cp stats obj on psoc 136 * destroy 137 * @cp_stats_pdev_obj_init:callback pointer to init cp stats obj on pdev create 138 * @cp_stats_pdev_obj_deinit:callback pointer to deinit cp stats obj on pdev 139 * destroy 140 * @cp_stats_vdev_obj_init:callback pointer to init cp stats obj on vdev create 141 * @cp_stats_vdev_obj_deinit:callback pointer to deinit cp stats obj on vdev 142 * destroy 143 * @cp_stats_peer_obj_init:callback pointer to init cp stats obj on peer create 144 * @cp_stats_peer_obj_deinit:callback pointer to deinit cp stats obj on peer 145 * destroy 146 * @cp_stats_comp_obj_config:callback pointer to attach/detach other umac comp 147 * @cp_stats_open: callback pointer for cp stats on psoc open 148 * @cp_stats_close: callback pointer for cp stats on psoc close 149 * @cp_stats_enable: callback pointer for cp stats on psoc enable 150 * @cp_stats_disable: callback pointer for cp stats on psoc disable 151 */ 152 struct cp_stats_context { 153 qdf_spinlock_t csc_lock; 154 struct wlan_objmgr_psoc *psoc_obj; 155 struct psoc_cp_stats *psoc_cs; 156 QDF_STATUS (*cp_stats_ctx_init)(struct cp_stats_context *ctx); 157 QDF_STATUS (*cp_stats_ctx_deinit)(struct cp_stats_context *ctx); 158 QDF_STATUS (*cp_stats_psoc_obj_init)(struct psoc_cp_stats *psoc_cs); 159 QDF_STATUS (*cp_stats_psoc_obj_deinit)(struct psoc_cp_stats *psoc_cs); 160 QDF_STATUS (*cp_stats_pdev_obj_init)(struct pdev_cp_stats *pdev_cs); 161 QDF_STATUS (*cp_stats_pdev_obj_deinit)(struct pdev_cp_stats *pdev_cs); 162 QDF_STATUS (*cp_stats_vdev_obj_init)(struct vdev_cp_stats *vdev_cs); 163 QDF_STATUS (*cp_stats_vdev_obj_deinit)(struct vdev_cp_stats *vdev_cs); 164 QDF_STATUS (*cp_stats_peer_obj_init)(struct peer_cp_stats *peer_cs); 165 QDF_STATUS (*cp_stats_peer_obj_deinit)(struct peer_cp_stats *peer_cs); 166 QDF_STATUS (*cp_stats_comp_obj_config)( 167 enum wlan_objmgr_obj_type obj_type, 168 enum wlan_cp_stats_cfg_state cfg_state, 169 enum wlan_cp_stats_comp_id comp_id, 170 void *cmn_obj, 171 void *data); 172 QDF_STATUS (*cp_stats_open)(struct wlan_objmgr_psoc *psoc); 173 QDF_STATUS (*cp_stats_close)(struct wlan_objmgr_psoc *psoc); 174 QDF_STATUS (*cp_stats_enable)(struct wlan_objmgr_psoc *psoc); 175 QDF_STATUS (*cp_stats_disable)(struct wlan_objmgr_psoc *psoc); 176 }; 177 178 /** 179 * wlan_cp_stats_psoc_obj_lock() - private API to acquire spinlock at psoc 180 * @psoc: pointer to psoc cp stats object 181 * 182 * Return: void 183 */ 184 static inline void wlan_cp_stats_psoc_obj_lock(struct psoc_cp_stats *psoc) 185 { 186 qdf_spin_lock_bh(&psoc->psoc_cp_stats_lock); 187 } 188 189 /** 190 * wlan_cp_stats_psoc_obj_unlock() - private API to release spinlock at psoc 191 * @psoc: pointer to psoc cp stats object 192 * 193 * Return: void 194 */ 195 static inline void wlan_cp_stats_psoc_obj_unlock(struct psoc_cp_stats *psoc) 196 { 197 qdf_spin_unlock_bh(&psoc->psoc_cp_stats_lock); 198 } 199 200 /** 201 * wlan_cp_stats_pdev_obj_lock() - private API to acquire spinlock at pdev 202 * @pdev: pointer to pdev cp stats object 203 * 204 * Return: void 205 */ 206 static inline void wlan_cp_stats_pdev_obj_lock(struct pdev_cp_stats *pdev) 207 { 208 qdf_spin_lock_bh(&pdev->pdev_cp_stats_lock); 209 } 210 211 /** 212 * wlan_cp_stats_pdev_obj_unlock() - private api to release spinlock at pdev 213 * @pdev: pointer to pdev cp stats object 214 * 215 * Return: void 216 */ 217 static inline void wlan_cp_stats_pdev_obj_unlock(struct pdev_cp_stats *pdev) 218 { 219 qdf_spin_unlock_bh(&pdev->pdev_cp_stats_lock); 220 } 221 222 /** 223 * wlan_cp_stats_vdev_obj_lock() - private api to acquire spinlock at vdev 224 * @vdev: pointer to vdev cp stats object 225 * 226 * Return: void 227 */ 228 static inline void wlan_cp_stats_vdev_obj_lock(struct vdev_cp_stats *vdev) 229 { 230 qdf_spin_lock_bh(&vdev->vdev_cp_stats_lock); 231 } 232 233 /** 234 * wlan_cp_stats_vdev_obj_unlock() - private api to release spinlock at vdev 235 * @vdev: pointer to vdev cp stats object 236 * 237 * Return: void 238 */ 239 static inline void wlan_cp_stats_vdev_obj_unlock(struct vdev_cp_stats *vdev) 240 { 241 qdf_spin_unlock_bh(&vdev->vdev_cp_stats_lock); 242 } 243 244 /** 245 * wlan_cp_stats_peer_obj_lock() - private api to acquire spinlock at peer 246 * @peer: pointer to peer cp stats object 247 * 248 * Return: void 249 */ 250 static inline void wlan_cp_stats_peer_obj_lock(struct peer_cp_stats *peer) 251 { 252 qdf_spin_lock_bh(&peer->peer_cp_stats_lock); 253 } 254 255 /** 256 * wlan_cp_stats_peer_obj_unlock() - private api to release spinlock at peer 257 * @peer: pointer to peer cp stats object 258 * 259 * Return: void 260 */ 261 static inline void wlan_cp_stats_peer_obj_unlock(struct peer_cp_stats *peer) 262 { 263 qdf_spin_unlock_bh(&peer->peer_cp_stats_lock); 264 } 265 266 /** 267 * wlan_cp_stats_get_psoc_stats_obj() - API to get psoc_cp_stats from psoc 268 * @psoc: Reference to psoc global object 269 * 270 * This API used to get psoc specific cp_stats object from global psoc 271 * reference. 272 * 273 * Return : Reference to psoc_cp_stats object on success or NULL on failure 274 */ 275 static inline 276 struct psoc_cp_stats *wlan_cp_stats_get_psoc_stats_obj(struct wlan_objmgr_psoc 277 *psoc) 278 { 279 struct cp_stats_context *csc; 280 281 if (!psoc) 282 return NULL; 283 284 csc = wlan_objmgr_psoc_get_comp_private_obj(psoc, 285 WLAN_UMAC_COMP_CP_STATS); 286 287 if (!csc) 288 return NULL; 289 290 return csc->psoc_cs; 291 } 292 293 /** 294 * wlan_cp_stats_get_pdev_stats_obj() - API to get pdev_cp_stats from pdev 295 * @pdev: Reference to pdev global object 296 * 297 * This API used to get pdev specific cp_stats object from global pdev 298 * reference. 299 * 300 * Return : Reference to pdev_cp_stats object on success or NULL on failure 301 */ 302 static inline 303 struct pdev_cp_stats *wlan_cp_stats_get_pdev_stats_obj(struct wlan_objmgr_pdev 304 *pdev) 305 { 306 struct pdev_cp_stats *pdev_cs = NULL; 307 308 if (pdev) { 309 pdev_cs = wlan_objmgr_pdev_get_comp_private_obj 310 (pdev, WLAN_UMAC_COMP_CP_STATS); 311 } 312 313 return pdev_cs; 314 } 315 316 /** 317 * wlan_cp_stats_get_vdev_stats_obj() - API to get vdev_cp_stats from vdev 318 * @vdev : Reference to vdev global object 319 * 320 * This API used to get vdev specific cp_stats object from global vdev 321 * reference. 322 * 323 * Return : Reference to vdev_cp_stats object on success or NULL on failure 324 */ 325 static inline 326 struct vdev_cp_stats *wlan_cp_stats_get_vdev_stats_obj(struct wlan_objmgr_vdev 327 *vdev) 328 { 329 struct vdev_cp_stats *vdev_cs = NULL; 330 331 if (vdev) { 332 vdev_cs = wlan_objmgr_vdev_get_comp_private_obj 333 (vdev, WLAN_UMAC_COMP_CP_STATS); 334 } 335 336 return vdev_cs; 337 } 338 339 /** 340 * wlan_cp_stats_get_peer_stats_obj() - API to get peer_cp_stats from peer 341 * @peer: Reference to peer global object 342 * 343 * This API used to get peer specific cp_stats object from global peer 344 * reference. 345 * 346 * Return : Reference to peer_cp_stats object on success or NULL on failure 347 */ 348 static inline 349 struct peer_cp_stats *wlan_cp_stats_get_peer_stats_obj(struct wlan_objmgr_peer 350 *peer) 351 { 352 struct peer_cp_stats *peer_cs = NULL; 353 354 if (peer) { 355 peer_cs = wlan_objmgr_peer_get_comp_private_obj 356 (peer, WLAN_UMAC_COMP_CP_STATS); 357 } 358 359 return peer_cs; 360 } 361 362 /** 363 * wlan_cp_stats_get_pdev_from_vdev() - API to get pdev_cp_stats obj from vdev 364 * @vdev: Reference to vdev global object 365 * 366 * This API used to get pdev specific cp_stats object from global vdev 367 * reference. 368 * 369 * Return: Reference to pdev_cp_stats object on success or NULL on failure 370 */ 371 static inline 372 struct pdev_cp_stats *wlan_cp_stats_get_pdev_from_vdev(struct wlan_objmgr_vdev 373 *vdev) 374 { 375 struct wlan_objmgr_pdev *pdev; 376 struct pdev_cp_stats *pdev_cs = NULL; 377 378 pdev = wlan_vdev_get_pdev(vdev); 379 if (pdev) { 380 pdev_cs = wlan_objmgr_pdev_get_comp_private_obj 381 (pdev, WLAN_UMAC_COMP_CP_STATS); 382 } 383 384 return pdev_cs; 385 } 386 387 /** 388 * wlan_cp_stats_ctx_get_from_pdev() - API to get cp_stats ctx obj from pdev 389 * @pdev: Reference to pdev global object 390 * 391 * This API used to get cp_stats context object from global pdev reference. 392 * 393 * Return: Reference to cp_stats_context object on success or NULL on failure 394 */ 395 static inline 396 struct cp_stats_context *wlan_cp_stats_ctx_get_from_pdev(struct wlan_objmgr_pdev 397 *pdev) 398 { 399 struct wlan_objmgr_psoc *psoc; 400 struct cp_stats_context *csc = NULL; 401 402 if (!pdev) 403 return NULL; 404 405 psoc = wlan_pdev_get_psoc(pdev); 406 if (psoc) { 407 csc = wlan_objmgr_psoc_get_comp_private_obj 408 (psoc, WLAN_UMAC_COMP_CP_STATS); 409 } 410 return csc; 411 } 412 413 /** 414 * wlan_cp_stats_ctx_get_from_vdev() - API to get cp_stats ctx obj from vdev 415 * @vdev: Reference to vdev global object 416 * 417 * This API used to get cp_stats context object from global vdev reference. 418 * 419 * Return: Reference to cp_stats_context object on success or NULL on failure 420 */ 421 static inline 422 struct cp_stats_context *wlan_cp_stats_ctx_get_from_vdev(struct wlan_objmgr_vdev 423 *vdev) 424 { 425 struct wlan_objmgr_pdev *pdev; 426 427 if (!vdev) 428 return NULL; 429 430 pdev = wlan_vdev_get_pdev(vdev); 431 return wlan_cp_stats_ctx_get_from_pdev(pdev); 432 } 433 434 /** 435 * wlan_cp_stats_ctx_get_from_peer() - API to get cp_stats ctx object from peer 436 * @peer: Reference to peer object 437 * 438 * This API used to get cp_stats context object from global peer reference. 439 * 440 * Return: Reference to cp_stats_context object on success or NULL on failure 441 */ 442 static inline 443 struct cp_stats_context *wlan_cp_stats_ctx_get_from_peer(struct wlan_objmgr_peer 444 *peer) 445 { 446 struct wlan_objmgr_vdev *vdev; 447 448 vdev = wlan_peer_get_vdev(peer); 449 return wlan_cp_stats_ctx_get_from_vdev(vdev); 450 } 451 452 /** 453 * wlan_cp_stats_get_comp_id() - API to get cp_stats component id from umac 454 * component id 455 * @comp_id: umac comp id 456 * 457 * Return: wlan_cp_stats_comp_id 458 */ 459 static inline enum wlan_cp_stats_comp_id 460 wlan_cp_stats_get_comp_id(enum wlan_umac_comp_id comp_id) 461 { 462 enum wlan_cp_stats_comp_id cp_stats_comp_id = 463 WLAN_CP_STATS_MAX_COMPONENTS; 464 465 if (comp_id == WLAN_UMAC_COMP_ATF) 466 cp_stats_comp_id = WLAN_CP_STATS_ATF; 467 468 return cp_stats_comp_id; 469 } 470 471 #endif /* QCA_SUPPORT_CP_STATS */ 472 #endif /* __WLAN_CP_STATS_DEFS_H__ */ 473