master/cdev.c
changeset 1544 cfcaf46c5b3f
parent 1543 373cd456dc26
parent 1535 0c484ee12d89
child 1586 eb9185dfa8ac
equal deleted inserted replaced
1543:373cd456dc26 1544:cfcaf46c5b3f
   173     data.domain_count = ec_master_domain_count(master);
   173     data.domain_count = ec_master_domain_count(master);
   174 #ifdef EC_EOE
   174 #ifdef EC_EOE
   175     data.eoe_handler_count = ec_master_eoe_handler_count(master);
   175     data.eoe_handler_count = ec_master_eoe_handler_count(master);
   176 #endif
   176 #endif
   177     data.phase = (uint8_t) master->phase;
   177     data.phase = (uint8_t) master->phase;
       
   178     data.active = (uint8_t) master->active;
   178     data.scan_busy = master->scan_busy;
   179     data.scan_busy = master->scan_busy;
   179     up(&master->master_sem);
   180     up(&master->master_sem);
   180 
   181 
   181     if (down_interruptible(&master->device_sem))
   182     if (down_interruptible(&master->device_sem))
   182         return -EINTR;
   183         return -EINTR;
  1645     return 0;
  1646     return 0;
  1646 }
  1647 }
  1647 
  1648 
  1648 /*****************************************************************************/
  1649 /*****************************************************************************/
  1649 
  1650 
       
  1651 /** Deactivates the master.
       
  1652  */
       
  1653 int ec_cdev_ioctl_deactivate(
       
  1654         ec_master_t *master, /**< EtherCAT master. */
       
  1655         unsigned long arg, /**< ioctl() argument. */
       
  1656         ec_cdev_priv_t *priv /**< Private data structure of file handle. */
       
  1657         )
       
  1658 {
       
  1659     if (unlikely(!priv->requested))
       
  1660         return -EPERM;
       
  1661 
       
  1662     ecrt_master_deactivate(master);
       
  1663     return 0;
       
  1664 }
       
  1665 
       
  1666 /*****************************************************************************/
       
  1667 
  1650 /** Send frames.
  1668 /** Send frames.
  1651  */
  1669  */
  1652 int ec_cdev_ioctl_send(
  1670 int ec_cdev_ioctl_send(
  1653         ec_master_t *master, /**< EtherCAT master. */
  1671         ec_master_t *master, /**< EtherCAT master. */
  1654         unsigned long arg, /**< ioctl() argument. */
  1672         unsigned long arg, /**< ioctl() argument. */
  1762         return -EPERM;
  1780         return -EPERM;
  1763 
  1781 
  1764     down(&master->io_sem);
  1782     down(&master->io_sem);
  1765     ecrt_master_sync_slave_clocks(master);
  1783     ecrt_master_sync_slave_clocks(master);
  1766     up(&master->io_sem);
  1784     up(&master->io_sem);
       
  1785     return 0;
       
  1786 }
       
  1787 
       
  1788 /*****************************************************************************/
       
  1789 
       
  1790 /** Queue the sync monitoring datagram.
       
  1791  */
       
  1792 int ec_cdev_ioctl_sync_mon_queue(
       
  1793         ec_master_t *master, /**< EtherCAT master. */
       
  1794         unsigned long arg, /**< ioctl() argument. */
       
  1795         ec_cdev_priv_t *priv /**< Private data structure of file handle. */
       
  1796         )
       
  1797 {
       
  1798     if (unlikely(!priv->requested))
       
  1799         return -EPERM;
       
  1800 
       
  1801     down(&master->io_sem);
       
  1802     ecrt_master_sync_monitor_queue(master);
       
  1803     up(&master->io_sem);
       
  1804     return 0;
       
  1805 }
       
  1806 
       
  1807 /*****************************************************************************/
       
  1808 
       
  1809 /** Processes the sync monitoring datagram.
       
  1810  */
       
  1811 int ec_cdev_ioctl_sync_mon_process(
       
  1812         ec_master_t *master, /**< EtherCAT master. */
       
  1813         unsigned long arg, /**< ioctl() argument. */
       
  1814         ec_cdev_priv_t *priv /**< Private data structure of file handle. */
       
  1815         )
       
  1816 {
       
  1817     uint32_t time_diff;
       
  1818 
       
  1819     if (unlikely(!priv->requested))
       
  1820         return -EPERM;
       
  1821 
       
  1822     down(&master->io_sem);
       
  1823     time_diff = ecrt_master_sync_monitor_process(master);
       
  1824     up(&master->io_sem);
       
  1825 
       
  1826     if (copy_to_user((void __user *) arg, &time_diff, sizeof(time_diff)))
       
  1827         return -EFAULT;
       
  1828 
  1767     return 0;
  1829     return 0;
  1768 }
  1830 }
  1769 
  1831 
  1770 /*****************************************************************************/
  1832 /*****************************************************************************/
  1771 
  1833 
  3260             return ec_cdev_ioctl_create_slave_config(master, arg, priv);
  3322             return ec_cdev_ioctl_create_slave_config(master, arg, priv);
  3261         case EC_IOCTL_ACTIVATE:
  3323         case EC_IOCTL_ACTIVATE:
  3262             if (!(filp->f_mode & FMODE_WRITE))
  3324             if (!(filp->f_mode & FMODE_WRITE))
  3263                 return -EPERM;
  3325                 return -EPERM;
  3264             return ec_cdev_ioctl_activate(master, arg, priv);
  3326             return ec_cdev_ioctl_activate(master, arg, priv);
       
  3327         case EC_IOCTL_DEACTIVATE:
       
  3328             if (!(filp->f_mode & FMODE_WRITE))
       
  3329                 return -EPERM;
       
  3330             return ec_cdev_ioctl_deactivate(master, arg, priv);
  3265         case EC_IOCTL_SEND:
  3331         case EC_IOCTL_SEND:
  3266             if (!(filp->f_mode & FMODE_WRITE))
  3332             if (!(filp->f_mode & FMODE_WRITE))
  3267                 return -EPERM;
  3333                 return -EPERM;
  3268             return ec_cdev_ioctl_send(master, arg, priv);
  3334             return ec_cdev_ioctl_send(master, arg, priv);
  3269         case EC_IOCTL_RECEIVE:
  3335         case EC_IOCTL_RECEIVE:
  3282             return ec_cdev_ioctl_sync_ref(master, arg, priv);
  3348             return ec_cdev_ioctl_sync_ref(master, arg, priv);
  3283         case EC_IOCTL_SYNC_SLAVES:
  3349         case EC_IOCTL_SYNC_SLAVES:
  3284             if (!(filp->f_mode & FMODE_WRITE))
  3350             if (!(filp->f_mode & FMODE_WRITE))
  3285                 return -EPERM;
  3351                 return -EPERM;
  3286             return ec_cdev_ioctl_sync_slaves(master, arg, priv);
  3352             return ec_cdev_ioctl_sync_slaves(master, arg, priv);
       
  3353         case EC_IOCTL_SYNC_MON_QUEUE:
       
  3354             if (!(filp->f_mode & FMODE_WRITE))
       
  3355                 return -EPERM;
       
  3356             return ec_cdev_ioctl_sync_mon_queue(master, arg, priv);
       
  3357         case EC_IOCTL_SYNC_MON_PROCESS:
       
  3358             if (!(filp->f_mode & FMODE_WRITE))
       
  3359                 return -EPERM;
       
  3360             return ec_cdev_ioctl_sync_mon_process(master, arg, priv);
  3287         case EC_IOCTL_SC_SYNC:
  3361         case EC_IOCTL_SC_SYNC:
  3288             if (!(filp->f_mode & FMODE_WRITE))
  3362             if (!(filp->f_mode & FMODE_WRITE))
  3289                 return -EPERM;
  3363                 return -EPERM;
  3290             return ec_cdev_ioctl_sc_sync(master, arg, priv);
  3364             return ec_cdev_ioctl_sc_sync(master, arg, priv);
  3291         case EC_IOCTL_SC_WATCHDOG:
  3365         case EC_IOCTL_SC_WATCHDOG: