in rio_cm.c [1778:1827]
static int cm_chan_connect(void __user *arg)
{
struct rio_cm_channel chan;
struct cm_dev *cm;
struct cm_peer *peer;
int ret = -ENODEV;
if (copy_from_user(&chan, arg, sizeof(chan)))
return -EFAULT;
if (chan.mport_id >= RIO_MAX_MPORTS)
return -EINVAL;
down_read(&rdev_sem);
/* Find matching cm_dev object */
list_for_each_entry(cm, &cm_dev_list, list) {
if (cm->mport->id == chan.mport_id) {
ret = 0;
break;
}
}
if (ret)
goto err_out;
if (chan.remote_destid >= RIO_ANY_DESTID(cm->mport->sys_size)) {
ret = -EINVAL;
goto err_out;
}
/* Find corresponding RapidIO endpoint device object */
ret = -ENODEV;
list_for_each_entry(peer, &cm->peers, node) {
if (peer->rdev->destid == chan.remote_destid) {
ret = 0;
break;
}
}
if (ret)
goto err_out;
up_read(&rdev_sem);
return riocm_ch_connect(chan.id, cm, peer, chan.remote_channel);
err_out:
up_read(&rdev_sem);
return ret;
}