master/cdev.c
changeset 1244 0b70040d3daa
parent 1242 632a6b91f8e4
child 1246 4042bda8c980
--- a/master/cdev.c	Thu Oct 02 07:14:00 2008 +0000
+++ b/master/cdev.c	Thu Oct 02 10:19:02 2008 +0000
@@ -1373,22 +1373,41 @@
         ec_cdev_priv_t *priv /**< Private data structure of file handle. */
         )
 {
-    ec_ioctl_request_t data;
+	ec_master_t *m;
     int ret = 0;
 
-    data.handle = ecrt_request_master(master->index);
-
-    if (IS_ERR(data.handle)) {
-        ret = PTR_ERR(data.handle);
+    m = ecrt_request_master(master->index);
+    if (IS_ERR(m)) {
+        ret = PTR_ERR(m);
     } else {
         priv->requested = 1;
-        if (copy_to_user((void __user *) arg, &data, sizeof(data)))
-            ret = -EFAULT;
     }
 
     return ret;
 }
 
+/*****************************************************************************/
+
+/** Create a domain.
+ */
+int ec_cdev_ioctl_create_domain(
+        ec_master_t *master, /**< EtherCAT master. */
+        unsigned long arg, /**< ioctl() argument. */
+        ec_cdev_priv_t *priv /**< Private data structure of file handle. */
+        )
+{
+    ec_domain_t *domain;
+
+	if (unlikely(!priv->requested))
+		return -EPERM;
+
+    domain = ecrt_master_create_domain(master);
+    if (!domain)
+        return -ENOMEM;
+
+    return domain->index;
+}
+
 /******************************************************************************
  * File operations
  *****************************************************************************/
@@ -1506,6 +1525,10 @@
             if (!(filp->f_mode & FMODE_WRITE))
 				return -EPERM;
 			return ec_cdev_ioctl_request(master, arg, priv);
+        case EC_IOCTL_CREATE_DOMAIN:
+            if (!(filp->f_mode & FMODE_WRITE))
+				return -EPERM;
+			return ec_cdev_ioctl_create_domain(master, arg, priv);
         default:
             return -ENOTTY;
     }