in devices/rio_mport_cdev.c [1874:1933]
static int mport_cdev_open(struct inode *inode, struct file *filp)
{
int ret;
int minor = iminor(inode);
struct mport_dev *chdev;
struct mport_cdev_priv *priv;
/* Test for valid device */
if (minor >= RIO_MAX_MPORTS) {
rmcd_error("Invalid minor device number");
return -EINVAL;
}
chdev = container_of(inode->i_cdev, struct mport_dev, cdev);
rmcd_debug(INIT, "%s filp=%p", dev_name(&chdev->dev), filp);
if (atomic_read(&chdev->active) == 0)
return -ENODEV;
get_device(&chdev->dev);
priv = kzalloc(sizeof(*priv), GFP_KERNEL);
if (!priv) {
put_device(&chdev->dev);
return -ENOMEM;
}
priv->md = chdev;
mutex_lock(&chdev->file_mutex);
list_add_tail(&priv->list, &chdev->file_list);
mutex_unlock(&chdev->file_mutex);
INIT_LIST_HEAD(&priv->db_filters);
INIT_LIST_HEAD(&priv->pw_filters);
spin_lock_init(&priv->fifo_lock);
init_waitqueue_head(&priv->event_rx_wait);
ret = kfifo_alloc(&priv->event_fifo,
sizeof(struct rio_event) * MPORT_EVENT_DEPTH,
GFP_KERNEL);
if (ret < 0) {
dev_err(&chdev->dev, DRV_NAME ": kfifo_alloc failed\n");
ret = -ENOMEM;
goto err_fifo;
}
#ifdef CONFIG_RAPIDIO_DMA_ENGINE
INIT_LIST_HEAD(&priv->async_list);
spin_lock_init(&priv->req_lock);
mutex_init(&priv->dma_lock);
#endif
filp->private_data = priv;
goto out;
err_fifo:
kfree(priv);
out:
return ret;
}