diff options
| author | Mark Brown <[email protected]> | 2015-10-12 18:09:27 +0100 | 
|---|---|---|
| committer | Mark Brown <[email protected]> | 2015-10-12 18:09:27 +0100 | 
| commit | 79828b4fa835f73cdaf4bffa48696abdcbea9d02 (patch) | |
| tree | 5e0fa7156acb75ba603022bc807df8f2fedb97a8 /drivers/misc/cxl/file.c | |
| parent | 721b51fcf91898299d96f4b72cb9434cda29dce6 (diff) | |
| parent | 8c1a9d6323abf0fb1e5dad96cf3f1c783505ea5a (diff) | |
Merge remote-tracking branch 'asoc/fix/rt5645' into asoc-fix-rt5645
Diffstat (limited to 'drivers/misc/cxl/file.c')
| -rw-r--r-- | drivers/misc/cxl/file.c | 27 | 
1 files changed, 24 insertions, 3 deletions
diff --git a/drivers/misc/cxl/file.c b/drivers/misc/cxl/file.c index e3f4b69527a9..a30bf285b5bd 100644 --- a/drivers/misc/cxl/file.c +++ b/drivers/misc/cxl/file.c @@ -73,6 +73,11 @@ static int __afu_open(struct inode *inode, struct file *file, bool master)  	if (!afu->current_mode)  		goto err_put_afu; +	if (!cxl_adapter_link_ok(adapter)) { +		rc = -EIO; +		goto err_put_afu; +	} +  	if (!(ctx = cxl_context_alloc())) {  		rc = -ENOMEM;  		goto err_put_afu; @@ -179,6 +184,8 @@ static long afu_ioctl_start_work(struct cxl_context *ctx,  	if (work.flags & CXL_START_WORK_AMR)  		amr = work.amr & mfspr(SPRN_UAMOR); +	ctx->mmio_err_ff = !!(work.flags & CXL_START_WORK_ERR_FF); +  	/*  	 * We grab the PID here and not in the file open to allow for the case  	 * where a process (master, some daemon, etc) has opened the chardev on @@ -238,6 +245,9 @@ long afu_ioctl(struct file *file, unsigned int cmd, unsigned long arg)  	if (ctx->status == CLOSED)  		return -EIO; +	if (!cxl_adapter_link_ok(ctx->afu->adapter)) +		return -EIO; +  	pr_devel("afu_ioctl\n");  	switch (cmd) {  	case CXL_IOCTL_START_WORK: @@ -251,7 +261,7 @@ long afu_ioctl(struct file *file, unsigned int cmd, unsigned long arg)  	return -EINVAL;  } -long afu_compat_ioctl(struct file *file, unsigned int cmd, +static long afu_compat_ioctl(struct file *file, unsigned int cmd,  			     unsigned long arg)  {  	return afu_ioctl(file, cmd, arg); @@ -265,6 +275,9 @@ int afu_mmap(struct file *file, struct vm_area_struct *vm)  	if (ctx->status != STARTED)  		return -EIO; +	if (!cxl_adapter_link_ok(ctx->afu->adapter)) +		return -EIO; +  	return cxl_context_iomap(ctx, vm);  } @@ -309,6 +322,9 @@ ssize_t afu_read(struct file *file, char __user *buf, size_t count,  	int rc;  	DEFINE_WAIT(wait); +	if (!cxl_adapter_link_ok(ctx->afu->adapter)) +		return -EIO; +  	if (count < CXL_READ_MIN_SIZE)  		return -EINVAL; @@ -319,6 +335,11 @@ ssize_t afu_read(struct file *file, char __user *buf, size_t count,  		if (ctx_event_pending(ctx))  			break; +		if (!cxl_adapter_link_ok(ctx->afu->adapter)) { +			rc = -EIO; +			goto out; +		} +  		if (file->f_flags & O_NONBLOCK) {  			rc = -EAGAIN;  			goto out; @@ -396,7 +417,7 @@ const struct file_operations afu_fops = {  	.mmap           = afu_mmap,  }; -const struct file_operations afu_master_fops = { +static const struct file_operations afu_master_fops = {  	.owner		= THIS_MODULE,  	.open           = afu_master_open,  	.poll		= afu_poll, @@ -519,7 +540,7 @@ int __init cxl_file_init(void)  	 * If these change we really need to update API.  Either change some  	 * flags or update API version number CXL_API_VERSION.  	 */ -	BUILD_BUG_ON(CXL_API_VERSION != 1); +	BUILD_BUG_ON(CXL_API_VERSION != 2);  	BUILD_BUG_ON(sizeof(struct cxl_ioctl_start_work) != 64);  	BUILD_BUG_ON(sizeof(struct cxl_event_header) != 8);  	BUILD_BUG_ON(sizeof(struct cxl_event_afu_interrupt) != 8);  |