diff --git a/include/ecrt.h b/include/ecrt.h index 82138d7f..754821f6 100644 --- a/include/ecrt.h +++ b/include/ecrt.h @@ -2262,8 +2262,9 @@ EC_PUBLIC_API int ecrt_soe_request_read( * change the header later on in realtime context. * * \ingroup ApplicationInterfaceRT + * \return 0 on success, otherwise negative error code. */ -EC_PUBLIC_API void ecrt_voe_handler_send_header( +EC_PUBLIC_API int ecrt_voe_handler_send_header( ec_voe_handler_t *voe, /**< VoE handler. */ uint32_t vendor_id, /**< Vendor ID. */ uint16_t vendor_type /**< Vendor-specific type. */ @@ -2281,8 +2282,9 @@ EC_PUBLIC_API void ecrt_voe_handler_send_header( * activation). * * \ingroup ApplicationInterfaceRT + * \return 0 on success, otherwise negative error code. */ -EC_PUBLIC_API void ecrt_voe_handler_received_header( +EC_PUBLIC_API int ecrt_voe_handler_received_header( const ec_voe_handler_t *voe, /**< VoE handler. */ uint32_t *vendor_id, /**< Vendor ID. */ uint16_t *vendor_type /**< Vendor-specific type. */ @@ -2339,8 +2341,9 @@ EC_PUBLIC_API size_t ecrt_voe_handler_data_size( * activation). * * \ingroup ApplicationInterfaceRT + * \return 0 on success, otherwise negative error code. */ -EC_PUBLIC_API void ecrt_voe_handler_write( +EC_PUBLIC_API int ecrt_voe_handler_write( ec_voe_handler_t *voe, /**< VoE handler. */ size_t size /**< Number of bytes to write (without the VoE header). */ ); @@ -2364,8 +2367,9 @@ EC_PUBLIC_API void ecrt_voe_handler_write( * activation). * * \ingroup ApplicationInterfaceRT + * \return 0 on success, otherwise negative error code. */ -EC_PUBLIC_API void ecrt_voe_handler_read( +EC_PUBLIC_API int ecrt_voe_handler_read( ec_voe_handler_t *voe /**< VoE handler. */ ); @@ -2389,8 +2393,9 @@ EC_PUBLIC_API void ecrt_voe_handler_read( * activation). * * \ingroup ApplicationInterfaceRT + * \return 0 on success, otherwise negative error code. */ -EC_PUBLIC_API void ecrt_voe_handler_read_nosync( +EC_PUBLIC_API int ecrt_voe_handler_read_nosync( ec_voe_handler_t *voe /**< VoE handler. */ ); diff --git a/lib/voe_handler.c b/lib/voe_handler.c index f0ae45c9..bc17c370 100644 --- a/lib/voe_handler.c +++ b/lib/voe_handler.c @@ -46,7 +46,7 @@ void ec_voe_handler_clear(ec_voe_handler_t *voe) /****************************************************************************/ -void ecrt_voe_handler_send_header(ec_voe_handler_t *voe, uint32_t vendor_id, +int ecrt_voe_handler_send_header(ec_voe_handler_t *voe, uint32_t vendor_id, uint16_t vendor_type) { ec_ioctl_voe_t data; @@ -59,14 +59,14 @@ void ecrt_voe_handler_send_header(ec_voe_handler_t *voe, uint32_t vendor_id, ret = ioctl(voe->config->master->fd, EC_IOCTL_VOE_SEND_HEADER, &data); if (EC_IOCTL_IS_ERROR(ret)) { - fprintf(stderr, "Failed to set VoE send header: %s\n", - strerror(EC_IOCTL_ERRNO(ret))); + return -EC_IOCTL_ERRNO(ret); } + return 0; } /****************************************************************************/ -void ecrt_voe_handler_received_header(const ec_voe_handler_t *voe, +int ecrt_voe_handler_received_header(const ec_voe_handler_t *voe, uint32_t *vendor_id, uint16_t *vendor_type) { ec_ioctl_voe_t data; @@ -79,9 +79,9 @@ void ecrt_voe_handler_received_header(const ec_voe_handler_t *voe, ret = ioctl(voe->config->master->fd, EC_IOCTL_VOE_REC_HEADER, &data); if (EC_IOCTL_IS_ERROR(ret)) { - fprintf(stderr, "Failed to get received VoE header: %s\n", - strerror(EC_IOCTL_ERRNO(ret))); + return -EC_IOCTL_ERRNO(ret); } + return 0; } /****************************************************************************/ @@ -100,7 +100,7 @@ size_t ecrt_voe_handler_data_size(const ec_voe_handler_t *voe) /****************************************************************************/ -void ecrt_voe_handler_read(ec_voe_handler_t *voe) +int ecrt_voe_handler_read(ec_voe_handler_t *voe) { ec_ioctl_voe_t data; int ret; @@ -110,14 +110,14 @@ void ecrt_voe_handler_read(ec_voe_handler_t *voe) ret = ioctl(voe->config->master->fd, EC_IOCTL_VOE_READ, &data); if (EC_IOCTL_IS_ERROR(ret)) { - fprintf(stderr, "Failed to initiate VoE reading: %s\n", - strerror(EC_IOCTL_ERRNO(ret))); + return -EC_IOCTL_ERRNO(ret); } + return 0; } /****************************************************************************/ -void ecrt_voe_handler_read_nosync(ec_voe_handler_t *voe) +int ecrt_voe_handler_read_nosync(ec_voe_handler_t *voe) { ec_ioctl_voe_t data; int ret; @@ -127,14 +127,14 @@ void ecrt_voe_handler_read_nosync(ec_voe_handler_t *voe) ret = ioctl(voe->config->master->fd, EC_IOCTL_VOE_READ_NOSYNC, &data); if (EC_IOCTL_IS_ERROR(ret)) { - fprintf(stderr, "Failed to initiate VoE reading: %s\n", - strerror(EC_IOCTL_ERRNO(ret))); + return -EC_IOCTL_ERRNO(ret); } + return 0; } /****************************************************************************/ -void ecrt_voe_handler_write(ec_voe_handler_t *voe, size_t size) +int ecrt_voe_handler_write(ec_voe_handler_t *voe, size_t size) { ec_ioctl_voe_t data; int ret; @@ -146,9 +146,9 @@ void ecrt_voe_handler_write(ec_voe_handler_t *voe, size_t size) ret = ioctl(voe->config->master->fd, EC_IOCTL_VOE_WRITE, &data); if (EC_IOCTL_IS_ERROR(ret)) { - fprintf(stderr, "Failed to initiate VoE writing: %s\n", - strerror(EC_IOCTL_ERRNO(ret))); + return -EC_IOCTL_ERRNO(ret); } + return 0; } /****************************************************************************/ diff --git a/master/ioctl.c b/master/ioctl.c index 134b2edc..ed07d063 100644 --- a/master/ioctl.c +++ b/master/ioctl.c @@ -4139,8 +4139,7 @@ static ATTRIBUTES int ec_ioctl_voe_send_header( return -ENOENT; } - ecrt_voe_handler_send_header(voe, vendor_id, vendor_type); - return 0; + return ecrt_voe_handler_send_header(voe, vendor_id, vendor_type); } /****************************************************************************/ @@ -4160,6 +4159,7 @@ static ATTRIBUTES int ec_ioctl_voe_rec_header( ec_voe_handler_t *voe; uint32_t vendor_id; uint16_t vendor_type; + int ret; if (unlikely(!ctx->requested)) return -EPERM; @@ -4178,7 +4178,9 @@ static ATTRIBUTES int ec_ioctl_voe_rec_header( return -ENOENT; } - ecrt_voe_handler_received_header(voe, &vendor_id, &vendor_type); + ret = ecrt_voe_handler_received_header(voe, &vendor_id, &vendor_type); + if (ret) + return ret; if (likely(data.vendor_id)) if (ec_copy_to_user(data.vendor_id, &vendor_id, @@ -4226,8 +4228,7 @@ static ATTRIBUTES int ec_ioctl_voe_read( return -ENOENT; } - ecrt_voe_handler_read(voe); - return 0; + return ecrt_voe_handler_read(voe); } /****************************************************************************/ @@ -4263,8 +4264,7 @@ static ATTRIBUTES int ec_ioctl_voe_read_nosync( return -ENOENT; } - ecrt_voe_handler_read_nosync(voe); - return 0; + return ecrt_voe_handler_read_nosync(voe); } /****************************************************************************/ @@ -4309,8 +4309,7 @@ static ATTRIBUTES int ec_ioctl_voe_write( return -EFAULT; } - ecrt_voe_handler_write(voe, data.size); - return 0; + return ecrt_voe_handler_write(voe, data.size); } /****************************************************************************/ diff --git a/master/voe_handler.c b/master/voe_handler.c index bc09069e..fc8cf307 100644 --- a/master/voe_handler.c +++ b/master/voe_handler.c @@ -112,16 +112,17 @@ size_t ec_voe_handler_mem_size( * Application interface. ****************************************************************************/ -void ecrt_voe_handler_send_header(ec_voe_handler_t *voe, uint32_t vendor_id, +int ecrt_voe_handler_send_header(ec_voe_handler_t *voe, uint32_t vendor_id, uint16_t vendor_type) { voe->vendor_id = vendor_id; voe->vendor_type = vendor_type; + return 0; } /****************************************************************************/ -void ecrt_voe_handler_received_header(const ec_voe_handler_t *voe, +int ecrt_voe_handler_received_header(const ec_voe_handler_t *voe, uint32_t *vendor_id, uint16_t *vendor_type) { uint8_t *header = voe->datagram.data + EC_MBOX_HEADER_SIZE; @@ -130,6 +131,7 @@ void ecrt_voe_handler_received_header(const ec_voe_handler_t *voe, *vendor_id = EC_READ_U32(header); if (vendor_type) *vendor_type = EC_READ_U16(header + 4); + return 0; } /****************************************************************************/ @@ -148,30 +150,33 @@ size_t ecrt_voe_handler_data_size(const ec_voe_handler_t *voe) /****************************************************************************/ -void ecrt_voe_handler_read(ec_voe_handler_t *voe) +int ecrt_voe_handler_read(ec_voe_handler_t *voe) { voe->dir = EC_DIR_INPUT; voe->state = ec_voe_handler_state_read_start; voe->request_state = EC_INT_REQUEST_BUSY; + return 0; } /****************************************************************************/ -void ecrt_voe_handler_read_nosync(ec_voe_handler_t *voe) +int ecrt_voe_handler_read_nosync(ec_voe_handler_t *voe) { voe->dir = EC_DIR_INPUT; voe->state = ec_voe_handler_state_read_nosync_start; voe->request_state = EC_INT_REQUEST_BUSY; + return 0; } /****************************************************************************/ -void ecrt_voe_handler_write(ec_voe_handler_t *voe, size_t size) +int ecrt_voe_handler_write(ec_voe_handler_t *voe, size_t size) { voe->dir = EC_DIR_OUTPUT; voe->data_size = size; voe->state = ec_voe_handler_state_write_start; voe->request_state = EC_INT_REQUEST_BUSY; + return 0; } /****************************************************************************/