1 // SPDX-License-Identifier: ISC 2 /* 3 * Copyright (c) 2005-2011 Atheros Communications Inc. 4 * Copyright (c) 2011-2017 Qualcomm Atheros, Inc. 5 * Copyright (c) 2018, The Linux Foundation. All rights reserved. 6 * Copyright (c) 2022, 2024 Qualcomm Innovation Center, Inc. All rights reserved. 7 */ 8 9 #include <linux/module.h> 10 #include <linux/debugfs.h> 11 #include <linux/vmalloc.h> 12 #include <linux/crc32.h> 13 #include <linux/firmware.h> 14 #include <linux/kstrtox.h> 15 16 #include "core.h" 17 #include "debug.h" 18 #include "hif.h" 19 #include "wmi-ops.h" 20 21 /* ms */ 22 #define ATH10K_DEBUG_HTT_STATS_INTERVAL 1000 23 24 #define ATH10K_DEBUG_CAL_DATA_LEN 12064 25 26 void ath10k_info(struct ath10k *ar, const char *fmt, ...) 27 { 28 struct va_format vaf = { 29 .fmt = fmt, 30 }; 31 va_list args; 32 33 va_start(args, fmt); 34 vaf.va = &args; 35 dev_info(ar->dev, "%pV", &vaf); 36 trace_ath10k_log_info(ar, &vaf); 37 va_end(args); 38 } 39 EXPORT_SYMBOL(ath10k_info); 40 41 void ath10k_debug_print_hwfw_info(struct ath10k *ar) 42 { 43 const struct firmware *firmware; 44 char fw_features[128] = {}; 45 u32 crc = 0; 46 47 ath10k_core_get_fw_features_str(ar, fw_features, sizeof(fw_features)); 48 49 ath10k_info(ar, "%s target 0x%08x chip_id 0x%08x sub %04x:%04x", 50 ar->hw_params.name, 51 ar->target_version, 52 ar->bus_param.chip_id, 53 ar->id.subsystem_vendor, ar->id.subsystem_device); 54 55 ath10k_info(ar, "kconfig debug %d debugfs %d tracing %d dfs %d testmode %d\n", 56 IS_ENABLED(CONFIG_ATH10K_DEBUG), 57 IS_ENABLED(CONFIG_ATH10K_DEBUGFS), 58 IS_ENABLED(CONFIG_ATH10K_TRACING), 59 IS_ENABLED(CONFIG_ATH10K_DFS_CERTIFIED), 60 IS_ENABLED(CONFIG_NL80211_TESTMODE)); 61 62 firmware = ar->normal_mode_fw.fw_file.firmware; 63 if (firmware) 64 crc = crc32_le(0, firmware->data, firmware->size); 65 66 ath10k_info(ar, "firmware ver %s api %d features %s crc32 %08x\n", 67 ar->hw->wiphy->fw_version, 68 ar->fw_api, 69 fw_features, 70 crc); 71 } 72 73 void ath10k_debug_print_board_info(struct ath10k *ar) 74 { 75 char boardinfo[100]; 76 const struct firmware *board; 77 u32 crc; 78 79 if (ar->id.bmi_ids_valid) 80 scnprintf(boardinfo, sizeof(boardinfo), "%d:%d", 81 ar->id.bmi_chip_id, ar->id.bmi_board_id); 82 else 83 scnprintf(boardinfo, sizeof(boardinfo), "N/A"); 84 85 board = ar->normal_mode_fw.board; 86 if (!IS_ERR_OR_NULL(board)) 87 crc = crc32_le(0, board->data, board->size); 88 else 89 crc = 0; 90 91 ath10k_info(ar, "board_file api %d bmi_id %s crc32 %08x", 92 ar->bd_api, 93 boardinfo, 94 crc); 95 } 96 97 void ath10k_debug_print_boot_info(struct ath10k *ar) 98 { 99 ath10k_info(ar, "htt-ver %d.%d wmi-op %d htt-op %d cal %s max-sta %d raw %d hwcrypto %d\n", 100 ar->htt.target_version_major, 101 ar->htt.target_version_minor, 102 ar->normal_mode_fw.fw_file.wmi_op_version, 103 ar->normal_mode_fw.fw_file.htt_op_version, 104 ath10k_cal_mode_str(ar->cal_mode), 105 ar->max_num_stations, 106 test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags), 107 !test_bit(ATH10K_FLAG_HW_CRYPTO_DISABLED, &ar->dev_flags)); 108 } 109 110 void ath10k_print_driver_info(struct ath10k *ar) 111 { 112 ath10k_debug_print_hwfw_info(ar); 113 ath10k_debug_print_board_info(ar); 114 ath10k_debug_print_boot_info(ar); 115 } 116 EXPORT_SYMBOL(ath10k_print_driver_info); 117 118 void ath10k_err(struct ath10k *ar, const char *fmt, ...) 119 { 120 struct va_format vaf = { 121 .fmt = fmt, 122 }; 123 va_list args; 124 125 va_start(args, fmt); 126 vaf.va = &args; 127 dev_err(ar->dev, "%pV", &vaf); 128 trace_ath10k_log_err(ar, &vaf); 129 va_end(args); 130 } 131 EXPORT_SYMBOL(ath10k_err); 132 133 void ath10k_warn(struct ath10k *ar, const char *fmt, ...) 134 { 135 struct va_format vaf = { 136 .fmt = fmt, 137 }; 138 va_list args; 139 140 va_start(args, fmt); 141 vaf.va = &args; 142 dev_warn_ratelimited(ar->dev, "%pV", &vaf); 143 trace_ath10k_log_warn(ar, &vaf); 144 145 va_end(args); 146 } 147 EXPORT_SYMBOL(ath10k_warn); 148 149 #ifdef CONFIG_ATH10K_DEBUGFS 150 151 static ssize_t ath10k_read_wmi_services(struct file *file, 152 char __user *user_buf, 153 size_t count, loff_t *ppos) 154 { 155 struct ath10k *ar = file->private_data; 156 char *buf; 157 size_t len = 0, buf_len = 8192; 158 const char *name; 159 ssize_t ret_cnt; 160 bool enabled; 161 int i; 162 163 buf = kzalloc(buf_len, GFP_KERNEL); 164 if (!buf) 165 return -ENOMEM; 166 167 mutex_lock(&ar->conf_mutex); 168 169 spin_lock_bh(&ar->data_lock); 170 for (i = 0; i < WMI_SERVICE_MAX; i++) { 171 enabled = test_bit(i, ar->wmi.svc_map); 172 name = wmi_service_name(i); 173 174 if (!name) { 175 if (enabled) 176 len += scnprintf(buf + len, buf_len - len, 177 "%-40s %s (bit %d)\n", 178 "unknown", "enabled", i); 179 180 continue; 181 } 182 183 len += scnprintf(buf + len, buf_len - len, 184 "%-40s %s\n", 185 name, enabled ? "enabled" : "-"); 186 } 187 spin_unlock_bh(&ar->data_lock); 188 189 ret_cnt = simple_read_from_buffer(user_buf, count, ppos, buf, len); 190 191 mutex_unlock(&ar->conf_mutex); 192 193 kfree(buf); 194 return ret_cnt; 195 } 196 197 static const struct file_operations fops_wmi_services = { 198 .read = ath10k_read_wmi_services, 199 .open = simple_open, 200 .owner = THIS_MODULE, 201 .llseek = default_llseek, 202 }; 203 204 static void ath10k_fw_stats_pdevs_free(struct list_head *head) 205 { 206 struct ath10k_fw_stats_pdev *i, *tmp; 207 208 list_for_each_entry_safe(i, tmp, head, list) { 209 list_del(&i->list); 210 kfree(i); 211 } 212 } 213 214 static void ath10k_fw_stats_vdevs_free(struct list_head *head) 215 { 216 struct ath10k_fw_stats_vdev *i, *tmp; 217 218 list_for_each_entry_safe(i, tmp, head, list) { 219 list_del(&i->list); 220 kfree(i); 221 } 222 } 223 224 static void ath10k_fw_stats_peers_free(struct list_head *head) 225 { 226 struct ath10k_fw_stats_peer *i, *tmp; 227 228 list_for_each_entry_safe(i, tmp, head, list) { 229 list_del(&i->list); 230 kfree(i); 231 } 232 } 233 234 static void ath10k_fw_extd_stats_peers_free(struct list_head *head) 235 { 236 struct ath10k_fw_extd_stats_peer *i, *tmp; 237 238 list_for_each_entry_safe(i, tmp, head, list) { 239 list_del(&i->list); 240 kfree(i); 241 } 242 } 243 244 static void ath10k_debug_fw_stats_reset(struct ath10k *ar) 245 { 246 spin_lock_bh(&ar->data_lock); 247 ar->debug.fw_stats_done = false; 248 ar->debug.fw_stats.extended = false; 249 ath10k_fw_stats_pdevs_free(&ar->debug.fw_stats.pdevs); 250 ath10k_fw_stats_vdevs_free(&ar->debug.fw_stats.vdevs); 251 ath10k_fw_stats_peers_free(&ar->debug.fw_stats.peers); 252 ath10k_fw_extd_stats_peers_free(&ar->debug.fw_stats.peers_extd); 253 spin_unlock_bh(&ar->data_lock); 254 } 255 256 void ath10k_debug_fw_stats_process(struct ath10k *ar, struct sk_buff *skb) 257 { 258 struct ath10k_fw_stats stats = {}; 259 bool is_start, is_started, is_end; 260 size_t num_peers; 261 size_t num_vdevs; 262 int ret; 263 264 INIT_LIST_HEAD(&stats.pdevs); 265 INIT_LIST_HEAD(&stats.vdevs); 266 INIT_LIST_HEAD(&stats.peers); 267 INIT_LIST_HEAD(&stats.peers_extd); 268 269 spin_lock_bh(&ar->data_lock); 270 ret = ath10k_wmi_pull_fw_stats(ar, skb, &stats); 271 if (ret) { 272 ath10k_warn(ar, "failed to pull fw stats: %d\n", ret); 273 goto free; 274 } 275 276 /* Stat data may exceed htc-wmi buffer limit. In such case firmware 277 * splits the stats data and delivers it in a ping-pong fashion of 278 * request cmd-update event. 279 * 280 * However there is no explicit end-of-data. Instead start-of-data is 281 * used as an implicit one. This works as follows: 282 * a) discard stat update events until one with pdev stats is 283 * delivered - this skips session started at end of (b) 284 * b) consume stat update events until another one with pdev stats is 285 * delivered which is treated as end-of-data and is itself discarded 286 */ 287 if (ath10k_peer_stats_enabled(ar)) 288 ath10k_sta_update_rx_duration(ar, &stats); 289 290 if (ar->debug.fw_stats_done) { 291 if (!ath10k_peer_stats_enabled(ar)) 292 ath10k_warn(ar, "received unsolicited stats update event\n"); 293 294 goto free; 295 } 296 297 num_peers = list_count_nodes(&ar->debug.fw_stats.peers); 298 num_vdevs = list_count_nodes(&ar->debug.fw_stats.vdevs); 299 is_start = (list_empty(&ar->debug.fw_stats.pdevs) && 300 !list_empty(&stats.pdevs)); 301 is_end = (!list_empty(&ar->debug.fw_stats.pdevs) && 302 !list_empty(&stats.pdevs)); 303 304 if (is_start) 305 list_splice_tail_init(&stats.pdevs, &ar->debug.fw_stats.pdevs); 306 307 if (is_end) 308 ar->debug.fw_stats_done = true; 309 310 if (stats.extended) 311 ar->debug.fw_stats.extended = true; 312 313 is_started = !list_empty(&ar->debug.fw_stats.pdevs); 314 315 if (is_started && !is_end) { 316 if (num_peers >= ATH10K_MAX_NUM_PEER_IDS) { 317 /* Although this is unlikely impose a sane limit to 318 * prevent firmware from DoS-ing the host. 319 */ 320 ath10k_fw_stats_peers_free(&ar->debug.fw_stats.peers); 321 ath10k_fw_extd_stats_peers_free(&ar->debug.fw_stats.peers_extd); 322 ath10k_warn(ar, "dropping fw peer stats\n"); 323 goto free; 324 } 325 326 if (num_vdevs >= BITS_PER_LONG) { 327 ath10k_fw_stats_vdevs_free(&ar->debug.fw_stats.vdevs); 328 ath10k_warn(ar, "dropping fw vdev stats\n"); 329 goto free; 330 } 331 332 if (!list_empty(&stats.peers)) 333 list_splice_tail_init(&stats.peers_extd, 334 &ar->debug.fw_stats.peers_extd); 335 336 list_splice_tail_init(&stats.peers, &ar->debug.fw_stats.peers); 337 list_splice_tail_init(&stats.vdevs, &ar->debug.fw_stats.vdevs); 338 } 339 340 complete(&ar->debug.fw_stats_complete); 341 342 free: 343 /* In some cases lists have been spliced and cleared. Free up 344 * resources if that is not the case. 345 */ 346 ath10k_fw_stats_pdevs_free(&stats.pdevs); 347 ath10k_fw_stats_vdevs_free(&stats.vdevs); 348 ath10k_fw_stats_peers_free(&stats.peers); 349 ath10k_fw_extd_stats_peers_free(&stats.peers_extd); 350 351 spin_unlock_bh(&ar->data_lock); 352 } 353 354 int ath10k_debug_fw_stats_request(struct ath10k *ar) 355 { 356 unsigned long timeout, time_left; 357 int ret; 358 359 lockdep_assert_held(&ar->conf_mutex); 360 361 timeout = jiffies + msecs_to_jiffies(1 * HZ); 362 363 ath10k_debug_fw_stats_reset(ar); 364 365 for (;;) { 366 if (time_after(jiffies, timeout)) 367 return -ETIMEDOUT; 368 369 reinit_completion(&ar->debug.fw_stats_complete); 370 371 ret = ath10k_wmi_request_stats(ar, ar->fw_stats_req_mask); 372 if (ret) { 373 ath10k_warn(ar, "could not request stats (%d)\n", ret); 374 return ret; 375 } 376 377 time_left = 378 wait_for_completion_timeout(&ar->debug.fw_stats_complete, 379 1 * HZ); 380 if (!time_left) 381 return -ETIMEDOUT; 382 383 spin_lock_bh(&ar->data_lock); 384 if (ar->debug.fw_stats_done) { 385 spin_unlock_bh(&ar->data_lock); 386 break; 387 } 388 spin_unlock_bh(&ar->data_lock); 389 } 390 391 return 0; 392 } 393 394 static int ath10k_fw_stats_open(struct inode *inode, struct file *file) 395 { 396 struct ath10k *ar = inode->i_private; 397 void *buf = NULL; 398 int ret; 399 400 mutex_lock(&ar->conf_mutex); 401 402 if (ar->state != ATH10K_STATE_ON) { 403 ret = -ENETDOWN; 404 goto err_unlock; 405 } 406 407 buf = vmalloc(ATH10K_FW_STATS_BUF_SIZE); 408 if (!buf) { 409 ret = -ENOMEM; 410 goto err_unlock; 411 } 412 413 ret = ath10k_debug_fw_stats_request(ar); 414 if (ret) { 415 ath10k_warn(ar, "failed to request fw stats: %d\n", ret); 416 goto err_free; 417 } 418 419 ret = ath10k_wmi_fw_stats_fill(ar, &ar->debug.fw_stats, buf); 420 if (ret) { 421 ath10k_warn(ar, "failed to fill fw stats: %d\n", ret); 422 goto err_free; 423 } 424 425 file->private_data = buf; 426 427 mutex_unlock(&ar->conf_mutex); 428 return 0; 429 430 err_free: 431 vfree(buf); 432 433 err_unlock: 434 mutex_unlock(&ar->conf_mutex); 435 return ret; 436 } 437 438 static int ath10k_fw_stats_release(struct inode *inode, struct file *file) 439 { 440 vfree(file->private_data); 441 442 return 0; 443 } 444 445 static ssize_t ath10k_fw_stats_read(struct file *file, char __user *user_buf, 446 size_t count, loff_t *ppos) 447 { 448 const char *buf = file->private_data; 449 size_t len = strlen(buf); 450 451 return simple_read_from_buffer(user_buf, count, ppos, buf, len); 452 } 453 454 static const struct file_operations fops_fw_stats = { 455 .open = ath10k_fw_stats_open, 456 .release = ath10k_fw_stats_release, 457 .read = ath10k_fw_stats_read, 458 .owner = THIS_MODULE, 459 .llseek = default_llseek, 460 }; 461 462 static ssize_t ath10k_debug_fw_reset_stats_read(struct file *file, 463 char __user *user_buf, 464 size_t count, loff_t *ppos) 465 { 466 struct ath10k *ar = file->private_data; 467 int ret; 468 size_t len = 0, buf_len = 500; 469 char *buf; 470 471 buf = kmalloc(buf_len, GFP_KERNEL); 472 if (!buf) 473 return -ENOMEM; 474 475 spin_lock_bh(&ar->data_lock); 476 477 len += scnprintf(buf + len, buf_len - len, 478 "fw_crash_counter\t\t%d\n", ar->stats.fw_crash_counter); 479 len += scnprintf(buf + len, buf_len - len, 480 "fw_warm_reset_counter\t\t%d\n", 481 ar->stats.fw_warm_reset_counter); 482 len += scnprintf(buf + len, buf_len - len, 483 "fw_cold_reset_counter\t\t%d\n", 484 ar->stats.fw_cold_reset_counter); 485 486 spin_unlock_bh(&ar->data_lock); 487 488 ret = simple_read_from_buffer(user_buf, count, ppos, buf, len); 489 490 kfree(buf); 491 492 return ret; 493 } 494 495 static const struct file_operations fops_fw_reset_stats = { 496 .open = simple_open, 497 .read = ath10k_debug_fw_reset_stats_read, 498 .owner = THIS_MODULE, 499 .llseek = default_llseek, 500 }; 501 502 /* This is a clean assert crash in firmware. */ 503 static int ath10k_debug_fw_assert(struct ath10k *ar) 504 { 505 struct wmi_vdev_install_key_cmd *cmd; 506 struct sk_buff *skb; 507 508 skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd) + 16); 509 if (!skb) 510 return -ENOMEM; 511 512 cmd = (struct wmi_vdev_install_key_cmd *)skb->data; 513 memset(cmd, 0, sizeof(*cmd)); 514 515 /* big enough number so that firmware asserts */ 516 cmd->vdev_id = __cpu_to_le32(0x7ffe); 517 518 return ath10k_wmi_cmd_send(ar, skb, 519 ar->wmi.cmd->vdev_install_key_cmdid); 520 } 521 522 static ssize_t ath10k_read_simulate_fw_crash(struct file *file, 523 char __user *user_buf, 524 size_t count, loff_t *ppos) 525 { 526 const char buf[] = 527 "To simulate firmware crash write one of the keywords to this file:\n" 528 "`soft` - this will send WMI_FORCE_FW_HANG_ASSERT to firmware if FW supports that command.\n" 529 "`hard` - this will send to firmware command with illegal parameters causing firmware crash.\n" 530 "`assert` - this will send special illegal parameter to firmware to cause assert failure and crash.\n" 531 "`hw-restart` - this will simply queue hw restart without fw/hw actually crashing.\n"; 532 533 return simple_read_from_buffer(user_buf, count, ppos, buf, strlen(buf)); 534 } 535 536 /* Simulate firmware crash: 537 * 'soft': Call wmi command causing firmware hang. This firmware hang is 538 * recoverable by warm firmware reset. 539 * 'hard': Force firmware crash by setting any vdev parameter for not allowed 540 * vdev id. This is hard firmware crash because it is recoverable only by cold 541 * firmware reset. 542 */ 543 static ssize_t ath10k_write_simulate_fw_crash(struct file *file, 544 const char __user *user_buf, 545 size_t count, loff_t *ppos) 546 { 547 struct ath10k *ar = file->private_data; 548 char buf[32] = {0}; 549 ssize_t rc; 550 int ret; 551 552 /* filter partial writes and invalid commands */ 553 if (*ppos != 0 || count >= sizeof(buf) || count == 0) 554 return -EINVAL; 555 556 rc = simple_write_to_buffer(buf, sizeof(buf) - 1, ppos, user_buf, count); 557 if (rc < 0) 558 return rc; 559 560 /* drop the possible '\n' from the end */ 561 if (buf[*ppos - 1] == '\n') 562 buf[*ppos - 1] = '\0'; 563 564 mutex_lock(&ar->conf_mutex); 565 566 if (ar->state != ATH10K_STATE_ON && 567 ar->state != ATH10K_STATE_RESTARTED) { 568 ret = -ENETDOWN; 569 goto exit; 570 } 571 572 if (!strcmp(buf, "soft")) { 573 ath10k_info(ar, "simulating soft firmware crash\n"); 574 ret = ath10k_wmi_force_fw_hang(ar, WMI_FORCE_FW_HANG_ASSERT, 0); 575 } else if (!strcmp(buf, "hard")) { 576 ath10k_info(ar, "simulating hard firmware crash\n"); 577 /* 0x7fff is vdev id, and it is always out of range for all 578 * firmware variants in order to force a firmware crash. 579 */ 580 ret = ath10k_wmi_vdev_set_param(ar, 0x7fff, 581 ar->wmi.vdev_param->rts_threshold, 582 0); 583 } else if (!strcmp(buf, "assert")) { 584 ath10k_info(ar, "simulating firmware assert crash\n"); 585 ret = ath10k_debug_fw_assert(ar); 586 } else if (!strcmp(buf, "hw-restart")) { 587 ath10k_info(ar, "user requested hw restart\n"); 588 ath10k_core_start_recovery(ar); 589 ret = 0; 590 } else { 591 ret = -EINVAL; 592 goto exit; 593 } 594 595 if (ret) { 596 ath10k_warn(ar, "failed to simulate firmware crash: %d\n", ret); 597 goto exit; 598 } 599 600 ret = count; 601 602 exit: 603 mutex_unlock(&ar->conf_mutex); 604 return ret; 605 } 606 607 static const struct file_operations fops_simulate_fw_crash = { 608 .read = ath10k_read_simulate_fw_crash, 609 .write = ath10k_write_simulate_fw_crash, 610 .open = simple_open, 611 .owner = THIS_MODULE, 612 .llseek = default_llseek, 613 }; 614 615 static ssize_t ath10k_read_chip_id(struct file *file, char __user *user_buf, 616 size_t count, loff_t *ppos) 617 { 618 struct ath10k *ar = file->private_data; 619 size_t len; 620 char buf[50]; 621 622 len = scnprintf(buf, sizeof(buf), "0x%08x\n", ar->bus_param.chip_id); 623 624 return simple_read_from_buffer(user_buf, count, ppos, buf, len); 625 } 626 627 static const struct file_operations fops_chip_id = { 628 .read = ath10k_read_chip_id, 629 .open = simple_open, 630 .owner = THIS_MODULE, 631 .llseek = default_llseek, 632 }; 633 634 static ssize_t ath10k_reg_addr_read(struct file *file, 635 char __user *user_buf, 636 size_t count, loff_t *ppos) 637 { 638 struct ath10k *ar = file->private_data; 639 u8 buf[32]; 640 size_t len = 0; 641 u32 reg_addr; 642 643 mutex_lock(&ar->conf_mutex); 644 reg_addr = ar->debug.reg_addr; 645 mutex_unlock(&ar->conf_mutex); 646 647 len += scnprintf(buf + len, sizeof(buf) - len, "0x%x\n", reg_addr); 648 649 return simple_read_from_buffer(user_buf, count, ppos, buf, len); 650 } 651 652 static ssize_t ath10k_reg_addr_write(struct file *file, 653 const char __user *user_buf, 654 size_t count, loff_t *ppos) 655 { 656 struct ath10k *ar = file->private_data; 657 u32 reg_addr; 658 int ret; 659 660 ret = kstrtou32_from_user(user_buf, count, 0, ®_addr); 661 if (ret) 662 return ret; 663 664 if (!IS_ALIGNED(reg_addr, 4)) 665 return -EFAULT; 666 667 mutex_lock(&ar->conf_mutex); 668 ar->debug.reg_addr = reg_addr; 669 mutex_unlock(&ar->conf_mutex); 670 671 return count; 672 } 673 674 static const struct file_operations fops_reg_addr = { 675 .read = ath10k_reg_addr_read, 676 .write = ath10k_reg_addr_write, 677 .open = simple_open, 678 .owner = THIS_MODULE, 679 .llseek = default_llseek, 680 }; 681 682 static ssize_t ath10k_reg_value_read(struct file *file, 683 char __user *user_buf, 684 size_t count, loff_t *ppos) 685 { 686 struct ath10k *ar = file->private_data; 687 u8 buf[48]; 688 size_t len; 689 u32 reg_addr, reg_val; 690 int ret; 691 692 mutex_lock(&ar->conf_mutex); 693 694 if (ar->state != ATH10K_STATE_ON && 695 ar->state != ATH10K_STATE_UTF) { 696 ret = -ENETDOWN; 697 goto exit; 698 } 699 700 reg_addr = ar->debug.reg_addr; 701 702 reg_val = ath10k_hif_read32(ar, reg_addr); 703 len = scnprintf(buf, sizeof(buf), "0x%08x:0x%08x\n", reg_addr, reg_val); 704 705 ret = simple_read_from_buffer(user_buf, count, ppos, buf, len); 706 707 exit: 708 mutex_unlock(&ar->conf_mutex); 709 710 return ret; 711 } 712 713 static ssize_t ath10k_reg_value_write(struct file *file, 714 const char __user *user_buf, 715 size_t count, loff_t *ppos) 716 { 717 struct ath10k *ar = file->private_data; 718 u32 reg_addr, reg_val; 719 int ret; 720 721 mutex_lock(&ar->conf_mutex); 722 723 if (ar->state != ATH10K_STATE_ON && 724 ar->state != ATH10K_STATE_UTF) { 725 ret = -ENETDOWN; 726 goto exit; 727 } 728 729 reg_addr = ar->debug.reg_addr; 730 731 ret = kstrtou32_from_user(user_buf, count, 0, ®_val); 732 if (ret) 733 goto exit; 734 735 ath10k_hif_write32(ar, reg_addr, reg_val); 736 737 ret = count; 738 739 exit: 740 mutex_unlock(&ar->conf_mutex); 741 742 return ret; 743 } 744 745 static const struct file_operations fops_reg_value = { 746 .read = ath10k_reg_value_read, 747 .write = ath10k_reg_value_write, 748 .open = simple_open, 749 .owner = THIS_MODULE, 750 .llseek = default_llseek, 751 }; 752 753 static ssize_t ath10k_mem_value_read(struct file *file, 754 char __user *user_buf, 755 size_t count, loff_t *ppos) 756 { 757 struct ath10k *ar = file->private_data; 758 u8 *buf; 759 int ret; 760 761 if (*ppos < 0) 762 return -EINVAL; 763 764 if (!count) 765 return 0; 766 767 mutex_lock(&ar->conf_mutex); 768 769 buf = vmalloc(count); 770 if (!buf) { 771 ret = -ENOMEM; 772 goto exit; 773 } 774 775 if (ar->state != ATH10K_STATE_ON && 776 ar->state != ATH10K_STATE_UTF) { 777 ret = -ENETDOWN; 778 goto exit; 779 } 780 781 ret = ath10k_hif_diag_read(ar, *ppos, buf, count); 782 if (ret) { 783 ath10k_warn(ar, "failed to read address 0x%08x via diagnose window from debugfs: %d\n", 784 (u32)(*ppos), ret); 785 goto exit; 786 } 787 788 ret = copy_to_user(user_buf, buf, count); 789 if (ret) { 790 ret = -EFAULT; 791 goto exit; 792 } 793 794 count -= ret; 795 *ppos += count; 796 ret = count; 797 798 exit: 799 vfree(buf); 800 mutex_unlock(&ar->conf_mutex); 801 802 return ret; 803 } 804 805 static ssize_t ath10k_mem_value_write(struct file *file, 806 const char __user *user_buf, 807 size_t count, loff_t *ppos) 808 { 809 struct ath10k *ar = file->private_data; 810 u8 *buf; 811 int ret; 812 813 if (*ppos < 0) 814 return -EINVAL; 815 816 if (!count) 817 return 0; 818 819 mutex_lock(&ar->conf_mutex); 820 821 buf = vmalloc(count); 822 if (!buf) { 823 ret = -ENOMEM; 824 goto exit; 825 } 826 827 if (ar->state != ATH10K_STATE_ON && 828 ar->state != ATH10K_STATE_UTF) { 829 ret = -ENETDOWN; 830 goto exit; 831 } 832 833 ret = copy_from_user(buf, user_buf, count); 834 if (ret) { 835 ret = -EFAULT; 836 goto exit; 837 } 838 839 ret = ath10k_hif_diag_write(ar, *ppos, buf, count); 840 if (ret) { 841 ath10k_warn(ar, "failed to write address 0x%08x via diagnose window from debugfs: %d\n", 842 (u32)(*ppos), ret); 843 goto exit; 844 } 845 846 *ppos += count; 847 ret = count; 848 849 exit: 850 vfree(buf); 851 mutex_unlock(&ar->conf_mutex); 852 853 return ret; 854 } 855 856 static const struct file_operations fops_mem_value = { 857 .read = ath10k_mem_value_read, 858 .write = ath10k_mem_value_write, 859 .open = simple_open, 860 .owner = THIS_MODULE, 861 .llseek = default_llseek, 862 }; 863 864 static int ath10k_debug_htt_stats_req(struct ath10k *ar) 865 { 866 u64 cookie; 867 int ret; 868 869 lockdep_assert_held(&ar->conf_mutex); 870 871 if (ar->debug.htt_stats_mask == 0) 872 /* htt stats are disabled */ 873 return 0; 874 875 if (ar->state != ATH10K_STATE_ON) 876 return 0; 877 878 cookie = get_jiffies_64(); 879 880 ret = ath10k_htt_h2t_stats_req(&ar->htt, ar->debug.htt_stats_mask, 881 ar->debug.reset_htt_stats, cookie); 882 if (ret) { 883 ath10k_warn(ar, "failed to send htt stats request: %d\n", ret); 884 return ret; 885 } 886 887 queue_delayed_work(ar->workqueue, &ar->debug.htt_stats_dwork, 888 msecs_to_jiffies(ATH10K_DEBUG_HTT_STATS_INTERVAL)); 889 890 return 0; 891 } 892 893 static void ath10k_debug_htt_stats_dwork(struct work_struct *work) 894 { 895 struct ath10k *ar = container_of(work, struct ath10k, 896 debug.htt_stats_dwork.work); 897 898 mutex_lock(&ar->conf_mutex); 899 900 ath10k_debug_htt_stats_req(ar); 901 902 mutex_unlock(&ar->conf_mutex); 903 } 904 905 static ssize_t ath10k_read_htt_stats_mask(struct file *file, 906 char __user *user_buf, 907 size_t count, loff_t *ppos) 908 { 909 struct ath10k *ar = file->private_data; 910 char buf[32]; 911 size_t len; 912 913 len = scnprintf(buf, sizeof(buf), "%lu\n", ar->debug.htt_stats_mask); 914 915 return simple_read_from_buffer(user_buf, count, ppos, buf, len); 916 } 917 918 static ssize_t ath10k_write_htt_stats_mask(struct file *file, 919 const char __user *user_buf, 920 size_t count, loff_t *ppos) 921 { 922 struct ath10k *ar = file->private_data; 923 unsigned long mask; 924 int ret; 925 926 ret = kstrtoul_from_user(user_buf, count, 0, &mask); 927 if (ret) 928 return ret; 929 930 /* max 17 bit masks (for now) */ 931 if (mask > HTT_STATS_BIT_MASK) 932 return -E2BIG; 933 934 mutex_lock(&ar->conf_mutex); 935 936 ar->debug.htt_stats_mask = mask; 937 938 ret = ath10k_debug_htt_stats_req(ar); 939 if (ret) 940 goto out; 941 942 ret = count; 943 944 out: 945 mutex_unlock(&ar->conf_mutex); 946 947 return ret; 948 } 949 950 static const struct file_operations fops_htt_stats_mask = { 951 .read = ath10k_read_htt_stats_mask, 952 .write = ath10k_write_htt_stats_mask, 953 .open = simple_open, 954 .owner = THIS_MODULE, 955 .llseek = default_llseek, 956 }; 957 958 static ssize_t ath10k_read_htt_max_amsdu_ampdu(struct file *file, 959 char __user *user_buf, 960 size_t count, loff_t *ppos) 961 { 962 struct ath10k *ar = file->private_data; 963 char buf[64]; 964 u8 amsdu, ampdu; 965 size_t len; 966 967 mutex_lock(&ar->conf_mutex); 968 969 amsdu = ar->htt.max_num_amsdu; 970 ampdu = ar->htt.max_num_ampdu; 971 mutex_unlock(&ar->conf_mutex); 972 973 len = scnprintf(buf, sizeof(buf), "%u %u\n", amsdu, ampdu); 974 975 return simple_read_from_buffer(user_buf, count, ppos, buf, len); 976 } 977 978 static ssize_t ath10k_write_htt_max_amsdu_ampdu(struct file *file, 979 const char __user *user_buf, 980 size_t count, loff_t *ppos) 981 { 982 struct ath10k *ar = file->private_data; 983 int res; 984 char buf[64] = {0}; 985 unsigned int amsdu, ampdu; 986 987 res = simple_write_to_buffer(buf, sizeof(buf) - 1, ppos, 988 user_buf, count); 989 if (res <= 0) 990 return res; 991 992 res = sscanf(buf, "%u %u", &amsdu, &du); 993 994 if (res != 2) 995 return -EINVAL; 996 997 mutex_lock(&ar->conf_mutex); 998 999 res = ath10k_htt_h2t_aggr_cfg_msg(&ar->htt, ampdu, amsdu); 1000 if (res) 1001 goto out; 1002 1003 res = count; 1004 ar->htt.max_num_amsdu = amsdu; 1005 ar->htt.max_num_ampdu = ampdu; 1006 1007 out: 1008 mutex_unlock(&ar->conf_mutex); 1009 return res; 1010 } 1011 1012 static const struct file_operations fops_htt_max_amsdu_ampdu = { 1013 .read = ath10k_read_htt_max_amsdu_ampdu, 1014 .write = ath10k_write_htt_max_amsdu_ampdu, 1015 .open = simple_open, 1016 .owner = THIS_MODULE, 1017 .llseek = default_llseek, 1018 }; 1019 1020 static ssize_t ath10k_read_fw_dbglog(struct file *file, 1021 char __user *user_buf, 1022 size_t count, loff_t *ppos) 1023 { 1024 struct ath10k *ar = file->private_data; 1025 size_t len; 1026 char buf[96]; 1027 1028 len = scnprintf(buf, sizeof(buf), "0x%16llx %u\n", 1029 ar->debug.fw_dbglog_mask, ar->debug.fw_dbglog_level); 1030 1031 return simple_read_from_buffer(user_buf, count, ppos, buf, len); 1032 } 1033 1034 static ssize_t ath10k_write_fw_dbglog(struct file *file, 1035 const char __user *user_buf, 1036 size_t count, loff_t *ppos) 1037 { 1038 struct ath10k *ar = file->private_data; 1039 int ret; 1040 char buf[96] = {0}; 1041 unsigned int log_level; 1042 u64 mask; 1043 1044 ret = simple_write_to_buffer(buf, sizeof(buf) - 1, ppos, 1045 user_buf, count); 1046 if (ret <= 0) 1047 return ret; 1048 1049 ret = sscanf(buf, "%llx %u", &mask, &log_level); 1050 1051 if (!ret) 1052 return -EINVAL; 1053 1054 if (ret == 1) 1055 /* default if user did not specify */ 1056 log_level = ATH10K_DBGLOG_LEVEL_WARN; 1057 1058 mutex_lock(&ar->conf_mutex); 1059 1060 ar->debug.fw_dbglog_mask = mask; 1061 ar->debug.fw_dbglog_level = log_level; 1062 1063 if (ar->state == ATH10K_STATE_ON) { 1064 ret = ath10k_wmi_dbglog_cfg(ar, ar->debug.fw_dbglog_mask, 1065 ar->debug.fw_dbglog_level); 1066 if (ret) { 1067 ath10k_warn(ar, "dbglog cfg failed from debugfs: %d\n", 1068 ret); 1069 goto exit; 1070 } 1071 } 1072 1073 ret = count; 1074 1075 exit: 1076 mutex_unlock(&ar->conf_mutex); 1077 1078 return ret; 1079 } 1080 1081 /* TODO: Would be nice to always support ethtool stats, would need to 1082 * move the stats storage out of ath10k_debug, or always have ath10k_debug 1083 * struct available.. 1084 */ 1085 1086 /* This generally corresponds to the debugfs fw_stats file */ 1087 static const char ath10k_gstrings_stats[][ETH_GSTRING_LEN] = { 1088 "tx_pkts_nic", 1089 "tx_bytes_nic", 1090 "rx_pkts_nic", 1091 "rx_bytes_nic", 1092 "d_noise_floor", 1093 "d_cycle_count", 1094 "d_phy_error", 1095 "d_rts_bad", 1096 "d_rts_good", 1097 "d_tx_power", /* in .5 dbM I think */ 1098 "d_rx_crc_err", /* fcs_bad */ 1099 "d_rx_crc_err_drop", /* frame with FCS error, dropped late in kernel */ 1100 "d_no_beacon", 1101 "d_tx_mpdus_queued", 1102 "d_tx_msdu_queued", 1103 "d_tx_msdu_dropped", 1104 "d_local_enqued", 1105 "d_local_freed", 1106 "d_tx_ppdu_hw_queued", 1107 "d_tx_ppdu_reaped", 1108 "d_tx_fifo_underrun", 1109 "d_tx_ppdu_abort", 1110 "d_tx_mpdu_requeued", 1111 "d_tx_excessive_retries", 1112 "d_tx_hw_rate", 1113 "d_tx_dropped_sw_retries", 1114 "d_tx_illegal_rate", 1115 "d_tx_continuous_xretries", 1116 "d_tx_timeout", 1117 "d_tx_mpdu_txop_limit", 1118 "d_pdev_resets", 1119 "d_rx_mid_ppdu_route_change", 1120 "d_rx_status", 1121 "d_rx_extra_frags_ring0", 1122 "d_rx_extra_frags_ring1", 1123 "d_rx_extra_frags_ring2", 1124 "d_rx_extra_frags_ring3", 1125 "d_rx_msdu_htt", 1126 "d_rx_mpdu_htt", 1127 "d_rx_msdu_stack", 1128 "d_rx_mpdu_stack", 1129 "d_rx_phy_err", 1130 "d_rx_phy_err_drops", 1131 "d_rx_mpdu_errors", /* FCS, MIC, ENC */ 1132 "d_fw_crash_count", 1133 "d_fw_warm_reset_count", 1134 "d_fw_cold_reset_count", 1135 }; 1136 1137 #define ATH10K_SSTATS_LEN ARRAY_SIZE(ath10k_gstrings_stats) 1138 1139 void ath10k_debug_get_et_strings(struct ieee80211_hw *hw, 1140 struct ieee80211_vif *vif, 1141 u32 sset, u8 *data) 1142 { 1143 if (sset == ETH_SS_STATS) 1144 memcpy(data, ath10k_gstrings_stats, 1145 sizeof(ath10k_gstrings_stats)); 1146 } 1147 1148 int ath10k_debug_get_et_sset_count(struct ieee80211_hw *hw, 1149 struct ieee80211_vif *vif, int sset) 1150 { 1151 if (sset == ETH_SS_STATS) 1152 return ATH10K_SSTATS_LEN; 1153 1154 return 0; 1155 } 1156 1157 void ath10k_debug_get_et_stats(struct ieee80211_hw *hw, 1158 struct ieee80211_vif *vif, 1159 struct ethtool_stats *stats, u64 *data) 1160 { 1161 struct ath10k *ar = hw->priv; 1162 static const struct ath10k_fw_stats_pdev zero_stats = {}; 1163 const struct ath10k_fw_stats_pdev *pdev_stats; 1164 int i = 0, ret; 1165 1166 mutex_lock(&ar->conf_mutex); 1167 1168 if (ar->state == ATH10K_STATE_ON) { 1169 ret = ath10k_debug_fw_stats_request(ar); 1170 if (ret) { 1171 /* just print a warning and try to use older results */ 1172 ath10k_warn(ar, 1173 "failed to get fw stats for ethtool: %d\n", 1174 ret); 1175 } 1176 } 1177 1178 pdev_stats = list_first_entry_or_null(&ar->debug.fw_stats.pdevs, 1179 struct ath10k_fw_stats_pdev, 1180 list); 1181 if (!pdev_stats) { 1182 /* no results available so just return zeroes */ 1183 pdev_stats = &zero_stats; 1184 } 1185 1186 spin_lock_bh(&ar->data_lock); 1187 1188 data[i++] = pdev_stats->hw_reaped; /* ppdu reaped */ 1189 data[i++] = 0; /* tx bytes */ 1190 data[i++] = pdev_stats->htt_mpdus; 1191 data[i++] = 0; /* rx bytes */ 1192 data[i++] = pdev_stats->ch_noise_floor; 1193 data[i++] = pdev_stats->cycle_count; 1194 data[i++] = pdev_stats->phy_err_count; 1195 data[i++] = pdev_stats->rts_bad; 1196 data[i++] = pdev_stats->rts_good; 1197 data[i++] = pdev_stats->chan_tx_power; 1198 data[i++] = pdev_stats->fcs_bad; 1199 data[i++] = ar->stats.rx_crc_err_drop; 1200 data[i++] = pdev_stats->no_beacons; 1201 data[i++] = pdev_stats->mpdu_enqued; 1202 data[i++] = pdev_stats->msdu_enqued; 1203 data[i++] = pdev_stats->wmm_drop; 1204 data[i++] = pdev_stats->local_enqued; 1205 data[i++] = pdev_stats->local_freed; 1206 data[i++] = pdev_stats->hw_queued; 1207 data[i++] = pdev_stats->hw_reaped; 1208 data[i++] = pdev_stats->underrun; 1209 data[i++] = pdev_stats->tx_abort; 1210 data[i++] = pdev_stats->mpdus_requeued; 1211 data[i++] = pdev_stats->tx_ko; 1212 data[i++] = pdev_stats->data_rc; 1213 data[i++] = pdev_stats->sw_retry_failure; 1214 data[i++] = pdev_stats->illgl_rate_phy_err; 1215 data[i++] = pdev_stats->pdev_cont_xretry; 1216 data[i++] = pdev_stats->pdev_tx_timeout; 1217 data[i++] = pdev_stats->txop_ovf; 1218 data[i++] = pdev_stats->pdev_resets; 1219 data[i++] = pdev_stats->mid_ppdu_route_change; 1220 data[i++] = pdev_stats->status_rcvd; 1221 data[i++] = pdev_stats->r0_frags; 1222 data[i++] = pdev_stats->r1_frags; 1223 data[i++] = pdev_stats->r2_frags; 1224 data[i++] = pdev_stats->r3_frags; 1225 data[i++] = pdev_stats->htt_msdus; 1226 data[i++] = pdev_stats->htt_mpdus; 1227 data[i++] = pdev_stats->loc_msdus; 1228 data[i++] = pdev_stats->loc_mpdus; 1229 data[i++] = pdev_stats->phy_errs; 1230 data[i++] = pdev_stats->phy_err_drop; 1231 data[i++] = pdev_stats->mpdu_errs; 1232 data[i++] = ar->stats.fw_crash_counter; 1233 data[i++] = ar->stats.fw_warm_reset_counter; 1234 data[i++] = ar->stats.fw_cold_reset_counter; 1235 1236 spin_unlock_bh(&ar->data_lock); 1237 1238 mutex_unlock(&ar->conf_mutex); 1239 1240 WARN_ON(i != ATH10K_SSTATS_LEN); 1241 } 1242 1243 static const struct file_operations fops_fw_dbglog = { 1244 .read = ath10k_read_fw_dbglog, 1245 .write = ath10k_write_fw_dbglog, 1246 .open = simple_open, 1247 .owner = THIS_MODULE, 1248 .llseek = default_llseek, 1249 }; 1250 1251 static int ath10k_debug_cal_data_fetch(struct ath10k *ar) 1252 { 1253 u32 hi_addr; 1254 __le32 addr; 1255 int ret; 1256 1257 lockdep_assert_held(&ar->conf_mutex); 1258 1259 if (WARN_ON(ar->hw_params.cal_data_len > ATH10K_DEBUG_CAL_DATA_LEN)) 1260 return -EINVAL; 1261 1262 if (ar->hw_params.cal_data_len == 0) 1263 return -EOPNOTSUPP; 1264 1265 hi_addr = host_interest_item_address(HI_ITEM(hi_board_data)); 1266 1267 ret = ath10k_hif_diag_read(ar, hi_addr, &addr, sizeof(addr)); 1268 if (ret) { 1269 ath10k_warn(ar, "failed to read hi_board_data address: %d\n", 1270 ret); 1271 return ret; 1272 } 1273 1274 ret = ath10k_hif_diag_read(ar, le32_to_cpu(addr), ar->debug.cal_data, 1275 ar->hw_params.cal_data_len); 1276 if (ret) { 1277 ath10k_warn(ar, "failed to read calibration data: %d\n", ret); 1278 return ret; 1279 } 1280 1281 return 0; 1282 } 1283 1284 static int ath10k_debug_cal_data_open(struct inode *inode, struct file *file) 1285 { 1286 struct ath10k *ar = inode->i_private; 1287 1288 mutex_lock(&ar->conf_mutex); 1289 1290 if (ar->state == ATH10K_STATE_ON || 1291 ar->state == ATH10K_STATE_UTF) { 1292 ath10k_debug_cal_data_fetch(ar); 1293 } 1294 1295 file->private_data = ar; 1296 mutex_unlock(&ar->conf_mutex); 1297 1298 return 0; 1299 } 1300 1301 static ssize_t ath10k_debug_cal_data_read(struct file *file, 1302 char __user *user_buf, 1303 size_t count, loff_t *ppos) 1304 { 1305 struct ath10k *ar = file->private_data; 1306 1307 mutex_lock(&ar->conf_mutex); 1308 1309 count = simple_read_from_buffer(user_buf, count, ppos, 1310 ar->debug.cal_data, 1311 ar->hw_params.cal_data_len); 1312 1313 mutex_unlock(&ar->conf_mutex); 1314 1315 return count; 1316 } 1317 1318 static ssize_t ath10k_write_ani_enable(struct file *file, 1319 const char __user *user_buf, 1320 size_t count, loff_t *ppos) 1321 { 1322 struct ath10k *ar = file->private_data; 1323 int ret; 1324 u8 enable; 1325 1326 if (kstrtou8_from_user(user_buf, count, 0, &enable)) 1327 return -EINVAL; 1328 1329 mutex_lock(&ar->conf_mutex); 1330 1331 if (ar->ani_enabled == enable) { 1332 ret = count; 1333 goto exit; 1334 } 1335 1336 ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->ani_enable, 1337 enable); 1338 if (ret) { 1339 ath10k_warn(ar, "ani_enable failed from debugfs: %d\n", ret); 1340 goto exit; 1341 } 1342 ar->ani_enabled = enable; 1343 1344 ret = count; 1345 1346 exit: 1347 mutex_unlock(&ar->conf_mutex); 1348 1349 return ret; 1350 } 1351 1352 static ssize_t ath10k_read_ani_enable(struct file *file, char __user *user_buf, 1353 size_t count, loff_t *ppos) 1354 { 1355 struct ath10k *ar = file->private_data; 1356 size_t len; 1357 char buf[32]; 1358 1359 len = scnprintf(buf, sizeof(buf), "%d\n", ar->ani_enabled); 1360 1361 return simple_read_from_buffer(user_buf, count, ppos, buf, len); 1362 } 1363 1364 static const struct file_operations fops_ani_enable = { 1365 .read = ath10k_read_ani_enable, 1366 .write = ath10k_write_ani_enable, 1367 .open = simple_open, 1368 .owner = THIS_MODULE, 1369 .llseek = default_llseek, 1370 }; 1371 1372 static const struct file_operations fops_cal_data = { 1373 .open = ath10k_debug_cal_data_open, 1374 .read = ath10k_debug_cal_data_read, 1375 .owner = THIS_MODULE, 1376 .llseek = default_llseek, 1377 }; 1378 1379 static ssize_t ath10k_read_nf_cal_period(struct file *file, 1380 char __user *user_buf, 1381 size_t count, loff_t *ppos) 1382 { 1383 struct ath10k *ar = file->private_data; 1384 size_t len; 1385 char buf[32]; 1386 1387 len = scnprintf(buf, sizeof(buf), "%d\n", ar->debug.nf_cal_period); 1388 1389 return simple_read_from_buffer(user_buf, count, ppos, buf, len); 1390 } 1391 1392 static ssize_t ath10k_write_nf_cal_period(struct file *file, 1393 const char __user *user_buf, 1394 size_t count, loff_t *ppos) 1395 { 1396 struct ath10k *ar = file->private_data; 1397 unsigned long period; 1398 int ret; 1399 1400 ret = kstrtoul_from_user(user_buf, count, 0, &period); 1401 if (ret) 1402 return ret; 1403 1404 if (period > WMI_PDEV_PARAM_CAL_PERIOD_MAX) 1405 return -EINVAL; 1406 1407 /* there's no way to switch back to the firmware default */ 1408 if (period == 0) 1409 return -EINVAL; 1410 1411 mutex_lock(&ar->conf_mutex); 1412 1413 ar->debug.nf_cal_period = period; 1414 1415 if (ar->state != ATH10K_STATE_ON) { 1416 /* firmware is not running, nothing else to do */ 1417 ret = count; 1418 goto exit; 1419 } 1420 1421 ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->cal_period, 1422 ar->debug.nf_cal_period); 1423 if (ret) { 1424 ath10k_warn(ar, "cal period cfg failed from debugfs: %d\n", 1425 ret); 1426 goto exit; 1427 } 1428 1429 ret = count; 1430 1431 exit: 1432 mutex_unlock(&ar->conf_mutex); 1433 1434 return ret; 1435 } 1436 1437 static const struct file_operations fops_nf_cal_period = { 1438 .read = ath10k_read_nf_cal_period, 1439 .write = ath10k_write_nf_cal_period, 1440 .open = simple_open, 1441 .owner = THIS_MODULE, 1442 .llseek = default_llseek, 1443 }; 1444 1445 #define ATH10K_TPC_CONFIG_BUF_SIZE (1024 * 1024) 1446 1447 static int ath10k_debug_tpc_stats_request(struct ath10k *ar) 1448 { 1449 int ret; 1450 unsigned long time_left; 1451 1452 lockdep_assert_held(&ar->conf_mutex); 1453 1454 reinit_completion(&ar->debug.tpc_complete); 1455 1456 ret = ath10k_wmi_pdev_get_tpc_config(ar, WMI_TPC_CONFIG_PARAM); 1457 if (ret) { 1458 ath10k_warn(ar, "failed to request tpc config: %d\n", ret); 1459 return ret; 1460 } 1461 1462 time_left = wait_for_completion_timeout(&ar->debug.tpc_complete, 1463 1 * HZ); 1464 if (time_left == 0) 1465 return -ETIMEDOUT; 1466 1467 return 0; 1468 } 1469 1470 void ath10k_debug_tpc_stats_process(struct ath10k *ar, 1471 struct ath10k_tpc_stats *tpc_stats) 1472 { 1473 spin_lock_bh(&ar->data_lock); 1474 1475 kfree(ar->debug.tpc_stats); 1476 ar->debug.tpc_stats = tpc_stats; 1477 complete(&ar->debug.tpc_complete); 1478 1479 spin_unlock_bh(&ar->data_lock); 1480 } 1481 1482 void 1483 ath10k_debug_tpc_stats_final_process(struct ath10k *ar, 1484 struct ath10k_tpc_stats_final *tpc_stats) 1485 { 1486 spin_lock_bh(&ar->data_lock); 1487 1488 kfree(ar->debug.tpc_stats_final); 1489 ar->debug.tpc_stats_final = tpc_stats; 1490 complete(&ar->debug.tpc_complete); 1491 1492 spin_unlock_bh(&ar->data_lock); 1493 } 1494 1495 static void ath10k_tpc_stats_print(struct ath10k_tpc_stats *tpc_stats, 1496 unsigned int j, char *buf, size_t *len) 1497 { 1498 int i; 1499 size_t buf_len; 1500 static const char table_str[][5] = { "CDD", 1501 "STBC", 1502 "TXBF" }; 1503 static const char pream_str[][6] = { "CCK", 1504 "OFDM", 1505 "HT20", 1506 "HT40", 1507 "VHT20", 1508 "VHT40", 1509 "VHT80", 1510 "HTCUP" }; 1511 1512 buf_len = ATH10K_TPC_CONFIG_BUF_SIZE; 1513 *len += scnprintf(buf + *len, buf_len - *len, 1514 "********************************\n"); 1515 *len += scnprintf(buf + *len, buf_len - *len, 1516 "******************* %s POWER TABLE ****************\n", 1517 table_str[j]); 1518 *len += scnprintf(buf + *len, buf_len - *len, 1519 "********************************\n"); 1520 *len += scnprintf(buf + *len, buf_len - *len, 1521 "No. Preamble Rate_code "); 1522 1523 for (i = 0; i < tpc_stats->num_tx_chain; i++) 1524 *len += scnprintf(buf + *len, buf_len - *len, 1525 "tpc_value%d ", i); 1526 1527 *len += scnprintf(buf + *len, buf_len - *len, "\n"); 1528 1529 for (i = 0; i < tpc_stats->rate_max; i++) { 1530 *len += scnprintf(buf + *len, buf_len - *len, 1531 "%8d %s 0x%2x %s\n", i, 1532 pream_str[tpc_stats->tpc_table[j].pream_idx[i]], 1533 tpc_stats->tpc_table[j].rate_code[i], 1534 tpc_stats->tpc_table[j].tpc_value[i]); 1535 } 1536 1537 *len += scnprintf(buf + *len, buf_len - *len, 1538 "***********************************\n"); 1539 } 1540 1541 static void ath10k_tpc_stats_fill(struct ath10k *ar, 1542 struct ath10k_tpc_stats *tpc_stats, 1543 char *buf) 1544 { 1545 int j; 1546 size_t len, buf_len; 1547 1548 len = 0; 1549 buf_len = ATH10K_TPC_CONFIG_BUF_SIZE; 1550 1551 spin_lock_bh(&ar->data_lock); 1552 1553 if (!tpc_stats) { 1554 ath10k_warn(ar, "failed to get tpc stats\n"); 1555 goto unlock; 1556 } 1557 1558 len += scnprintf(buf + len, buf_len - len, "\n"); 1559 len += scnprintf(buf + len, buf_len - len, 1560 "*************************************\n"); 1561 len += scnprintf(buf + len, buf_len - len, 1562 "TPC config for channel %4d mode %d\n", 1563 tpc_stats->chan_freq, 1564 tpc_stats->phy_mode); 1565 len += scnprintf(buf + len, buf_len - len, 1566 "*************************************\n"); 1567 len += scnprintf(buf + len, buf_len - len, 1568 "CTL = 0x%2x Reg. Domain = %2d\n", 1569 tpc_stats->ctl, 1570 tpc_stats->reg_domain); 1571 len += scnprintf(buf + len, buf_len - len, 1572 "Antenna Gain = %2d Reg. Max Antenna Gain = %2d\n", 1573 tpc_stats->twice_antenna_gain, 1574 tpc_stats->twice_antenna_reduction); 1575 len += scnprintf(buf + len, buf_len - len, 1576 "Power Limit = %2d Reg. Max Power = %2d\n", 1577 tpc_stats->power_limit, 1578 tpc_stats->twice_max_rd_power / 2); 1579 len += scnprintf(buf + len, buf_len - len, 1580 "Num tx chains = %2d Num supported rates = %2d\n", 1581 tpc_stats->num_tx_chain, 1582 tpc_stats->rate_max); 1583 1584 for (j = 0; j < WMI_TPC_FLAG; j++) { 1585 switch (j) { 1586 case WMI_TPC_TABLE_TYPE_CDD: 1587 if (tpc_stats->flag[j] == ATH10K_TPC_TABLE_TYPE_FLAG) { 1588 len += scnprintf(buf + len, buf_len - len, 1589 "CDD not supported\n"); 1590 break; 1591 } 1592 1593 ath10k_tpc_stats_print(tpc_stats, j, buf, &len); 1594 break; 1595 case WMI_TPC_TABLE_TYPE_STBC: 1596 if (tpc_stats->flag[j] == ATH10K_TPC_TABLE_TYPE_FLAG) { 1597 len += scnprintf(buf + len, buf_len - len, 1598 "STBC not supported\n"); 1599 break; 1600 } 1601 1602 ath10k_tpc_stats_print(tpc_stats, j, buf, &len); 1603 break; 1604 case WMI_TPC_TABLE_TYPE_TXBF: 1605 if (tpc_stats->flag[j] == ATH10K_TPC_TABLE_TYPE_FLAG) { 1606 len += scnprintf(buf + len, buf_len - len, 1607 "TXBF not supported\n***************************\n"); 1608 break; 1609 } 1610 1611 ath10k_tpc_stats_print(tpc_stats, j, buf, &len); 1612 break; 1613 default: 1614 len += scnprintf(buf + len, buf_len - len, 1615 "Invalid Type\n"); 1616 break; 1617 } 1618 } 1619 1620 unlock: 1621 spin_unlock_bh(&ar->data_lock); 1622 1623 if (len >= buf_len) 1624 buf[len - 1] = 0; 1625 else 1626 buf[len] = 0; 1627 } 1628 1629 static int ath10k_tpc_stats_open(struct inode *inode, struct file *file) 1630 { 1631 struct ath10k *ar = inode->i_private; 1632 void *buf = NULL; 1633 int ret; 1634 1635 mutex_lock(&ar->conf_mutex); 1636 1637 if (ar->state != ATH10K_STATE_ON) { 1638 ret = -ENETDOWN; 1639 goto err_unlock; 1640 } 1641 1642 buf = vmalloc(ATH10K_TPC_CONFIG_BUF_SIZE); 1643 if (!buf) { 1644 ret = -ENOMEM; 1645 goto err_unlock; 1646 } 1647 1648 ret = ath10k_debug_tpc_stats_request(ar); 1649 if (ret) { 1650 ath10k_warn(ar, "failed to request tpc config stats: %d\n", 1651 ret); 1652 goto err_free; 1653 } 1654 1655 ath10k_tpc_stats_fill(ar, ar->debug.tpc_stats, buf); 1656 file->private_data = buf; 1657 1658 mutex_unlock(&ar->conf_mutex); 1659 return 0; 1660 1661 err_free: 1662 vfree(buf); 1663 1664 err_unlock: 1665 mutex_unlock(&ar->conf_mutex); 1666 return ret; 1667 } 1668 1669 static int ath10k_tpc_stats_release(struct inode *inode, struct file *file) 1670 { 1671 vfree(file->private_data); 1672 1673 return 0; 1674 } 1675 1676 static ssize_t ath10k_tpc_stats_read(struct file *file, char __user *user_buf, 1677 size_t count, loff_t *ppos) 1678 { 1679 const char *buf = file->private_data; 1680 size_t len = strlen(buf); 1681 1682 return simple_read_from_buffer(user_buf, count, ppos, buf, len); 1683 } 1684 1685 static const struct file_operations fops_tpc_stats = { 1686 .open = ath10k_tpc_stats_open, 1687 .release = ath10k_tpc_stats_release, 1688 .read = ath10k_tpc_stats_read, 1689 .owner = THIS_MODULE, 1690 .llseek = default_llseek, 1691 }; 1692 1693 int ath10k_debug_start(struct ath10k *ar) 1694 { 1695 int ret; 1696 1697 lockdep_assert_held(&ar->conf_mutex); 1698 1699 ret = ath10k_debug_htt_stats_req(ar); 1700 if (ret) 1701 /* continue normally anyway, this isn't serious */ 1702 ath10k_warn(ar, "failed to start htt stats workqueue: %d\n", 1703 ret); 1704 1705 if (ar->debug.fw_dbglog_mask) { 1706 ret = ath10k_wmi_dbglog_cfg(ar, ar->debug.fw_dbglog_mask, 1707 ATH10K_DBGLOG_LEVEL_WARN); 1708 if (ret) 1709 /* not serious */ 1710 ath10k_warn(ar, "failed to enable dbglog during start: %d", 1711 ret); 1712 } 1713 1714 if (ar->pktlog_filter) { 1715 ret = ath10k_wmi_pdev_pktlog_enable(ar, 1716 ar->pktlog_filter); 1717 if (ret) 1718 /* not serious */ 1719 ath10k_warn(ar, 1720 "failed to enable pktlog filter %x: %d\n", 1721 ar->pktlog_filter, ret); 1722 } else { 1723 ret = ath10k_wmi_pdev_pktlog_disable(ar); 1724 if (ret) 1725 /* not serious */ 1726 ath10k_warn(ar, "failed to disable pktlog: %d\n", ret); 1727 } 1728 1729 if (ar->debug.nf_cal_period && 1730 !test_bit(ATH10K_FW_FEATURE_NON_BMI, 1731 ar->normal_mode_fw.fw_file.fw_features)) { 1732 ret = ath10k_wmi_pdev_set_param(ar, 1733 ar->wmi.pdev_param->cal_period, 1734 ar->debug.nf_cal_period); 1735 if (ret) 1736 /* not serious */ 1737 ath10k_warn(ar, "cal period cfg failed from debug start: %d\n", 1738 ret); 1739 } 1740 1741 return ret; 1742 } 1743 1744 void ath10k_debug_stop(struct ath10k *ar) 1745 { 1746 lockdep_assert_held(&ar->conf_mutex); 1747 1748 if (!test_bit(ATH10K_FW_FEATURE_NON_BMI, 1749 ar->normal_mode_fw.fw_file.fw_features)) 1750 ath10k_debug_cal_data_fetch(ar); 1751 1752 /* Must not use _sync to avoid deadlock, we do that in 1753 * ath10k_debug_destroy(). The check for htt_stats_mask is to avoid 1754 * warning from del_timer(). 1755 */ 1756 if (ar->debug.htt_stats_mask != 0) 1757 cancel_delayed_work(&ar->debug.htt_stats_dwork); 1758 1759 ath10k_wmi_pdev_pktlog_disable(ar); 1760 } 1761 1762 static ssize_t ath10k_write_simulate_radar(struct file *file, 1763 const char __user *user_buf, 1764 size_t count, loff_t *ppos) 1765 { 1766 struct ath10k *ar = file->private_data; 1767 struct ath10k_vif *arvif; 1768 1769 /* Just check for the first vif alone, as all the vifs will be 1770 * sharing the same channel and if the channel is disabled, all the 1771 * vifs will share the same 'is_started' state. 1772 */ 1773 arvif = list_first_entry(&ar->arvifs, typeof(*arvif), list); 1774 if (!arvif->is_started) 1775 return -EINVAL; 1776 1777 ieee80211_radar_detected(ar->hw, NULL); 1778 1779 return count; 1780 } 1781 1782 static const struct file_operations fops_simulate_radar = { 1783 .write = ath10k_write_simulate_radar, 1784 .open = simple_open, 1785 .owner = THIS_MODULE, 1786 .llseek = default_llseek, 1787 }; 1788 1789 #define ATH10K_DFS_STAT(s, p) (\ 1790 len += scnprintf(buf + len, size - len, "%-28s : %10u\n", s, \ 1791 ar->debug.dfs_stats.p)) 1792 1793 #define ATH10K_DFS_POOL_STAT(s, p) (\ 1794 len += scnprintf(buf + len, size - len, "%-28s : %10u\n", s, \ 1795 ar->debug.dfs_pool_stats.p)) 1796 1797 static ssize_t ath10k_read_dfs_stats(struct file *file, char __user *user_buf, 1798 size_t count, loff_t *ppos) 1799 { 1800 int retval = 0, len = 0; 1801 const int size = 8000; 1802 struct ath10k *ar = file->private_data; 1803 char *buf; 1804 1805 buf = kzalloc(size, GFP_KERNEL); 1806 if (buf == NULL) 1807 return -ENOMEM; 1808 1809 if (!ar->dfs_detector) { 1810 len += scnprintf(buf + len, size - len, "DFS not enabled\n"); 1811 goto exit; 1812 } 1813 1814 ar->debug.dfs_pool_stats = 1815 ar->dfs_detector->get_stats(ar->dfs_detector); 1816 1817 len += scnprintf(buf + len, size - len, "Pulse detector statistics:\n"); 1818 1819 ATH10K_DFS_STAT("reported phy errors", phy_errors); 1820 ATH10K_DFS_STAT("pulse events reported", pulses_total); 1821 ATH10K_DFS_STAT("DFS pulses detected", pulses_detected); 1822 ATH10K_DFS_STAT("DFS pulses discarded", pulses_discarded); 1823 ATH10K_DFS_STAT("Radars detected", radar_detected); 1824 1825 len += scnprintf(buf + len, size - len, "Global Pool statistics:\n"); 1826 ATH10K_DFS_POOL_STAT("Pool references", pool_reference); 1827 ATH10K_DFS_POOL_STAT("Pulses allocated", pulse_allocated); 1828 ATH10K_DFS_POOL_STAT("Pulses alloc error", pulse_alloc_error); 1829 ATH10K_DFS_POOL_STAT("Pulses in use", pulse_used); 1830 ATH10K_DFS_POOL_STAT("Seqs. allocated", pseq_allocated); 1831 ATH10K_DFS_POOL_STAT("Seqs. alloc error", pseq_alloc_error); 1832 ATH10K_DFS_POOL_STAT("Seqs. in use", pseq_used); 1833 1834 exit: 1835 if (len > size) 1836 len = size; 1837 1838 retval = simple_read_from_buffer(user_buf, count, ppos, buf, len); 1839 kfree(buf); 1840 1841 return retval; 1842 } 1843 1844 static const struct file_operations fops_dfs_stats = { 1845 .read = ath10k_read_dfs_stats, 1846 .open = simple_open, 1847 .owner = THIS_MODULE, 1848 .llseek = default_llseek, 1849 }; 1850 1851 static ssize_t ath10k_write_pktlog_filter(struct file *file, 1852 const char __user *ubuf, 1853 size_t count, loff_t *ppos) 1854 { 1855 struct ath10k *ar = file->private_data; 1856 u32 filter; 1857 int ret; 1858 1859 if (kstrtouint_from_user(ubuf, count, 0, &filter)) 1860 return -EINVAL; 1861 1862 mutex_lock(&ar->conf_mutex); 1863 1864 if (ar->state != ATH10K_STATE_ON) { 1865 ar->pktlog_filter = filter; 1866 ret = count; 1867 goto out; 1868 } 1869 1870 if (filter == ar->pktlog_filter) { 1871 ret = count; 1872 goto out; 1873 } 1874 1875 if (filter) { 1876 ret = ath10k_wmi_pdev_pktlog_enable(ar, filter); 1877 if (ret) { 1878 ath10k_warn(ar, "failed to enable pktlog filter %x: %d\n", 1879 ar->pktlog_filter, ret); 1880 goto out; 1881 } 1882 } else { 1883 ret = ath10k_wmi_pdev_pktlog_disable(ar); 1884 if (ret) { 1885 ath10k_warn(ar, "failed to disable pktlog: %d\n", ret); 1886 goto out; 1887 } 1888 } 1889 1890 ar->pktlog_filter = filter; 1891 ret = count; 1892 1893 out: 1894 mutex_unlock(&ar->conf_mutex); 1895 return ret; 1896 } 1897 1898 static ssize_t ath10k_read_pktlog_filter(struct file *file, char __user *ubuf, 1899 size_t count, loff_t *ppos) 1900 { 1901 char buf[32]; 1902 struct ath10k *ar = file->private_data; 1903 int len = 0; 1904 1905 mutex_lock(&ar->conf_mutex); 1906 len = scnprintf(buf, sizeof(buf) - len, "%08x\n", 1907 ar->pktlog_filter); 1908 mutex_unlock(&ar->conf_mutex); 1909 1910 return simple_read_from_buffer(ubuf, count, ppos, buf, len); 1911 } 1912 1913 static const struct file_operations fops_pktlog_filter = { 1914 .read = ath10k_read_pktlog_filter, 1915 .write = ath10k_write_pktlog_filter, 1916 .open = simple_open 1917 }; 1918 1919 static ssize_t ath10k_write_quiet_period(struct file *file, 1920 const char __user *ubuf, 1921 size_t count, loff_t *ppos) 1922 { 1923 struct ath10k *ar = file->private_data; 1924 u32 period; 1925 1926 if (kstrtouint_from_user(ubuf, count, 0, &period)) 1927 return -EINVAL; 1928 1929 if (period < ATH10K_QUIET_PERIOD_MIN) { 1930 ath10k_warn(ar, "Quiet period %u can not be lesser than 25ms\n", 1931 period); 1932 return -EINVAL; 1933 } 1934 mutex_lock(&ar->conf_mutex); 1935 ar->thermal.quiet_period = period; 1936 ath10k_thermal_set_throttling(ar); 1937 mutex_unlock(&ar->conf_mutex); 1938 1939 return count; 1940 } 1941 1942 static ssize_t ath10k_read_quiet_period(struct file *file, char __user *ubuf, 1943 size_t count, loff_t *ppos) 1944 { 1945 char buf[32]; 1946 struct ath10k *ar = file->private_data; 1947 int len = 0; 1948 1949 mutex_lock(&ar->conf_mutex); 1950 len = scnprintf(buf, sizeof(buf) - len, "%d\n", 1951 ar->thermal.quiet_period); 1952 mutex_unlock(&ar->conf_mutex); 1953 1954 return simple_read_from_buffer(ubuf, count, ppos, buf, len); 1955 } 1956 1957 static const struct file_operations fops_quiet_period = { 1958 .read = ath10k_read_quiet_period, 1959 .write = ath10k_write_quiet_period, 1960 .open = simple_open 1961 }; 1962 1963 static ssize_t ath10k_write_btcoex(struct file *file, 1964 const char __user *ubuf, 1965 size_t count, loff_t *ppos) 1966 { 1967 struct ath10k *ar = file->private_data; 1968 ssize_t ret; 1969 bool val; 1970 u32 pdev_param; 1971 1972 ret = kstrtobool_from_user(ubuf, count, &val); 1973 if (ret) 1974 return ret; 1975 1976 if (!ar->coex_support) 1977 return -EOPNOTSUPP; 1978 1979 mutex_lock(&ar->conf_mutex); 1980 1981 if (ar->state != ATH10K_STATE_ON && 1982 ar->state != ATH10K_STATE_RESTARTED) { 1983 ret = -ENETDOWN; 1984 goto exit; 1985 } 1986 1987 if (!(test_bit(ATH10K_FLAG_BTCOEX, &ar->dev_flags) ^ val)) { 1988 ret = count; 1989 goto exit; 1990 } 1991 1992 pdev_param = ar->wmi.pdev_param->enable_btcoex; 1993 if (test_bit(ATH10K_FW_FEATURE_BTCOEX_PARAM, 1994 ar->running_fw->fw_file.fw_features)) { 1995 ret = ath10k_wmi_pdev_set_param(ar, pdev_param, val); 1996 if (ret) { 1997 ath10k_warn(ar, "failed to enable btcoex: %zd\n", ret); 1998 ret = count; 1999 goto exit; 2000 } 2001 } else { 2002 ath10k_info(ar, "restarting firmware due to btcoex change"); 2003 ath10k_core_start_recovery(ar); 2004 } 2005 2006 if (val) 2007 set_bit(ATH10K_FLAG_BTCOEX, &ar->dev_flags); 2008 else 2009 clear_bit(ATH10K_FLAG_BTCOEX, &ar->dev_flags); 2010 2011 ret = count; 2012 2013 exit: 2014 mutex_unlock(&ar->conf_mutex); 2015 2016 return ret; 2017 } 2018 2019 static ssize_t ath10k_read_btcoex(struct file *file, char __user *ubuf, 2020 size_t count, loff_t *ppos) 2021 { 2022 char buf[32]; 2023 struct ath10k *ar = file->private_data; 2024 int len = 0; 2025 2026 mutex_lock(&ar->conf_mutex); 2027 len = scnprintf(buf, sizeof(buf) - len, "%d\n", 2028 test_bit(ATH10K_FLAG_BTCOEX, &ar->dev_flags)); 2029 mutex_unlock(&ar->conf_mutex); 2030 2031 return simple_read_from_buffer(ubuf, count, ppos, buf, len); 2032 } 2033 2034 static const struct file_operations fops_btcoex = { 2035 .read = ath10k_read_btcoex, 2036 .write = ath10k_write_btcoex, 2037 .open = simple_open 2038 }; 2039 2040 static ssize_t ath10k_write_enable_extd_tx_stats(struct file *file, 2041 const char __user *ubuf, 2042 size_t count, loff_t *ppos) 2043 { 2044 struct ath10k *ar = file->private_data; 2045 u32 filter; 2046 int ret; 2047 2048 if (kstrtouint_from_user(ubuf, count, 0, &filter)) 2049 return -EINVAL; 2050 2051 mutex_lock(&ar->conf_mutex); 2052 2053 if (ar->state != ATH10K_STATE_ON) { 2054 ar->debug.enable_extd_tx_stats = filter; 2055 ret = count; 2056 goto out; 2057 } 2058 2059 if (filter == ar->debug.enable_extd_tx_stats) { 2060 ret = count; 2061 goto out; 2062 } 2063 2064 ar->debug.enable_extd_tx_stats = filter; 2065 ret = count; 2066 2067 out: 2068 mutex_unlock(&ar->conf_mutex); 2069 return ret; 2070 } 2071 2072 static ssize_t ath10k_read_enable_extd_tx_stats(struct file *file, 2073 char __user *ubuf, 2074 size_t count, loff_t *ppos) 2075 2076 { 2077 char buf[32]; 2078 struct ath10k *ar = file->private_data; 2079 int len = 0; 2080 2081 mutex_lock(&ar->conf_mutex); 2082 len = scnprintf(buf, sizeof(buf) - len, "%08x\n", 2083 ar->debug.enable_extd_tx_stats); 2084 mutex_unlock(&ar->conf_mutex); 2085 2086 return simple_read_from_buffer(ubuf, count, ppos, buf, len); 2087 } 2088 2089 static const struct file_operations fops_enable_extd_tx_stats = { 2090 .read = ath10k_read_enable_extd_tx_stats, 2091 .write = ath10k_write_enable_extd_tx_stats, 2092 .open = simple_open 2093 }; 2094 2095 static ssize_t ath10k_write_peer_stats(struct file *file, 2096 const char __user *ubuf, 2097 size_t count, loff_t *ppos) 2098 { 2099 struct ath10k *ar = file->private_data; 2100 ssize_t ret; 2101 bool val; 2102 2103 ret = kstrtobool_from_user(ubuf, count, &val); 2104 if (ret) 2105 return ret; 2106 2107 mutex_lock(&ar->conf_mutex); 2108 2109 if (ar->state != ATH10K_STATE_ON && 2110 ar->state != ATH10K_STATE_RESTARTED) { 2111 ret = -ENETDOWN; 2112 goto exit; 2113 } 2114 2115 if (!(test_bit(ATH10K_FLAG_PEER_STATS, &ar->dev_flags) ^ val)) { 2116 ret = count; 2117 goto exit; 2118 } 2119 2120 if (val) 2121 set_bit(ATH10K_FLAG_PEER_STATS, &ar->dev_flags); 2122 else 2123 clear_bit(ATH10K_FLAG_PEER_STATS, &ar->dev_flags); 2124 2125 ath10k_info(ar, "restarting firmware due to Peer stats change"); 2126 2127 ath10k_core_start_recovery(ar); 2128 ret = count; 2129 2130 exit: 2131 mutex_unlock(&ar->conf_mutex); 2132 return ret; 2133 } 2134 2135 static ssize_t ath10k_read_peer_stats(struct file *file, char __user *ubuf, 2136 size_t count, loff_t *ppos) 2137 2138 { 2139 char buf[32]; 2140 struct ath10k *ar = file->private_data; 2141 int len = 0; 2142 2143 mutex_lock(&ar->conf_mutex); 2144 len = scnprintf(buf, sizeof(buf) - len, "%d\n", 2145 test_bit(ATH10K_FLAG_PEER_STATS, &ar->dev_flags)); 2146 mutex_unlock(&ar->conf_mutex); 2147 2148 return simple_read_from_buffer(ubuf, count, ppos, buf, len); 2149 } 2150 2151 static const struct file_operations fops_peer_stats = { 2152 .read = ath10k_read_peer_stats, 2153 .write = ath10k_write_peer_stats, 2154 .open = simple_open 2155 }; 2156 2157 static ssize_t ath10k_debug_fw_checksums_read(struct file *file, 2158 char __user *user_buf, 2159 size_t count, loff_t *ppos) 2160 { 2161 struct ath10k *ar = file->private_data; 2162 size_t len = 0, buf_len = 4096; 2163 ssize_t ret_cnt; 2164 char *buf; 2165 2166 buf = kzalloc(buf_len, GFP_KERNEL); 2167 if (!buf) 2168 return -ENOMEM; 2169 2170 mutex_lock(&ar->conf_mutex); 2171 2172 len += scnprintf(buf + len, buf_len - len, 2173 "firmware-N.bin\t\t%08x\n", 2174 crc32_le(0, ar->normal_mode_fw.fw_file.firmware->data, 2175 ar->normal_mode_fw.fw_file.firmware->size)); 2176 len += scnprintf(buf + len, buf_len - len, 2177 "athwlan\t\t\t%08x\n", 2178 crc32_le(0, ar->normal_mode_fw.fw_file.firmware_data, 2179 ar->normal_mode_fw.fw_file.firmware_len)); 2180 len += scnprintf(buf + len, buf_len - len, 2181 "otp\t\t\t%08x\n", 2182 crc32_le(0, ar->normal_mode_fw.fw_file.otp_data, 2183 ar->normal_mode_fw.fw_file.otp_len)); 2184 len += scnprintf(buf + len, buf_len - len, 2185 "codeswap\t\t%08x\n", 2186 crc32_le(0, ar->normal_mode_fw.fw_file.codeswap_data, 2187 ar->normal_mode_fw.fw_file.codeswap_len)); 2188 len += scnprintf(buf + len, buf_len - len, 2189 "board-N.bin\t\t%08x\n", 2190 crc32_le(0, ar->normal_mode_fw.board->data, 2191 ar->normal_mode_fw.board->size)); 2192 len += scnprintf(buf + len, buf_len - len, 2193 "board\t\t\t%08x\n", 2194 crc32_le(0, ar->normal_mode_fw.board_data, 2195 ar->normal_mode_fw.board_len)); 2196 2197 ret_cnt = simple_read_from_buffer(user_buf, count, ppos, buf, len); 2198 2199 mutex_unlock(&ar->conf_mutex); 2200 2201 kfree(buf); 2202 return ret_cnt; 2203 } 2204 2205 static const struct file_operations fops_fw_checksums = { 2206 .read = ath10k_debug_fw_checksums_read, 2207 .open = simple_open, 2208 .owner = THIS_MODULE, 2209 .llseek = default_llseek, 2210 }; 2211 2212 static ssize_t ath10k_sta_tid_stats_mask_read(struct file *file, 2213 char __user *user_buf, 2214 size_t count, loff_t *ppos) 2215 { 2216 struct ath10k *ar = file->private_data; 2217 char buf[32]; 2218 size_t len; 2219 2220 len = scnprintf(buf, sizeof(buf), "0x%08x\n", ar->sta_tid_stats_mask); 2221 return simple_read_from_buffer(user_buf, count, ppos, buf, len); 2222 } 2223 2224 static ssize_t ath10k_sta_tid_stats_mask_write(struct file *file, 2225 const char __user *user_buf, 2226 size_t count, loff_t *ppos) 2227 { 2228 struct ath10k *ar = file->private_data; 2229 ssize_t ret; 2230 u32 mask; 2231 2232 ret = kstrtoint_from_user(user_buf, count, 0, &mask); 2233 if (ret) 2234 return ret; 2235 2236 ar->sta_tid_stats_mask = mask; 2237 2238 return count; 2239 } 2240 2241 static const struct file_operations fops_sta_tid_stats_mask = { 2242 .read = ath10k_sta_tid_stats_mask_read, 2243 .write = ath10k_sta_tid_stats_mask_write, 2244 .open = simple_open, 2245 .owner = THIS_MODULE, 2246 .llseek = default_llseek, 2247 }; 2248 2249 static int ath10k_debug_tpc_stats_final_request(struct ath10k *ar) 2250 { 2251 int ret; 2252 unsigned long time_left; 2253 2254 lockdep_assert_held(&ar->conf_mutex); 2255 2256 reinit_completion(&ar->debug.tpc_complete); 2257 2258 ret = ath10k_wmi_pdev_get_tpc_table_cmdid(ar, WMI_TPC_CONFIG_PARAM); 2259 if (ret) { 2260 ath10k_warn(ar, "failed to request tpc table cmdid: %d\n", ret); 2261 return ret; 2262 } 2263 2264 time_left = wait_for_completion_timeout(&ar->debug.tpc_complete, 2265 1 * HZ); 2266 if (time_left == 0) 2267 return -ETIMEDOUT; 2268 2269 return 0; 2270 } 2271 2272 static int ath10k_tpc_stats_final_open(struct inode *inode, struct file *file) 2273 { 2274 struct ath10k *ar = inode->i_private; 2275 void *buf; 2276 int ret; 2277 2278 mutex_lock(&ar->conf_mutex); 2279 2280 if (ar->state != ATH10K_STATE_ON) { 2281 ret = -ENETDOWN; 2282 goto err_unlock; 2283 } 2284 2285 buf = vmalloc(ATH10K_TPC_CONFIG_BUF_SIZE); 2286 if (!buf) { 2287 ret = -ENOMEM; 2288 goto err_unlock; 2289 } 2290 2291 ret = ath10k_debug_tpc_stats_final_request(ar); 2292 if (ret) { 2293 ath10k_warn(ar, "failed to request tpc stats final: %d\n", 2294 ret); 2295 goto err_free; 2296 } 2297 2298 ath10k_tpc_stats_fill(ar, ar->debug.tpc_stats, buf); 2299 file->private_data = buf; 2300 2301 mutex_unlock(&ar->conf_mutex); 2302 return 0; 2303 2304 err_free: 2305 vfree(buf); 2306 2307 err_unlock: 2308 mutex_unlock(&ar->conf_mutex); 2309 return ret; 2310 } 2311 2312 static int ath10k_tpc_stats_final_release(struct inode *inode, 2313 struct file *file) 2314 { 2315 vfree(file->private_data); 2316 2317 return 0; 2318 } 2319 2320 static ssize_t ath10k_tpc_stats_final_read(struct file *file, 2321 char __user *user_buf, 2322 size_t count, loff_t *ppos) 2323 { 2324 const char *buf = file->private_data; 2325 unsigned int len = strlen(buf); 2326 2327 return simple_read_from_buffer(user_buf, count, ppos, buf, len); 2328 } 2329 2330 static const struct file_operations fops_tpc_stats_final = { 2331 .open = ath10k_tpc_stats_final_open, 2332 .release = ath10k_tpc_stats_final_release, 2333 .read = ath10k_tpc_stats_final_read, 2334 .owner = THIS_MODULE, 2335 .llseek = default_llseek, 2336 }; 2337 2338 static ssize_t ath10k_write_warm_hw_reset(struct file *file, 2339 const char __user *user_buf, 2340 size_t count, loff_t *ppos) 2341 { 2342 struct ath10k *ar = file->private_data; 2343 int ret; 2344 bool val; 2345 2346 if (kstrtobool_from_user(user_buf, count, &val)) 2347 return -EFAULT; 2348 2349 if (!val) 2350 return -EINVAL; 2351 2352 mutex_lock(&ar->conf_mutex); 2353 2354 if (ar->state != ATH10K_STATE_ON) { 2355 ret = -ENETDOWN; 2356 goto exit; 2357 } 2358 2359 ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->pdev_reset, 2360 WMI_RST_MODE_WARM_RESET); 2361 2362 if (ret) { 2363 ath10k_warn(ar, "failed to enable warm hw reset: %d\n", ret); 2364 goto exit; 2365 } 2366 2367 ret = count; 2368 2369 exit: 2370 mutex_unlock(&ar->conf_mutex); 2371 return ret; 2372 } 2373 2374 static const struct file_operations fops_warm_hw_reset = { 2375 .write = ath10k_write_warm_hw_reset, 2376 .open = simple_open, 2377 .owner = THIS_MODULE, 2378 .llseek = default_llseek, 2379 }; 2380 2381 static void ath10k_peer_ps_state_disable(void *data, 2382 struct ieee80211_sta *sta) 2383 { 2384 struct ath10k *ar = data; 2385 struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv; 2386 2387 spin_lock_bh(&ar->data_lock); 2388 arsta->peer_ps_state = WMI_PEER_PS_STATE_DISABLED; 2389 spin_unlock_bh(&ar->data_lock); 2390 } 2391 2392 static ssize_t ath10k_write_ps_state_enable(struct file *file, 2393 const char __user *user_buf, 2394 size_t count, loff_t *ppos) 2395 { 2396 struct ath10k *ar = file->private_data; 2397 int ret; 2398 u32 param; 2399 u8 ps_state_enable; 2400 2401 if (kstrtou8_from_user(user_buf, count, 0, &ps_state_enable)) 2402 return -EINVAL; 2403 2404 if (ps_state_enable > 1) 2405 return -EINVAL; 2406 2407 mutex_lock(&ar->conf_mutex); 2408 2409 if (ar->ps_state_enable == ps_state_enable) { 2410 ret = count; 2411 goto exit; 2412 } 2413 2414 param = ar->wmi.pdev_param->peer_sta_ps_statechg_enable; 2415 ret = ath10k_wmi_pdev_set_param(ar, param, ps_state_enable); 2416 if (ret) { 2417 ath10k_warn(ar, "failed to enable ps_state_enable: %d\n", 2418 ret); 2419 goto exit; 2420 } 2421 ar->ps_state_enable = ps_state_enable; 2422 2423 if (!ar->ps_state_enable) 2424 ieee80211_iterate_stations_atomic(ar->hw, 2425 ath10k_peer_ps_state_disable, 2426 ar); 2427 2428 ret = count; 2429 2430 exit: 2431 mutex_unlock(&ar->conf_mutex); 2432 2433 return ret; 2434 } 2435 2436 static ssize_t ath10k_read_ps_state_enable(struct file *file, 2437 char __user *user_buf, 2438 size_t count, loff_t *ppos) 2439 { 2440 struct ath10k *ar = file->private_data; 2441 int len = 0; 2442 char buf[32]; 2443 2444 mutex_lock(&ar->conf_mutex); 2445 len = scnprintf(buf, sizeof(buf) - len, "%d\n", 2446 ar->ps_state_enable); 2447 mutex_unlock(&ar->conf_mutex); 2448 2449 return simple_read_from_buffer(user_buf, count, ppos, buf, len); 2450 } 2451 2452 static const struct file_operations fops_ps_state_enable = { 2453 .read = ath10k_read_ps_state_enable, 2454 .write = ath10k_write_ps_state_enable, 2455 .open = simple_open, 2456 .owner = THIS_MODULE, 2457 .llseek = default_llseek, 2458 }; 2459 2460 static ssize_t ath10k_write_reset_htt_stats(struct file *file, 2461 const char __user *user_buf, 2462 size_t count, loff_t *ppos) 2463 { 2464 struct ath10k *ar = file->private_data; 2465 unsigned long reset; 2466 int ret; 2467 2468 ret = kstrtoul_from_user(user_buf, count, 0, &reset); 2469 if (ret) 2470 return ret; 2471 2472 if (reset == 0 || reset > 0x1ffff) 2473 return -EINVAL; 2474 2475 mutex_lock(&ar->conf_mutex); 2476 2477 ar->debug.reset_htt_stats = reset; 2478 2479 ret = ath10k_debug_htt_stats_req(ar); 2480 if (ret) 2481 goto out; 2482 2483 ar->debug.reset_htt_stats = 0; 2484 ret = count; 2485 2486 out: 2487 mutex_unlock(&ar->conf_mutex); 2488 return ret; 2489 } 2490 2491 static const struct file_operations fops_reset_htt_stats = { 2492 .write = ath10k_write_reset_htt_stats, 2493 .owner = THIS_MODULE, 2494 .open = simple_open, 2495 .llseek = default_llseek, 2496 }; 2497 2498 int ath10k_debug_create(struct ath10k *ar) 2499 { 2500 ar->debug.cal_data = vzalloc(ATH10K_DEBUG_CAL_DATA_LEN); 2501 if (!ar->debug.cal_data) 2502 return -ENOMEM; 2503 2504 INIT_LIST_HEAD(&ar->debug.fw_stats.pdevs); 2505 INIT_LIST_HEAD(&ar->debug.fw_stats.vdevs); 2506 INIT_LIST_HEAD(&ar->debug.fw_stats.peers); 2507 INIT_LIST_HEAD(&ar->debug.fw_stats.peers_extd); 2508 2509 return 0; 2510 } 2511 2512 void ath10k_debug_destroy(struct ath10k *ar) 2513 { 2514 vfree(ar->debug.cal_data); 2515 ar->debug.cal_data = NULL; 2516 2517 ath10k_debug_fw_stats_reset(ar); 2518 2519 kfree(ar->debug.tpc_stats); 2520 kfree(ar->debug.tpc_stats_final); 2521 } 2522 2523 int ath10k_debug_register(struct ath10k *ar) 2524 { 2525 ar->debug.debugfs_phy = debugfs_create_dir("ath10k", 2526 ar->hw->wiphy->debugfsdir); 2527 if (IS_ERR_OR_NULL(ar->debug.debugfs_phy)) { 2528 if (IS_ERR(ar->debug.debugfs_phy)) 2529 return PTR_ERR(ar->debug.debugfs_phy); 2530 2531 return -ENOMEM; 2532 } 2533 2534 INIT_DELAYED_WORK(&ar->debug.htt_stats_dwork, 2535 ath10k_debug_htt_stats_dwork); 2536 2537 init_completion(&ar->debug.tpc_complete); 2538 init_completion(&ar->debug.fw_stats_complete); 2539 2540 debugfs_create_file("fw_stats", 0400, ar->debug.debugfs_phy, ar, 2541 &fops_fw_stats); 2542 2543 debugfs_create_file("fw_reset_stats", 0400, ar->debug.debugfs_phy, ar, 2544 &fops_fw_reset_stats); 2545 2546 debugfs_create_file("wmi_services", 0400, ar->debug.debugfs_phy, ar, 2547 &fops_wmi_services); 2548 2549 debugfs_create_file("simulate_fw_crash", 0600, ar->debug.debugfs_phy, ar, 2550 &fops_simulate_fw_crash); 2551 2552 debugfs_create_file("reg_addr", 0600, ar->debug.debugfs_phy, ar, 2553 &fops_reg_addr); 2554 2555 debugfs_create_file("reg_value", 0600, ar->debug.debugfs_phy, ar, 2556 &fops_reg_value); 2557 2558 debugfs_create_file("mem_value", 0600, ar->debug.debugfs_phy, ar, 2559 &fops_mem_value); 2560 2561 debugfs_create_file("chip_id", 0400, ar->debug.debugfs_phy, ar, 2562 &fops_chip_id); 2563 2564 debugfs_create_file("htt_stats_mask", 0600, ar->debug.debugfs_phy, ar, 2565 &fops_htt_stats_mask); 2566 2567 debugfs_create_file("htt_max_amsdu_ampdu", 0600, ar->debug.debugfs_phy, ar, 2568 &fops_htt_max_amsdu_ampdu); 2569 2570 debugfs_create_file("fw_dbglog", 0600, ar->debug.debugfs_phy, ar, 2571 &fops_fw_dbglog); 2572 2573 if (!test_bit(ATH10K_FW_FEATURE_NON_BMI, 2574 ar->normal_mode_fw.fw_file.fw_features)) { 2575 debugfs_create_file("cal_data", 0400, ar->debug.debugfs_phy, ar, 2576 &fops_cal_data); 2577 2578 debugfs_create_file("nf_cal_period", 0600, ar->debug.debugfs_phy, ar, 2579 &fops_nf_cal_period); 2580 } 2581 2582 debugfs_create_file("ani_enable", 0600, ar->debug.debugfs_phy, ar, 2583 &fops_ani_enable); 2584 2585 if (IS_ENABLED(CONFIG_ATH10K_DFS_CERTIFIED)) { 2586 debugfs_create_file("dfs_simulate_radar", 0200, ar->debug.debugfs_phy, 2587 ar, &fops_simulate_radar); 2588 2589 debugfs_create_bool("dfs_block_radar_events", 0200, 2590 ar->debug.debugfs_phy, 2591 &ar->dfs_block_radar_events); 2592 2593 debugfs_create_file("dfs_stats", 0400, ar->debug.debugfs_phy, ar, 2594 &fops_dfs_stats); 2595 } 2596 2597 debugfs_create_file("pktlog_filter", 0644, ar->debug.debugfs_phy, ar, 2598 &fops_pktlog_filter); 2599 2600 if (test_bit(WMI_SERVICE_THERM_THROT, ar->wmi.svc_map)) 2601 debugfs_create_file("quiet_period", 0644, ar->debug.debugfs_phy, ar, 2602 &fops_quiet_period); 2603 2604 debugfs_create_file("tpc_stats", 0400, ar->debug.debugfs_phy, ar, 2605 &fops_tpc_stats); 2606 2607 if (test_bit(WMI_SERVICE_COEX_GPIO, ar->wmi.svc_map)) 2608 debugfs_create_file("btcoex", 0644, ar->debug.debugfs_phy, ar, 2609 &fops_btcoex); 2610 2611 if (test_bit(WMI_SERVICE_PEER_STATS, ar->wmi.svc_map)) { 2612 debugfs_create_file("peer_stats", 0644, ar->debug.debugfs_phy, ar, 2613 &fops_peer_stats); 2614 2615 debugfs_create_file("enable_extd_tx_stats", 0644, 2616 ar->debug.debugfs_phy, ar, 2617 &fops_enable_extd_tx_stats); 2618 } 2619 2620 debugfs_create_file("fw_checksums", 0400, ar->debug.debugfs_phy, ar, 2621 &fops_fw_checksums); 2622 2623 if (IS_ENABLED(CONFIG_MAC80211_DEBUGFS)) 2624 debugfs_create_file("sta_tid_stats_mask", 0600, 2625 ar->debug.debugfs_phy, 2626 ar, &fops_sta_tid_stats_mask); 2627 2628 if (test_bit(WMI_SERVICE_TPC_STATS_FINAL, ar->wmi.svc_map)) 2629 debugfs_create_file("tpc_stats_final", 0400, 2630 ar->debug.debugfs_phy, ar, 2631 &fops_tpc_stats_final); 2632 2633 if (test_bit(WMI_SERVICE_RESET_CHIP, ar->wmi.svc_map)) 2634 debugfs_create_file("warm_hw_reset", 0600, 2635 ar->debug.debugfs_phy, ar, 2636 &fops_warm_hw_reset); 2637 2638 debugfs_create_file("ps_state_enable", 0600, ar->debug.debugfs_phy, ar, 2639 &fops_ps_state_enable); 2640 2641 debugfs_create_file("reset_htt_stats", 0200, ar->debug.debugfs_phy, ar, 2642 &fops_reset_htt_stats); 2643 2644 return 0; 2645 } 2646 2647 void ath10k_debug_unregister(struct ath10k *ar) 2648 { 2649 cancel_delayed_work_sync(&ar->debug.htt_stats_dwork); 2650 } 2651 2652 #endif /* CONFIG_ATH10K_DEBUGFS */ 2653 2654 #ifdef CONFIG_ATH10K_DEBUG 2655 void __ath10k_dbg(struct ath10k *ar, enum ath10k_debug_mask mask, 2656 const char *fmt, ...) 2657 { 2658 struct va_format vaf; 2659 va_list args; 2660 2661 va_start(args, fmt); 2662 2663 vaf.fmt = fmt; 2664 vaf.va = &args; 2665 2666 if (ath10k_debug_mask & mask) 2667 dev_printk(KERN_DEBUG, ar->dev, "%pV", &vaf); 2668 2669 trace_ath10k_log_dbg(ar, mask, &vaf); 2670 2671 va_end(args); 2672 } 2673 EXPORT_SYMBOL(__ath10k_dbg); 2674 2675 void ath10k_dbg_dump(struct ath10k *ar, 2676 enum ath10k_debug_mask mask, 2677 const char *msg, const char *prefix, 2678 const void *buf, size_t len) 2679 { 2680 char linebuf[256]; 2681 size_t linebuflen; 2682 const void *ptr; 2683 2684 if (ath10k_debug_mask & mask) { 2685 if (msg) 2686 __ath10k_dbg(ar, mask, "%s\n", msg); 2687 2688 for (ptr = buf; (ptr - buf) < len; ptr += 16) { 2689 linebuflen = 0; 2690 linebuflen += scnprintf(linebuf + linebuflen, 2691 sizeof(linebuf) - linebuflen, 2692 "%s%08x: ", 2693 (prefix ? prefix : ""), 2694 (unsigned int)(ptr - buf)); 2695 hex_dump_to_buffer(ptr, len - (ptr - buf), 16, 1, 2696 linebuf + linebuflen, 2697 sizeof(linebuf) - linebuflen, true); 2698 dev_printk(KERN_DEBUG, ar->dev, "%s\n", linebuf); 2699 } 2700 } 2701 2702 /* tracing code doesn't like null strings :/ */ 2703 trace_ath10k_log_dbg_dump(ar, msg ? msg : "", prefix ? prefix : "", 2704 buf, len); 2705 } 2706 EXPORT_SYMBOL(ath10k_dbg_dump); 2707 2708 #endif /* CONFIG_ATH10K_DEBUG */ 2709