1 /* 2 * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved. 3 * Copyright (c) 2021-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_mc_ucfg_api.h 22 * 23 * This header file maintain API declaration required for northbound interaction 24 */ 25 26 #ifndef __WLAN_CP_STATS_MC_UCFG_API_H__ 27 #define __WLAN_CP_STATS_MC_UCFG_API_H__ 28 29 #ifdef QCA_SUPPORT_CP_STATS 30 31 #include <wlan_objmgr_psoc_obj.h> 32 #include <wlan_objmgr_vdev_obj.h> 33 #include <wlan_cp_stats_mc_defs.h> 34 35 #ifdef WLAN_SUPPORT_TWT 36 37 #include <wlan_objmgr_peer_obj.h> 38 #include "../../core/src/wlan_cp_stats_defs.h" 39 #include <qdf_event.h> 40 41 /* Max TWT sessions supported */ 42 #define TWT_PSOC_MAX_SESSIONS TWT_PEER_MAX_SESSIONS 43 44 /** 45 * ucfg_twt_get_peer_session_params() - Retrieves peer twt session parameters 46 * corresponding to a peer by using mac_addr and dialog id 47 * If dialog_id is TWT_GET_ALL_PEER_PARAMS_DIALOG_ID retrieves twt session 48 * parameters of all peers with valid twt session 49 * @psoc_obj: psoc object 50 * @param: array pointer to store peer twt session parameters, should contain 51 * mac_addr and dialog id of a peer for which twt session stats to be retrieved 52 * 53 * Return: total number of valid twt session 54 */ 55 int 56 ucfg_twt_get_peer_session_params(struct wlan_objmgr_psoc *psoc_obj, 57 struct wmi_host_twt_session_stats_info *param); 58 #endif /* WLAN_SUPPORT_TWT */ 59 60 struct psoc_cp_stats; 61 struct vdev_cp_stats; 62 63 /** 64 * ucfg_mc_cp_stats_get_psoc_wake_lock_stats() : API to get wake lock stats from 65 * psoc 66 * @psoc: pointer to psoc object 67 * @stats: stats object to populate 68 * 69 * Return : status of operation 70 */ 71 QDF_STATUS ucfg_mc_cp_stats_get_psoc_wake_lock_stats( 72 struct wlan_objmgr_psoc *psoc, 73 struct wake_lock_stats *stats); 74 75 /** 76 * ucfg_mc_cp_stats_get_vdev_wake_lock_stats() : API to get wake lock stats from 77 * vdev 78 * @vdev: pointer to vdev object 79 * @stats: stats object to populate 80 * 81 * Return : status of operation 82 */ 83 QDF_STATUS ucfg_mc_cp_stats_get_vdev_wake_lock_stats( 84 struct wlan_objmgr_vdev *vdev, 85 struct wake_lock_stats *stats); 86 87 /** 88 * ucfg_mc_cp_stats_inc_wake_lock_stats_by_protocol() : API to increment wake 89 * lock stats given the protocol of the packet that was received. 90 * @psoc: pointer to psoc object 91 * @vdev_id: vdev_id for which the packet was received 92 * @protocol: protocol of the packet that was received 93 * 94 * Return : status of operation 95 */ 96 QDF_STATUS ucfg_mc_cp_stats_inc_wake_lock_stats_by_protocol( 97 struct wlan_objmgr_psoc *psoc, 98 uint8_t vdev_id, 99 enum qdf_proto_subtype protocol); 100 101 /** 102 * ucfg_mc_cp_stats_inc_wake_lock_stats_by_dst_addr() : API to increment wake 103 * lock stats given destination of packet that was received. 104 * @psoc: pointer to psoc object 105 * @vdev_id: vdev_id for which the packet was received 106 * @dest_mac: destination mac address of packet that was received 107 * 108 * Return : status of operation 109 */ 110 QDF_STATUS ucfg_mc_cp_stats_inc_wake_lock_stats_by_dst_addr( 111 struct wlan_objmgr_psoc *psoc, 112 uint8_t vdev_id, uint8_t *dest_mac); 113 114 /** 115 * ucfg_mc_cp_stats_inc_wake_lock_stats() : API to increment wake lock stats 116 * given wake reason. 117 * @psoc: pointer to psoc object 118 * @vdev_id: vdev_id on with WOW was received 119 * @reason: reason of WOW 120 * 121 * Return : status of operation 122 */ 123 QDF_STATUS ucfg_mc_cp_stats_inc_wake_lock_stats(struct wlan_objmgr_psoc *psoc, 124 uint8_t vdev_id, 125 uint32_t reason); 126 127 /** 128 * ucfg_mc_cp_stats_write_wow_stats() - Writes WOW stats to buffer 129 * @psoc: pointer to psoc object 130 * @buffer: The char buffer to write to 131 * @max_len: The maximum number of chars to write 132 * @ret: number of bytes written 133 * 134 * Return: status of operation 135 */ 136 QDF_STATUS ucfg_mc_cp_stats_write_wow_stats( 137 struct wlan_objmgr_psoc *psoc, 138 char *buffer, uint16_t max_len, int *ret); 139 140 /** 141 * ucfg_mc_cp_stats_send_stats_request() - API to send stats request to lmac 142 * @vdev: pointer to vdev object 143 * @type: request type 144 * @info: specific request information 145 * 146 * Return: status of operation 147 */ 148 QDF_STATUS ucfg_mc_cp_stats_send_stats_request(struct wlan_objmgr_vdev *vdev, 149 enum stats_req_type type, 150 struct request_info *info); 151 152 /** 153 * wlan_cfg80211_mc_twt_clear_infra_cp_stats() - send request to reset 154 * control path statistics 155 * @vdev: pointer to vdev object 156 * @dialog_id: dialod id of the twt session 157 * @twt_peer_mac: mac address of the peer 158 * 159 * Return: 0 for success or error code for failure 160 */ 161 int 162 wlan_cfg80211_mc_twt_clear_infra_cp_stats( 163 struct wlan_objmgr_vdev *vdev, 164 uint32_t dialog_id, 165 uint8_t twt_peer_mac[QDF_MAC_ADDR_SIZE]); 166 167 /** 168 * wlan_cfg80211_mc_twt_get_infra_cp_stats() - send twt get statistic request 169 * @vdev: pointer to vdev object 170 * @dialog_id: TWT session dialog id 171 * @twt_peer_mac: mac address of the peer 172 * @errno: error code 173 * 174 * Return: pointer to infra cp stats event for success or NULL for failure 175 */ 176 struct infra_cp_stats_event * 177 wlan_cfg80211_mc_twt_get_infra_cp_stats(struct wlan_objmgr_vdev *vdev, 178 uint32_t dialog_id, 179 uint8_t twt_peer_mac[QDF_MAC_ADDR_SIZE], 180 int *errno); 181 /** 182 * ucfg_mc_cp_stats_get_tx_power() - API to fetch tx_power 183 * @vdev: pointer to vdev object 184 * @dbm: pointer to tx power in dbm 185 * 186 * Return: status of operation 187 */ 188 QDF_STATUS ucfg_mc_cp_stats_get_tx_power(struct wlan_objmgr_vdev *vdev, 189 int *dbm); 190 191 /** 192 * ucfg_mc_cp_stats_is_req_pending() - API to tell if given request is pending 193 * @psoc: pointer to psoc object 194 * @type: request type to check 195 * 196 * Return: true of request is pending, false otherwise 197 */ 198 bool ucfg_mc_cp_stats_is_req_pending(struct wlan_objmgr_psoc *psoc, 199 enum stats_req_type type); 200 201 /** 202 * ucfg_mc_cp_stats_set_pending_req() - API to set pending request 203 * @psoc: pointer to psoc object 204 * @type: request to update 205 * @req: value to update 206 * 207 * Return: status of operation 208 */ 209 QDF_STATUS ucfg_mc_cp_stats_set_pending_req(struct wlan_objmgr_psoc *psoc, 210 enum stats_req_type type, 211 struct request_info *req); 212 /** 213 * ucfg_mc_cp_stats_reset_pending_req() - API to reset pending request 214 * @psoc: pointer to psoc object 215 * @type: request to update 216 * @last_req: last request 217 * @pending: pending request present 218 * 219 * The function is an atomic operation of "reset" and "get" last request. 220 * 221 * Return: status of operation 222 */ 223 QDF_STATUS ucfg_mc_cp_stats_reset_pending_req(struct wlan_objmgr_psoc *psoc, 224 enum stats_req_type type, 225 struct request_info *last_req, 226 bool *pending); 227 228 /** 229 * ucfg_mc_cp_stats_get_pending_req() - API to get pending request 230 * @psoc: pointer to psoc object 231 * @type: request to update 232 * @info: buffer to populate 233 * 234 * Return: status of operation 235 */ 236 QDF_STATUS ucfg_mc_cp_stats_get_pending_req(struct wlan_objmgr_psoc *psoc, 237 enum stats_req_type type, 238 struct request_info *info); 239 240 /** 241 * ucfg_mc_infra_cp_stats_free_stats_resources() - API to free buffers within 242 * infra cp stats_event structure 243 * @ev: structure whose buffer are to freed 244 * 245 * Return: none 246 */ 247 void 248 ucfg_mc_infra_cp_stats_free_stats_resources(struct infra_cp_stats_event *ev); 249 250 /** 251 * ucfg_mc_cp_stats_free_stats_resources() - API to free buffers within stats_event 252 * structure 253 * @ev: structure whose buffer are to freed 254 * 255 * Return: none 256 */ 257 void ucfg_mc_cp_stats_free_stats_resources(struct stats_event *ev); 258 259 /** 260 * ucfg_mc_cp_stats_cca_stats_get() - API to fetch cca stats 261 * @vdev: pointer to vdev object 262 * @cca_stats: pointer to cca info 263 * 264 * Return: status of operation 265 */ 266 QDF_STATUS ucfg_mc_cp_stats_cca_stats_get(struct wlan_objmgr_vdev *vdev, 267 struct cca_stats *cca_stats); 268 269 /** 270 * ucfg_mc_cp_stats_set_rate_flags() - API to set rate flags 271 * @vdev: pointer to vdev object 272 * @flags: value to set 273 * 274 * Return: status of operation 275 */ 276 QDF_STATUS ucfg_mc_cp_stats_set_rate_flags(struct wlan_objmgr_vdev *vdev, 277 uint32_t flags); 278 279 /** 280 * ucfg_mc_cp_stats_register_lost_link_info_cb() - API to register lost link 281 * info callback 282 * @psoc: pointer to psoc object 283 * @lost_link_cp_stats_info_cb: Lost link info callback to be registered 284 * 285 */ 286 void ucfg_mc_cp_stats_register_lost_link_info_cb( 287 struct wlan_objmgr_psoc *psoc, 288 void (*lost_link_cp_stats_info_cb)(void *stats_ev)); 289 290 #ifdef WLAN_POWER_MANAGEMENT_OFFLOAD 291 /** 292 * ucfg_mc_cp_stats_register_pmo_handler() - API to register pmo handler 293 * 294 * Return: none 295 */ 296 void ucfg_mc_cp_stats_register_pmo_handler(void); 297 #else 298 void static inline ucfg_mc_cp_stats_register_pmo_handler(void) { }; 299 #endif /* WLAN_POWER_MANAGEMENT_OFFLOAD */ 300 301 #ifdef WLAN_FEATURE_BIG_DATA_STATS 302 /** 303 * ucfg_send_big_data_stats_request() - API to send big data stats 304 * request 305 * @vdev: pointer to vdev object 306 * @type: request type 307 * @info: request info 308 * 309 * Return: status of operation 310 */ 311 QDF_STATUS ucfg_send_big_data_stats_request(struct wlan_objmgr_vdev *vdev, 312 enum stats_req_type type, 313 struct request_info *info); 314 315 /** 316 * ucfg_mc_cp_set_big_data_fw_support() - set big data fw support 317 * @psoc: PSOC object 318 * @enable: Set true if firmware supports big data, otherwise false 319 * 320 * API to set fw supports big data feature or not 321 * 322 * Return: void 323 */ 324 void 325 ucfg_mc_cp_set_big_data_fw_support(struct wlan_objmgr_psoc *psoc, 326 bool enable); 327 328 /** 329 * ucfg_mc_cp_get_big_data_fw_support() - get big data fw support 330 * @psoc: PSOC object 331 * @enable: Set true if firmware supports big data, otherwise false 332 * 333 * API to get fw supports big data feature or not 334 * 335 * Return: void 336 */ 337 void 338 ucfg_mc_cp_get_big_data_fw_support(struct wlan_objmgr_psoc *psoc, 339 bool *enable); 340 #else 341 static inline 342 QDF_STATUS ucfg_send_big_data_stats_request(struct wlan_objmgr_vdev *vdev, 343 enum stats_req_type type, 344 struct request_info *info) 345 { 346 return QDF_STATUS_SUCCESS; 347 } 348 349 static inline void 350 ucfg_mc_cp_set_big_data_fw_support(struct wlan_objmgr_psoc *psoc, 351 bool enable) 352 {} 353 354 static inline void 355 ucfg_mc_cp_get_big_data_fw_support(struct wlan_objmgr_psoc *psoc, 356 bool *enable) 357 {} 358 #endif 359 360 #ifdef CONFIG_WLAN_BMISS 361 /** 362 * wlan_cfg80211_mc_bmiss_get_infra_cp_stats() - API to get bmiss stats 363 * @vdev: pointer to vdev object 364 * @bmiss_peer_mac: mac address of the peer 365 * @errno: error code 366 * 367 * Return: pointer to infra cp stats event for success or NULL for failure 368 */ 369 struct infra_cp_stats_event* 370 wlan_cfg80211_mc_bmiss_get_infra_cp_stats( 371 struct wlan_objmgr_vdev *vdev, 372 uint8_t bmiss_peer_mac[QDF_MAC_ADDR_SIZE], 373 int *errno); 374 #else /* CONFIG_WLAN_BMISS */ 375 static inline struct infra_cp_stats_event* 376 wlan_cfg80211_mc_bmiss_get_infra_cp_stats( 377 struct wlan_objmgr_vdev *vdev, 378 uint8_t bmiss_peer_mac[QDF_MAC_ADDR_SIZE], 379 int *errno) 380 { 381 return NULL; 382 } 383 #endif /* CONFIG_WLAN_BMISS */ 384 385 /** 386 * wlan_cp_stats_update_chan_info() - API to update chan stats 387 * @psoc: pointer to psoc 388 * @chan_stat: channel stats 389 * @vdev_id: vdev id 390 * 391 * Return: None 392 */ 393 void wlan_cp_stats_update_chan_info(struct wlan_objmgr_psoc *psoc, 394 struct channel_status *chan_stat, 395 uint8_t vdev_id); 396 397 /** 398 * wlan_cp_stats_get_rx_clear_count() - API to get rx clear count for a channel 399 * @psoc: pointer to psoc 400 * @vdev_id: vdev id 401 * @req_freq: freq for which rx clear count require 402 * 403 * Return: channel load 404 */ 405 uint8_t wlan_cp_stats_get_rx_clear_count(struct wlan_objmgr_psoc *psoc, 406 uint8_t vdev_id, qdf_freq_t req_freq); 407 408 /** 409 * ucfg_mc_cp_stats_clear_channel_status() - API to clear chan stats 410 * @pdev: pointer to pdev object 411 * 412 * Return: None 413 */ 414 void ucfg_mc_cp_stats_clear_channel_status(struct wlan_objmgr_pdev *pdev); 415 416 /** 417 * ucfg_mc_cp_stats_get_channel_status() - API to get chan stats 418 * @pdev: pointer to pdev object 419 * @chan_freq: channel freq of which stats are needed 420 * 421 * Return: channel status 422 */ 423 struct channel_status * 424 ucfg_mc_cp_stats_get_channel_status(struct wlan_objmgr_pdev *pdev, 425 uint32_t chan_freq); 426 #else /* QCA_SUPPORT_CP_STATS */ 427 428 void static inline ucfg_mc_cp_stats_register_pmo_handler(void) { }; 429 static inline QDF_STATUS ucfg_mc_cp_stats_send_stats_request( 430 struct wlan_objmgr_vdev *vdev, 431 enum stats_req_type type, 432 struct request_info *info) 433 { 434 return QDF_STATUS_SUCCESS; 435 } 436 437 static inline QDF_STATUS ucfg_mc_cp_stats_set_rate_flags( 438 struct wlan_objmgr_vdev *vdev, 439 uint32_t flags) 440 { 441 return QDF_STATUS_SUCCESS; 442 } 443 444 static inline QDF_STATUS ucfg_mc_cp_stats_get_psoc_wake_lock_stats( 445 struct wlan_objmgr_psoc *psoc, 446 struct wake_lock_stats *stats) 447 { 448 return QDF_STATUS_SUCCESS; 449 } 450 451 static inline QDF_STATUS ucfg_mc_cp_stats_inc_wake_lock_stats_by_protocol( 452 struct wlan_objmgr_psoc *psoc, 453 uint8_t vdev_id, 454 enum qdf_proto_subtype protocol) 455 { 456 return QDF_STATUS_SUCCESS; 457 } 458 459 static inline QDF_STATUS ucfg_mc_cp_stats_inc_wake_lock_stats( 460 struct wlan_objmgr_psoc *psoc, 461 uint8_t vdev_id, 462 uint32_t reason) 463 { 464 return QDF_STATUS_SUCCESS; 465 } 466 467 static inline QDF_STATUS ucfg_mc_cp_stats_inc_wake_lock_stats_by_dst_addr( 468 struct wlan_objmgr_psoc *psoc, 469 uint8_t vdev_id, uint8_t *dest_mac) 470 { 471 return QDF_STATUS_SUCCESS; 472 } 473 474 static inline QDF_STATUS ucfg_mc_cp_stats_get_vdev_wake_lock_stats( 475 struct wlan_objmgr_vdev *vdev, 476 struct wake_lock_stats *stats) 477 { 478 return QDF_STATUS_SUCCESS; 479 } 480 481 static inline 482 QDF_STATUS ucfg_send_big_data_stats_request(struct wlan_objmgr_vdev *vdev, 483 enum stats_req_type type, 484 struct request_info *info) 485 { 486 return QDF_STATUS_SUCCESS; 487 } 488 489 static inline void 490 ucfg_mc_cp_set_big_data_fw_support(struct wlan_objmgr_psoc *psoc, 491 bool enable) 492 {} 493 494 static inline void 495 ucfg_mc_cp_big_data_fw_support(struct wlan_objmgr_psoc *psoc, 496 bool *enable) 497 {} 498 499 static inline struct infra_cp_stats_event* 500 wlan_cfg80211_mc_bmiss_get_infra_cp_stats( 501 struct wlan_objmgr_vdev *vdev, 502 uint8_t bmiss_peer_mac[QDF_MAC_ADDR_SIZE], 503 int *errno) 504 { 505 return NULL; 506 } 507 508 static inline void 509 ucfg_mc_cp_stats_get_tx_power(struct wlan_objmgr_vdev *vdev, 510 int *dbm) 511 {} 512 513 static inline 514 void wlan_cp_stats_update_chan_info(struct wlan_objmgr_psoc *psoc, 515 struct channel_status *chan_stat, 516 uint8_t vdev_id) 517 { 518 } 519 520 static inline 521 uint8_t wlan_cp_stats_get_rx_clear_count(struct wlan_objmgr_psoc *psoc, 522 uint8_t vdev_id, qdf_freq_t req_freq) 523 { 524 } 525 526 static inline 527 void ucfg_mc_cp_stats_clear_channel_status(struct wlan_objmgr_pdev *pdev) 528 { 529 } 530 531 static inline struct channel_status * 532 ucfg_mc_cp_stats_get_channel_status(struct wlan_objmgr_pdev *pdev, 533 uint32_t chan_freq) 534 { 535 return NULL; 536 } 537 #endif /* QCA_SUPPORT_CP_STATS */ 538 #endif /* __WLAN_CP_STATS_MC_UCFG_API_H__ */ 539