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