master/rtdm.c
branchstable-1.5
changeset 2719 94c9657e0bee
parent 2713 2e2f57fd2131
child 2720 4645c990fd79
--- a/master/rtdm.c	Mon Oct 01 22:05:31 2018 +0200
+++ b/master/rtdm.c	Fri Oct 05 01:26:51 2018 +0200
@@ -49,6 +49,8 @@
 
 int ec_rtdm_open(struct rtdm_fd *, int);
 void ec_rtdm_close(struct rtdm_fd *);
+int ec_rtdm_rt_ioctl(struct rtdm_fd *,
+        unsigned int, void __user *);
 int ec_rtdm_ioctl(struct rtdm_fd *,
         unsigned int, void __user *);
 int ec_rtdm_mmap(struct rtdm_fd *fd, struct vm_area_struct *vma);
@@ -66,7 +68,7 @@
 	.ops = {
         .open      = ec_rtdm_open,
         .close     = ec_rtdm_close,
-        .ioctl_rt  = ec_rtdm_ioctl,
+        .ioctl_rt  = ec_rtdm_rt_ioctl,
         .ioctl_nrt = ec_rtdm_ioctl,
         .mmap      = ec_rtdm_mmap
 	},
@@ -192,6 +194,32 @@
  *
  * \return ioctl() return code.
  */
+int ec_rtdm_rt_ioctl(
+        struct rtdm_fd *fd, /**< User data. */
+        unsigned int request, /**< Request. */
+        void __user *arg /**< Argument. */
+        )
+{
+    switch (request) {
+        /*
+            Requests to be handled directly in primary domain
+        */
+        case EC_IOCTL_SEND:
+        case EC_IOCTL_RECEIVE:
+        case EC_IOCTL_MASTER_STATE:
+        case EC_IOCTL_DOMAIN_STATE:
+        case EC_IOCTL_DOMAIN_PROCESS:
+        case EC_IOCTL_DOMAIN_QUEUE:
+            return ec_rtdm_ioctl(fd, request, arg);
+        default:
+            break;
+    }
+    /* When a call is not supposed to happen in primary domain,
+       syscall catches -ENOSYS, then switch to secondary mode,
+       and calls .ioctl_nrt */
+    return -ENOSYS;
+}
+
 int ec_rtdm_ioctl(
         struct rtdm_fd *fd, /**< User data. */
         unsigned int request, /**< Request. */