1 /* 2 * Copyright (c) 2016-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: cdp_txrx_host_stats.h 22 * Define the host data path stats API functions 23 * called by the host control SW and the OS interface module 24 */ 25 #ifndef _CDP_TXRX_HOST_STATS_H_ 26 #define _CDP_TXRX_HOST_STATS_H_ 27 #include "cdp_txrx_handle.h" 28 #include <cdp_txrx_cmn.h> 29 #include <wmi_unified_api.h> 30 /** 31 * cdp_host_stats_get() - cdp call to get host stats 32 * @soc: SOC handle 33 * @vdev_id: vdev id of vdev 34 * @req: Requirement type 35 * 36 * Return: 0 for Success, Failure returns error message 37 */ cdp_host_stats_get(ol_txrx_soc_handle soc,uint8_t vdev_id,struct ol_txrx_stats_req * req)38 static inline int cdp_host_stats_get(ol_txrx_soc_handle soc, 39 uint8_t vdev_id, 40 struct ol_txrx_stats_req *req) 41 { 42 if (!soc || !soc->ops) { 43 dp_cdp_debug("Invalid Instance"); 44 QDF_BUG(0); 45 return 0; 46 } 47 48 if (!soc->ops->host_stats_ops || 49 !soc->ops->host_stats_ops->txrx_host_stats_get) 50 return 0; 51 52 return soc->ops->host_stats_ops->txrx_host_stats_get(soc, vdev_id, req); 53 } 54 55 /** 56 * cdp_host_stats_get_ratekbps() - cdp call to get rate in kbps 57 * @soc: SOC handle 58 * @preamb: Preamble 59 * @mcs: Modulation and Coding scheme index 60 * @htflag: Flag to identify HT or VHT 61 * @gintval: Guard Interval value 62 * 63 * Return: 0 for Failure, Returns rate on Success 64 */ cdp_host_stats_get_ratekbps(ol_txrx_soc_handle soc,int preamb,int mcs,int htflag,int gintval)65 static inline int cdp_host_stats_get_ratekbps(ol_txrx_soc_handle soc, 66 int preamb, int mcs, 67 int htflag, int gintval) 68 { 69 if (!soc || !soc->ops) { 70 dp_cdp_debug("Invalid Instance"); 71 QDF_BUG(0); 72 return 0; 73 } 74 75 if (!soc->ops->host_stats_ops || 76 !soc->ops->host_stats_ops->txrx_get_ratekbps) 77 return 0; 78 79 return soc->ops->host_stats_ops->txrx_get_ratekbps(preamb, 80 mcs, htflag, 81 gintval); 82 } 83 84 /** 85 * cdp_host_stats_clr() - cdp call to clear host stats 86 * @soc: soc handle 87 * @vdev_id: vdev handle id 88 * 89 * Return: QDF_STATUS 90 */ 91 static inline QDF_STATUS cdp_host_stats_clr(ol_txrx_soc_handle soc,uint8_t vdev_id)92 cdp_host_stats_clr(ol_txrx_soc_handle soc, uint8_t vdev_id) 93 { 94 if (!soc || !soc->ops) { 95 dp_cdp_debug("Invalid Instance"); 96 QDF_BUG(0); 97 return QDF_STATUS_E_FAILURE; 98 } 99 100 if (!soc->ops->host_stats_ops || 101 !soc->ops->host_stats_ops->txrx_host_stats_clr) 102 return QDF_STATUS_E_FAILURE; 103 104 return soc->ops->host_stats_ops->txrx_host_stats_clr(soc, vdev_id); 105 } 106 107 static inline QDF_STATUS cdp_host_ce_stats(ol_txrx_soc_handle soc,uint8_t vdev_id)108 cdp_host_ce_stats(ol_txrx_soc_handle soc, uint8_t vdev_id) 109 { 110 if (!soc || !soc->ops) { 111 dp_cdp_debug("Invalid Instance"); 112 QDF_BUG(0); 113 return QDF_STATUS_E_FAILURE; 114 } 115 116 if (!soc->ops->host_stats_ops || 117 !soc->ops->host_stats_ops->txrx_host_ce_stats) 118 return QDF_STATUS_E_FAILURE; 119 120 return soc->ops->host_stats_ops->txrx_host_ce_stats(soc, vdev_id); 121 } 122 cdp_stats_publish(ol_txrx_soc_handle soc,uint8_t pdev_id,struct cdp_stats_extd * buf)123 static inline int cdp_stats_publish 124 (ol_txrx_soc_handle soc, uint8_t pdev_id, 125 struct cdp_stats_extd *buf) 126 { 127 if (!soc || !soc->ops) { 128 dp_cdp_debug("Invalid Instance"); 129 QDF_BUG(0); 130 return 0; 131 } 132 133 if (!soc->ops->host_stats_ops || 134 !soc->ops->host_stats_ops->txrx_stats_publish) 135 return 0; 136 137 return soc->ops->host_stats_ops->txrx_stats_publish(soc, pdev_id, buf); 138 } 139 140 /** 141 * cdp_enable_enhanced_stats() - Enable enhanced stats functionality. 142 * @soc: the soc object 143 * @pdev_id: id of the physical device object 144 * 145 * Return: QDF_STATUS 146 */ 147 static inline QDF_STATUS cdp_enable_enhanced_stats(ol_txrx_soc_handle soc,uint8_t pdev_id)148 cdp_enable_enhanced_stats(ol_txrx_soc_handle soc, uint8_t pdev_id) 149 { 150 if (!soc || !soc->ops) { 151 dp_cdp_debug("Invalid Instance"); 152 QDF_BUG(0); 153 return QDF_STATUS_E_FAILURE; 154 } 155 156 if (!soc->ops->mon_ops || 157 !soc->ops->mon_ops->txrx_enable_enhanced_stats) 158 return QDF_STATUS_E_FAILURE; 159 160 return soc->ops->mon_ops->txrx_enable_enhanced_stats 161 (soc, pdev_id); 162 } 163 164 /** 165 * cdp_disable_enhanced_stats() - Disable enhanced stats functionality. 166 * @soc: the soc object 167 * @pdev_id: id of the physical device object 168 * 169 * Return: QDF_STATUS 170 */ 171 static inline QDF_STATUS cdp_disable_enhanced_stats(ol_txrx_soc_handle soc,uint8_t pdev_id)172 cdp_disable_enhanced_stats(ol_txrx_soc_handle soc, uint8_t pdev_id) 173 { 174 if (!soc || !soc->ops) { 175 dp_cdp_debug("Invalid Instance"); 176 QDF_BUG(0); 177 return QDF_STATUS_E_FAILURE; 178 } 179 180 if (!soc->ops->mon_ops || 181 !soc->ops->mon_ops->txrx_disable_enhanced_stats) 182 return QDF_STATUS_E_FAILURE; 183 184 return soc->ops->mon_ops->txrx_disable_enhanced_stats 185 (soc, pdev_id); 186 } 187 188 static inline QDF_STATUS cdp_tx_print_tso_stats(ol_txrx_soc_handle soc,uint8_t vdev_id)189 cdp_tx_print_tso_stats(ol_txrx_soc_handle soc, uint8_t vdev_id) 190 { 191 if (!soc || !soc->ops) { 192 dp_cdp_debug("Invalid Instance"); 193 QDF_BUG(0); 194 return QDF_STATUS_E_FAILURE; 195 } 196 197 if (!soc->ops->host_stats_ops || 198 !soc->ops->host_stats_ops->tx_print_tso_stats) 199 return QDF_STATUS_E_FAILURE; 200 201 return soc->ops->host_stats_ops->tx_print_tso_stats(soc, vdev_id); 202 } 203 204 static inline QDF_STATUS cdp_tx_rst_tso_stats(ol_txrx_soc_handle soc,uint8_t vdev_id)205 cdp_tx_rst_tso_stats(ol_txrx_soc_handle soc, uint8_t vdev_id) 206 { 207 if (!soc || !soc->ops) { 208 dp_cdp_debug("Invalid Instance"); 209 QDF_BUG(0); 210 return QDF_STATUS_E_FAILURE; 211 } 212 213 if (!soc->ops->host_stats_ops || 214 !soc->ops->host_stats_ops->tx_rst_tso_stats) 215 return QDF_STATUS_E_FAILURE; 216 217 return soc->ops->host_stats_ops->tx_rst_tso_stats(soc, vdev_id); 218 } 219 220 static inline QDF_STATUS cdp_tx_print_sg_stats(ol_txrx_soc_handle soc,uint8_t vdev_id)221 cdp_tx_print_sg_stats(ol_txrx_soc_handle soc, uint8_t vdev_id) 222 { 223 if (!soc || !soc->ops) { 224 dp_cdp_debug("Invalid Instance"); 225 QDF_BUG(0); 226 return QDF_STATUS_E_FAILURE; 227 } 228 229 if (!soc->ops->host_stats_ops || 230 !soc->ops->host_stats_ops->tx_print_sg_stats) 231 return QDF_STATUS_E_FAILURE; 232 233 return soc->ops->host_stats_ops->tx_print_sg_stats(soc, vdev_id); 234 } 235 236 static inline QDF_STATUS cdp_tx_rst_sg_stats(ol_txrx_soc_handle soc,uint8_t vdev_id)237 cdp_tx_rst_sg_stats(ol_txrx_soc_handle soc, uint8_t vdev_id) 238 { 239 if (!soc || !soc->ops) { 240 dp_cdp_debug("Invalid Instance"); 241 QDF_BUG(0); 242 return QDF_STATUS_E_FAILURE; 243 } 244 245 if (!soc->ops->host_stats_ops || 246 !soc->ops->host_stats_ops->tx_rst_sg_stats) 247 return QDF_STATUS_E_FAILURE; 248 249 return soc->ops->host_stats_ops->tx_rst_sg_stats(soc, vdev_id); 250 } 251 252 static inline QDF_STATUS cdp_print_rx_cksum_stats(ol_txrx_soc_handle soc,uint8_t vdev_id)253 cdp_print_rx_cksum_stats(ol_txrx_soc_handle soc, uint8_t vdev_id) 254 { 255 if (!soc || !soc->ops) { 256 dp_cdp_debug("Invalid Instance"); 257 QDF_BUG(0); 258 return QDF_STATUS_E_FAILURE; 259 } 260 261 if (!soc->ops->host_stats_ops || 262 !soc->ops->host_stats_ops->print_rx_cksum_stats) 263 return QDF_STATUS_E_FAILURE; 264 265 return soc->ops->host_stats_ops->print_rx_cksum_stats(soc, vdev_id); 266 } 267 268 static inline QDF_STATUS cdp_rst_rx_cksum_stats(ol_txrx_soc_handle soc,uint8_t vdev_id)269 cdp_rst_rx_cksum_stats(ol_txrx_soc_handle soc, uint8_t vdev_id) 270 { 271 if (!soc || !soc->ops) { 272 dp_cdp_debug("Invalid Instance"); 273 QDF_BUG(0); 274 return QDF_STATUS_E_FAILURE; 275 } 276 277 if (!soc->ops->host_stats_ops || 278 !soc->ops->host_stats_ops->rst_rx_cksum_stats) 279 return QDF_STATUS_E_FAILURE; 280 281 return soc->ops->host_stats_ops->rst_rx_cksum_stats(soc, vdev_id); 282 } 283 284 static inline QDF_STATUS cdp_host_me_stats(ol_txrx_soc_handle soc,uint8_t vdev_id)285 cdp_host_me_stats(ol_txrx_soc_handle soc, uint8_t vdev_id) 286 { 287 if (!soc || !soc->ops) { 288 dp_cdp_debug("Invalid Instance"); 289 QDF_BUG(0); 290 return QDF_STATUS_E_FAILURE; 291 } 292 293 if (!soc->ops->host_stats_ops || 294 !soc->ops->host_stats_ops->txrx_host_me_stats) 295 return QDF_STATUS_E_FAILURE; 296 297 return soc->ops->host_stats_ops->txrx_host_me_stats(soc, vdev_id); 298 } 299 300 /** 301 * cdp_per_peer_stats() - function to print per peer REO Queue stats 302 * @soc: soc handle 303 * @addr: peer address 304 * 305 * Return: status 306 */ cdp_per_peer_stats(ol_txrx_soc_handle soc,uint8_t * addr)307 static inline QDF_STATUS cdp_per_peer_stats(ol_txrx_soc_handle soc, 308 uint8_t *addr) 309 { 310 if (!soc || !soc->ops) { 311 dp_cdp_debug("Invalid Instance"); 312 QDF_BUG(0); 313 return QDF_STATUS_E_FAILURE; 314 } 315 316 if (!soc->ops->host_stats_ops || 317 !soc->ops->host_stats_ops->txrx_per_peer_stats) 318 return QDF_STATUS_E_FAILURE; 319 320 return soc->ops->host_stats_ops->txrx_per_peer_stats(soc, addr); 321 } 322 cdp_host_msdu_ttl_stats(ol_txrx_soc_handle soc,uint8_t vdev_id,struct ol_txrx_stats_req * req)323 static inline int cdp_host_msdu_ttl_stats(ol_txrx_soc_handle soc, 324 uint8_t vdev_id, 325 struct ol_txrx_stats_req *req) 326 { 327 if (!soc || !soc->ops) { 328 dp_cdp_debug("Invalid Instance"); 329 QDF_BUG(0); 330 return 0; 331 } 332 333 if (!soc->ops->host_stats_ops || 334 !soc->ops->host_stats_ops->txrx_host_msdu_ttl_stats) 335 return 0; 336 337 return soc->ops->host_stats_ops->txrx_host_msdu_ttl_stats 338 (soc, vdev_id, req); 339 } 340 cdp_update_peer_stats(ol_txrx_soc_handle soc,uint8_t vdev_id,uint8_t * mac,void * stats,uint32_t last_tx_rate_mcs,uint32_t stats_id)341 static inline QDF_STATUS cdp_update_peer_stats(ol_txrx_soc_handle soc, 342 uint8_t vdev_id, uint8_t *mac, 343 void *stats, 344 uint32_t last_tx_rate_mcs, 345 uint32_t stats_id) 346 { 347 if (!soc || !soc->ops) { 348 dp_cdp_debug("Invalid Instance"); 349 QDF_BUG(0); 350 return QDF_STATUS_E_FAILURE; 351 } 352 353 if (!soc->ops->host_stats_ops || 354 !soc->ops->host_stats_ops->txrx_update_peer_stats) 355 return QDF_STATUS_E_FAILURE; 356 357 return soc->ops->host_stats_ops->txrx_update_peer_stats 358 (soc, vdev_id, mac, stats, last_tx_rate_mcs, stats_id); 359 } 360 cdp_get_dp_fw_peer_stats(ol_txrx_soc_handle soc,uint8_t pdev_id,uint8_t * mac,uint32_t caps,uint32_t copy_stats)361 static inline QDF_STATUS cdp_get_dp_fw_peer_stats(ol_txrx_soc_handle soc, 362 uint8_t pdev_id, 363 uint8_t *mac, uint32_t caps, 364 uint32_t copy_stats) 365 { 366 if (!soc || !soc->ops) { 367 dp_cdp_debug("Invalid Instance"); 368 QDF_BUG(0); 369 return QDF_STATUS_E_FAILURE; 370 } 371 372 if (!soc->ops->host_stats_ops || 373 !soc->ops->host_stats_ops->get_fw_peer_stats) 374 return QDF_STATUS_E_FAILURE; 375 376 return soc->ops->host_stats_ops->get_fw_peer_stats 377 (soc, pdev_id, mac, caps, copy_stats); 378 } 379 cdp_get_dp_htt_stats(ol_txrx_soc_handle soc,uint8_t pdev_id,void * data,uint32_t data_len)380 static inline QDF_STATUS cdp_get_dp_htt_stats(ol_txrx_soc_handle soc, 381 uint8_t pdev_id, 382 void *data, uint32_t data_len) 383 { 384 if (!soc || !soc->ops) { 385 dp_cdp_debug("Invalid Instance"); 386 QDF_BUG(0); 387 return QDF_STATUS_E_FAILURE; 388 } 389 390 if (!soc->ops->host_stats_ops || 391 !soc->ops->host_stats_ops->get_htt_stats) 392 return QDF_STATUS_E_FAILURE; 393 394 return soc->ops->host_stats_ops->get_htt_stats(soc, pdev_id, data, 395 data_len); 396 } 397 398 /** 399 * cdp_update_pdev_host_stats() - Update pdev host stats received from firmware 400 * (wmi_host_pdev_stats and wmi_host_pdev_ext_stats) into dp 401 * @soc: soc handle 402 * @pdev_id: id of the physical device object 403 * @data: pdev stats 404 * @stats_id: statistics to be updated 405 * 406 * Return: QDF_STATUS 407 */ 408 static inline QDF_STATUS cdp_update_pdev_host_stats(ol_txrx_soc_handle soc,uint8_t pdev_id,void * data,uint16_t stats_id)409 cdp_update_pdev_host_stats(ol_txrx_soc_handle soc, 410 uint8_t pdev_id, 411 void *data, 412 uint16_t stats_id) 413 { 414 if (!soc || !soc->ops) { 415 dp_cdp_debug("Invalid Instance"); 416 QDF_BUG(0); 417 return QDF_STATUS_E_FAILURE; 418 } 419 420 if (!soc->ops->host_stats_ops || 421 !soc->ops->host_stats_ops->txrx_update_pdev_stats) 422 return QDF_STATUS_E_FAILURE; 423 424 return soc->ops->host_stats_ops->txrx_update_pdev_stats(soc, pdev_id, 425 data, 426 stats_id); 427 } 428 429 /** 430 * cdp_update_vdev_host_stats() - Update vdev host stats 431 * @soc: soc handle 432 * @vdev_id: id of the virtual device object 433 * @data: pdev stats 434 * @stats_id: type of stats 435 * @xmit_type: xmit type, MLO/Legacy 436 * Return: QDF_STATUS 437 */ 438 static inline QDF_STATUS cdp_update_vdev_host_stats(ol_txrx_soc_handle soc,uint8_t vdev_id,void * data,uint16_t stats_id,uint8_t xmit_type)439 cdp_update_vdev_host_stats(ol_txrx_soc_handle soc, 440 uint8_t vdev_id, 441 void *data, 442 uint16_t stats_id, uint8_t xmit_type) 443 { 444 if (!soc || !soc->ops) { 445 dp_cdp_debug("Invalid Instance"); 446 QDF_BUG(0); 447 return QDF_STATUS_E_FAILURE; 448 } 449 450 if (!soc->ops->host_stats_ops || 451 !soc->ops->host_stats_ops->txrx_update_vdev_stats) 452 return QDF_STATUS_E_FAILURE; 453 454 return soc->ops->host_stats_ops->txrx_update_vdev_stats(soc, vdev_id, 455 data, 456 stats_id, 457 xmit_type); 458 } 459 460 /** 461 * cdp_txrx_get_peer_stats_param() - Call to get specified peer stats 462 * @soc: soc handle 463 * @vdev_id: vdev_id of vdev object 464 * @peer_mac: mac address of the peer 465 * @type: enum of required stats 466 * @buf: buffer to hold the value 467 * 468 * Return: QDF_STATUS 469 */ 470 static inline QDF_STATUS cdp_txrx_get_peer_stats_param(ol_txrx_soc_handle soc,uint8_t vdev_id,uint8_t * peer_mac,enum cdp_peer_stats_type type,cdp_peer_stats_param_t * buf)471 cdp_txrx_get_peer_stats_param(ol_txrx_soc_handle soc, uint8_t vdev_id, 472 uint8_t *peer_mac, 473 enum cdp_peer_stats_type type, 474 cdp_peer_stats_param_t *buf) 475 { 476 if (!soc || !soc->ops) { 477 dp_cdp_debug("Invalid Instance"); 478 QDF_BUG(0); 479 return QDF_STATUS_E_FAILURE; 480 } 481 482 if (!soc->ops->host_stats_ops || 483 !soc->ops->host_stats_ops->txrx_get_peer_stats_param) 484 return QDF_STATUS_E_FAILURE; 485 486 return soc->ops->host_stats_ops->txrx_get_peer_stats_param(soc, 487 vdev_id, 488 peer_mac, 489 type, 490 buf); 491 } 492 493 /** 494 * cdp_host_get_soc_stats() - Call to get soc stats 495 * @soc: soc handle 496 * @soc_stats: buffer for cdp soc stats 497 * 498 * Return: QDF_STATUS 499 */ 500 static inline QDF_STATUS cdp_host_get_soc_stats(ol_txrx_soc_handle soc,struct cdp_soc_stats * soc_stats)501 cdp_host_get_soc_stats(ol_txrx_soc_handle soc, struct cdp_soc_stats *soc_stats) 502 { 503 if (!soc || !soc->ops) { 504 dp_cdp_debug("Invalid Instance"); 505 QDF_BUG(0); 506 return QDF_STATUS_E_FAILURE; 507 } 508 509 if (!soc->ops->host_stats_ops || 510 !soc->ops->host_stats_ops->txrx_get_soc_stats) 511 return QDF_STATUS_E_FAILURE; 512 513 return soc->ops->host_stats_ops->txrx_get_soc_stats(soc, soc_stats); 514 } 515 516 /** 517 * cdp_host_get_peer_stats() - Call to get peer stats 518 * @soc: soc handle 519 * @vdev_id: vdev_id of vdev object 520 * @peer_mac: mac address of the peer 521 * @peer_stats: destination buffer 522 * 523 * Return: QDF_STATUS 524 */ 525 static inline QDF_STATUS cdp_host_get_peer_stats(ol_txrx_soc_handle soc,uint8_t vdev_id,uint8_t * peer_mac,struct cdp_peer_stats * peer_stats)526 cdp_host_get_peer_stats(ol_txrx_soc_handle soc, uint8_t vdev_id, 527 uint8_t *peer_mac, 528 struct cdp_peer_stats *peer_stats) 529 { 530 if (!soc || !soc->ops) { 531 dp_cdp_debug("Invalid Instance"); 532 QDF_BUG(0); 533 return QDF_STATUS_E_FAILURE; 534 } 535 536 if (!soc->ops->host_stats_ops || 537 !soc->ops->host_stats_ops->txrx_get_peer_stats) 538 return QDF_STATUS_E_FAILURE; 539 540 return soc->ops->host_stats_ops->txrx_get_peer_stats(soc, vdev_id, 541 peer_mac, 542 peer_stats); 543 } 544 545 546 /** 547 * cdp_host_get_peer_stats_based_on_peer_type() - Fetch peer stats based on the 548 * peer type 549 * @soc: soc handle 550 * @vdev_id: vdev_id of vdev object 551 * @peer_mac: mac address of the peer 552 * @peer_stats: destination buffer 553 * @peer_type: type of peer 554 * 555 * Return: QDF_STATUS 556 */ 557 static inline QDF_STATUS cdp_host_get_peer_stats_based_on_peer_type(ol_txrx_soc_handle soc,uint8_t vdev_id,uint8_t * peer_mac,struct cdp_peer_stats * peer_stats,enum cdp_peer_type peer_type)558 cdp_host_get_peer_stats_based_on_peer_type(ol_txrx_soc_handle soc, uint8_t vdev_id, 559 uint8_t *peer_mac, 560 struct cdp_peer_stats *peer_stats, 561 enum cdp_peer_type peer_type) 562 { 563 if (!soc || !soc->ops) { 564 dp_cdp_debug("Invalid Instance"); 565 QDF_BUG(0); 566 return QDF_STATUS_E_FAILURE; 567 } 568 569 if (!soc->ops->host_stats_ops || 570 !soc->ops->host_stats_ops->txrx_get_peer_stats_based_on_peer_type) 571 return QDF_STATUS_E_FAILURE; 572 573 return soc->ops->host_stats_ops->txrx_get_peer_stats_based_on_peer_type( 574 soc, vdev_id, 575 peer_mac, 576 peer_stats, 577 peer_type); 578 } 579 580 /** 581 * cdp_host_get_per_link_peer_stats() - Call to get peer stats 582 * @soc: soc handle 583 * @vdev_id: vdev_id of vdev object 584 * @peer_mac: mac address of the peer 585 * @peer_stats: destination buffer 586 * @peer_type: Peer type 587 * @num_link: Number of ML links 588 * 589 * NOTE: For peer_type = CDP_MLD_PEER_TYPE peer_stats should point to 590 * buffer of size = (sizeof(*peer_stats) * num_link) 591 * 592 * Return: QDF_STATUS 593 */ 594 static inline QDF_STATUS cdp_host_get_per_link_peer_stats(ol_txrx_soc_handle soc,uint8_t vdev_id,uint8_t * peer_mac,struct cdp_peer_stats * peer_stats,enum cdp_peer_type peer_type,uint8_t num_link)595 cdp_host_get_per_link_peer_stats(ol_txrx_soc_handle soc, uint8_t vdev_id, 596 uint8_t *peer_mac, 597 struct cdp_peer_stats *peer_stats, 598 enum cdp_peer_type peer_type, 599 uint8_t num_link) 600 { 601 if (!soc || !soc->ops) { 602 dp_cdp_debug("Invalid Instance"); 603 QDF_BUG(0); 604 return QDF_STATUS_E_FAILURE; 605 } 606 607 if (!soc->ops->host_stats_ops || 608 !soc->ops->host_stats_ops->txrx_get_per_link_stats) 609 return QDF_STATUS_E_FAILURE; 610 611 return soc->ops->host_stats_ops->txrx_get_per_link_stats(soc, vdev_id, 612 peer_mac, 613 peer_stats, 614 peer_type, 615 num_link); 616 } 617 618 /** 619 * cdp_host_reset_peer_ald_stats() - Call to reset ald stats 620 * @soc: soc handle 621 * @vdev_id: vdev_id of vdev object 622 * @peer_mac: mac address of the peer 623 * 624 * Return: QDF_STATUS 625 */ 626 static inline QDF_STATUS cdp_host_reset_peer_ald_stats(ol_txrx_soc_handle soc,uint8_t vdev_id,uint8_t * peer_mac)627 cdp_host_reset_peer_ald_stats(ol_txrx_soc_handle soc, uint8_t vdev_id, 628 uint8_t *peer_mac) 629 { 630 if (!soc || !soc->ops) { 631 dp_cdp_debug("Invalid Instance"); 632 QDF_BUG(0); 633 return QDF_STATUS_E_FAILURE; 634 } 635 636 if (!soc->ops->host_stats_ops || 637 !soc->ops->host_stats_ops->txrx_reset_peer_ald_stats) 638 return QDF_STATUS_E_FAILURE; 639 640 return soc->ops->host_stats_ops->txrx_reset_peer_ald_stats(soc, 641 vdev_id, 642 peer_mac); 643 } 644 645 /** 646 * cdp_host_reset_peer_stats() - Call to reset peer stats 647 * @soc: soc handle 648 * @vdev_id: vdev_id of vdev object 649 * @peer_mac: mac address of the peer 650 * 651 * Return: QDF_STATUS 652 */ 653 static inline QDF_STATUS cdp_host_reset_peer_stats(ol_txrx_soc_handle soc,uint8_t vdev_id,uint8_t * peer_mac)654 cdp_host_reset_peer_stats(ol_txrx_soc_handle soc, 655 uint8_t vdev_id, uint8_t *peer_mac) 656 { 657 if (!soc || !soc->ops) { 658 dp_cdp_debug("Invalid Instance"); 659 QDF_BUG(0); 660 return QDF_STATUS_E_FAILURE; 661 } 662 663 if (!soc->ops->host_stats_ops || 664 !soc->ops->host_stats_ops->txrx_reset_peer_stats) 665 return QDF_STATUS_E_FAILURE; 666 667 return soc->ops->host_stats_ops->txrx_reset_peer_stats(soc, 668 vdev_id, 669 peer_mac); 670 } 671 672 /** 673 * cdp_host_get_vdev_stats() - Call to get vdev stats 674 * @soc: dp soc object 675 * @vdev_id: id of dp vdev object 676 * @buf: buffer 677 * @is_aggregate: 678 * 679 * Return: int 680 */ 681 static inline int cdp_host_get_vdev_stats(ol_txrx_soc_handle soc,uint8_t vdev_id,struct cdp_vdev_stats * buf,bool is_aggregate)682 cdp_host_get_vdev_stats(ol_txrx_soc_handle soc, 683 uint8_t vdev_id, 684 struct cdp_vdev_stats *buf, 685 bool is_aggregate) 686 { 687 if (!soc || !soc->ops) { 688 dp_cdp_debug("Invalid Instance"); 689 QDF_BUG(0); 690 return 0; 691 } 692 693 if (!soc->ops->host_stats_ops || 694 !soc->ops->host_stats_ops->txrx_get_vdev_stats) 695 return 0; 696 697 return soc->ops->host_stats_ops->txrx_get_vdev_stats(soc, vdev_id, 698 buf, 699 is_aggregate); 700 } 701 702 /** 703 * cdp_update_host_vdev_stats() - Call to update vdev stats received from 704 * firmware (wmi_host_vdev_stats and wmi_host_vdev_extd_stats) into dp 705 * @soc: soc handle 706 * @data: stats data to be updated 707 * @size: size of stats data 708 * @stats_id: stats id 709 * 710 * Return: int 711 */ 712 static inline int cdp_update_host_vdev_stats(ol_txrx_soc_handle soc,void * data,uint32_t size,uint32_t stats_id)713 cdp_update_host_vdev_stats(ol_txrx_soc_handle soc, 714 void *data, 715 uint32_t size, 716 uint32_t stats_id) 717 { 718 if (!soc || !soc->ops) { 719 dp_cdp_debug("Invalid Instance"); 720 QDF_BUG(0); 721 return 0; 722 } 723 724 if (!soc->ops->host_stats_ops || 725 !soc->ops->host_stats_ops->txrx_process_wmi_host_vdev_stats) 726 return 0; 727 728 return soc->ops->host_stats_ops->txrx_process_wmi_host_vdev_stats 729 (soc, 730 data, 731 size, 732 stats_id); 733 } 734 735 /** 736 * cdp_get_vdev_extd_stats() - Call to get vdev extd stats 737 * @soc: soc handle 738 * @vdev_id: id of dp vdev object 739 * @buf: buffer 740 * 741 * Return: int 742 */ 743 static inline int cdp_get_vdev_extd_stats(ol_txrx_soc_handle soc,uint8_t vdev_id,wmi_host_vdev_extd_stats * buf)744 cdp_get_vdev_extd_stats(ol_txrx_soc_handle soc, 745 uint8_t vdev_id, 746 wmi_host_vdev_extd_stats *buf) 747 { 748 if (!soc || !soc->ops) { 749 dp_cdp_debug("Invalid Instance"); 750 QDF_BUG(0); 751 return 0; 752 } 753 754 if (!soc->ops->host_stats_ops || 755 !soc->ops->host_stats_ops->txrx_get_vdev_extd_stats) 756 return 0; 757 758 return soc->ops->host_stats_ops->txrx_get_vdev_extd_stats(soc, vdev_id, 759 buf); 760 } 761 762 /** 763 * cdp_host_get_pdev_stats() - Call to get cdp_pdev_stats 764 * @soc: soc handle 765 * @pdev_id: id of dp pdev object 766 * @buf: buffer to hold cdp_pdev_stats 767 * 768 * Return: success/failure 769 */ 770 static inline int cdp_host_get_pdev_stats(ol_txrx_soc_handle soc,uint8_t pdev_id,struct cdp_pdev_stats * buf)771 cdp_host_get_pdev_stats(ol_txrx_soc_handle soc, 772 uint8_t pdev_id, struct cdp_pdev_stats *buf) 773 { 774 if (!soc || !soc->ops) { 775 dp_cdp_debug("Invalid Instance"); 776 QDF_BUG(0); 777 return 0; 778 } 779 780 if (!soc->ops->host_stats_ops || 781 !soc->ops->host_stats_ops->txrx_get_pdev_stats) 782 return 0; 783 784 return soc->ops->host_stats_ops->txrx_get_pdev_stats(soc, pdev_id, buf); 785 } 786 787 /** 788 * cdp_host_get_radio_stats() - Call to get radio stats 789 * @soc: soc handle 790 * @pdev_id: id of dp pdev object 791 * @buf: stats buffer 792 * 793 * Return: int 794 */ 795 static inline int cdp_host_get_radio_stats(ol_txrx_soc_handle soc,uint8_t pdev_id,void * buf)796 cdp_host_get_radio_stats(ol_txrx_soc_handle soc, 797 uint8_t pdev_id, 798 void *buf) 799 { 800 if (!soc || !soc->ops) { 801 dp_cdp_debug("Invalid Instance"); 802 QDF_BUG(0); 803 return 0; 804 } 805 806 if (!soc->ops->host_stats_ops || 807 !soc->ops->host_stats_ops->txrx_get_radio_stats) 808 return 0; 809 810 return soc->ops->host_stats_ops->txrx_get_radio_stats(soc, pdev_id, 811 buf); 812 } 813 814 #ifdef QCA_SUPPORT_SCAN_SPCL_VAP_STATS 815 static inline int cdp_get_scan_spcl_vap_stats(ol_txrx_soc_handle soc,uint8_t vdev_id,struct cdp_scan_spcl_vap_stats * stats)816 cdp_get_scan_spcl_vap_stats(ol_txrx_soc_handle soc, 817 uint8_t vdev_id, 818 struct cdp_scan_spcl_vap_stats *stats) 819 { 820 if (!soc || !soc->ops) { 821 dp_cdp_debug("Invalid Instance"); 822 QDF_BUG(0); 823 return QDF_STATUS_E_FAILURE; 824 } 825 826 if (!soc->ops->host_stats_ops || 827 !soc->ops->host_stats_ops->txrx_get_scan_spcl_vap_stats) 828 return QDF_STATUS_E_FAILURE; 829 830 return soc->ops->host_stats_ops->txrx_get_scan_spcl_vap_stats(soc, 831 vdev_id, 832 stats); 833 } 834 #endif 835 836 /** 837 * cdp_get_peer_delay_stats() - Call to get per peer delay stats 838 * @soc: soc handle 839 * @vdev_id: id of dp_vdev handle 840 * @peer_mac: peer mac address 841 * @delay_stats: user allocated buffer for peer delay stats 842 * 843 * Return: status Success/Failure 844 */ 845 static inline QDF_STATUS cdp_get_peer_delay_stats(ol_txrx_soc_handle soc,uint8_t vdev_id,uint8_t * peer_mac,struct cdp_delay_tid_stats * delay_stats)846 cdp_get_peer_delay_stats(ol_txrx_soc_handle soc, 847 uint8_t vdev_id, 848 uint8_t *peer_mac, 849 struct cdp_delay_tid_stats *delay_stats) 850 { 851 if (!soc || !soc->ops) { 852 dp_cdp_debug("Invalid Instance"); 853 QDF_BUG(0); 854 return QDF_STATUS_E_FAILURE; 855 } 856 857 if (!soc->ops->host_stats_ops || 858 !soc->ops->host_stats_ops->txrx_get_peer_delay_stats) 859 return QDF_STATUS_E_FAILURE; 860 861 return soc->ops->host_stats_ops->txrx_get_peer_delay_stats(soc, 862 vdev_id, 863 peer_mac, 864 delay_stats); 865 } 866 867 /** 868 * cdp_get_peer_jitter_stats() - Call to get per peer jitter stats 869 * @soc: soc handle 870 * @pdev_id: id of dp_pdev handle 871 * @vdev_id: id of dp_vdev handle 872 * @peer_mac: peer mac address 873 * @tid_stats: user allocated buffer for tid_stats 874 * 875 * Return: status Success/Failure 876 */ 877 static inline QDF_STATUS cdp_get_peer_jitter_stats(ol_txrx_soc_handle soc,uint8_t pdev_id,uint8_t vdev_id,uint8_t * peer_mac,struct cdp_peer_tid_stats * tid_stats)878 cdp_get_peer_jitter_stats(ol_txrx_soc_handle soc, 879 uint8_t pdev_id, 880 uint8_t vdev_id, 881 uint8_t *peer_mac, 882 struct cdp_peer_tid_stats *tid_stats) 883 { 884 if (!soc || !soc->ops) { 885 dp_cdp_debug("Invalid Instance"); 886 QDF_BUG(0); 887 return QDF_STATUS_E_FAILURE; 888 } 889 890 if (!soc->ops->host_stats_ops || 891 !soc->ops->host_stats_ops->txrx_get_peer_jitter_stats) 892 return QDF_STATUS_E_FAILURE; 893 894 return soc->ops->host_stats_ops->txrx_get_peer_jitter_stats(soc, 895 pdev_id, 896 vdev_id, 897 peer_mac, 898 tid_stats); 899 } 900 901 /** 902 * cdp_mon_pdev_get_rx_stats() - Call to get monitor pdev rx stats 903 * @soc: soc handle 904 * @pdev_id: id of dp_pdev handle 905 * @stats: user allocated buffer for dp pdev mon stats 906 * 907 * Return: status Success/Failure 908 */ 909 static inline QDF_STATUS cdp_mon_pdev_get_rx_stats(ol_txrx_soc_handle soc,uint8_t pdev_id,struct cdp_pdev_mon_stats * stats)910 cdp_mon_pdev_get_rx_stats(ol_txrx_soc_handle soc, uint8_t pdev_id, 911 struct cdp_pdev_mon_stats *stats) 912 { 913 if (!soc || !soc->ops) { 914 dp_cdp_debug("Invalid Instance"); 915 QDF_BUG(0); 916 return QDF_STATUS_E_FAILURE; 917 } 918 919 if (!soc->ops->mon_ops || 920 !soc->ops->mon_ops->get_mon_pdev_rx_stats) 921 return QDF_STATUS_E_FAILURE; 922 923 return soc->ops->mon_ops->get_mon_pdev_rx_stats(soc, pdev_id, stats); 924 } 925 926 #ifdef WLAN_TX_PKT_CAPTURE_ENH 927 /** 928 * cdp_get_peer_tx_capture_stats() - Call to get peer tx capture stats 929 * @soc: soc handle 930 * @vdev_id: id of dp_vdev handle 931 * @peer_mac: peer mac address 932 * @stats: pointer to peer tx capture stats 933 * 934 * Return: status Success/Failure 935 */ 936 static inline QDF_STATUS cdp_get_peer_tx_capture_stats(ol_txrx_soc_handle soc,uint8_t vdev_id,uint8_t * peer_mac,struct cdp_peer_tx_capture_stats * stats)937 cdp_get_peer_tx_capture_stats(ol_txrx_soc_handle soc, 938 uint8_t vdev_id, 939 uint8_t *peer_mac, 940 struct cdp_peer_tx_capture_stats *stats) 941 { 942 if (!soc || !soc->ops) { 943 dp_cdp_debug("Invalid Instance"); 944 QDF_BUG(0); 945 return QDF_STATUS_E_FAILURE; 946 } 947 948 if (!soc->ops->host_stats_ops || 949 !soc->ops->host_stats_ops->get_peer_tx_capture_stats) 950 return QDF_STATUS_E_FAILURE; 951 952 return soc->ops->host_stats_ops->get_peer_tx_capture_stats(soc, vdev_id, 953 peer_mac, 954 stats); 955 } 956 957 /** 958 * cdp_get_pdev_tx_capture_stats() - Call to get pdev tx capture stats 959 * @soc: soc handle 960 * @pdev_id: id of dp_pdev handle 961 * @stats: pointer to pdev tx capture stats 962 * 963 * Return: status Success/Failure 964 */ 965 static inline QDF_STATUS cdp_get_pdev_tx_capture_stats(ol_txrx_soc_handle soc,uint8_t pdev_id,struct cdp_pdev_tx_capture_stats * stats)966 cdp_get_pdev_tx_capture_stats(ol_txrx_soc_handle soc, uint8_t pdev_id, 967 struct cdp_pdev_tx_capture_stats *stats) 968 { 969 if (!soc || !soc->ops) { 970 dp_cdp_debug("Invalid Instance"); 971 QDF_BUG(0); 972 return QDF_STATUS_E_FAILURE; 973 } 974 975 if (!soc->ops->host_stats_ops || 976 !soc->ops->host_stats_ops->get_pdev_tx_capture_stats) 977 return QDF_STATUS_E_FAILURE; 978 979 return soc->ops->host_stats_ops->get_pdev_tx_capture_stats(soc, pdev_id, 980 stats); 981 } 982 #endif /* WLAN_TX_PKT_CAPTURE_ENH */ 983 984 #ifdef HW_TX_DELAY_STATS_ENABLE 985 /** 986 * cdp_enable_disable_vdev_tx_delay_stats() - Start/Stop tx delay stats capture 987 * @soc: soc handle 988 * @vdev_id: vdev id 989 * @value: value to be set 990 * 991 * Return: None 992 */ 993 static inline void cdp_enable_disable_vdev_tx_delay_stats(ol_txrx_soc_handle soc,uint8_t vdev_id,uint8_t value)994 cdp_enable_disable_vdev_tx_delay_stats(ol_txrx_soc_handle soc, uint8_t vdev_id, 995 uint8_t value) 996 { 997 if (!soc || !soc->ops) { 998 dp_cdp_debug("Invalid Instance"); 999 return; 1000 } 1001 1002 if (!soc->ops->host_stats_ops || 1003 !soc->ops->host_stats_ops->enable_disable_vdev_tx_delay_stats) 1004 return; 1005 1006 soc->ops->host_stats_ops->enable_disable_vdev_tx_delay_stats(soc, 1007 vdev_id, 1008 value); 1009 } 1010 1011 /** 1012 * cdp_vdev_is_tx_delay_stats_enabled() - Check if the Tx delay stats 1013 * is enabled or not for the given vdev_id 1014 * @soc: soc handle 1015 * @vdev_id: vdev_id 1016 * 1017 * Return: 1 if enabled, 0 if disabled 1018 */ 1019 static inline uint8_t cdp_vdev_is_tx_delay_stats_enabled(ol_txrx_soc_handle soc,uint8_t vdev_id)1020 cdp_vdev_is_tx_delay_stats_enabled(ol_txrx_soc_handle soc, uint8_t vdev_id) 1021 { 1022 if (!soc || !soc->ops || !soc->ops->host_stats_ops) { 1023 dp_cdp_debug("Invalid Instance:"); 1024 return 0; 1025 } 1026 1027 if (soc->ops->host_stats_ops->is_tx_delay_stats_enabled) 1028 return soc->ops->host_stats_ops->is_tx_delay_stats_enabled(soc, 1029 vdev_id); 1030 1031 return 0; 1032 } 1033 #endif 1034 1035 /** 1036 * cdp_get_pdev_tid_stats() - Get pdev tid stats 1037 * @soc: soc handle 1038 * @pdev_id: Pdev id 1039 * @tid_stats: Pointer to cdp_tid_stats_intf 1040 * 1041 * Return: status Success/Failure 1042 */ 1043 static inline QDF_STATUS cdp_get_pdev_tid_stats(ol_txrx_soc_handle soc,uint8_t pdev_id,struct cdp_tid_stats_intf * tid_stats)1044 cdp_get_pdev_tid_stats(ol_txrx_soc_handle soc, uint8_t pdev_id, 1045 struct cdp_tid_stats_intf *tid_stats) 1046 { 1047 if (!soc || !soc->ops || !soc->ops->host_stats_ops) { 1048 dp_cdp_debug("Invalid Instance:"); 1049 return QDF_STATUS_E_FAILURE; 1050 } 1051 1052 if (!soc->ops->host_stats_ops->txrx_get_pdev_tid_stats) 1053 return QDF_STATUS_E_FAILURE; 1054 1055 return soc->ops->host_stats_ops->txrx_get_pdev_tid_stats(soc, pdev_id, 1056 tid_stats); 1057 } 1058 1059 #ifdef WLAN_CONFIG_TELEMETRY_AGENT 1060 /** 1061 * cdp_get_pdev_telemetry_stats() - function to get pdev telemetry stats 1062 * @soc: soc handle 1063 * @pdev_id: pdev id 1064 * @stats: pointer to pdev telemetry stats 1065 * 1066 * Return: status 1067 */ cdp_get_pdev_telemetry_stats(ol_txrx_soc_handle soc,uint8_t pdev_id,struct cdp_pdev_telemetry_stats * stats)1068 static inline QDF_STATUS cdp_get_pdev_telemetry_stats( 1069 ol_txrx_soc_handle soc, 1070 uint8_t pdev_id, 1071 struct cdp_pdev_telemetry_stats *stats) 1072 { 1073 if (!soc || !soc->ops) { 1074 dp_cdp_debug("Invalid Instance"); 1075 QDF_BUG(0); 1076 return QDF_STATUS_E_FAILURE; 1077 } 1078 1079 if (!soc->ops->host_stats_ops || 1080 !soc->ops->host_stats_ops->txrx_pdev_telemetry_stats) 1081 return QDF_STATUS_E_FAILURE; 1082 1083 return soc->ops->host_stats_ops->txrx_pdev_telemetry_stats( 1084 soc, pdev_id, stats); 1085 } 1086 1087 /** 1088 * cdp_get_peer_telemetry_stats() - function to get peer telemetry stats 1089 * @soc: soc handle 1090 * @addr: peer address 1091 * @stats: pointer to peer telemetry stats 1092 * 1093 * Return: status 1094 */ cdp_get_peer_telemetry_stats(ol_txrx_soc_handle soc,uint8_t * addr,struct cdp_peer_telemetry_stats * stats)1095 static inline QDF_STATUS cdp_get_peer_telemetry_stats( 1096 ol_txrx_soc_handle soc, 1097 uint8_t *addr, 1098 struct cdp_peer_telemetry_stats *stats) 1099 { 1100 if (!soc || !soc->ops) { 1101 dp_cdp_debug("Invalid Instance"); 1102 QDF_BUG(0); 1103 return QDF_STATUS_E_FAILURE; 1104 } 1105 1106 if (!soc->ops->host_stats_ops || 1107 !soc->ops->host_stats_ops->txrx_peer_telemetry_stats) 1108 return QDF_STATUS_E_FAILURE; 1109 1110 return soc->ops->host_stats_ops->txrx_peer_telemetry_stats( 1111 soc, addr, stats); 1112 } 1113 1114 /** 1115 * cdp_get_pdev_deter_stats(): function to get pdev deterministic stats 1116 * @soc: soc handle 1117 * @pdev_id: pdev id 1118 * @stats: pointer to pdev deterministic stats 1119 * 1120 * return: status 1121 */ cdp_get_pdev_deter_stats(ol_txrx_soc_handle soc,uint8_t pdev_id,struct cdp_pdev_deter_stats * stats)1122 static inline QDF_STATUS cdp_get_pdev_deter_stats( 1123 ol_txrx_soc_handle soc, 1124 uint8_t pdev_id, 1125 struct cdp_pdev_deter_stats *stats) 1126 { 1127 if (!soc || !soc->ops) { 1128 dp_cdp_debug("Invalid Instance"); 1129 QDF_BUG(0); 1130 return QDF_STATUS_E_FAILURE; 1131 } 1132 1133 if (!soc->ops->host_stats_ops || 1134 !soc->ops->host_stats_ops->txrx_pdev_deter_stats) 1135 return QDF_STATUS_E_FAILURE; 1136 1137 return soc->ops->host_stats_ops->txrx_pdev_deter_stats( 1138 soc, pdev_id, stats); 1139 } 1140 1141 /** 1142 * cdp_get_peer_deter_stats(): function to get peer deterministic stats 1143 * @soc: soc handle 1144 * @vdev_id: id of vdev handle 1145 * @addr: peer address 1146 * @stats: pointer to peer telemetry stats 1147 * 1148 * return: status 1149 */ cdp_get_peer_deter_stats(ol_txrx_soc_handle soc,uint8_t vdev_id,uint8_t * addr,struct cdp_peer_deter_stats * stats)1150 static inline QDF_STATUS cdp_get_peer_deter_stats( 1151 ol_txrx_soc_handle soc, 1152 uint8_t vdev_id, 1153 uint8_t *addr, 1154 struct cdp_peer_deter_stats *stats) 1155 { 1156 if (!soc || !soc->ops) { 1157 dp_cdp_debug("Invalid Instance"); 1158 QDF_BUG(0); 1159 return QDF_STATUS_E_FAILURE; 1160 } 1161 1162 if (!soc->ops->host_stats_ops || 1163 !soc->ops->host_stats_ops->txrx_peer_deter_stats) 1164 return QDF_STATUS_E_FAILURE; 1165 1166 return soc->ops->host_stats_ops->txrx_peer_deter_stats( 1167 soc, vdev_id, addr, stats); 1168 } 1169 1170 /** 1171 * cdp_update_pdev_chan_util_stats(): function to update pdev channel util stats 1172 * @soc: soc handle 1173 * @pdev_id: pdev id 1174 * @ch_util: pointer to pdev ch util stats 1175 * 1176 * return: status 1177 */ cdp_update_pdev_chan_util_stats(ol_txrx_soc_handle soc,uint8_t pdev_id,struct cdp_pdev_chan_util_stats * ch_util)1178 static inline QDF_STATUS cdp_update_pdev_chan_util_stats( 1179 ol_txrx_soc_handle soc, 1180 uint8_t pdev_id, 1181 struct cdp_pdev_chan_util_stats *ch_util) 1182 { 1183 if (!soc || !soc->ops) { 1184 dp_cdp_debug("Invalid Instance"); 1185 QDF_BUG(0); 1186 return QDF_STATUS_E_FAILURE; 1187 } 1188 1189 if (!soc->ops->host_stats_ops || 1190 !soc->ops->host_stats_ops->txrx_update_pdev_chan_util_stats) 1191 return QDF_STATUS_E_FAILURE; 1192 1193 return soc->ops->host_stats_ops->txrx_update_pdev_chan_util_stats( 1194 soc, pdev_id, ch_util); 1195 } 1196 #endif 1197 1198 /** 1199 * cdp_get_peer_extd_rate_link_stats() - cdp function to get peer 1200 * extended rate and link stats 1201 * @soc: soc handle 1202 * @mac_addr: mac address 1203 * 1204 * Return: status 1205 */ cdp_get_peer_extd_rate_link_stats(ol_txrx_soc_handle soc,uint8_t * mac_addr)1206 static inline QDF_STATUS cdp_get_peer_extd_rate_link_stats( 1207 ol_txrx_soc_handle soc, 1208 uint8_t *mac_addr) 1209 { 1210 if (!soc || !soc->ops) { 1211 dp_cdp_debug("Invalid Instance"); 1212 QDF_BUG(0); 1213 return QDF_STATUS_E_FAILURE; 1214 } 1215 1216 if (!soc->ops->host_stats_ops || 1217 !soc->ops->host_stats_ops->txrx_get_peer_extd_rate_link_stats) 1218 return QDF_STATUS_E_FAILURE; 1219 1220 return soc->ops->host_stats_ops->txrx_get_peer_extd_rate_link_stats( 1221 soc, mac_addr); 1222 } 1223 1224 /** 1225 * cdp_get_pdev_obss_pd_stats() - function to get pdev obss stats 1226 * @soc: soc handle 1227 * @pdev_id: pdev id 1228 * @stats: pointer to pdev obss stats 1229 * @req: Pointer to CDP TxRx stats 1230 * 1231 * Return: status 1232 */ cdp_get_pdev_obss_pd_stats(ol_txrx_soc_handle soc,uint8_t pdev_id,struct cdp_pdev_obss_pd_stats_tlv * stats,struct cdp_txrx_stats_req * req)1233 static inline QDF_STATUS cdp_get_pdev_obss_pd_stats( 1234 ol_txrx_soc_handle soc, 1235 uint8_t pdev_id, 1236 struct cdp_pdev_obss_pd_stats_tlv *stats, 1237 struct cdp_txrx_stats_req *req) 1238 { 1239 if (!soc || !soc->ops) { 1240 dp_cdp_debug("Invalid Instance"); 1241 QDF_BUG(0); 1242 return QDF_STATUS_E_FAILURE; 1243 } 1244 1245 if (!soc->ops->host_stats_ops || 1246 !soc->ops->host_stats_ops->get_pdev_obss_stats) 1247 return QDF_STATUS_E_FAILURE; 1248 1249 return soc->ops->host_stats_ops->get_pdev_obss_stats( 1250 soc, pdev_id, stats, req); 1251 } 1252 1253 /** 1254 * cdp_clear_pdev_obss_pd_stats() - function to clear pdev obss stats 1255 * @soc: soc handle 1256 * @pdev_id: pdev id 1257 * @req: Pointer to CDP TxRx stats request. mac_id will be pre-filled 1258 * and should not be overwritten 1259 * 1260 * Return: status 1261 */ cdp_clear_pdev_obss_pd_stats(ol_txrx_soc_handle soc,uint8_t pdev_id,struct cdp_txrx_stats_req * req)1262 static inline QDF_STATUS cdp_clear_pdev_obss_pd_stats( 1263 ol_txrx_soc_handle soc, 1264 uint8_t pdev_id, struct cdp_txrx_stats_req *req) 1265 { 1266 if (!soc || !soc->ops) { 1267 dp_cdp_debug("Invalid Instance"); 1268 QDF_BUG(0); 1269 return QDF_STATUS_E_FAILURE; 1270 } 1271 1272 if (!soc->ops->host_stats_ops || 1273 !soc->ops->host_stats_ops->clear_pdev_obss_pd_stats) 1274 return QDF_STATUS_E_FAILURE; 1275 1276 return soc->ops->host_stats_ops->clear_pdev_obss_pd_stats( 1277 soc, pdev_id, req); 1278 } 1279 1280 /* 1281 * cdp_host_get_interface_stats - Get vdev stats for ath interface 1282 * @soc: soc handle 1283 * @vdev_id: vdev_id 1284 * @buf: buffer to hold vdev_stats 1285 * 1286 * return: QDF_STATUS 1287 */ 1288 static inline QDF_STATUS cdp_host_get_interface_stats(ol_txrx_soc_handle soc,uint8_t vdev_id,struct cdp_vdev_stats * buf)1289 cdp_host_get_interface_stats(ol_txrx_soc_handle soc, 1290 uint8_t vdev_id, 1291 struct cdp_vdev_stats *buf) 1292 { 1293 if (!soc || !soc->ops) { 1294 QDF_BUG(0); 1295 return QDF_STATUS_E_FAILURE; 1296 } 1297 1298 if (!soc->ops->host_stats_ops || 1299 !soc->ops->host_stats_ops->txrx_get_interface_stats) 1300 return QDF_STATUS_E_FAILURE; 1301 1302 return soc->ops->host_stats_ops->txrx_get_interface_stats(soc, 1303 vdev_id, 1304 buf, 1305 true); 1306 } 1307 1308 #ifdef WLAN_FEATURE_TX_LATENCY_STATS 1309 /** 1310 * cdp_host_tx_latency_stats_config() - config transmit latency statistics for 1311 * specified vdev 1312 * @soc: Handle to struct dp_soc 1313 * @vdev_id: vdev id 1314 * @config: configuration for transmit latency statistics 1315 * 1316 * Return: QDF_STATUS 1317 */ 1318 static inline QDF_STATUS cdp_host_tx_latency_stats_config(ol_txrx_soc_handle soc,uint8_t vdev_id,struct cdp_tx_latency_config * config)1319 cdp_host_tx_latency_stats_config(ol_txrx_soc_handle soc, 1320 uint8_t vdev_id, 1321 struct cdp_tx_latency_config *config) 1322 { 1323 if (!soc || !soc->ops) { 1324 QDF_BUG(0); 1325 return QDF_STATUS_E_FAILURE; 1326 } 1327 1328 if (!soc->ops->host_stats_ops || 1329 !soc->ops->host_stats_ops->tx_latency_stats_config) 1330 return QDF_STATUS_E_FAILURE; 1331 1332 return soc->ops->host_stats_ops->tx_latency_stats_config(soc, 1333 vdev_id, 1334 config); 1335 } 1336 1337 /** 1338 * cdp_host_tx_latency_stats_fetch() - fetch transmit latency statistics for 1339 * specified link mac address 1340 * @soc: Handle to struct dp_soc 1341 * @vdev_id: vdev id 1342 * @mac: link mac address of remote peer 1343 * @latency: buffer to hold per-link transmit latency statistics 1344 * 1345 * Return: QDF_STATUS 1346 */ 1347 static inline QDF_STATUS cdp_host_tx_latency_stats_fetch(ol_txrx_soc_handle soc,uint8_t vdev_id,uint8_t * mac,struct cdp_tx_latency * latency)1348 cdp_host_tx_latency_stats_fetch(ol_txrx_soc_handle soc, 1349 uint8_t vdev_id, uint8_t *mac, 1350 struct cdp_tx_latency *latency) 1351 { 1352 if (!soc || !soc->ops) { 1353 QDF_BUG(0); 1354 return QDF_STATUS_E_FAILURE; 1355 } 1356 1357 if (!soc->ops->host_stats_ops || 1358 !soc->ops->host_stats_ops->tx_latency_stats_fetch) 1359 return QDF_STATUS_E_FAILURE; 1360 1361 return soc->ops->host_stats_ops->tx_latency_stats_fetch(soc, 1362 vdev_id, 1363 mac, 1364 latency); 1365 } 1366 1367 /** 1368 * cdp_host_tx_latency_stats_register_cb() - register transmit latency 1369 * statistics callback 1370 * @soc: Handle to struct dp_soc 1371 * @cb: callback function for transmit latency statistics 1372 * 1373 * Return: QDF_STATUS 1374 */ 1375 static inline QDF_STATUS cdp_host_tx_latency_stats_register_cb(ol_txrx_soc_handle soc,cdp_tx_latency_cb cb)1376 cdp_host_tx_latency_stats_register_cb(ol_txrx_soc_handle soc, 1377 cdp_tx_latency_cb cb) 1378 { 1379 if (!soc || !soc->ops) { 1380 QDF_BUG(0); 1381 return QDF_STATUS_E_FAILURE; 1382 } 1383 1384 if (!soc->ops->host_stats_ops || 1385 !soc->ops->host_stats_ops->tx_latency_stats_register_cb) 1386 return QDF_STATUS_E_FAILURE; 1387 1388 return soc->ops->host_stats_ops->tx_latency_stats_register_cb(soc, cb); 1389 } 1390 #endif 1391 #endif /* _CDP_TXRX_HOST_STATS_H_ */ 1392