master/ioctl.c
changeset 2597 0e145bb05859
parent 2589 2b9c78543663
child 2609 777d1a8b3a27
equal deleted inserted replaced
2596:d71acfbd7319 2597:0e145bb05859
  1548 
  1548 
  1549 #endif
  1549 #endif
  1550 
  1550 
  1551 /*****************************************************************************/
  1551 /*****************************************************************************/
  1552 
  1552 
       
  1553 /** Request EoE IP parameter setting.
       
  1554  *
       
  1555  * \return Zero on success, otherwise a negative error code.
       
  1556  */
       
  1557 static ATTRIBUTES int ec_ioctl_slave_eoe_ip_param(
       
  1558         ec_master_t *master, /**< EtherCAT master. */
       
  1559         void *arg /**< ioctl() argument. */
       
  1560         )
       
  1561 {
       
  1562     ec_ioctl_slave_eoe_ip_t io;
       
  1563     ec_eoe_request_t req;
       
  1564     ec_slave_t *slave;
       
  1565 
       
  1566     if (copy_from_user(&io, (void __user *) arg, sizeof(io))) {
       
  1567         return -EFAULT;
       
  1568     }
       
  1569 
       
  1570     // init EoE request
       
  1571     ec_eoe_request_init(&req);
       
  1572 
       
  1573     req.mac_address_included = io.mac_address_included;
       
  1574     req.ip_address_included = io.ip_address_included;
       
  1575     req.subnet_mask_included = io.subnet_mask_included;
       
  1576     req.gateway_included = io.gateway_included;
       
  1577     req.dns_included = io.dns_included;
       
  1578     req.name_included = io.name_included;
       
  1579 
       
  1580     memcpy(req.mac_address, io.mac_address, ETH_ALEN);
       
  1581     req.ip_address = io.ip_address;
       
  1582     req.subnet_mask = io.subnet_mask;
       
  1583     req.gateway = io.gateway;
       
  1584     req.dns = io.dns;
       
  1585     memcpy(req.name, io.name, EC_MAX_HOSTNAME_SIZE);
       
  1586 
       
  1587     req.state = EC_INT_REQUEST_QUEUED;
       
  1588 
       
  1589     if (down_interruptible(&master->master_sem)) {
       
  1590         return -EINTR;
       
  1591     }
       
  1592 
       
  1593     if (!(slave = ec_master_find_slave(
       
  1594                     master, 0, io.slave_position))) {
       
  1595         up(&master->master_sem);
       
  1596         EC_MASTER_ERR(master, "Slave %u does not exist!\n",
       
  1597                 io.slave_position);
       
  1598         return -EINVAL;
       
  1599     }
       
  1600 
       
  1601     EC_MASTER_DBG(master, 1, "Scheduling EoE request.\n");
       
  1602 
       
  1603     // schedule request.
       
  1604     list_add_tail(&req.list, &slave->eoe_requests);
       
  1605 
       
  1606     up(&master->master_sem);
       
  1607 
       
  1608     // wait for processing through FSM
       
  1609     if (wait_event_interruptible(master->request_queue,
       
  1610                 req.state != EC_INT_REQUEST_QUEUED)) {
       
  1611         // interrupted by signal
       
  1612         down(&master->master_sem);
       
  1613         if (req.state == EC_INT_REQUEST_QUEUED) {
       
  1614             // abort request
       
  1615             list_del(&req.list);
       
  1616             up(&master->master_sem);
       
  1617             return -EINTR;
       
  1618         }
       
  1619         up(&master->master_sem);
       
  1620     }
       
  1621 
       
  1622     // wait until master FSM has finished processing
       
  1623     wait_event(master->request_queue, req.state != EC_INT_REQUEST_BUSY);
       
  1624 
       
  1625     io.result = req.result;
       
  1626 
       
  1627     if (copy_to_user((void __user *) arg, &io, sizeof(io))) {
       
  1628         return -EFAULT;
       
  1629     }
       
  1630 
       
  1631     return req.state == EC_INT_REQUEST_SUCCESS ? 0 : -EIO;
       
  1632 }
       
  1633 
       
  1634 /*****************************************************************************/
       
  1635 
  1553 /** Request the master from userspace.
  1636 /** Request the master from userspace.
  1554  *
  1637  *
  1555  * \return Zero on success, otherwise a negative error code.
  1638  * \return Zero on success, otherwise a negative error code.
  1556  */
  1639  */
  1557 static ATTRIBUTES int ec_ioctl_request(
  1640 static ATTRIBUTES int ec_ioctl_request(
  4203             ret = ec_ioctl_slave_foe_write(master, arg);
  4286             ret = ec_ioctl_slave_foe_write(master, arg);
  4204             break;
  4287             break;
  4205         case EC_IOCTL_SLAVE_SOE_READ:
  4288         case EC_IOCTL_SLAVE_SOE_READ:
  4206             ret = ec_ioctl_slave_soe_read(master, arg);
  4289             ret = ec_ioctl_slave_soe_read(master, arg);
  4207             break;
  4290             break;
       
  4291         case EC_IOCTL_SLAVE_EOE_IP_PARAM:
       
  4292             if (!ctx->writable) {
       
  4293                 ret = -EPERM;
       
  4294                 break;
       
  4295             }
       
  4296             ret = ec_ioctl_slave_eoe_ip_param(master, arg);
       
  4297             break;
  4208         case EC_IOCTL_SLAVE_SOE_WRITE:
  4298         case EC_IOCTL_SLAVE_SOE_WRITE:
  4209             if (!ctx->writable) {
  4299             if (!ctx->writable) {
  4210                 ret = -EPERM;
  4300                 ret = -EPERM;
  4211                 break;
  4301                 break;
  4212             }
  4302             }