master/rtdm.c
branchstable-1.5
changeset 2719 94c9657e0bee
parent 2713 2e2f57fd2131
child 2720 4645c990fd79
equal deleted inserted replaced
2718:137cdf41bcec 2719:94c9657e0bee
    47 
    47 
    48 /****************************************************************************/
    48 /****************************************************************************/
    49 
    49 
    50 int ec_rtdm_open(struct rtdm_fd *, int);
    50 int ec_rtdm_open(struct rtdm_fd *, int);
    51 void ec_rtdm_close(struct rtdm_fd *);
    51 void ec_rtdm_close(struct rtdm_fd *);
       
    52 int ec_rtdm_rt_ioctl(struct rtdm_fd *,
       
    53         unsigned int, void __user *);
    52 int ec_rtdm_ioctl(struct rtdm_fd *,
    54 int ec_rtdm_ioctl(struct rtdm_fd *,
    53         unsigned int, void __user *);
    55         unsigned int, void __user *);
    54 int ec_rtdm_mmap(struct rtdm_fd *fd, struct vm_area_struct *vma);
    56 int ec_rtdm_mmap(struct rtdm_fd *fd, struct vm_area_struct *vma);
    55 
    57 
    56 /****************************************************************************/
    58 /****************************************************************************/
    64 	.device_count		=	1,
    66 	.device_count		=	1,
    65 	.context_size		=	sizeof(ec_ioctl_context_t),
    67 	.context_size		=	sizeof(ec_ioctl_context_t),
    66 	.ops = {
    68 	.ops = {
    67         .open      = ec_rtdm_open,
    69         .open      = ec_rtdm_open,
    68         .close     = ec_rtdm_close,
    70         .close     = ec_rtdm_close,
    69         .ioctl_rt  = ec_rtdm_ioctl,
    71         .ioctl_rt  = ec_rtdm_rt_ioctl,
    70         .ioctl_nrt = ec_rtdm_ioctl,
    72         .ioctl_nrt = ec_rtdm_ioctl,
    71         .mmap      = ec_rtdm_mmap
    73         .mmap      = ec_rtdm_mmap
    72 	},
    74 	},
    73 };
    75 };
    74 
    76 
   190 
   192 
   191 /** Driver ioctl.
   193 /** Driver ioctl.
   192  *
   194  *
   193  * \return ioctl() return code.
   195  * \return ioctl() return code.
   194  */
   196  */
       
   197 int ec_rtdm_rt_ioctl(
       
   198         struct rtdm_fd *fd, /**< User data. */
       
   199         unsigned int request, /**< Request. */
       
   200         void __user *arg /**< Argument. */
       
   201         )
       
   202 {
       
   203     switch (request) {
       
   204         /*
       
   205             Requests to be handled directly in primary domain
       
   206         */
       
   207         case EC_IOCTL_SEND:
       
   208         case EC_IOCTL_RECEIVE:
       
   209         case EC_IOCTL_MASTER_STATE:
       
   210         case EC_IOCTL_DOMAIN_STATE:
       
   211         case EC_IOCTL_DOMAIN_PROCESS:
       
   212         case EC_IOCTL_DOMAIN_QUEUE:
       
   213             return ec_rtdm_ioctl(fd, request, arg);
       
   214         default:
       
   215             break;
       
   216     }
       
   217     /* When a call is not supposed to happen in primary domain,
       
   218        syscall catches -ENOSYS, then switch to secondary mode,
       
   219        and calls .ioctl_nrt */
       
   220     return -ENOSYS;
       
   221 }
       
   222 
   195 int ec_rtdm_ioctl(
   223 int ec_rtdm_ioctl(
   196         struct rtdm_fd *fd, /**< User data. */
   224         struct rtdm_fd *fd, /**< User data. */
   197         unsigned int request, /**< Request. */
   225         unsigned int request, /**< Request. */
   198         void __user *arg /**< Argument. */
   226         void __user *arg /**< Argument. */
   199         )
   227         )