803 ec_sdo_request_clear(&request.req); |
803 ec_sdo_request_clear(&request.req); |
804 EC_ERR("Slave %u does not exist!\n", data.slave_position); |
804 EC_ERR("Slave %u does not exist!\n", data.slave_position); |
805 return -EINVAL; |
805 return -EINVAL; |
806 } |
806 } |
807 |
807 |
|
808 if (master->debug_level) |
|
809 EC_DBG("Schedule SDO upload request for slave %u\n",request.slave->ring_position); |
808 // schedule request. |
810 // schedule request. |
809 list_add_tail(&request.list, &master->slave_sdo_requests); |
811 list_add_tail(&request.list, &master->slave_sdo_requests); |
810 |
812 |
811 up(&master->master_sem); |
813 up(&master->master_sem); |
812 |
814 |
814 if (wait_event_interruptible(master->sdo_queue, |
816 if (wait_event_interruptible(master->sdo_queue, |
815 request.req.state != EC_INT_REQUEST_QUEUED)) { |
817 request.req.state != EC_INT_REQUEST_QUEUED)) { |
816 // interrupted by signal |
818 // interrupted by signal |
817 down(&master->master_sem); |
819 down(&master->master_sem); |
818 if (request.req.state == EC_INT_REQUEST_QUEUED) { |
820 if (request.req.state == EC_INT_REQUEST_QUEUED) { |
819 list_del(&request.req.list); |
821 list_del(&request.list); |
820 up(&master->master_sem); |
822 up(&master->master_sem); |
821 ec_sdo_request_clear(&request.req); |
823 ec_sdo_request_clear(&request.req); |
822 return -EINTR; |
824 return -EINTR; |
823 } |
825 } |
824 // request already processing: interrupt not possible. |
826 // request already processing: interrupt not possible. |
825 up(&master->master_sem); |
827 up(&master->master_sem); |
826 } |
828 } |
827 |
829 |
828 // wait until master FSM has finished processing |
830 // wait until master FSM has finished processing |
829 wait_event(master->sdo_queue, request.req.state != EC_INT_REQUEST_BUSY); |
831 wait_event(master->sdo_queue, request.req.state != EC_INT_REQUEST_BUSY); |
|
832 |
|
833 if (master->debug_level) |
|
834 EC_DBG("Scheduled SDO upload request for slave %u done\n",request.slave->ring_position); |
830 |
835 |
831 data.abort_code = request.req.abort_code; |
836 data.abort_code = request.req.abort_code; |
832 |
837 |
833 if (request.req.state != EC_INT_REQUEST_SUCCESS) { |
838 if (request.req.state != EC_INT_REQUEST_SUCCESS) { |
834 data.data_size = 0; |
839 data.data_size = 0; |
904 EC_ERR("Slave %u does not exist!\n", data.slave_position); |
909 EC_ERR("Slave %u does not exist!\n", data.slave_position); |
905 ec_sdo_request_clear(&request.req); |
910 ec_sdo_request_clear(&request.req); |
906 return -EINVAL; |
911 return -EINVAL; |
907 } |
912 } |
908 |
913 |
|
914 if (master->debug_level) |
|
915 EC_DBG("Schedule SDO download request for slave %u\n",request.slave->ring_position); |
909 // schedule request. |
916 // schedule request. |
910 list_add_tail(&request.list, &master->slave_sdo_requests); |
917 list_add_tail(&request.list, &master->slave_sdo_requests); |
911 |
918 |
912 up(&master->master_sem); |
919 up(&master->master_sem); |
913 |
920 |
915 if (wait_event_interruptible(master->sdo_queue, |
922 if (wait_event_interruptible(master->sdo_queue, |
916 request.req.state != EC_INT_REQUEST_QUEUED)) { |
923 request.req.state != EC_INT_REQUEST_QUEUED)) { |
917 // interrupted by signal |
924 // interrupted by signal |
918 down(&master->master_sem); |
925 down(&master->master_sem); |
919 if (request.req.state == EC_INT_REQUEST_QUEUED) { |
926 if (request.req.state == EC_INT_REQUEST_QUEUED) { |
920 list_del(&request.req.list); |
927 list_del(&request.list); |
921 up(&master->master_sem); |
928 up(&master->master_sem); |
922 ec_sdo_request_clear(&request.req); |
929 ec_sdo_request_clear(&request.req); |
923 return -EINTR; |
930 return -EINTR; |
924 } |
931 } |
925 // request already processing: interrupt not possible. |
932 // request already processing: interrupt not possible. |
926 up(&master->master_sem); |
933 up(&master->master_sem); |
927 } |
934 } |
928 |
935 |
929 // wait until master FSM has finished processing |
936 // wait until master FSM has finished processing |
930 wait_event(master->sdo_queue, request.req.state != EC_INT_REQUEST_BUSY); |
937 wait_event(master->sdo_queue, request.req.state != EC_INT_REQUEST_BUSY); |
|
938 |
|
939 if (master->debug_level) |
|
940 EC_DBG("Scheduled SDO download request for slave %u done\n",request.slave->ring_position); |
931 |
941 |
932 data.abort_code = request.req.abort_code; |
942 data.abort_code = request.req.abort_code; |
933 |
943 |
934 retval = request.req.state == EC_INT_REQUEST_SUCCESS ? 0 : -EIO; |
944 retval = request.req.state == EC_INT_REQUEST_SUCCESS ? 0 : -EIO; |
935 |
945 |
1660 return -EPERM; |
1670 return -EPERM; |
1661 |
1671 |
1662 ecrt_master_deactivate(master); |
1672 ecrt_master_deactivate(master); |
1663 return 0; |
1673 return 0; |
1664 } |
1674 } |
|
1675 |
|
1676 |
|
1677 /*****************************************************************************/ |
|
1678 |
|
1679 /** Set max. number of databytes in a cycle |
|
1680 */ |
|
1681 int ec_cdev_ioctl_set_max_cycle_size( |
|
1682 ec_master_t *master, /**< EtherCAT master. */ |
|
1683 unsigned long arg, /**< ioctl() argument. */ |
|
1684 ec_cdev_priv_t *priv /**< Private data structure of file handle. */ |
|
1685 ) |
|
1686 { |
|
1687 size_t max_cycle_size; |
|
1688 |
|
1689 if (copy_from_user(&max_cycle_size, (void __user *) arg, sizeof(max_cycle_size))) { |
|
1690 return -EFAULT; |
|
1691 } |
|
1692 |
|
1693 if (down_interruptible(&master->master_sem)) |
|
1694 return -EINTR; |
|
1695 master->max_queue_size = max_cycle_size; |
|
1696 up(&master->master_sem); |
|
1697 |
|
1698 return 0; |
|
1699 } |
|
1700 |
1665 |
1701 |
1666 /*****************************************************************************/ |
1702 /*****************************************************************************/ |
1667 |
1703 |
1668 /** Send frames. |
1704 /** Send frames. |
1669 */ |
1705 */ |
3454 if (!(filp->f_mode & FMODE_WRITE)) |
3490 if (!(filp->f_mode & FMODE_WRITE)) |
3455 return -EPERM; |
3491 return -EPERM; |
3456 return ec_cdev_ioctl_voe_exec(master, arg, priv); |
3492 return ec_cdev_ioctl_voe_exec(master, arg, priv); |
3457 case EC_IOCTL_VOE_DATA: |
3493 case EC_IOCTL_VOE_DATA: |
3458 return ec_cdev_ioctl_voe_data(master, arg, priv); |
3494 return ec_cdev_ioctl_voe_data(master, arg, priv); |
|
3495 case EC_IOCTL_SET_MAX_CYCLE_SIZE: |
|
3496 if (!(filp->f_mode & FMODE_WRITE)) |
|
3497 return -EPERM; |
|
3498 return ec_cdev_ioctl_set_max_cycle_size(master,arg,priv); |
3459 default: |
3499 default: |
3460 return -ENOTTY; |
3500 return -ENOTTY; |
3461 } |
3501 } |
3462 } |
3502 } |
3463 |
3503 |