master/cdev.c
changeset 1586 eb9185dfa8ac
parent 1544 cfcaf46c5b3f
parent 1585 1f640e321ee4
child 1606 6c5849669900
equal deleted inserted replaced
1581:e51cf2af3ff9 1586:eb9185dfa8ac
   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