Commit 87571bf0 authored by Michal Kazior's avatar Michal Kazior Committed by Kalle Valo

ath10k: skip fw stats debugfs interface if device is down

If the device is not running then there may be no
FW at all to send the query to. If the FW is
already there it might still trigger a crash if
the command is sent before the device is fully
initialized.
Signed-off-by: default avatarMichal Kazior <michal.kazior@tieto.com>
Signed-off-by: default avatarKalle Valo <kvalo@qca.qualcomm.com>
parent 29385057
...@@ -161,7 +161,7 @@ void ath10k_debug_read_target_stats(struct ath10k *ar, ...@@ -161,7 +161,7 @@ void ath10k_debug_read_target_stats(struct ath10k *ar,
struct wmi_pdev_stats *ps; struct wmi_pdev_stats *ps;
int i; int i;
mutex_lock(&ar->conf_mutex); spin_lock_bh(&ar->data_lock);
stats = &ar->debug.target_stats; stats = &ar->debug.target_stats;
...@@ -259,6 +259,7 @@ void ath10k_debug_read_target_stats(struct ath10k *ar, ...@@ -259,6 +259,7 @@ void ath10k_debug_read_target_stats(struct ath10k *ar,
} }
} }
spin_unlock_bh(&ar->data_lock);
mutex_unlock(&ar->conf_mutex); mutex_unlock(&ar->conf_mutex);
complete(&ar->debug.event_stats_compl); complete(&ar->debug.event_stats_compl);
} }
...@@ -268,35 +269,35 @@ static ssize_t ath10k_read_fw_stats(struct file *file, char __user *user_buf, ...@@ -268,35 +269,35 @@ static ssize_t ath10k_read_fw_stats(struct file *file, char __user *user_buf,
{ {
struct ath10k *ar = file->private_data; struct ath10k *ar = file->private_data;
struct ath10k_target_stats *fw_stats; struct ath10k_target_stats *fw_stats;
char *buf; char *buf = NULL;
unsigned int len = 0, buf_len = 2500; unsigned int len = 0, buf_len = 2500;
ssize_t ret_cnt; ssize_t ret_cnt = 0;
long left; long left;
int i; int i;
int ret; int ret;
fw_stats = &ar->debug.target_stats; fw_stats = &ar->debug.target_stats;
mutex_lock(&ar->conf_mutex);
if (ar->state != ATH10K_STATE_ON)
goto exit;
buf = kzalloc(buf_len, GFP_KERNEL); buf = kzalloc(buf_len, GFP_KERNEL);
if (!buf) if (!buf)
return -ENOMEM; goto exit;
ret = ath10k_wmi_request_stats(ar, WMI_REQUEST_PEER_STAT); ret = ath10k_wmi_request_stats(ar, WMI_REQUEST_PEER_STAT);
if (ret) { if (ret) {
ath10k_warn("could not request stats (%d)\n", ret); ath10k_warn("could not request stats (%d)\n", ret);
kfree(buf); goto exit;
return -EIO;
} }
left = wait_for_completion_timeout(&ar->debug.event_stats_compl, 1*HZ); left = wait_for_completion_timeout(&ar->debug.event_stats_compl, 1*HZ);
if (left <= 0)
goto exit;
if (left <= 0) { spin_lock_bh(&ar->data_lock);
kfree(buf);
return -ETIMEDOUT;
}
mutex_lock(&ar->conf_mutex);
len += scnprintf(buf + len, buf_len - len, "\n"); len += scnprintf(buf + len, buf_len - len, "\n");
len += scnprintf(buf + len, buf_len - len, "%30s\n", len += scnprintf(buf + len, buf_len - len, "%30s\n",
"ath10k PDEV stats"); "ath10k PDEV stats");
...@@ -424,14 +425,15 @@ static ssize_t ath10k_read_fw_stats(struct file *file, char __user *user_buf, ...@@ -424,14 +425,15 @@ static ssize_t ath10k_read_fw_stats(struct file *file, char __user *user_buf,
fw_stats->peer_stat[i].peer_tx_rate); fw_stats->peer_stat[i].peer_tx_rate);
len += scnprintf(buf + len, buf_len - len, "\n"); len += scnprintf(buf + len, buf_len - len, "\n");
} }
spin_unlock_bh(&ar->data_lock);
if (len > buf_len) if (len > buf_len)
len = buf_len; len = buf_len;
ret_cnt = simple_read_from_buffer(user_buf, count, ppos, buf, len); ret_cnt = simple_read_from_buffer(user_buf, count, ppos, buf, len);
exit:
mutex_unlock(&ar->conf_mutex); mutex_unlock(&ar->conf_mutex);
kfree(buf); kfree(buf);
return ret_cnt; return ret_cnt;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment