diff options
Diffstat (limited to 'drivers/infiniband/core/ucma.c')
| -rw-r--r-- | drivers/infiniband/core/ucma.c | 35 | 
1 files changed, 28 insertions, 7 deletions
diff --git a/drivers/infiniband/core/ucma.c b/drivers/infiniband/core/ucma.c index b3fa798525b..71be5eebd68 100644 --- a/drivers/infiniband/core/ucma.c +++ b/drivers/infiniband/core/ucma.c @@ -367,13 +367,28 @@ done:  	return ret;  } -static ssize_t ucma_create_id(struct ucma_file *file, -				const char __user *inbuf, -				int in_len, int out_len) +static int ucma_get_qp_type(struct rdma_ucm_create_id *cmd, enum ib_qp_type *qp_type) +{ +	switch (cmd->ps) { +	case RDMA_PS_TCP: +		*qp_type = IB_QPT_RC; +		return 0; +	case RDMA_PS_UDP: +	case RDMA_PS_IPOIB: +		*qp_type = IB_QPT_UD; +		return 0; +	default: +		return -EINVAL; +	} +} + +static ssize_t ucma_create_id(struct ucma_file *file, const char __user *inbuf, +			      int in_len, int out_len)  {  	struct rdma_ucm_create_id cmd;  	struct rdma_ucm_create_id_resp resp;  	struct ucma_context *ctx; +	enum ib_qp_type qp_type;  	int ret;  	if (out_len < sizeof(resp)) @@ -382,6 +397,10 @@ static ssize_t ucma_create_id(struct ucma_file *file,  	if (copy_from_user(&cmd, inbuf, sizeof(cmd)))  		return -EFAULT; +	ret = ucma_get_qp_type(&cmd, &qp_type); +	if (ret) +		return ret; +  	mutex_lock(&file->mut);  	ctx = ucma_alloc_ctx(file);  	mutex_unlock(&file->mut); @@ -389,7 +408,7 @@ static ssize_t ucma_create_id(struct ucma_file *file,  		return -ENOMEM;  	ctx->uid = cmd.uid; -	ctx->cm_id = rdma_create_id(ucma_event_handler, ctx, cmd.ps); +	ctx->cm_id = rdma_create_id(ucma_event_handler, ctx, cmd.ps, qp_type);  	if (IS_ERR(ctx->cm_id)) {  		ret = PTR_ERR(ctx->cm_id);  		goto err1; @@ -1338,9 +1357,11 @@ static const struct file_operations ucma_fops = {  };  static struct miscdevice ucma_misc = { -	.minor	= MISC_DYNAMIC_MINOR, -	.name	= "rdma_cm", -	.fops	= &ucma_fops, +	.minor		= MISC_DYNAMIC_MINOR, +	.name		= "rdma_cm", +	.nodename	= "infiniband/rdma_cm", +	.mode		= 0666, +	.fops		= &ucma_fops,  };  static ssize_t show_abi_version(struct device *dev,  |