1 /* 2 * Copyright (c) 2012-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_hdd_stats.h 22 * 23 * WLAN Host Device Driver statistics related implementation 24 * 25 */ 26 27 #if !defined(WLAN_HDD_STATS_H) 28 #define WLAN_HDD_STATS_H 29 30 #include "wlan_hdd_main.h" 31 #ifdef WLAN_FEATURE_11BE_MLO 32 #include "wlan_mlo_mgr_cmn.h" 33 #endif 34 35 #define INVALID_MCS_IDX 255 36 37 #define DATA_RATE_11AC_MCS_MASK 0x03 38 39 #ifdef FEATURE_CLUB_LL_STATS_AND_GET_STATION 40 /* LL stats get request time out value */ 41 #define WLAN_WAIT_TIME_LL_STATS 3300 42 #else 43 #define WLAN_WAIT_TIME_LL_STATS 800 44 #endif 45 46 #define WLAN_HDD_TGT_NOISE_FLOOR_DBM (-128) 47 48 #ifdef WLAN_FEATURE_LINK_LAYER_STATS 49 extern const struct nla_policy qca_wlan_vendor_ll_ext_policy[ 50 QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_MAX + 1]; 51 52 /* QCA_NL80211_VENDOR_SUBCMD_LL_STATS_CLR */ 53 extern const struct nla_policy qca_wlan_vendor_ll_clr_policy[ 54 QCA_WLAN_VENDOR_ATTR_LL_STATS_CLR_MAX + 1]; 55 56 /* QCA_NL80211_VENDOR_SUBCMD_LL_STATS_SET */ 57 extern const struct nla_policy qca_wlan_vendor_ll_set_policy[ 58 QCA_WLAN_VENDOR_ATTR_LL_STATS_SET_MAX + 1]; 59 60 /* QCA_NL80211_VENDOR_SUBCMD_LL_STATS_GET */ 61 extern const struct nla_policy qca_wlan_vendor_ll_get_policy[ 62 QCA_WLAN_VENDOR_ATTR_LL_STATS_GET_MAX + 1]; 63 64 #define FEATURE_LL_STATS_VENDOR_COMMANDS \ 65 { \ 66 .info.vendor_id = QCA_NL80211_VENDOR_ID, \ 67 .info.subcmd = QCA_NL80211_VENDOR_SUBCMD_LL_STATS_CLR, \ 68 .flags = WIPHY_VENDOR_CMD_NEED_WDEV | \ 69 WIPHY_VENDOR_CMD_NEED_NETDEV | \ 70 WIPHY_VENDOR_CMD_NEED_RUNNING, \ 71 .doit = wlan_hdd_cfg80211_ll_stats_clear, \ 72 vendor_command_policy(qca_wlan_vendor_ll_clr_policy, \ 73 QCA_WLAN_VENDOR_ATTR_LL_STATS_CLR_MAX) \ 74 }, \ 75 \ 76 { \ 77 .info.vendor_id = QCA_NL80211_VENDOR_ID, \ 78 .info.subcmd = QCA_NL80211_VENDOR_SUBCMD_LL_STATS_SET, \ 79 .flags = WIPHY_VENDOR_CMD_NEED_WDEV | \ 80 WIPHY_VENDOR_CMD_NEED_NETDEV | \ 81 WIPHY_VENDOR_CMD_NEED_RUNNING, \ 82 .doit = wlan_hdd_cfg80211_ll_stats_set, \ 83 vendor_command_policy(qca_wlan_vendor_ll_set_policy, \ 84 QCA_WLAN_VENDOR_ATTR_LL_STATS_SET_MAX) \ 85 }, \ 86 \ 87 { \ 88 .info.vendor_id = QCA_NL80211_VENDOR_ID, \ 89 .info.subcmd = QCA_NL80211_VENDOR_SUBCMD_LL_STATS_GET, \ 90 .flags = WIPHY_VENDOR_CMD_NEED_WDEV | \ 91 WIPHY_VENDOR_CMD_NEED_NETDEV | \ 92 WIPHY_VENDOR_CMD_NEED_RUNNING, \ 93 .doit = wlan_hdd_cfg80211_ll_stats_get, \ 94 vendor_command_policy(qca_wlan_vendor_ll_get_policy, \ 95 QCA_WLAN_VENDOR_ATTR_LL_STATS_GET_MAX) \ 96 }, 97 #else 98 #define FEATURE_LL_STATS_VENDOR_COMMANDS 99 #endif 100 101 /** 102 * struct index_vht_data_rate_type - vht data rate type 103 * @beacon_rate_index: Beacon rate index 104 * @supported_VHT80_rate: VHT80 rate 105 * @supported_VHT40_rate: VHT40 rate 106 * @supported_VHT20_rate: VHT20 rate 107 */ 108 struct index_vht_data_rate_type { 109 uint8_t beacon_rate_index; 110 uint16_t supported_VHT80_rate[2]; 111 uint16_t supported_VHT40_rate[2]; 112 uint16_t supported_VHT20_rate[2]; 113 }; 114 115 /** 116 * enum data_rate_11ac_max_mcs - possible VHT max MCS values 117 * @DATA_RATE_11AC_MAX_MCS_7: MCS7 rate 118 * @DATA_RATE_11AC_MAX_MCS_8: MCS8 rate 119 * @DATA_RATE_11AC_MAX_MCS_9: MCS9 rate 120 * @DATA_RATE_11AC_MAX_MCS_NA: Not applicable 121 */ 122 enum data_rate_11ac_max_mcs { 123 DATA_RATE_11AC_MAX_MCS_7, 124 DATA_RATE_11AC_MAX_MCS_8, 125 DATA_RATE_11AC_MAX_MCS_9, 126 DATA_RATE_11AC_MAX_MCS_NA 127 }; 128 129 /** 130 * struct index_data_rate_type - non vht data rate type 131 * @beacon_rate_index: Beacon rate index 132 * @supported_rate: Supported rate table 133 */ 134 struct index_data_rate_type { 135 uint8_t beacon_rate_index; 136 uint16_t supported_rate[4]; 137 }; 138 139 #ifdef WLAN_FEATURE_LINK_LAYER_STATS 140 141 /** 142 * wlan_hdd_cfg80211_ll_stats_set() - set link layer stats 143 * @wiphy: Pointer to wiphy 144 * @wdev: Pointer to wdev 145 * @data: Pointer to data 146 * @data_len: Data length 147 * 148 * Return: int 149 */ 150 int wlan_hdd_cfg80211_ll_stats_set(struct wiphy *wiphy, 151 struct wireless_dev *wdev, 152 const void *data, 153 int data_len); 154 155 /** 156 * wlan_hdd_cfg80211_ll_stats_get() - get link layer stats 157 * @wiphy: Pointer to wiphy 158 * @wdev: Pointer to wdev 159 * @data: Pointer to data 160 * @data_len: Data length 161 * 162 * Return: int 163 */ 164 int wlan_hdd_cfg80211_ll_stats_get(struct wiphy *wiphy, 165 struct wireless_dev *wdev, 166 const void *data, 167 int data_len); 168 169 170 /** 171 * wlan_hdd_cfg80211_ll_stats_clear() - clear link layer stats 172 * @wiphy: Pointer to wiphy 173 * @wdev: Pointer to wdev 174 * @data: Pointer to data 175 * @data_len: Data length 176 * 177 * Return: int 178 */ 179 int wlan_hdd_cfg80211_ll_stats_clear(struct wiphy *wiphy, 180 struct wireless_dev *wdev, 181 const void *data, 182 int data_len); 183 184 void wlan_hdd_clear_link_layer_stats(struct hdd_adapter *adapter); 185 186 static inline bool hdd_link_layer_stats_supported(void) 187 { 188 return true; 189 } 190 191 /** 192 * wlan_hdd_cfg80211_ll_stats_ext_set_param() - config monitor parameters 193 * @wiphy: wiphy handle 194 * @wdev: wdev handle 195 * @data: user layer input 196 * @data_len: length of user layer input 197 * 198 * return: 0 success, einval failure 199 */ 200 int wlan_hdd_cfg80211_ll_stats_ext_set_param(struct wiphy *wiphy, 201 struct wireless_dev *wdev, 202 const void *data, 203 int data_len); 204 /** 205 * hdd_get_interface_info() - get interface info 206 * @link_info: Link info pointer in HDD adapter 207 * @info: Pointer to interface info 208 * 209 * Return: bool 210 */ 211 bool hdd_get_interface_info(struct wlan_hdd_link_info *link_info, 212 struct wifi_interface_info *info); 213 214 /** 215 * wlan_hdd_ll_stats_get() - Get Link Layer statistics from FW 216 * @link_info: Link info pointer in HDD adapter 217 * @req_id: request id 218 * @req_mask: bitmask used by FW for the request 219 * 220 * Return: 0 on success and error code otherwise 221 */ 222 int wlan_hdd_ll_stats_get(struct wlan_hdd_link_info *link_info, 223 uint32_t req_id, uint32_t req_mask); 224 225 /** 226 * wlan_hdd_cfg80211_link_layer_stats_callback() - This function is called 227 * @hdd_handle: Handle to HDD context 228 * @indication_type: Indication type 229 * @results: Pointer to results 230 * @cookie: Callback context 231 * 232 * After receiving Link Layer indications from FW.This callback converts the 233 * firmware data to the NL data and send the same to the kernel/upper layers. 234 * 235 * Return: None 236 */ 237 void wlan_hdd_cfg80211_link_layer_stats_callback(hdd_handle_t hdd_handle, 238 int indication_type, 239 tSirLLStatsResults *results, 240 void *cookie); 241 242 /** 243 * wlan_hdd_cfg80211_link_layer_stats_ext_callback() - Callback for LL ext 244 * @ctx: HDD context 245 * @rsp: msg from FW 246 * 247 * This function is an extension of 248 * wlan_hdd_cfg80211_link_layer_stats_callback. It converts 249 * monitoring parameters offloaded to NL data and send the same to the 250 * kernel/upper layers. 251 * 252 * Return: None. 253 */ 254 void wlan_hdd_cfg80211_link_layer_stats_ext_callback(hdd_handle_t ctx, 255 tSirLLStatsResults *rsp); 256 257 /** 258 * hdd_lost_link_info_cb() - callback function to get lost link information 259 * @hdd_handle: Opaque handle for the HDD context 260 * @lost_link_info: lost link information 261 * 262 * Return: none 263 */ 264 void hdd_lost_link_info_cb(hdd_handle_t hdd_handle, 265 struct sir_lost_link_info *lost_link_info); 266 267 #else /* WLAN_FEATURE_LINK_LAYER_STATS */ 268 269 static inline bool hdd_link_layer_stats_supported(void) 270 { 271 return false; 272 } 273 274 static inline int 275 wlan_hdd_cfg80211_ll_stats_ext_set_param(struct wiphy *wiphy, 276 struct wireless_dev *wdev, 277 const void *data, 278 int data_len) 279 { 280 return -EINVAL; 281 } 282 283 static inline int 284 wlan_hdd_ll_stats_get(struct wlan_hdd_link_info *link_info, 285 uint32_t req_id, uint32_t req_mask) 286 { 287 return -EINVAL; 288 } 289 290 static inline void 291 wlan_hdd_clear_link_layer_stats(struct hdd_adapter *adapter) 292 { 293 } 294 295 static inline void 296 wlan_hdd_cfg80211_link_layer_stats_callback(hdd_handle_t hdd_handle, 297 int indication_type, 298 tSirLLStatsResults *results, 299 void *cookie) 300 { 301 } 302 303 static inline void 304 wlan_hdd_cfg80211_link_layer_stats_ext_callback(hdd_handle_t ctx, 305 tSirLLStatsResults *rsp) 306 { 307 } 308 309 static inline void 310 hdd_lost_link_info_cb(hdd_handle_t hdd_handle, 311 struct sir_lost_link_info *lost_link_info) 312 { 313 } 314 315 #endif /* End of WLAN_FEATURE_LINK_LAYER_STATS */ 316 317 #ifdef WLAN_FEATURE_STATS_EXT 318 /** 319 * wlan_hdd_cfg80211_stats_ext_request() - ext stats request 320 * @wiphy: Pointer to wiphy 321 * @wdev: Pointer to wdev 322 * @data: Pointer to data 323 * @data_len: Data length 324 * 325 * Return: int 326 */ 327 int wlan_hdd_cfg80211_stats_ext_request(struct wiphy *wiphy, 328 struct wireless_dev *wdev, 329 const void *data, 330 int data_len); 331 332 #endif /* End of WLAN_FEATURE_STATS_EXT */ 333 334 /** 335 * wlan_hdd_cfg80211_connected_chan_stats_req() - get currently connected 336 * channel statistics from driver/firmware 337 * @wiphy: Pointer to wiphy 338 * @wdev: Pointer to wdev 339 * @data: Pointer to data 340 * @data_len: Data length 341 * 342 * Return: int 343 */ 344 int wlan_hdd_cfg80211_connected_chan_stats_req(struct wiphy *wiphy, 345 struct wireless_dev *wdev, 346 const void *data, 347 int data_len); 348 349 /** 350 * wlan_hdd_cfg80211_get_station() - get station statistics 351 * @wiphy: Pointer to wiphy 352 * @dev: Pointer to network device 353 * @mac: Pointer to mac 354 * @sinfo: Pointer to station info 355 * 356 * Return: 0 for success, non-zero for failure 357 */ 358 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 16, 0)) 359 int wlan_hdd_cfg80211_get_station(struct wiphy *wiphy, 360 struct net_device *dev, const uint8_t *mac, 361 struct station_info *sinfo); 362 #else 363 int wlan_hdd_cfg80211_get_station(struct wiphy *wiphy, 364 struct net_device *dev, uint8_t *mac, 365 struct station_info *sinfo); 366 #endif 367 368 /** 369 * wlan_hdd_cfg80211_dump_station() - dump station statistics 370 * @wiphy: Pointer to wiphy 371 * @dev: Pointer to network device 372 * @idx: variable to determine whether to get stats or not 373 * @mac: Pointer to mac 374 * @sinfo: Pointer to station info 375 * 376 * Return: 0 for success, non-zero for failure 377 */ 378 int wlan_hdd_cfg80211_dump_station(struct wiphy *wiphy, 379 struct net_device *dev, 380 int idx, u8 *mac, 381 struct station_info *sinfo); 382 383 struct net_device_stats *hdd_get_stats(struct net_device *dev); 384 385 int wlan_hdd_cfg80211_dump_survey(struct wiphy *wiphy, 386 struct net_device *dev, 387 int idx, struct survey_info *survey); 388 389 void hdd_display_hif_stats(void); 390 void hdd_clear_hif_stats(void); 391 392 /** 393 * wlan_hdd_cfg80211_stats_ext_callback() - ext stats callback 394 * @hdd_handle: Opaque handle to HDD context 395 * @data: ext stats payload 396 * 397 * Return: nothing 398 */ 399 void wlan_hdd_cfg80211_stats_ext_callback(hdd_handle_t hdd_handle, 400 struct stats_ext_event *data); 401 402 /** 403 * wlan_hdd_cfg80211_stats_ext2_callback() - stats_ext2_callback 404 * @hdd_handle: opaque handle to the hdd context 405 * @pmsg: sir_sme_rx_aggr_hole_ind 406 * 407 * Return: void 408 */ 409 void 410 wlan_hdd_cfg80211_stats_ext2_callback(hdd_handle_t hdd_handle, 411 struct sir_sme_rx_aggr_hole_ind *pmsg); 412 413 #ifdef WLAN_FEATURE_ROAM_OFFLOAD 414 /** 415 * wlan_hdd_cfg80211_roam_events_callback() - roam_events_callback 416 * @roam_stats: roam events stats 417 * @idx: TLV index in roam stats event 418 * 419 * Return: void 420 */ 421 void 422 wlan_hdd_cfg80211_roam_events_callback(struct roam_stats_event *roam_stats, 423 uint8_t idx); 424 #endif /* End of WLAN_FEATURE_ROAM_OFFLOAD */ 425 426 /** 427 * wlan_hdd_get_rcpi() - Wrapper to get current RCPI 428 * @adapter: adapter upon which the measurement is requested 429 * @mac: peer addr for which measurement is requested 430 * @rcpi_value: pointer to where the RCPI should be returned 431 * @measurement_type: type of rcpi measurement 432 * 433 * This is a wrapper function for getting RCPI, invoke this function only 434 * when rcpi support is enabled in firmware 435 * 436 * Return: 0 for success, non-zero for failure 437 */ 438 int wlan_hdd_get_rcpi(struct hdd_adapter *adapter, uint8_t *mac, 439 int32_t *rcpi_value, 440 enum rcpi_measurement_type measurement_type); 441 442 #ifdef WLAN_FEATURE_MIB_STATS 443 /** 444 * wlan_hdd_get_mib_stats() - Get the mib statistics 445 * @adapter: adapter upon which the measurement is requested 446 * 447 * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_** on error 448 */ 449 QDF_STATUS wlan_hdd_get_mib_stats(struct hdd_adapter *adapter); 450 #endif 451 452 /** 453 * wlan_hdd_get_rssi() - Get the current RSSI 454 * @link_info: Link info pointer in HDD adapter 455 * @rssi_value: pointer to where the RSSI should be returned 456 * 457 * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_** on error 458 */ 459 QDF_STATUS wlan_hdd_get_rssi(struct wlan_hdd_link_info *link_info, 460 int8_t *rssi_value); 461 462 /** 463 * wlan_hdd_get_snr() - Get the current SNR 464 * @link_info: Link info pointer in HDD adapter 465 * @snr: pointer to where the SNR should be returned 466 * 467 * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_** on error 468 */ 469 QDF_STATUS wlan_hdd_get_snr(struct wlan_hdd_link_info *link_info, int8_t *snr); 470 471 /** 472 * wlan_hdd_get_linkspeed_for_peermac() - Get link speed for a peer 473 * @link_info: Link info pointer in adapter 474 * @mac_address: MAC address of the peer 475 * @linkspeed: pointer to memory where returned link speed is to be placed 476 * 477 * This function will send a query to SME for the linkspeed of the 478 * given peer, and then wait for the callback to be invoked. 479 * 480 * Return: 0 if linkspeed data is available, negative errno otherwise 481 */ 482 int wlan_hdd_get_linkspeed_for_peermac(struct wlan_hdd_link_info *link_info, 483 struct qdf_mac_addr *mac_address, 484 uint32_t *linkspeed); 485 486 /** 487 * wlan_hdd_get_link_speed() - get link speed 488 * @link_info: Link info pointer in HDD adapter 489 * @link_speed: pointer to link speed 490 * 491 * This function fetches per bssid link speed. 492 * 493 * Return: if associated, link speed shall be returned. 494 * if not associated, link speed of 0 is returned. 495 * On error, error number will be returned. 496 */ 497 int wlan_hdd_get_link_speed(struct wlan_hdd_link_info *link_info, 498 uint32_t *link_speed); 499 500 #ifdef FEATURE_RX_LINKSPEED_ROAM_TRIGGER 501 /** 502 * wlan_hdd_get_peer_rx_rate_stats() - STA gets rx rate stats 503 * @link_info: Link info pointer in HDD adapter 504 * 505 * STA gets rx rate stats through using the existed API 506 * cdp_host_get_peer_stats. The reason that we make this 507 * function is to avoid being disrupted by the flag 508 * "get_station_fw_request_needed" 509 * 510 * Return: void 511 */ 512 void wlan_hdd_get_peer_rx_rate_stats(struct wlan_hdd_link_info *link_info); 513 #else 514 static inline void 515 wlan_hdd_get_peer_rx_rate_stats(struct wlan_hdd_link_info *link_info) 516 { 517 } 518 #endif 519 520 /** 521 * wlan_hdd_get_station_stats() - Get station statistics 522 * @link_info: Link info pointer in HDD adapter. 523 * 524 * Return: status of operation 525 */ 526 int wlan_hdd_get_station_stats(struct wlan_hdd_link_info *link_info); 527 528 int wlan_hdd_qmi_get_sync_resume(void); 529 int wlan_hdd_qmi_put_suspend(void); 530 531 #ifdef WLAN_FEATURE_BIG_DATA_STATS 532 /** 533 * wlan_hdd_get_big_data_station_stats() - Get big data station statistics 534 * @link_info: Link info pointer in HDD adapter 535 * 536 * Return: status of operation 537 */ 538 int wlan_hdd_get_big_data_station_stats(struct wlan_hdd_link_info *link_info); 539 540 /** 541 * wlan_cfg80211_mc_cp_get_big_data_stats() - API to get big data 542 * statistics from firmware 543 * @vdev: Pointer to vdev 544 * @errno: error type in case of failure 545 * 546 * Return: big data stats buffer on success, Null on failure 547 */ 548 struct big_data_stats_event * 549 wlan_cfg80211_mc_cp_get_big_data_stats(struct wlan_objmgr_vdev *vdev, 550 int *errno); 551 552 /** 553 * wlan_cfg80211_mc_cp_stats_free_big_data_stats_event() - API to release big 554 * data statistics buffer 555 * @info: pointer to object to populate with big data stats 556 * 557 * Return: None 558 */ 559 void wlan_cfg80211_mc_cp_stats_free_big_data_stats_event( 560 struct big_data_stats_event *info); 561 #else 562 static inline int 563 wlan_hdd_get_big_data_station_stats(struct wlan_hdd_link_info *link_info) 564 { 565 return 0; 566 } 567 568 static inline struct big_data_stats_event * 569 wlan_cfg80211_mc_cp_get_big_data_stats(struct wlan_objmgr_vdev *vdev, 570 int *errno) 571 { 572 return 0; 573 } 574 575 static inline 576 void wlan_cfg80211_mc_cp_stats_free_big_data_stats_event( 577 struct big_data_stats_event *info) 578 { 579 } 580 #endif 581 582 /** 583 * wlan_hdd_get_temperature() - get current device temperature 584 * @adapter: device upon which the request was made 585 * @temperature: pointer to where the temperature is to be returned 586 * 587 * Return: 0 if a temperature value (either current or cached) was 588 * returned, otherwise a negative errno is returned. 589 * 590 */ 591 int wlan_hdd_get_temperature(struct hdd_adapter *adapter, int *temperature); 592 593 /** 594 * hdd_get_max_tx_bitrate() - Get the max tx bitrate of the AP 595 * @link_info: pointer to link_info struct in adapter 596 * 597 * This function gets the MAX supported rate by AP and cache 598 * it into connection info structure 599 * 600 * Return: None 601 */ 602 void hdd_get_max_tx_bitrate(struct wlan_hdd_link_info *link_info); 603 604 #ifdef TX_MULTIQ_PER_AC 605 /** 606 * wlan_hdd_display_tx_multiq_stats() - display Tx multi queue stats 607 * @context: hdd context 608 * @netdev: netdev 609 * 610 * Return: none 611 */ 612 void wlan_hdd_display_tx_multiq_stats(hdd_cb_handle context, 613 qdf_netdev_t netdev); 614 #else 615 static inline 616 void wlan_hdd_display_tx_multiq_stats(hdd_cb_handle context, 617 qdf_netdev_t netdev) 618 { 619 } 620 #endif 621 622 /** 623 * hdd_report_max_rate() - Fill the max rate stats in the station info structure 624 * to be sent to the userspace. 625 * @link_info: pointer to link_info struct in adapter 626 * @mac_handle: The mac handle 627 * @rate: The station_info tx/rx rate to be filled 628 * @signal: signal from station_info 629 * @rate_flags: TX/RX rate flags computed from tx/rx rate 630 * @mcs_index: The TX/RX mcs index computed from tx/rx rate 631 * @fw_rate: The tx/rx rate from fw stats 632 * @nss: The TX/RX NSS from fw stats 633 * 634 * Return: True if fill is successful 635 */ 636 bool hdd_report_max_rate(struct wlan_hdd_link_info *link_info, 637 mac_handle_t mac_handle, 638 struct rate_info *rate, 639 int8_t signal, 640 enum tx_rate_info rate_flags, 641 uint8_t mcs_index, 642 uint16_t fw_rate, uint8_t nss); 643 644 /** 645 * hdd_check_and_update_nss() - Check and update NSS as per DBS capability 646 * @hdd_ctx: HDD Context pointer 647 * @tx_nss: pointer to variable storing the tx_nss 648 * @rx_nss: pointer to variable storing the rx_nss 649 * 650 * The parameters include the NSS obtained from the FW or static NSS. This NSS 651 * could be invalid in the case the current HW mode is DBS where the connection 652 * are 1x1. Rectify these NSS values as per the current HW mode. 653 * 654 * Return: none 655 */ 656 void hdd_check_and_update_nss(struct hdd_context *hdd_ctx, 657 uint8_t *tx_nss, uint8_t *rx_nss); 658 #ifdef QCA_SUPPORT_CP_STATS 659 /** 660 * wlan_hdd_register_cp_stats_cb() - Register hdd stats specific 661 * callbacks to the cp stats component 662 * @hdd_ctx: hdd context 663 * 664 * Return: none 665 */ 666 667 void wlan_hdd_register_cp_stats_cb(struct hdd_context *hdd_ctx); 668 #else 669 static inline void wlan_hdd_register_cp_stats_cb(struct hdd_context *hdd_ctx) {} 670 #endif 671 672 #if defined(WLAN_FEATURE_ROAM_OFFLOAD) && defined(WLAN_FEATURE_ROAM_INFO_STATS) 673 #define FEATURE_ROAM_STATS_COMMANDS \ 674 { \ 675 .info.vendor_id = QCA_NL80211_VENDOR_ID, \ 676 .info.subcmd = QCA_NL80211_VENDOR_SUBCMD_ROAM_STATS, \ 677 .flags = WIPHY_VENDOR_CMD_NEED_WDEV | \ 678 WIPHY_VENDOR_CMD_NEED_NETDEV | \ 679 WIPHY_VENDOR_CMD_NEED_RUNNING, \ 680 .doit = wlan_hdd_cfg80211_get_roam_stats, \ 681 vendor_command_policy(VENDOR_CMD_RAW_DATA, 0) \ 682 }, \ 683 684 #define FEATURE_ROAM_STATS_EVENTS \ 685 [QCA_NL80211_VENDOR_SUBCMD_ROAM_STATS_INDEX] = { \ 686 .vendor_id = QCA_NL80211_VENDOR_ID, \ 687 .subcmd = QCA_NL80211_VENDOR_SUBCMD_ROAM_STATS, \ 688 }, \ 689 690 /** 691 * wlan_hdd_cfg80211_get_roam_stats() - get roam statstics information 692 * @wiphy: wiphy pointer 693 * @wdev: pointer to struct wireless_dev 694 * @data: pointer to incoming NL vendor data 695 * @data_len: length of @data 696 * 697 * Return: 0 on success; error number otherwise. 698 */ 699 int wlan_hdd_cfg80211_get_roam_stats(struct wiphy *wiphy, 700 struct wireless_dev *wdev, 701 const void *data, 702 int data_len); 703 #else 704 #define FEATURE_ROAM_STATS_COMMANDS 705 #define FEATURE_ROAM_STATS_EVENTS 706 #endif 707 708 #ifdef WLAN_FEATURE_TX_LATENCY_STATS 709 /** 710 * hdd_tx_latency_register_cb() - register callback function for transmit 711 * latency stats 712 * @soc: pointer to soc context 713 * 714 * Return: QDF_STATUS 715 */ 716 QDF_STATUS hdd_tx_latency_register_cb(void *soc); 717 718 /** 719 * hdd_tx_latency_restore_config() - restore tx latency stats config for a link 720 * @link_info: link specific information 721 * 722 * Return: QDF_STATUS 723 */ 724 QDF_STATUS 725 hdd_tx_latency_restore_config(struct wlan_hdd_link_info *link_info); 726 727 /** 728 * wlan_hdd_cfg80211_tx_latency - configure/retrieve per-link transmit latency 729 * statistics 730 * @wiphy: wiphy handle 731 * @wdev: wdev handle 732 * @data: user layer input 733 * @data_len: length of user layer input 734 * 735 * return: 0 success, einval failure 736 */ 737 int wlan_hdd_cfg80211_tx_latency(struct wiphy *wiphy, 738 struct wireless_dev *wdev, 739 const void *data, int data_len); 740 741 /** 742 * hdd_tx_latency_record_ingress_ts() - Record driver ingress timestamp in CB 743 * @adapter: pointer to hdd vdev/net_device context 744 * @skb: sk buff 745 * 746 * Return: None 747 */ 748 static inline void 749 hdd_tx_latency_record_ingress_ts(struct hdd_adapter *adapter, 750 struct sk_buff *skb) 751 { 752 if (adapter->tx_latency_cfg.enable) 753 qdf_nbuf_set_tx_ts(skb); 754 } 755 756 extern const struct nla_policy 757 tx_latency_policy[QCA_WLAN_VENDOR_ATTR_TX_LATENCY_MAX + 1]; 758 759 #define FEATURE_TX_LATENCY_STATS_COMMANDS \ 760 { \ 761 .info.vendor_id = QCA_NL80211_VENDOR_ID, \ 762 .info.subcmd = QCA_NL80211_VENDOR_SUBCMD_TX_LATENCY, \ 763 .flags = WIPHY_VENDOR_CMD_NEED_WDEV | \ 764 WIPHY_VENDOR_CMD_NEED_NETDEV | \ 765 WIPHY_VENDOR_CMD_NEED_RUNNING, \ 766 .doit = wlan_hdd_cfg80211_tx_latency, \ 767 vendor_command_policy(tx_latency_policy, \ 768 QCA_WLAN_VENDOR_ATTR_TX_LATENCY_MAX) \ 769 }, \ 770 771 #define FEATURE_TX_LATENCY_STATS_EVENTS \ 772 [QCA_NL80211_VENDOR_SUBCMD_TX_LATENCY_INDEX] = { \ 773 .vendor_id = QCA_NL80211_VENDOR_ID, \ 774 .subcmd = QCA_NL80211_VENDOR_SUBCMD_TX_LATENCY, \ 775 }, \ 776 777 #else 778 static inline QDF_STATUS hdd_tx_latency_register_cb(void *soc) 779 { 780 return QDF_STATUS_SUCCESS; 781 } 782 783 static inline QDF_STATUS 784 hdd_tx_latency_restore_config(struct wlan_hdd_link_info *link_info) 785 { 786 return QDF_STATUS_SUCCESS; 787 } 788 789 static inline void 790 hdd_tx_latency_record_ingress_ts(struct hdd_adapter *adapter, 791 struct sk_buff *skb) 792 { 793 } 794 795 #define FEATURE_TX_LATENCY_STATS_COMMANDS 796 #define FEATURE_TX_LATENCY_STATS_EVENTS 797 #endif 798 #endif /* end #if !defined(WLAN_HDD_STATS_H) */ 799