|
@@ -242,12 +242,19 @@ static void wil_print_ring(struct seq_file *s, const char *prefix,
|
|
static int wil_mbox_debugfs_show(struct seq_file *s, void *data)
|
|
static int wil_mbox_debugfs_show(struct seq_file *s, void *data)
|
|
{
|
|
{
|
|
struct wil6210_priv *wil = s->private;
|
|
struct wil6210_priv *wil = s->private;
|
|
|
|
+ int ret;
|
|
|
|
+
|
|
|
|
+ ret = wil_pm_runtime_get(wil);
|
|
|
|
+ if (ret < 0)
|
|
|
|
+ return ret;
|
|
|
|
|
|
wil_print_ring(s, "tx", wil->csr + HOST_MBOX +
|
|
wil_print_ring(s, "tx", wil->csr + HOST_MBOX +
|
|
offsetof(struct wil6210_mbox_ctl, tx));
|
|
offsetof(struct wil6210_mbox_ctl, tx));
|
|
wil_print_ring(s, "rx", wil->csr + HOST_MBOX +
|
|
wil_print_ring(s, "rx", wil->csr + HOST_MBOX +
|
|
offsetof(struct wil6210_mbox_ctl, rx));
|
|
offsetof(struct wil6210_mbox_ctl, rx));
|
|
|
|
|
|
|
|
+ wil_pm_runtime_put(wil);
|
|
|
|
+
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -265,15 +272,37 @@ static const struct file_operations fops_mbox = {
|
|
|
|
|
|
static int wil_debugfs_iomem_x32_set(void *data, u64 val)
|
|
static int wil_debugfs_iomem_x32_set(void *data, u64 val)
|
|
{
|
|
{
|
|
- writel(val, (void __iomem *)data);
|
|
|
|
|
|
+ struct wil_debugfs_iomem_data *d = (struct
|
|
|
|
+ wil_debugfs_iomem_data *)data;
|
|
|
|
+ struct wil6210_priv *wil = d->wil;
|
|
|
|
+ int ret;
|
|
|
|
+
|
|
|
|
+ ret = wil_pm_runtime_get(wil);
|
|
|
|
+ if (ret < 0)
|
|
|
|
+ return ret;
|
|
|
|
+
|
|
|
|
+ writel(val, (void __iomem *)d->offset);
|
|
wmb(); /* make sure write propagated to HW */
|
|
wmb(); /* make sure write propagated to HW */
|
|
|
|
|
|
|
|
+ wil_pm_runtime_put(wil);
|
|
|
|
+
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
static int wil_debugfs_iomem_x32_get(void *data, u64 *val)
|
|
static int wil_debugfs_iomem_x32_get(void *data, u64 *val)
|
|
{
|
|
{
|
|
- *val = readl((void __iomem *)data);
|
|
|
|
|
|
+ struct wil_debugfs_iomem_data *d = (struct
|
|
|
|
+ wil_debugfs_iomem_data *)data;
|
|
|
|
+ struct wil6210_priv *wil = d->wil;
|
|
|
|
+ int ret;
|
|
|
|
+
|
|
|
|
+ ret = wil_pm_runtime_get(wil);
|
|
|
|
+ if (ret < 0)
|
|
|
|
+ return ret;
|
|
|
|
+
|
|
|
|
+ *val = readl((void __iomem *)d->offset);
|
|
|
|
+
|
|
|
|
+ wil_pm_runtime_put(wil);
|
|
|
|
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
@@ -284,10 +313,21 @@ DEFINE_SIMPLE_ATTRIBUTE(fops_iomem_x32, wil_debugfs_iomem_x32_get,
|
|
static struct dentry *wil_debugfs_create_iomem_x32(const char *name,
|
|
static struct dentry *wil_debugfs_create_iomem_x32(const char *name,
|
|
umode_t mode,
|
|
umode_t mode,
|
|
struct dentry *parent,
|
|
struct dentry *parent,
|
|
- void *value)
|
|
|
|
|
|
+ void *value,
|
|
|
|
+ struct wil6210_priv *wil)
|
|
{
|
|
{
|
|
- return debugfs_create_file(name, mode, parent, value,
|
|
|
|
- &fops_iomem_x32);
|
|
|
|
|
|
+ struct dentry *file;
|
|
|
|
+ struct wil_debugfs_iomem_data *data = &wil->dbg_data.data_arr[
|
|
|
|
+ wil->dbg_data.iomem_data_count];
|
|
|
|
+
|
|
|
|
+ data->wil = wil;
|
|
|
|
+ data->offset = value;
|
|
|
|
+
|
|
|
|
+ file = debugfs_create_file(name, mode, parent, data, &fops_iomem_x32);
|
|
|
|
+ if (!IS_ERR_OR_NULL(file))
|
|
|
|
+ wil->dbg_data.iomem_data_count++;
|
|
|
|
+
|
|
|
|
+ return file;
|
|
}
|
|
}
|
|
|
|
|
|
static int wil_debugfs_ulong_set(void *data, u64 val)
|
|
static int wil_debugfs_ulong_set(void *data, u64 val)
|
|
@@ -346,7 +386,8 @@ static void wil6210_debugfs_init_offset(struct wil6210_priv *wil,
|
|
case doff_io32:
|
|
case doff_io32:
|
|
f = wil_debugfs_create_iomem_x32(tbl[i].name,
|
|
f = wil_debugfs_create_iomem_x32(tbl[i].name,
|
|
tbl[i].mode, dbg,
|
|
tbl[i].mode, dbg,
|
|
- base + tbl[i].off);
|
|
|
|
|
|
+ base + tbl[i].off,
|
|
|
|
+ wil);
|
|
break;
|
|
break;
|
|
case doff_u8:
|
|
case doff_u8:
|
|
f = debugfs_create_u8(tbl[i].name, tbl[i].mode, dbg,
|
|
f = debugfs_create_u8(tbl[i].name, tbl[i].mode, dbg,
|
|
@@ -475,13 +516,22 @@ static int wil6210_debugfs_create_ITR_CNT(struct wil6210_priv *wil,
|
|
static int wil_memread_debugfs_show(struct seq_file *s, void *data)
|
|
static int wil_memread_debugfs_show(struct seq_file *s, void *data)
|
|
{
|
|
{
|
|
struct wil6210_priv *wil = s->private;
|
|
struct wil6210_priv *wil = s->private;
|
|
- void __iomem *a = wmi_buffer(wil, cpu_to_le32(mem_addr));
|
|
|
|
|
|
+ void __iomem *a;
|
|
|
|
+ int ret;
|
|
|
|
+
|
|
|
|
+ ret = wil_pm_runtime_get(wil);
|
|
|
|
+ if (ret < 0)
|
|
|
|
+ return ret;
|
|
|
|
+
|
|
|
|
+ a = wmi_buffer(wil, cpu_to_le32(mem_addr));
|
|
|
|
|
|
if (a)
|
|
if (a)
|
|
seq_printf(s, "[0x%08x] = 0x%08x\n", mem_addr, readl(a));
|
|
seq_printf(s, "[0x%08x] = 0x%08x\n", mem_addr, readl(a));
|
|
else
|
|
else
|
|
seq_printf(s, "[0x%08x] = INVALID\n", mem_addr);
|
|
seq_printf(s, "[0x%08x] = INVALID\n", mem_addr);
|
|
|
|
|
|
|
|
+ wil_pm_runtime_put(wil);
|
|
|
|
+
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -502,10 +552,12 @@ static ssize_t wil_read_file_ioblob(struct file *file, char __user *user_buf,
|
|
{
|
|
{
|
|
enum { max_count = 4096 };
|
|
enum { max_count = 4096 };
|
|
struct wil_blob_wrapper *wil_blob = file->private_data;
|
|
struct wil_blob_wrapper *wil_blob = file->private_data;
|
|
|
|
+ struct wil6210_priv *wil = wil_blob->wil;
|
|
loff_t pos = *ppos;
|
|
loff_t pos = *ppos;
|
|
size_t available = wil_blob->blob.size;
|
|
size_t available = wil_blob->blob.size;
|
|
void *buf;
|
|
void *buf;
|
|
size_t ret;
|
|
size_t ret;
|
|
|
|
+ int rc;
|
|
|
|
|
|
if (test_bit(wil_status_suspending, wil_blob->wil->status) ||
|
|
if (test_bit(wil_status_suspending, wil_blob->wil->status) ||
|
|
test_bit(wil_status_suspended, wil_blob->wil->status))
|
|
test_bit(wil_status_suspended, wil_blob->wil->status))
|
|
@@ -526,10 +578,19 @@ static ssize_t wil_read_file_ioblob(struct file *file, char __user *user_buf,
|
|
if (!buf)
|
|
if (!buf)
|
|
return -ENOMEM;
|
|
return -ENOMEM;
|
|
|
|
|
|
|
|
+ rc = wil_pm_runtime_get(wil);
|
|
|
|
+ if (rc < 0) {
|
|
|
|
+ kfree(buf);
|
|
|
|
+ return rc;
|
|
|
|
+ }
|
|
|
|
+
|
|
wil_memcpy_fromio_32(buf, (const void __iomem *)
|
|
wil_memcpy_fromio_32(buf, (const void __iomem *)
|
|
wil_blob->blob.data + pos, count);
|
|
wil_blob->blob.data + pos, count);
|
|
|
|
|
|
ret = copy_to_user(user_buf, buf, count);
|
|
ret = copy_to_user(user_buf, buf, count);
|
|
|
|
+
|
|
|
|
+ wil_pm_runtime_put(wil);
|
|
|
|
+
|
|
kfree(buf);
|
|
kfree(buf);
|
|
if (ret == count)
|
|
if (ret == count)
|
|
return -EFAULT;
|
|
return -EFAULT;
|
|
@@ -1736,14 +1797,31 @@ static const struct dbg_off dbg_statics[] = {
|
|
{},
|
|
{},
|
|
};
|
|
};
|
|
|
|
|
|
|
|
+static const int dbg_off_count = 4 * (ARRAY_SIZE(isr_off) - 1) +
|
|
|
|
+ ARRAY_SIZE(dbg_wil_regs) - 1 +
|
|
|
|
+ ARRAY_SIZE(pseudo_isr_off) - 1 +
|
|
|
|
+ ARRAY_SIZE(lgc_itr_cnt_off) - 1 +
|
|
|
|
+ ARRAY_SIZE(tx_itr_cnt_off) - 1 +
|
|
|
|
+ ARRAY_SIZE(rx_itr_cnt_off) - 1;
|
|
|
|
+
|
|
int wil6210_debugfs_init(struct wil6210_priv *wil)
|
|
int wil6210_debugfs_init(struct wil6210_priv *wil)
|
|
{
|
|
{
|
|
struct dentry *dbg = wil->debug = debugfs_create_dir(WIL_NAME,
|
|
struct dentry *dbg = wil->debug = debugfs_create_dir(WIL_NAME,
|
|
wil_to_wiphy(wil)->debugfsdir);
|
|
wil_to_wiphy(wil)->debugfsdir);
|
|
-
|
|
|
|
if (IS_ERR_OR_NULL(dbg))
|
|
if (IS_ERR_OR_NULL(dbg))
|
|
return -ENODEV;
|
|
return -ENODEV;
|
|
|
|
|
|
|
|
+ wil->dbg_data.data_arr = kcalloc(dbg_off_count,
|
|
|
|
+ sizeof(struct wil_debugfs_iomem_data),
|
|
|
|
+ GFP_KERNEL);
|
|
|
|
+ if (!wil->dbg_data.data_arr) {
|
|
|
|
+ debugfs_remove_recursive(dbg);
|
|
|
|
+ wil->debug = NULL;
|
|
|
|
+ return -ENOMEM;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ wil->dbg_data.iomem_data_count = 0;
|
|
|
|
+
|
|
wil_pmc_init(wil);
|
|
wil_pmc_init(wil);
|
|
|
|
|
|
wil6210_debugfs_init_files(wil, dbg);
|
|
wil6210_debugfs_init_files(wil, dbg);
|
|
@@ -1768,6 +1846,8 @@ void wil6210_debugfs_remove(struct wil6210_priv *wil)
|
|
debugfs_remove_recursive(wil->debug);
|
|
debugfs_remove_recursive(wil->debug);
|
|
wil->debug = NULL;
|
|
wil->debug = NULL;
|
|
|
|
|
|
|
|
+ kfree(wil->dbg_data.data_arr);
|
|
|
|
+
|
|
/* free pmc memory without sending command to fw, as it will
|
|
/* free pmc memory without sending command to fw, as it will
|
|
* be reset on the way down anyway
|
|
* be reset on the way down anyway
|
|
*/
|
|
*/
|