diff options
Diffstat (limited to 'drivers/net/wireless/ath/ath10k/debug.c')
| -rw-r--r-- | drivers/net/wireless/ath/ath10k/debug.c | 293 | 
1 files changed, 9 insertions, 284 deletions
diff --git a/drivers/net/wireless/ath/ath10k/debug.c b/drivers/net/wireless/ath/ath10k/debug.c index df514507d3f1..6d836a26272f 100644 --- a/drivers/net/wireless/ath/ath10k/debug.c +++ b/drivers/net/wireless/ath/ath10k/debug.c @@ -1,6 +1,6 @@  /*   * Copyright (c) 2005-2011 Atheros Communications Inc. - * Copyright (c) 2011-2013 Qualcomm Atheros, Inc. + * Copyright (c) 2011-2017 Qualcomm Atheros, Inc.   *   * Permission to use, copy, modify, and/or distribute this software for any   * purpose with or without fee is hereby granted, provided that the above @@ -18,10 +18,8 @@  #include <linux/module.h>  #include <linux/debugfs.h>  #include <linux/vmalloc.h> -#include <linux/utsname.h>  #include <linux/crc32.h>  #include <linux/firmware.h> -#include <linux/devcoredump.h>  #include "core.h"  #include "debug.h" @@ -33,86 +31,6 @@  #define ATH10K_DEBUG_CAL_DATA_LEN 12064 -#define ATH10K_FW_CRASH_DUMP_VERSION 1 - -/** - * enum ath10k_fw_crash_dump_type - types of data in the dump file - * @ATH10K_FW_CRASH_DUMP_REGDUMP: Register crash dump in binary format - */ -enum ath10k_fw_crash_dump_type { -	ATH10K_FW_CRASH_DUMP_REGISTERS = 0, -	ATH10K_FW_CRASH_DUMP_CE_DATA = 1, - -	ATH10K_FW_CRASH_DUMP_MAX, -}; - -struct ath10k_tlv_dump_data { -	/* see ath10k_fw_crash_dump_type above */ -	__le32 type; - -	/* in bytes */ -	__le32 tlv_len; - -	/* pad to 32-bit boundaries as needed */ -	u8 tlv_data[]; -} __packed; - -struct ath10k_dump_file_data { -	/* dump file information */ - -	/* "ATH10K-FW-DUMP" */ -	char df_magic[16]; - -	__le32 len; - -	/* file dump version */ -	__le32 version; - -	/* some info we can get from ath10k struct that might help */ - -	guid_t guid; - -	__le32 chip_id; - -	/* 0 for now, in place for later hardware */ -	__le32 bus_type; - -	__le32 target_version; -	__le32 fw_version_major; -	__le32 fw_version_minor; -	__le32 fw_version_release; -	__le32 fw_version_build; -	__le32 phy_capability; -	__le32 hw_min_tx_power; -	__le32 hw_max_tx_power; -	__le32 ht_cap_info; -	__le32 vht_cap_info; -	__le32 num_rf_chains; - -	/* firmware version string */ -	char fw_ver[ETHTOOL_FWVERS_LEN]; - -	/* Kernel related information */ - -	/* time-of-day stamp */ -	__le64 tv_sec; - -	/* time-of-day stamp, nano-seconds */ -	__le64 tv_nsec; - -	/* LINUX_VERSION_CODE */ -	__le32 kernel_ver_code; - -	/* VERMAGIC_STRING */ -	char kernel_ver[64]; - -	/* room for growth w/out changing binary format */ -	u8 unused[128]; - -	/* struct ath10k_tlv_dump_data + more */ -	u8 data[0]; -} __packed; -  void ath10k_info(struct ath10k *ar, const char *fmt, ...)  {  	struct va_format vaf = { @@ -711,189 +629,6 @@ static const struct file_operations fops_chip_id = {  	.llseek = default_llseek,  }; -struct ath10k_fw_crash_data * -ath10k_debug_get_new_fw_crash_data(struct ath10k *ar) -{ -	struct ath10k_fw_crash_data *crash_data = ar->debug.fw_crash_data; - -	lockdep_assert_held(&ar->data_lock); - -	crash_data->crashed_since_read = true; -	guid_gen(&crash_data->guid); -	getnstimeofday(&crash_data->timestamp); - -	return crash_data; -} -EXPORT_SYMBOL(ath10k_debug_get_new_fw_crash_data); - -static struct ath10k_dump_file_data *ath10k_build_dump_file(struct ath10k *ar, -							    bool mark_read) -{ -	struct ath10k_fw_crash_data *crash_data = ar->debug.fw_crash_data; -	struct ath10k_ce_crash_hdr *ce_hdr; -	struct ath10k_dump_file_data *dump_data; -	struct ath10k_tlv_dump_data *dump_tlv; -	size_t hdr_len = sizeof(*dump_data); -	size_t len, sofar = 0; -	unsigned char *buf; - -	len = hdr_len; -	len += sizeof(*dump_tlv) + sizeof(crash_data->registers); -	len += sizeof(*dump_tlv) + sizeof(*ce_hdr) + -		CE_COUNT * sizeof(ce_hdr->entries[0]); - -	sofar += hdr_len; - -	/* This is going to get big when we start dumping FW RAM and such, -	 * so go ahead and use vmalloc. -	 */ -	buf = vzalloc(len); -	if (!buf) -		return NULL; - -	spin_lock_bh(&ar->data_lock); - -	if (!crash_data->crashed_since_read) { -		spin_unlock_bh(&ar->data_lock); -		vfree(buf); -		return NULL; -	} - -	dump_data = (struct ath10k_dump_file_data *)(buf); -	strlcpy(dump_data->df_magic, "ATH10K-FW-DUMP", -		sizeof(dump_data->df_magic)); -	dump_data->len = cpu_to_le32(len); - -	dump_data->version = cpu_to_le32(ATH10K_FW_CRASH_DUMP_VERSION); - -	guid_copy(&dump_data->guid, &crash_data->guid); -	dump_data->chip_id = cpu_to_le32(ar->chip_id); -	dump_data->bus_type = cpu_to_le32(0); -	dump_data->target_version = cpu_to_le32(ar->target_version); -	dump_data->fw_version_major = cpu_to_le32(ar->fw_version_major); -	dump_data->fw_version_minor = cpu_to_le32(ar->fw_version_minor); -	dump_data->fw_version_release = cpu_to_le32(ar->fw_version_release); -	dump_data->fw_version_build = cpu_to_le32(ar->fw_version_build); -	dump_data->phy_capability = cpu_to_le32(ar->phy_capability); -	dump_data->hw_min_tx_power = cpu_to_le32(ar->hw_min_tx_power); -	dump_data->hw_max_tx_power = cpu_to_le32(ar->hw_max_tx_power); -	dump_data->ht_cap_info = cpu_to_le32(ar->ht_cap_info); -	dump_data->vht_cap_info = cpu_to_le32(ar->vht_cap_info); -	dump_data->num_rf_chains = cpu_to_le32(ar->num_rf_chains); - -	strlcpy(dump_data->fw_ver, ar->hw->wiphy->fw_version, -		sizeof(dump_data->fw_ver)); - -	dump_data->kernel_ver_code = 0; -	strlcpy(dump_data->kernel_ver, init_utsname()->release, -		sizeof(dump_data->kernel_ver)); - -	dump_data->tv_sec = cpu_to_le64(crash_data->timestamp.tv_sec); -	dump_data->tv_nsec = cpu_to_le64(crash_data->timestamp.tv_nsec); - -	/* Gather crash-dump */ -	dump_tlv = (struct ath10k_tlv_dump_data *)(buf + sofar); -	dump_tlv->type = cpu_to_le32(ATH10K_FW_CRASH_DUMP_REGISTERS); -	dump_tlv->tlv_len = cpu_to_le32(sizeof(crash_data->registers)); -	memcpy(dump_tlv->tlv_data, &crash_data->registers, -	       sizeof(crash_data->registers)); -	sofar += sizeof(*dump_tlv) + sizeof(crash_data->registers); - -	dump_tlv = (struct ath10k_tlv_dump_data *)(buf + sofar); -	dump_tlv->type = cpu_to_le32(ATH10K_FW_CRASH_DUMP_CE_DATA); -	dump_tlv->tlv_len = cpu_to_le32(sizeof(*ce_hdr) + -					CE_COUNT * sizeof(ce_hdr->entries[0])); -	ce_hdr = (struct ath10k_ce_crash_hdr *)(dump_tlv->tlv_data); -	ce_hdr->ce_count = cpu_to_le32(CE_COUNT); -	memset(ce_hdr->reserved, 0, sizeof(ce_hdr->reserved)); -	memcpy(ce_hdr->entries, crash_data->ce_crash_data, -	       CE_COUNT * sizeof(ce_hdr->entries[0])); -	sofar += sizeof(*dump_tlv) + sizeof(*ce_hdr) + -		 CE_COUNT * sizeof(ce_hdr->entries[0]); - -	ar->debug.fw_crash_data->crashed_since_read = !mark_read; - -	spin_unlock_bh(&ar->data_lock); - -	return dump_data; -} - -int ath10k_debug_fw_devcoredump(struct ath10k *ar) -{ -	struct ath10k_dump_file_data *dump; -	void *dump_ptr; -	u32 dump_len; - -	/* To keep the dump file available also for debugfs don't mark the -	 * file read, only debugfs should do that. -	 */ -	dump = ath10k_build_dump_file(ar, false); -	if (!dump) { -		ath10k_warn(ar, "no crash dump data found for devcoredump"); -		return -ENODATA; -	} - -	/* Make a copy of the dump file for dev_coredumpv() as during the -	 * transition period we need to own the original file. Once -	 * fw_crash_dump debugfs file is removed no need to have a copy -	 * anymore. -	 */ -	dump_len = le32_to_cpu(dump->len); -	dump_ptr = vzalloc(dump_len); - -	if (!dump_ptr) -		return -ENOMEM; - -	memcpy(dump_ptr, dump, dump_len); - -	dev_coredumpv(ar->dev, dump_ptr, dump_len, GFP_KERNEL); - -	return 0; -} - -static int ath10k_fw_crash_dump_open(struct inode *inode, struct file *file) -{ -	struct ath10k *ar = inode->i_private; -	struct ath10k_dump_file_data *dump; - -	ath10k_warn(ar, "fw_crash_dump debugfs file is deprecated, please use /sys/class/devcoredump instead."); - -	dump = ath10k_build_dump_file(ar, true); -	if (!dump) -		return -ENODATA; - -	file->private_data = dump; - -	return 0; -} - -static ssize_t ath10k_fw_crash_dump_read(struct file *file, -					 char __user *user_buf, -					 size_t count, loff_t *ppos) -{ -	struct ath10k_dump_file_data *dump_file = file->private_data; - -	return simple_read_from_buffer(user_buf, count, ppos, -				       dump_file, -				       le32_to_cpu(dump_file->len)); -} - -static int ath10k_fw_crash_dump_release(struct inode *inode, -					struct file *file) -{ -	vfree(file->private_data); - -	return 0; -} - -static const struct file_operations fops_fw_crash_dump = { -	.open = ath10k_fw_crash_dump_open, -	.read = ath10k_fw_crash_dump_read, -	.release = ath10k_fw_crash_dump_release, -	.owner = THIS_MODULE, -	.llseek = default_llseek, -}; -  static ssize_t ath10k_reg_addr_read(struct file *file,  				    char __user *user_buf,  				    size_t count, loff_t *ppos) @@ -1950,14 +1685,14 @@ int ath10k_debug_start(struct ath10k *ar)  				    ret);  	} -	if (ar->debug.pktlog_filter) { +	if (ar->pktlog_filter) {  		ret = ath10k_wmi_pdev_pktlog_enable(ar, -						    ar->debug.pktlog_filter); +						    ar->pktlog_filter);  		if (ret)  			/* not serious */  			ath10k_warn(ar,  				    "failed to enable pktlog filter %x: %d\n", -				    ar->debug.pktlog_filter, ret); +				    ar->pktlog_filter, ret);  	} else {  		ret = ath10k_wmi_pdev_pktlog_disable(ar);  		if (ret) @@ -2097,12 +1832,12 @@ static ssize_t ath10k_write_pktlog_filter(struct file *file,  	mutex_lock(&ar->conf_mutex);  	if (ar->state != ATH10K_STATE_ON) { -		ar->debug.pktlog_filter = filter; +		ar->pktlog_filter = filter;  		ret = count;  		goto out;  	} -	if (filter == ar->debug.pktlog_filter) { +	if (filter == ar->pktlog_filter) {  		ret = count;  		goto out;  	} @@ -2111,7 +1846,7 @@ static ssize_t ath10k_write_pktlog_filter(struct file *file,  		ret = ath10k_wmi_pdev_pktlog_enable(ar, filter);  		if (ret) {  			ath10k_warn(ar, "failed to enable pktlog filter %x: %d\n", -				    ar->debug.pktlog_filter, ret); +				    ar->pktlog_filter, ret);  			goto out;  		}  	} else { @@ -2122,7 +1857,7 @@ static ssize_t ath10k_write_pktlog_filter(struct file *file,  		}  	} -	ar->debug.pktlog_filter = filter; +	ar->pktlog_filter = filter;  	ret = count;  out: @@ -2139,7 +1874,7 @@ static ssize_t ath10k_read_pktlog_filter(struct file *file, char __user *ubuf,  	mutex_lock(&ar->conf_mutex);  	len = scnprintf(buf, sizeof(buf) - len, "%08x\n", -			ar->debug.pktlog_filter); +			ar->pktlog_filter);  	mutex_unlock(&ar->conf_mutex);  	return simple_read_from_buffer(ubuf, count, ppos, buf, len); @@ -2402,10 +2137,6 @@ static const struct file_operations fops_fw_checksums = {  int ath10k_debug_create(struct ath10k *ar)  { -	ar->debug.fw_crash_data = vzalloc(sizeof(*ar->debug.fw_crash_data)); -	if (!ar->debug.fw_crash_data) -		return -ENOMEM; -  	ar->debug.cal_data = vzalloc(ATH10K_DEBUG_CAL_DATA_LEN);  	if (!ar->debug.cal_data)  		return -ENOMEM; @@ -2420,9 +2151,6 @@ int ath10k_debug_create(struct ath10k *ar)  void ath10k_debug_destroy(struct ath10k *ar)  { -	vfree(ar->debug.fw_crash_data); -	ar->debug.fw_crash_data = NULL; -  	vfree(ar->debug.cal_data);  	ar->debug.cal_data = NULL; @@ -2460,9 +2188,6 @@ int ath10k_debug_register(struct ath10k *ar)  	debugfs_create_file("simulate_fw_crash", 0600, ar->debug.debugfs_phy, ar,  			    &fops_simulate_fw_crash); -	debugfs_create_file("fw_crash_dump", 0400, ar->debug.debugfs_phy, ar, -			    &fops_fw_crash_dump); -  	debugfs_create_file("reg_addr", 0600, ar->debug.debugfs_phy, ar,  			    &fops_reg_addr);  |