--- 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. */