master/cdev.c
changeset 1509 a864688e7de5
parent 1507 68e89abadd19
child 1513 60ca68d853b8
--- a/master/cdev.c	Mon Jul 27 10:44:16 2009 +0000
+++ b/master/cdev.c	Mon Jul 27 10:48:52 2009 +0000
@@ -1759,7 +1759,7 @@
 
 /*****************************************************************************/
 
-/** Set the direction of a sync manager.
+/** Configure a sync manager.
  */
 int ec_cdev_ioctl_sc_sync(
         ec_master_t *master, /**< EtherCAT master. */
@@ -1793,9 +1793,9 @@
     }
 
     for (i = 0; i < EC_MAX_SYNC_MANAGERS; i++) {
-        ec_direction_t dir = data.syncs[i].dir;
-        if (dir == EC_DIR_INPUT || dir == EC_DIR_OUTPUT) {
-            if (ecrt_slave_config_sync_manager(sc, i, dir)) {
+        if (data.syncs[i].config_this) {
+            if (ecrt_slave_config_sync_manager(sc, i, data.syncs[i].dir,
+                        data.syncs[i].watchdog_mode)) {
                 ret = -EINVAL;
                 goto out_up;
             }
@@ -1810,6 +1810,49 @@
 
 /*****************************************************************************/
 
+/** Configure a slave's watchdogs.
+ */
+int ec_cdev_ioctl_sc_watchdog(
+        ec_master_t *master, /**< EtherCAT master. */
+        unsigned long arg, /**< ioctl() argument. */
+        ec_cdev_priv_t *priv /**< Private data structure of file handle. */
+        )
+{
+    ec_ioctl_config_t data;
+    ec_slave_config_t *sc;
+    int ret = 0;
+
+    if (unlikely(!priv->requested)) {
+        ret = -EPERM;
+        goto out_return;
+    }
+
+    if (copy_from_user(&data, (void __user *) arg, sizeof(data))) {
+        ret = -EFAULT;
+        goto out_return;
+    }
+
+    if (down_interruptible(&master->master_sem)) {
+        ret = -EINTR;
+        goto out_return;
+    }
+
+    if (!(sc = ec_master_get_config(master, data.config_index))) {
+        ret = -ENOENT;
+        goto out_up;
+    }
+
+    ecrt_slave_config_watchdog(sc,
+            data.watchdog_divider, data.watchdog_intervals);
+
+out_up:
+    up(&master->master_sem);
+out_return:
+    return ret;
+}
+
+/*****************************************************************************/
+
 /** Add a PDO to the assignment.
  */
 int ec_cdev_ioctl_sc_add_pdo(
@@ -3229,6 +3272,10 @@
             if (!(filp->f_mode & FMODE_WRITE))
                 return -EPERM;
             return ec_cdev_ioctl_sc_sync(master, arg, priv);
+        case EC_IOCTL_SC_WATCHDOG:
+            if (!(filp->f_mode & FMODE_WRITE))
+                return -EPERM;
+            return ec_cdev_ioctl_sc_watchdog(master, arg, priv);
         case EC_IOCTL_SC_ADD_PDO:
             if (!(filp->f_mode & FMODE_WRITE))
                 return -EPERM;