|
@@ -171,6 +171,8 @@ static void wil_print_ring(struct seq_file *s, const char *prefix,
|
|
|
int rsize;
|
|
|
uint i;
|
|
|
|
|
|
+ wil_halp_vote(wil);
|
|
|
+
|
|
|
wil_memcpy_fromio_32(&r, off, sizeof(r));
|
|
|
wil_mbox_ring_le2cpus(&r);
|
|
|
/*
|
|
@@ -236,6 +238,7 @@ static void wil_print_ring(struct seq_file *s, const char *prefix,
|
|
|
}
|
|
|
out:
|
|
|
seq_puts(s, "}\n");
|
|
|
+ wil_halp_unvote(wil);
|
|
|
}
|
|
|
|
|
|
static int wil_mbox_debugfs_show(struct seq_file *s, void *data)
|
|
@@ -500,9 +503,9 @@ static ssize_t wil_read_file_ioblob(struct file *file, char __user *user_buf,
|
|
|
size_t count, loff_t *ppos)
|
|
|
{
|
|
|
enum { max_count = 4096 };
|
|
|
- struct debugfs_blob_wrapper *blob = file->private_data;
|
|
|
+ struct wil_blob_wrapper *wil_blob = file->private_data;
|
|
|
loff_t pos = *ppos;
|
|
|
- size_t available = blob->size;
|
|
|
+ size_t available = wil_blob->blob.size;
|
|
|
void *buf;
|
|
|
size_t ret;
|
|
|
|
|
@@ -521,8 +524,9 @@ static ssize_t wil_read_file_ioblob(struct file *file, char __user *user_buf,
|
|
|
if (!buf)
|
|
|
return -ENOMEM;
|
|
|
|
|
|
- wil_memcpy_fromio_32(buf, (const volatile void __iomem *)blob->data +
|
|
|
- pos, count);
|
|
|
+ wil_memcpy_fromio_halp_vote(wil_blob->wil, buf,
|
|
|
+ (const volatile void __iomem *)
|
|
|
+ wil_blob->blob.data + pos, count);
|
|
|
|
|
|
ret = copy_to_user(user_buf, buf, count);
|
|
|
kfree(buf);
|
|
@@ -545,9 +549,9 @@ static
|
|
|
struct dentry *wil_debugfs_create_ioblob(const char *name,
|
|
|
umode_t mode,
|
|
|
struct dentry *parent,
|
|
|
- struct debugfs_blob_wrapper *blob)
|
|
|
+ struct wil_blob_wrapper *wil_blob)
|
|
|
{
|
|
|
- return debugfs_create_file(name, mode, parent, blob, &fops_ioblob);
|
|
|
+ return debugfs_create_file(name, mode, parent, wil_blob, &fops_ioblob);
|
|
|
}
|
|
|
|
|
|
/*---reset---*/
|
|
@@ -1437,6 +1441,118 @@ static const struct file_operations fops_sta = {
|
|
|
.llseek = seq_lseek,
|
|
|
};
|
|
|
|
|
|
+static ssize_t wil_read_file_led_cfg(struct file *file, char __user *user_buf,
|
|
|
+ size_t count, loff_t *ppos)
|
|
|
+{
|
|
|
+ char buf[80];
|
|
|
+ int n;
|
|
|
+
|
|
|
+ n = snprintf(buf, sizeof(buf),
|
|
|
+ "led_id is set to %d, echo 1 to enable, 0 to disable\n",
|
|
|
+ led_id);
|
|
|
+
|
|
|
+ n = min_t(int, n, sizeof(buf));
|
|
|
+
|
|
|
+ return simple_read_from_buffer(user_buf, count, ppos,
|
|
|
+ buf, n);
|
|
|
+}
|
|
|
+
|
|
|
+static ssize_t wil_write_file_led_cfg(struct file *file,
|
|
|
+ const char __user *buf_,
|
|
|
+ size_t count, loff_t *ppos)
|
|
|
+{
|
|
|
+ struct wil6210_priv *wil = file->private_data;
|
|
|
+ int val;
|
|
|
+ int rc;
|
|
|
+
|
|
|
+ rc = kstrtoint_from_user(buf_, count, 0, &val);
|
|
|
+ if (rc) {
|
|
|
+ wil_err(wil, "Invalid argument\n");
|
|
|
+ return rc;
|
|
|
+ }
|
|
|
+
|
|
|
+ wil_info(wil, "%s led %d\n", val ? "Enabling" : "Disabling", led_id);
|
|
|
+ rc = wmi_led_cfg(wil, val);
|
|
|
+ if (rc) {
|
|
|
+ wil_info(wil, "%s led %d failed\n",
|
|
|
+ val ? "Enabling" : "Disabling", led_id);
|
|
|
+ return rc;
|
|
|
+ }
|
|
|
+
|
|
|
+ return count;
|
|
|
+}
|
|
|
+
|
|
|
+static const struct file_operations fops_led_cfg = {
|
|
|
+ .read = wil_read_file_led_cfg,
|
|
|
+ .write = wil_write_file_led_cfg,
|
|
|
+ .open = simple_open,
|
|
|
+};
|
|
|
+
|
|
|
+/* led_blink_time, write:
|
|
|
+ * "<blink_on_slow> <blink_off_slow> <blink_on_med> <blink_off_med> <blink_on_fast> <blink_off_fast>
|
|
|
+ */
|
|
|
+static ssize_t wil_write_led_blink_time(struct file *file,
|
|
|
+ const char __user *buf,
|
|
|
+ size_t len, loff_t *ppos)
|
|
|
+{
|
|
|
+ int rc;
|
|
|
+ char *kbuf = kmalloc(len + 1, GFP_KERNEL);
|
|
|
+
|
|
|
+ if (!kbuf)
|
|
|
+ return -ENOMEM;
|
|
|
+
|
|
|
+ rc = simple_write_to_buffer(kbuf, len, ppos, buf, len);
|
|
|
+ if (rc != len) {
|
|
|
+ kfree(kbuf);
|
|
|
+ return rc >= 0 ? -EIO : rc;
|
|
|
+ }
|
|
|
+
|
|
|
+ kbuf[len] = '\0';
|
|
|
+ rc = sscanf(kbuf, "%d %d %d %d %d %d",
|
|
|
+ &led_blink_time[WIL_LED_TIME_SLOW].on_ms,
|
|
|
+ &led_blink_time[WIL_LED_TIME_SLOW].off_ms,
|
|
|
+ &led_blink_time[WIL_LED_TIME_MED].on_ms,
|
|
|
+ &led_blink_time[WIL_LED_TIME_MED].off_ms,
|
|
|
+ &led_blink_time[WIL_LED_TIME_FAST].on_ms,
|
|
|
+ &led_blink_time[WIL_LED_TIME_FAST].off_ms);
|
|
|
+ kfree(kbuf);
|
|
|
+
|
|
|
+ if (rc < 0)
|
|
|
+ return rc;
|
|
|
+ if (rc < 6)
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ return len;
|
|
|
+}
|
|
|
+
|
|
|
+static ssize_t wil_read_led_blink_time(struct file *file, char __user *user_buf,
|
|
|
+ size_t count, loff_t *ppos)
|
|
|
+{
|
|
|
+ static char text[400];
|
|
|
+
|
|
|
+ snprintf(text, sizeof(text),
|
|
|
+ "To set led blink on/off time variables write:\n"
|
|
|
+ "<blink_on_slow> <blink_off_slow> <blink_on_med> "
|
|
|
+ "<blink_off_med> <blink_on_fast> <blink_off_fast>\n"
|
|
|
+ "The current values are:\n"
|
|
|
+ "%d %d %d %d %d %d\n",
|
|
|
+ led_blink_time[WIL_LED_TIME_SLOW].on_ms,
|
|
|
+ led_blink_time[WIL_LED_TIME_SLOW].off_ms,
|
|
|
+ led_blink_time[WIL_LED_TIME_MED].on_ms,
|
|
|
+ led_blink_time[WIL_LED_TIME_MED].off_ms,
|
|
|
+ led_blink_time[WIL_LED_TIME_FAST].on_ms,
|
|
|
+ led_blink_time[WIL_LED_TIME_FAST].off_ms);
|
|
|
+
|
|
|
+ return simple_read_from_buffer(user_buf, count, ppos, text,
|
|
|
+ sizeof(text));
|
|
|
+}
|
|
|
+
|
|
|
+static const struct file_operations fops_led_blink_time = {
|
|
|
+ .read = wil_read_led_blink_time,
|
|
|
+ .write = wil_write_led_blink_time,
|
|
|
+ .open = simple_open,
|
|
|
+};
|
|
|
+
|
|
|
/*----------------*/
|
|
|
static void wil6210_debugfs_init_blobs(struct wil6210_priv *wil,
|
|
|
struct dentry *dbg)
|
|
@@ -1445,16 +1561,18 @@ static void wil6210_debugfs_init_blobs(struct wil6210_priv *wil,
|
|
|
char name[32];
|
|
|
|
|
|
for (i = 0; i < ARRAY_SIZE(fw_mapping); i++) {
|
|
|
- struct debugfs_blob_wrapper *blob = &wil->blobs[i];
|
|
|
+ struct wil_blob_wrapper *wil_blob = &wil->blobs[i];
|
|
|
+ struct debugfs_blob_wrapper *blob = &wil_blob->blob;
|
|
|
const struct fw_map *map = &fw_mapping[i];
|
|
|
|
|
|
if (!map->name)
|
|
|
continue;
|
|
|
|
|
|
+ wil_blob->wil = wil;
|
|
|
blob->data = (void * __force)wil->csr + HOSTADDR(map->host);
|
|
|
blob->size = map->to - map->from;
|
|
|
snprintf(name, sizeof(name), "blob_%s", map->name);
|
|
|
- wil_debugfs_create_ioblob(name, S_IRUGO, dbg, blob);
|
|
|
+ wil_debugfs_create_ioblob(name, S_IRUGO, dbg, wil_blob);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -1483,6 +1601,8 @@ static const struct {
|
|
|
{"link", S_IRUGO, &fops_link},
|
|
|
{"info", S_IRUGO, &fops_info},
|
|
|
{"recovery", S_IRUGO | S_IWUSR, &fops_recovery},
|
|
|
+ {"led_cfg", S_IRUGO | S_IWUSR, &fops_led_cfg},
|
|
|
+ {"led_blink_time", S_IRUGO | S_IWUSR, &fops_led_blink_time},
|
|
|
};
|
|
|
|
|
|
static void wil6210_debugfs_init_files(struct wil6210_priv *wil,
|
|
@@ -1545,6 +1665,7 @@ static const struct dbg_off dbg_statics[] = {
|
|
|
{"mem_addr", S_IRUGO | S_IWUSR, (ulong)&mem_addr, doff_u32},
|
|
|
{"vring_idle_trsh", S_IRUGO | S_IWUSR, (ulong)&vring_idle_trsh,
|
|
|
doff_u32},
|
|
|
+ {"led_polarity", S_IRUGO | S_IWUSR, (ulong)&led_polarity, doff_u8},
|
|
|
{},
|
|
|
};
|
|
|
|