mei: export active connections to debugfs
authorTomas Winkler <tomas.winkler@intel.com>
Tue, 14 Jan 2014 21:21:41 +0000 (23:21 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 7 Feb 2014 23:09:35 +0000 (15:09 -0800)
Export active connection state to debugfs
The information displayed is [me,host] id pair,
client connection state, and client's read and write states

Signed-off-by: Tomas Winkler <tomas.winkler@intel.com>
Reviewed-by: Alexander Usyskin <alexander.usyskin@intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/misc/mei/debugfs.c

index a3ae154444b2e81d60066ef4a1aefe70f7b51cc4..ced5b777c70fde3926df4c8e5ae2329d326e185c 100644 (file)
@@ -75,6 +75,54 @@ static const struct file_operations mei_dbgfs_fops_meclients = {
        .llseek = generic_file_llseek,
 };
 
+static ssize_t mei_dbgfs_read_active(struct file *fp, char __user *ubuf,
+                                       size_t cnt, loff_t *ppos)
+{
+       struct mei_device *dev = fp->private_data;
+       struct mei_cl *cl;
+       const size_t bufsz = 1024;
+       char *buf;
+       int i = 0;
+       int pos = 0;
+       int ret;
+
+       if (!dev)
+               return -ENODEV;
+
+       buf = kzalloc(bufsz, GFP_KERNEL);
+       if  (!buf)
+               return -ENOMEM;
+
+       pos += scnprintf(buf + pos, bufsz - pos,
+                       "  |me|host|state|rd|wr|\n");
+
+       mutex_lock(&dev->device_lock);
+
+       /*  if the driver is not enabled the list won't b consitent */
+       if (dev->dev_state != MEI_DEV_ENABLED)
+               goto out;
+
+       list_for_each_entry(cl, &dev->file_list, link) {
+
+               pos += scnprintf(buf + pos, bufsz - pos,
+                       "%2d|%2d|%4d|%5d|%2d|%2d|\n",
+                       i, cl->me_client_id, cl->host_client_id, cl->state,
+                       cl->reading_state, cl->writing_state);
+               i++;
+       }
+out:
+       mutex_unlock(&dev->device_lock);
+       ret = simple_read_from_buffer(ubuf, cnt, ppos, buf, pos);
+       kfree(buf);
+       return ret;
+}
+
+static const struct file_operations mei_dbgfs_fops_active = {
+       .open = simple_open,
+       .read = mei_dbgfs_read_active,
+       .llseek = generic_file_llseek,
+};
+
 static ssize_t mei_dbgfs_read_devstate(struct file *fp, char __user *ubuf,
                                        size_t cnt, loff_t *ppos)
 {
@@ -128,6 +176,12 @@ int mei_dbgfs_register(struct mei_device *dev, const char *name)
                dev_err(&dev->pdev->dev, "meclients: registration failed\n");
                goto err;
        }
+       f = debugfs_create_file("active", S_IRUSR, dir,
+                               dev, &mei_dbgfs_fops_active);
+       if (!f) {
+               dev_err(&dev->pdev->dev, "meclients: registration failed\n");
+               goto err;
+       }
        f = debugfs_create_file("devstate", S_IRUSR, dir,
                                dev, &mei_dbgfs_fops_devstate);
        if (!f) {