master/cdev.c
changeset 1485 5ddc3a455059
parent 1465 3099d78343ea
child 1489 f77a1182b6f4
equal deleted inserted replaced
1484:1c9151455b65 1485:5ddc3a455059
    40 
    40 
    41 #include "cdev.h"
    41 #include "cdev.h"
    42 #include "master.h"
    42 #include "master.h"
    43 #include "slave_config.h"
    43 #include "slave_config.h"
    44 #include "voe_handler.h"
    44 #include "voe_handler.h"
       
    45 #include "ethernet.h"
    45 #include "ioctl.h"
    46 #include "ioctl.h"
    46 
    47 
    47 /** Set to 1 to enable ioctl() command debugging.
    48 /** Set to 1 to enable ioctl() command debugging.
    48  */
    49  */
    49 #define DEBUG_IOCTL 0
    50 #define DEBUG_IOCTL 0
   168     if (down_interruptible(&master->master_sem))
   169     if (down_interruptible(&master->master_sem))
   169         return -EINTR;
   170         return -EINTR;
   170     data.slave_count = master->slave_count;
   171     data.slave_count = master->slave_count;
   171     data.config_count = ec_master_config_count(master);
   172     data.config_count = ec_master_config_count(master);
   172     data.domain_count = ec_master_domain_count(master);
   173     data.domain_count = ec_master_domain_count(master);
       
   174     data.eoe_handler_count = ec_master_eoe_handler_count(master);
   173     data.phase = (uint8_t) master->phase;
   175     data.phase = (uint8_t) master->phase;
   174     data.scan_busy = master->scan_busy;
   176     data.scan_busy = master->scan_busy;
   175     up(&master->master_sem);
   177     up(&master->master_sem);
   176 
   178 
   177     if (down_interruptible(&master->device_sem))
   179     if (down_interruptible(&master->device_sem))
  1426 
  1428 
  1427     data.index = req->index;
  1429     data.index = req->index;
  1428     data.subindex = req->subindex;
  1430     data.subindex = req->subindex;
  1429     data.size = req->data_size;
  1431     data.size = req->data_size;
  1430     memcpy(&data.data, req->data, min((u32) data.size, (u32) 4));
  1432     memcpy(&data.data, req->data, min((u32) data.size, (u32) 4));
       
  1433 
       
  1434     up(&master->master_sem);
       
  1435 
       
  1436     if (copy_to_user((void __user *) arg, &data, sizeof(data)))
       
  1437         return -EFAULT;
       
  1438 
       
  1439     return 0;
       
  1440 }
       
  1441 
       
  1442 /*****************************************************************************/
       
  1443 
       
  1444 /** Get EoE handler information.
       
  1445  */
       
  1446 int ec_cdev_ioctl_eoe_handler(
       
  1447         ec_master_t *master, /**< EtherCAT master. */
       
  1448         unsigned long arg /**< ioctl() argument. */
       
  1449         )
       
  1450 {
       
  1451     ec_ioctl_eoe_handler_t data;
       
  1452 	const ec_eoe_t *eoe;
       
  1453 
       
  1454     if (copy_from_user(&data, (void __user *) arg, sizeof(data))) {
       
  1455         return -EFAULT;
       
  1456     }
       
  1457 
       
  1458     if (down_interruptible(&master->master_sem))
       
  1459         return -EINTR;
       
  1460 
       
  1461     if (!(eoe = ec_master_get_eoe_handler_const(master, data.eoe_index))) {
       
  1462         up(&master->master_sem);
       
  1463         EC_ERR("EoE handler %u does not exist!\n", data.eoe_index);
       
  1464         return -EINVAL;
       
  1465     }
       
  1466 
       
  1467 	if (eoe->slave) {
       
  1468 		data.slave_position = eoe->slave->ring_position;
       
  1469 	} else {
       
  1470 		data.slave_position = 0xffff;
       
  1471 	}
       
  1472 	snprintf(data.name, EC_DATAGRAM_NAME_SIZE, eoe->dev->name);
       
  1473     data.open = eoe->opened;
       
  1474     data.rx_bytes = eoe->stats.tx_bytes;
       
  1475     data.rx_rate = eoe->tx_rate;
       
  1476     data.tx_bytes = eoe->stats.rx_bytes;
       
  1477     data.tx_rate = eoe->tx_rate;
       
  1478     data.tx_queued_frames = eoe->tx_queued_frames;
       
  1479     data.tx_queue_size = eoe->tx_queue_size;
  1431 
  1480 
  1432     up(&master->master_sem);
  1481     up(&master->master_sem);
  1433 
  1482 
  1434     if (copy_to_user((void __user *) arg, &data, sizeof(data)))
  1483     if (copy_to_user((void __user *) arg, &data, sizeof(data)))
  1435         return -EFAULT;
  1484         return -EFAULT;
  3131             return ec_cdev_ioctl_config_pdo(master, arg);
  3180             return ec_cdev_ioctl_config_pdo(master, arg);
  3132         case EC_IOCTL_CONFIG_PDO_ENTRY:
  3181         case EC_IOCTL_CONFIG_PDO_ENTRY:
  3133             return ec_cdev_ioctl_config_pdo_entry(master, arg);
  3182             return ec_cdev_ioctl_config_pdo_entry(master, arg);
  3134         case EC_IOCTL_CONFIG_SDO:
  3183         case EC_IOCTL_CONFIG_SDO:
  3135             return ec_cdev_ioctl_config_sdo(master, arg);
  3184             return ec_cdev_ioctl_config_sdo(master, arg);
       
  3185         case EC_IOCTL_EOE_HANDLER:
       
  3186             return ec_cdev_ioctl_eoe_handler(master, arg);
  3136         case EC_IOCTL_REQUEST:
  3187         case EC_IOCTL_REQUEST:
  3137             if (!(filp->f_mode & FMODE_WRITE))
  3188             if (!(filp->f_mode & FMODE_WRITE))
  3138 				return -EPERM;
  3189 				return -EPERM;
  3139 			return ec_cdev_ioctl_request(master, arg, priv);
  3190 			return ec_cdev_ioctl_request(master, arg, priv);
  3140         case EC_IOCTL_CREATE_DOMAIN:
  3191         case EC_IOCTL_CREATE_DOMAIN: