aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless
diff options
context:
space:
mode:
authorSenthilKumar Jegadeesan <sjegadee@qti.qualcomm.com>2015-01-29 04:06:52 -0500
committerKalle Valo <kvalo@qca.qualcomm.com>2015-02-04 02:20:08 -0500
commit467210a67b8e4e63dc7fb0bc9aca21e412f32da5 (patch)
treee261397bd1da8749e838b4b67ae7c31df0d18cdf /drivers/net/wireless
parent75930d1a80e81052376ffc5298aadfe8a075d9d2 (diff)
ath10k: add log level configuration for fw_dbglog
Introduce an optional log level configuration for the existing debugfs fw_dbglog file. It allows users to configure the desired log level for firmware dbglog messages. To configure log level as WARN: echo 0xffffffff 2 > /sys/kernel/debug/ieee80211/phy0/ath10k/fw_dbglog The values are: VERBOSE 0 INFO 1 WARN 2 ERR 3 Signed-off-by: SenthilKumar Jegadeesan <sjegadee@qti.qualcomm.com> Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
Diffstat (limited to 'drivers/net/wireless')
-rw-r--r--drivers/net/wireless/ath/ath10k/core.h1
-rw-r--r--drivers/net/wireless/ath/ath10k/debug.c32
-rw-r--r--drivers/net/wireless/ath/ath10k/wmi-ops.h7
-rw-r--r--drivers/net/wireless/ath/ath10k/wmi-tlv.c4
-rw-r--r--drivers/net/wireless/ath/ath10k/wmi.c5
5 files changed, 33 insertions, 16 deletions
diff --git a/drivers/net/wireless/ath/ath10k/core.h b/drivers/net/wireless/ath/ath10k/core.h
index c8ba6bd4b968..d60e46fe6d19 100644
--- a/drivers/net/wireless/ath/ath10k/core.h
+++ b/drivers/net/wireless/ath/ath10k/core.h
@@ -350,6 +350,7 @@ struct ath10k_debug {
350 350
351 /* protected by conf_mutex */ 351 /* protected by conf_mutex */
352 u32 fw_dbglog_mask; 352 u32 fw_dbglog_mask;
353 u32 fw_dbglog_level;
353 u32 pktlog_filter; 354 u32 pktlog_filter;
354 u32 reg_addr; 355 u32 reg_addr;
355 u32 nf_cal_period; 356 u32 nf_cal_period;
diff --git a/drivers/net/wireless/ath/ath10k/debug.c b/drivers/net/wireless/ath/ath10k/debug.c
index 42b2e49b2836..d2281e5c2ffe 100644
--- a/drivers/net/wireless/ath/ath10k/debug.c
+++ b/drivers/net/wireless/ath/ath10k/debug.c
@@ -1318,10 +1318,10 @@ static ssize_t ath10k_read_fw_dbglog(struct file *file,
1318{ 1318{
1319 struct ath10k *ar = file->private_data; 1319 struct ath10k *ar = file->private_data;
1320 unsigned int len; 1320 unsigned int len;
1321 char buf[32]; 1321 char buf[64];
1322 1322
1323 len = scnprintf(buf, sizeof(buf), "0x%08x\n", 1323 len = scnprintf(buf, sizeof(buf), "0x%08x %u\n",
1324 ar->debug.fw_dbglog_mask); 1324 ar->debug.fw_dbglog_mask, ar->debug.fw_dbglog_level);
1325 1325
1326 return simple_read_from_buffer(user_buf, count, ppos, buf, len); 1326 return simple_read_from_buffer(user_buf, count, ppos, buf, len);
1327} 1327}
@@ -1331,19 +1331,32 @@ static ssize_t ath10k_write_fw_dbglog(struct file *file,
1331 size_t count, loff_t *ppos) 1331 size_t count, loff_t *ppos)
1332{ 1332{
1333 struct ath10k *ar = file->private_data; 1333 struct ath10k *ar = file->private_data;
1334 unsigned long mask;
1335 int ret; 1334 int ret;
1335 char buf[64];
1336 unsigned int log_level, mask;
1336 1337
1337 ret = kstrtoul_from_user(user_buf, count, 0, &mask); 1338 simple_write_to_buffer(buf, sizeof(buf) - 1, ppos, user_buf, count);
1338 if (ret) 1339
1339 return ret; 1340 /* make sure that buf is null terminated */
1341 buf[sizeof(buf) - 1] = 0;
1342
1343 ret = sscanf(buf, "%x %u", &mask, &log_level);
1344
1345 if (!ret)
1346 return -EINVAL;
1347
1348 if (ret == 1)
1349 /* default if user did not specify */
1350 log_level = ATH10K_DBGLOG_LEVEL_WARN;
1340 1351
1341 mutex_lock(&ar->conf_mutex); 1352 mutex_lock(&ar->conf_mutex);
1342 1353
1343 ar->debug.fw_dbglog_mask = mask; 1354 ar->debug.fw_dbglog_mask = mask;
1355 ar->debug.fw_dbglog_level = log_level;
1344 1356
1345 if (ar->state == ATH10K_STATE_ON) { 1357 if (ar->state == ATH10K_STATE_ON) {
1346 ret = ath10k_wmi_dbglog_cfg(ar, ar->debug.fw_dbglog_mask); 1358 ret = ath10k_wmi_dbglog_cfg(ar, ar->debug.fw_dbglog_mask,
1359 ar->debug.fw_dbglog_level);
1347 if (ret) { 1360 if (ret) {
1348 ath10k_warn(ar, "dbglog cfg failed from debugfs: %d\n", 1361 ath10k_warn(ar, "dbglog cfg failed from debugfs: %d\n",
1349 ret); 1362 ret);
@@ -1685,7 +1698,8 @@ int ath10k_debug_start(struct ath10k *ar)
1685 ret); 1698 ret);
1686 1699
1687 if (ar->debug.fw_dbglog_mask) { 1700 if (ar->debug.fw_dbglog_mask) {
1688 ret = ath10k_wmi_dbglog_cfg(ar, ar->debug.fw_dbglog_mask); 1701 ret = ath10k_wmi_dbglog_cfg(ar, ar->debug.fw_dbglog_mask,
1702 ATH10K_DBGLOG_LEVEL_WARN);
1689 if (ret) 1703 if (ret)
1690 /* not serious */ 1704 /* not serious */
1691 ath10k_warn(ar, "failed to enable dbglog during start: %d", 1705 ath10k_warn(ar, "failed to enable dbglog during start: %d",
diff --git a/drivers/net/wireless/ath/ath10k/wmi-ops.h b/drivers/net/wireless/ath/ath10k/wmi-ops.h
index de436162a805..04dc4b9db04e 100644
--- a/drivers/net/wireless/ath/ath10k/wmi-ops.h
+++ b/drivers/net/wireless/ath/ath10k/wmi-ops.h
@@ -116,7 +116,8 @@ struct wmi_ops {
116 enum wmi_force_fw_hang_type type, 116 enum wmi_force_fw_hang_type type,
117 u32 delay_ms); 117 u32 delay_ms);
118 struct sk_buff *(*gen_mgmt_tx)(struct ath10k *ar, struct sk_buff *skb); 118 struct sk_buff *(*gen_mgmt_tx)(struct ath10k *ar, struct sk_buff *skb);
119 struct sk_buff *(*gen_dbglog_cfg)(struct ath10k *ar, u32 module_enable); 119 struct sk_buff *(*gen_dbglog_cfg)(struct ath10k *ar, u32 module_enable,
120 u32 log_level);
120 struct sk_buff *(*gen_pktlog_enable)(struct ath10k *ar, u32 filter); 121 struct sk_buff *(*gen_pktlog_enable)(struct ath10k *ar, u32 filter);
121 struct sk_buff *(*gen_pktlog_disable)(struct ath10k *ar); 122 struct sk_buff *(*gen_pktlog_disable)(struct ath10k *ar);
122 struct sk_buff *(*gen_pdev_set_quiet_mode)(struct ath10k *ar, 123 struct sk_buff *(*gen_pdev_set_quiet_mode)(struct ath10k *ar,
@@ -846,14 +847,14 @@ ath10k_wmi_force_fw_hang(struct ath10k *ar,
846} 847}
847 848
848static inline int 849static inline int
849ath10k_wmi_dbglog_cfg(struct ath10k *ar, u32 module_enable) 850ath10k_wmi_dbglog_cfg(struct ath10k *ar, u32 module_enable, u32 log_level)
850{ 851{
851 struct sk_buff *skb; 852 struct sk_buff *skb;
852 853
853 if (!ar->wmi.ops->gen_dbglog_cfg) 854 if (!ar->wmi.ops->gen_dbglog_cfg)
854 return -EOPNOTSUPP; 855 return -EOPNOTSUPP;
855 856
856 skb = ar->wmi.ops->gen_dbglog_cfg(ar, module_enable); 857 skb = ar->wmi.ops->gen_dbglog_cfg(ar, module_enable, log_level);
857 if (IS_ERR(skb)) 858 if (IS_ERR(skb))
858 return PTR_ERR(skb); 859 return PTR_ERR(skb);
859 860
diff --git a/drivers/net/wireless/ath/ath10k/wmi-tlv.c b/drivers/net/wireless/ath/ath10k/wmi-tlv.c
index ba78c187976c..71614ba1b145 100644
--- a/drivers/net/wireless/ath/ath10k/wmi-tlv.c
+++ b/drivers/net/wireless/ath/ath10k/wmi-tlv.c
@@ -2126,8 +2126,8 @@ ath10k_wmi_tlv_op_gen_force_fw_hang(struct ath10k *ar,
2126} 2126}
2127 2127
2128static struct sk_buff * 2128static struct sk_buff *
2129ath10k_wmi_tlv_op_gen_dbglog_cfg(struct ath10k *ar, u32 module_enable) 2129ath10k_wmi_tlv_op_gen_dbglog_cfg(struct ath10k *ar, u32 module_enable,
2130{ 2130 u32 log_level) {
2131 struct wmi_tlv_dbglog_cmd *cmd; 2131 struct wmi_tlv_dbglog_cmd *cmd;
2132 struct wmi_tlv *tlv; 2132 struct wmi_tlv *tlv;
2133 struct sk_buff *skb; 2133 struct sk_buff *skb;
diff --git a/drivers/net/wireless/ath/ath10k/wmi.c b/drivers/net/wireless/ath/ath10k/wmi.c
index d6c5b423b836..fd213d9e4214 100644
--- a/drivers/net/wireless/ath/ath10k/wmi.c
+++ b/drivers/net/wireless/ath/ath10k/wmi.c
@@ -4991,7 +4991,8 @@ ath10k_wmi_op_gen_force_fw_hang(struct ath10k *ar,
4991} 4991}
4992 4992
4993static struct sk_buff * 4993static struct sk_buff *
4994ath10k_wmi_op_gen_dbglog_cfg(struct ath10k *ar, u32 module_enable) 4994ath10k_wmi_op_gen_dbglog_cfg(struct ath10k *ar, u32 module_enable,
4995 u32 log_level)
4995{ 4996{
4996 struct wmi_dbglog_cfg_cmd *cmd; 4997 struct wmi_dbglog_cfg_cmd *cmd;
4997 struct sk_buff *skb; 4998 struct sk_buff *skb;
@@ -5004,7 +5005,7 @@ ath10k_wmi_op_gen_dbglog_cfg(struct ath10k *ar, u32 module_enable)
5004 cmd = (struct wmi_dbglog_cfg_cmd *)skb->data; 5005 cmd = (struct wmi_dbglog_cfg_cmd *)skb->data;
5005 5006
5006 if (module_enable) { 5007 if (module_enable) {
5007 cfg = SM(ATH10K_DBGLOG_LEVEL_VERBOSE, 5008 cfg = SM(log_level,
5008 ATH10K_DBGLOG_CFG_LOG_LVL); 5009 ATH10K_DBGLOG_CFG_LOG_LVL);
5009 } else { 5010 } else {
5010 /* set back defaults, all modules with WARN level */ 5011 /* set back defaults, all modules with WARN level */