Linux Audio

Check our new training course

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