diff -r e51cf2af3ff9 -r eb9185dfa8ac master/cdev.c --- a/master/cdev.c Mon Dec 14 13:11:36 2009 +0100 +++ b/master/cdev.c Mon Dec 14 13:25:50 2009 +0100 @@ -805,6 +805,8 @@ return -EINVAL; } + if (master->debug_level) + EC_DBG("Schedule SDO upload request for slave %u\n",request.slave->ring_position); // schedule request. list_add_tail(&request.list, &master->slave_sdo_requests); @@ -816,7 +818,7 @@ // interrupted by signal down(&master->master_sem); if (request.req.state == EC_INT_REQUEST_QUEUED) { - list_del(&request.req.list); + list_del(&request.list); up(&master->master_sem); ec_sdo_request_clear(&request.req); return -EINTR; @@ -828,6 +830,9 @@ // wait until master FSM has finished processing wait_event(master->sdo_queue, request.req.state != EC_INT_REQUEST_BUSY); + if (master->debug_level) + EC_DBG("Scheduled SDO upload request for slave %u done\n",request.slave->ring_position); + data.abort_code = request.req.abort_code; if (request.req.state != EC_INT_REQUEST_SUCCESS) { @@ -906,6 +911,8 @@ return -EINVAL; } + if (master->debug_level) + EC_DBG("Schedule SDO download request for slave %u\n",request.slave->ring_position); // schedule request. list_add_tail(&request.list, &master->slave_sdo_requests); @@ -917,7 +924,7 @@ // interrupted by signal down(&master->master_sem); if (request.req.state == EC_INT_REQUEST_QUEUED) { - list_del(&request.req.list); + list_del(&request.list); up(&master->master_sem); ec_sdo_request_clear(&request.req); return -EINTR; @@ -929,6 +936,9 @@ // wait until master FSM has finished processing wait_event(master->sdo_queue, request.req.state != EC_INT_REQUEST_BUSY); + if (master->debug_level) + EC_DBG("Scheduled SDO download request for slave %u done\n",request.slave->ring_position); + data.abort_code = request.req.abort_code; retval = request.req.state == EC_INT_REQUEST_SUCCESS ? 0 : -EIO; @@ -1663,6 +1673,32 @@ return 0; } + +/*****************************************************************************/ + +/** Set max. number of databytes in a cycle + */ +int ec_cdev_ioctl_set_max_cycle_size( + ec_master_t *master, /**< EtherCAT master. */ + unsigned long arg, /**< ioctl() argument. */ + ec_cdev_priv_t *priv /**< Private data structure of file handle. */ + ) +{ + size_t max_cycle_size; + + if (copy_from_user(&max_cycle_size, (void __user *) arg, sizeof(max_cycle_size))) { + return -EFAULT; + } + + if (down_interruptible(&master->master_sem)) + return -EINTR; + master->max_queue_size = max_cycle_size; + up(&master->master_sem); + + return 0; +} + + /*****************************************************************************/ /** Send frames. @@ -3456,6 +3492,10 @@ return ec_cdev_ioctl_voe_exec(master, arg, priv); case EC_IOCTL_VOE_DATA: return ec_cdev_ioctl_voe_data(master, arg, priv); + case EC_IOCTL_SET_MAX_CYCLE_SIZE: + if (!(filp->f_mode & FMODE_WRITE)) + return -EPERM; + return ec_cdev_ioctl_set_max_cycle_size(master,arg,priv); default: return -ENOTTY; }