master/cdev.c
changeset 1485 5ddc3a455059
parent 1465 3099d78343ea
child 1489 f77a1182b6f4
--- a/master/cdev.c	Fri Jun 26 08:00:47 2009 +0000
+++ b/master/cdev.c	Fri Jun 26 09:46:57 2009 +0000
@@ -42,6 +42,7 @@
 #include "master.h"
 #include "slave_config.h"
 #include "voe_handler.h"
+#include "ethernet.h"
 #include "ioctl.h"
 
 /** Set to 1 to enable ioctl() command debugging.
@@ -170,6 +171,7 @@
     data.slave_count = master->slave_count;
     data.config_count = ec_master_config_count(master);
     data.domain_count = ec_master_domain_count(master);
+    data.eoe_handler_count = ec_master_eoe_handler_count(master);
     data.phase = (uint8_t) master->phase;
     data.scan_busy = master->scan_busy;
     up(&master->master_sem);
@@ -1439,6 +1441,53 @@
 
 /*****************************************************************************/
 
+/** Get EoE handler information.
+ */
+int ec_cdev_ioctl_eoe_handler(
+        ec_master_t *master, /**< EtherCAT master. */
+        unsigned long arg /**< ioctl() argument. */
+        )
+{
+    ec_ioctl_eoe_handler_t data;
+	const ec_eoe_t *eoe;
+
+    if (copy_from_user(&data, (void __user *) arg, sizeof(data))) {
+        return -EFAULT;
+    }
+
+    if (down_interruptible(&master->master_sem))
+        return -EINTR;
+
+    if (!(eoe = ec_master_get_eoe_handler_const(master, data.eoe_index))) {
+        up(&master->master_sem);
+        EC_ERR("EoE handler %u does not exist!\n", data.eoe_index);
+        return -EINVAL;
+    }
+
+	if (eoe->slave) {
+		data.slave_position = eoe->slave->ring_position;
+	} else {
+		data.slave_position = 0xffff;
+	}
+	snprintf(data.name, EC_DATAGRAM_NAME_SIZE, eoe->dev->name);
+    data.open = eoe->opened;
+    data.rx_bytes = eoe->stats.tx_bytes;
+    data.rx_rate = eoe->tx_rate;
+    data.tx_bytes = eoe->stats.rx_bytes;
+    data.tx_rate = eoe->tx_rate;
+    data.tx_queued_frames = eoe->tx_queued_frames;
+    data.tx_queue_size = eoe->tx_queue_size;
+
+    up(&master->master_sem);
+
+    if (copy_to_user((void __user *) arg, &data, sizeof(data)))
+        return -EFAULT;
+
+    return 0;
+}
+
+/*****************************************************************************/
+
 /** Request the master from userspace.
  */
 int ec_cdev_ioctl_request(
@@ -3133,6 +3182,8 @@
             return ec_cdev_ioctl_config_pdo_entry(master, arg);
         case EC_IOCTL_CONFIG_SDO:
             return ec_cdev_ioctl_config_sdo(master, arg);
+        case EC_IOCTL_EOE_HANDLER:
+            return ec_cdev_ioctl_eoe_handler(master, arg);
         case EC_IOCTL_REQUEST:
             if (!(filp->f_mode & FMODE_WRITE))
 				return -EPERM;