--- 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;