diff options
Diffstat (limited to 'drivers/misc/mei/debugfs.c')
| -rw-r--r-- | drivers/misc/mei/debugfs.c | 58 | 
1 files changed, 56 insertions, 2 deletions
diff --git a/drivers/misc/mei/debugfs.c b/drivers/misc/mei/debugfs.c index e3870f22d23..ced5b777c70 100644 --- a/drivers/misc/mei/debugfs.c +++ b/drivers/misc/mei/debugfs.c @@ -43,7 +43,7 @@ static ssize_t mei_dbgfs_read_meclients(struct file *fp, char __user *ubuf,  	mutex_lock(&dev->device_lock); -	/*  if the driver is not enabled the list won't b consitent */ +	/*  if the driver is not enabled the list won't be consistent */  	if (dev->dev_state != MEI_DEV_ENABLED)  		goto out; @@ -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)  { @@ -101,7 +149,7 @@ static const struct file_operations mei_dbgfs_fops_devstate = {  /**   * mei_dbgfs_deregister - Remove the debugfs files and directories - * @mei - pointer to mei device private dat + * @mei - pointer to mei device private data   */  void mei_dbgfs_deregister(struct mei_device *dev)  { @@ -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) {  | 
