diff -r 1c9151455b65 -r 5ddc3a455059 master/cdev.c --- 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;