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