From 06b408ef1b79e986d4cf4dedefe6dbaadf4250c5 Mon Sep 17 00:00:00 2001 From: Bjarne von Horn Date: Fri, 9 Feb 2024 09:20:07 +0100 Subject: [PATCH 1/8] use int as return type for ecrt_domain_* See #101 --- include/ecrt.h | 9 ++++++--- lib/domain.c | 18 +++++++++--------- master/domain.c | 9 ++++++--- master/ioctl.c | 13 ++++++++----- 4 files changed, 29 insertions(+), 20 deletions(-) diff --git a/include/ecrt.h b/include/ecrt.h index 1ffda2db..08bb66b6 100644 --- a/include/ecrt.h +++ b/include/ecrt.h @@ -1901,8 +1901,9 @@ EC_PUBLIC_API uint8_t *ecrt_domain_data( * ecrt_domain_state() return the result of the last process data exchange. * * \ingroup ApplicationInterfaceRT + * \return 0 on success, otherwise negative error code. */ -EC_PUBLIC_API void ecrt_domain_process( +EC_PUBLIC_API int ecrt_domain_process( ec_domain_t *domain /**< Domain. */ ); @@ -1912,8 +1913,9 @@ EC_PUBLIC_API void ecrt_domain_process( * next call of ecrt_master_send(). * * \ingroup ApplicationInterfaceRT + * \return 0 on success, otherwise negative error code. */ -EC_PUBLIC_API void ecrt_domain_queue( +EC_PUBLIC_API int ecrt_domain_queue( ec_domain_t *domain /**< Domain. */ ); @@ -1924,8 +1926,9 @@ EC_PUBLIC_API void ecrt_domain_queue( * Using this method, the process data exchange can be monitored in realtime. * * \ingroup ApplicationInterfaceRT + * \return 0 on success, otherwise negative error code. */ -EC_PUBLIC_API void ecrt_domain_state( +EC_PUBLIC_API int ecrt_domain_state( const ec_domain_t *domain, /**< Domain. */ ec_domain_state_t *state /**< Pointer to a state object to store the information. */ diff --git a/lib/domain.c b/lib/domain.c index c04fdeee..7382a24b 100644 --- a/lib/domain.c +++ b/lib/domain.c @@ -90,33 +90,33 @@ uint8_t *ecrt_domain_data(const ec_domain_t *domain) /****************************************************************************/ -void ecrt_domain_process(ec_domain_t *domain) +int ecrt_domain_process(ec_domain_t *domain) { int ret; ret = ioctl(domain->master->fd, EC_IOCTL_DOMAIN_PROCESS, domain->index); if (EC_IOCTL_IS_ERROR(ret)) { - fprintf(stderr, "Failed to process domain: %s\n", - strerror(EC_IOCTL_ERRNO(ret))); + return -EC_IOCTL_ERRNO(ret); } + return 0; } /****************************************************************************/ -void ecrt_domain_queue(ec_domain_t *domain) +int ecrt_domain_queue(ec_domain_t *domain) { int ret; ret = ioctl(domain->master->fd, EC_IOCTL_DOMAIN_QUEUE, domain->index); if (EC_IOCTL_IS_ERROR(ret)) { - fprintf(stderr, "Failed to queue domain: %s\n", - strerror(EC_IOCTL_ERRNO(ret))); + return -EC_IOCTL_ERRNO(ret); } + return 0; } /****************************************************************************/ -void ecrt_domain_state(const ec_domain_t *domain, ec_domain_state_t *state) +int ecrt_domain_state(const ec_domain_t *domain, ec_domain_state_t *state) { ec_ioctl_domain_state_t data; int ret; @@ -126,9 +126,9 @@ void ecrt_domain_state(const ec_domain_t *domain, ec_domain_state_t *state) ret = ioctl(domain->master->fd, EC_IOCTL_DOMAIN_STATE, &data); if (EC_IOCTL_IS_ERROR(ret)) { - fprintf(stderr, "Failed to get domain state: %s\n", - strerror(EC_IOCTL_ERRNO(ret))); + return -EC_IOCTL_ERRNO(ret); } + return 0; } /****************************************************************************/ diff --git a/master/domain.c b/master/domain.c index 0a886821..34eecb4b 100644 --- a/master/domain.c +++ b/master/domain.c @@ -447,7 +447,7 @@ uint8_t *ecrt_domain_data(const ec_domain_t *domain) /****************************************************************************/ -void ecrt_domain_process(ec_domain_t *domain) +int ecrt_domain_process(ec_domain_t *domain) { uint16_t wc_sum[EC_MAX_NUM_DEVICES] = {}, wc_total; ec_datagram_pair_t *pair; @@ -633,11 +633,12 @@ void ecrt_domain_process(ec_domain_t *domain) domain->working_counter_changes = 0; } #endif + return 0; } /****************************************************************************/ -void ecrt_domain_queue(ec_domain_t *domain) +int ecrt_domain_queue(ec_domain_t *domain) { ec_datagram_pair_t *datagram_pair; ec_device_index_t dev_idx; @@ -663,11 +664,12 @@ void ecrt_domain_queue(ec_domain_t *domain) &datagram_pair->datagrams[dev_idx]); } } + return 0; } /****************************************************************************/ -void ecrt_domain_state(const ec_domain_t *domain, ec_domain_state_t *state) +int ecrt_domain_state(const ec_domain_t *domain, ec_domain_state_t *state) { unsigned int dev_idx; uint16_t wc = 0; @@ -690,6 +692,7 @@ void ecrt_domain_state(const ec_domain_t *domain, ec_domain_state_t *state) } state->redundancy_active = domain->redundancy_active; + return 0; } /****************************************************************************/ diff --git a/master/ioctl.c b/master/ioctl.c index 1a1c97b6..a0ebb862 100644 --- a/master/ioctl.c +++ b/master/ioctl.c @@ -3334,8 +3334,7 @@ static ATTRIBUTES int ec_ioctl_domain_process( return -ENOENT; } - ecrt_domain_process(domain); - return 0; + return ecrt_domain_process(domain); } /****************************************************************************/ @@ -3351,6 +3350,7 @@ static ATTRIBUTES int ec_ioctl_domain_queue( ) { ec_domain_t *domain; + int ret; if (unlikely(!ctx->requested)) return -EPERM; @@ -3365,9 +3365,9 @@ static ATTRIBUTES int ec_ioctl_domain_queue( if (ec_ioctl_lock_interruptible(&master->io_mutex)) return -EINTR; - ecrt_domain_queue(domain); + ret = ecrt_domain_queue(domain); ec_ioctl_unlock(&master->io_mutex); - return 0; + return ret; } /****************************************************************************/ @@ -3385,6 +3385,7 @@ static ATTRIBUTES int ec_ioctl_domain_state( ec_ioctl_domain_state_t data; const ec_domain_t *domain; ec_domain_state_t state; + int ret; if (unlikely(!ctx->requested)) return -EPERM; @@ -3400,7 +3401,9 @@ static ATTRIBUTES int ec_ioctl_domain_state( return -ENOENT; } - ecrt_domain_state(domain, &state); + ret = ecrt_domain_state(domain, &state); + if (ret) + return ret; if (ec_copy_to_user((void __user *) data.state, &state, sizeof(state), ctx)) From 13e99008c3fec479dd270d7a0589b844a76b03b0 Mon Sep 17 00:00:00 2001 From: Bjarne von Horn Date: Fri, 9 Feb 2024 10:29:57 +0100 Subject: [PATCH 2/8] use int as return type for ecrt_master_* See #101 --- include/ecrt.h | 42 +++++++++++++++++++++++--------- lib/master.c | 64 ++++++++++++++++++++++++------------------------- master/ioctl.c | 46 ++++++++++++++++++++++------------- master/master.c | 42 ++++++++++++++++++++++---------- 4 files changed, 120 insertions(+), 74 deletions(-) diff --git a/include/ecrt.h b/include/ecrt.h index 08bb66b6..016a1441 100644 --- a/include/ecrt.h +++ b/include/ecrt.h @@ -1027,8 +1027,11 @@ EC_PUBLIC_API int ecrt_master_activate( * become invalid. * * This method should not be called in realtime context. + * \return 0 on success, otherwise negative error code. + * \retval 0 Success. + * \retval -EINVAL Master has not been activated before. */ -EC_PUBLIC_API void ecrt_master_deactivate( +EC_PUBLIC_API int ecrt_master_deactivate( ec_master_t *master /**< EtherCAT master. */ ); @@ -1056,8 +1059,9 @@ EC_PUBLIC_API int ecrt_master_set_send_interval( * has returned. * * \ingroup ApplicationInterfaceRT + * \return Zero on success, otherwise negative error code. */ -EC_PUBLIC_API void ecrt_master_send( +EC_PUBLIC_API int ecrt_master_send( ec_master_t *master /**< EtherCAT master. */ ); @@ -1072,19 +1076,23 @@ EC_PUBLIC_API void ecrt_master_send( * ecrt_master_activate() has returned. * * \ingroup ApplicationInterfaceRT + * \return Zero on success, otherwise negative error code. */ -EC_PUBLIC_API void ecrt_master_receive( +EC_PUBLIC_API int ecrt_master_receive( ec_master_t *master /**< EtherCAT master. */ ); +#ifdef __KERNEL__ /** Sends non-application datagrams. * * This method has to be called in the send callback function passed via * ecrt_master_callbacks() to allow the sending of non-application datagrams. + * \return Zero on success, otherwise negative error code. */ -EC_PUBLIC_API void ecrt_master_send_ext( +int ecrt_master_send_ext( ec_master_t *master /**< EtherCAT master. */ ); +#endif /** Reads the current master state. * @@ -1092,8 +1100,9 @@ EC_PUBLIC_API void ecrt_master_send_ext( * * This method returns a global state. For the link-specific states in a * redundant network topology, use the ecrt_master_link_state() method. + * \return Zero on success, otherwise negative error code. */ -EC_PUBLIC_API void ecrt_master_state( +EC_PUBLIC_API int ecrt_master_state( const ec_master_t *master, /**< EtherCAT master. */ ec_master_state_t *state /**< Structure to store the information. */ ); @@ -1133,8 +1142,9 @@ EC_PUBLIC_API int ecrt_master_link_state( * necessary, since the absolute value is not of any interest. * * \ingroup ApplicationInterfaceRT + * \return Zero on success, otherwise negative error code. */ -EC_PUBLIC_API void ecrt_master_application_time( +EC_PUBLIC_API int ecrt_master_application_time( ec_master_t *master, /**< EtherCAT master. */ uint64_t app_time /**< Application time. */ ); @@ -1145,8 +1155,11 @@ EC_PUBLIC_API void ecrt_master_application_time( * by the last call off ecrt_master_application_time(). * * \ingroup ApplicationInterfaceRT + * \return Zero on success, otherwise negative error code. + * \retval 0 Success. + * \retval -ENXIO No reference clock found. */ -EC_PUBLIC_API void ecrt_master_sync_reference_clock( +EC_PUBLIC_API int ecrt_master_sync_reference_clock( ec_master_t *master /**< EtherCAT master. */ ); @@ -1159,8 +1172,11 @@ EC_PUBLIC_API void ecrt_master_sync_reference_clock( * has returned. * * \ingroup ApplicationInterfaceRT + * \return Zero on success, otherwise negative error code. + * \retval 0 Success. + * \retval -ENXIO No reference clock found. */ -EC_PUBLIC_API void ecrt_master_sync_reference_clock_to( +EC_PUBLIC_API int ecrt_master_sync_reference_clock_to( ec_master_t *master, /**< EtherCAT master. */ uint64_t sync_time /**< Sync reference clock to this time. */ ); @@ -1173,8 +1189,11 @@ EC_PUBLIC_API void ecrt_master_sync_reference_clock_to( * has returned. * * \ingroup ApplicationInterfaceRT + * \return 0 on success, otherwise negative error code. + * \retval 0 Success. + * \retval -ENXIO No reference clock found. */ -EC_PUBLIC_API void ecrt_master_sync_slave_clocks( +EC_PUBLIC_API int ecrt_master_sync_slave_clocks( ec_master_t *master /**< EtherCAT master. */ ); @@ -1211,7 +1230,7 @@ EC_PUBLIC_API int ecrt_master_reference_clock_time( * * \ingroup ApplicationInterfaceRT */ -EC_PUBLIC_API void ecrt_master_sync_monitor_queue( +EC_PUBLIC_API int ecrt_master_sync_monitor_queue( ec_master_t *master /**< EtherCAT master. */ ); @@ -1240,8 +1259,9 @@ EC_PUBLIC_API uint32_t ecrt_master_sync_monitor_process( * activation), because slaves will not be configured before. * * \ingroup ApplicationInterfaceRT + * \return 0 on success, otherwise negative error code. */ -EC_PUBLIC_API void ecrt_master_reset( +EC_PUBLIC_API int ecrt_master_reset( ec_master_t *master /**< EtherCAT master. */ ); diff --git a/lib/master.c b/lib/master.c index a215d3e2..59ca10e5 100644 --- a/lib/master.c +++ b/lib/master.c @@ -605,18 +605,17 @@ int ecrt_master_activate(ec_master_t *master) /****************************************************************************/ -void ecrt_master_deactivate(ec_master_t *master) +int ecrt_master_deactivate(ec_master_t *master) { int ret; ret = ioctl(master->fd, EC_IOCTL_DEACTIVATE, NULL); if (EC_IOCTL_IS_ERROR(ret)) { - fprintf(stderr, "Failed to deactivate master: %s\n", - strerror(EC_IOCTL_ERRNO(ret))); - return; + return -EC_IOCTL_ERRNO(ret); } ec_master_clear_config(master); + return 0; } /****************************************************************************/ @@ -628,8 +627,6 @@ int ecrt_master_set_send_interval(ec_master_t *master, ret = ioctl(master->fd, EC_IOCTL_SET_SEND_INTERVAL, &send_interval_us); if (EC_IOCTL_IS_ERROR(ret)) { - fprintf(stderr, "Failed to set send interval: %s\n", - strerror(EC_IOCTL_ERRNO(ret))); return -EC_IOCTL_ERRNO(ret); } @@ -638,41 +635,41 @@ int ecrt_master_set_send_interval(ec_master_t *master, /****************************************************************************/ -void ecrt_master_send(ec_master_t *master) +int ecrt_master_send(ec_master_t *master) { int ret; ret = ioctl(master->fd, EC_IOCTL_SEND, NULL); if (EC_IOCTL_IS_ERROR(ret)) { - fprintf(stderr, "Failed to send: %s\n", - strerror(EC_IOCTL_ERRNO(ret))); + return -EC_IOCTL_ERRNO(ret); } + return 0; } /****************************************************************************/ -void ecrt_master_receive(ec_master_t *master) +int ecrt_master_receive(ec_master_t *master) { int ret; ret = ioctl(master->fd, EC_IOCTL_RECEIVE, NULL); if (EC_IOCTL_IS_ERROR(ret)) { - fprintf(stderr, "Failed to receive: %s\n", - strerror(EC_IOCTL_ERRNO(ret))); + return -EC_IOCTL_ERRNO(ret); } + return 0; } /****************************************************************************/ -void ecrt_master_state(const ec_master_t *master, ec_master_state_t *state) +int ecrt_master_state(const ec_master_t *master, ec_master_state_t *state) { int ret; ret = ioctl(master->fd, EC_IOCTL_MASTER_STATE, state); if (EC_IOCTL_IS_ERROR(ret)) { - fprintf(stderr, "Failed to get master state: %s\n", - strerror(EC_IOCTL_ERRNO(ret))); + return -EC_IOCTL_ERRNO(ret); } + return 0; } /****************************************************************************/ @@ -698,7 +695,7 @@ int ecrt_master_link_state(const ec_master_t *master, unsigned int dev_idx, /****************************************************************************/ -void ecrt_master_application_time(ec_master_t *master, uint64_t app_time) +int ecrt_master_application_time(ec_master_t *master, uint64_t app_time) { uint64_t time; int ret; @@ -707,27 +704,27 @@ void ecrt_master_application_time(ec_master_t *master, uint64_t app_time) ret = ioctl(master->fd, EC_IOCTL_APP_TIME, &time); if (EC_IOCTL_IS_ERROR(ret)) { - fprintf(stderr, "Failed to set application time: %s\n", - strerror(EC_IOCTL_ERRNO(ret))); + return -EC_IOCTL_ERRNO(ret); } + return 0; } /****************************************************************************/ -void ecrt_master_sync_reference_clock(ec_master_t *master) +int ecrt_master_sync_reference_clock(ec_master_t *master) { int ret; ret = ioctl(master->fd, EC_IOCTL_SYNC_REF, NULL); if (EC_IOCTL_IS_ERROR(ret)) { - fprintf(stderr, "Failed to sync reference clock: %s\n", - strerror(EC_IOCTL_ERRNO(ret))); + return -EC_IOCTL_ERRNO(ret); } + return 0; } /****************************************************************************/ -void ecrt_master_sync_reference_clock_to(ec_master_t *master, +int ecrt_master_sync_reference_clock_to(ec_master_t *master, uint64_t sync_time) { uint64_t time; @@ -737,22 +734,22 @@ void ecrt_master_sync_reference_clock_to(ec_master_t *master, ret = ioctl(master->fd, EC_IOCTL_SYNC_REF_TO, &time); if (EC_IOCTL_IS_ERROR(ret)) { - fprintf(stderr, "Failed to sync reference clock: %s\n", - strerror(EC_IOCTL_ERRNO(ret))); + return -EC_IOCTL_ERRNO(ret); } + return 0; } /****************************************************************************/ -void ecrt_master_sync_slave_clocks(ec_master_t *master) +int ecrt_master_sync_slave_clocks(ec_master_t *master) { int ret; ret = ioctl(master->fd, EC_IOCTL_SYNC_SLAVES, NULL); if (EC_IOCTL_IS_ERROR(ret)) { - fprintf(stderr, "Failed to sync slave clocks: %s\n", - strerror(EC_IOCTL_ERRNO(ret))); + return -EC_IOCTL_ERRNO(ret); } + return 0; } /****************************************************************************/ @@ -766,6 +763,7 @@ int ecrt_master_reference_clock_time(const ec_master_t *master, if (EC_IOCTL_IS_ERROR(ret)) { fprintf(stderr, "Failed to get reference clock time: %s\n", strerror(EC_IOCTL_ERRNO(ret))); + return -EC_IOCTL_ERRNO(ret); } return ret; @@ -773,15 +771,15 @@ int ecrt_master_reference_clock_time(const ec_master_t *master, /****************************************************************************/ -void ecrt_master_sync_monitor_queue(ec_master_t *master) +int ecrt_master_sync_monitor_queue(ec_master_t *master) { int ret; ret = ioctl(master->fd, EC_IOCTL_SYNC_MON_QUEUE, NULL); if (EC_IOCTL_IS_ERROR(ret)) { - fprintf(stderr, "Failed to queue sync monitor datagram: %s\n", - strerror(EC_IOCTL_ERRNO(ret))); + return -EC_IOCTL_ERRNO(ret); } + return 0; } /****************************************************************************/ @@ -803,15 +801,15 @@ uint32_t ecrt_master_sync_monitor_process(const ec_master_t *master) /****************************************************************************/ -void ecrt_master_reset(ec_master_t *master) +int ecrt_master_reset(ec_master_t *master) { int ret; ret = ioctl(master->fd, EC_IOCTL_RESET, NULL); if (EC_IOCTL_IS_ERROR(ret)) { - fprintf(stderr, "Failed to reset master: %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 a0ebb862..f0440e50 100644 --- a/master/ioctl.c +++ b/master/ioctl.c @@ -1948,8 +1948,7 @@ static ATTRIBUTES int ec_ioctl_deactivate( if (unlikely(!ctx->requested)) return -EPERM; - ecrt_master_deactivate(master); - return 0; + return ecrt_master_deactivate(master); } /****************************************************************************/ @@ -1996,6 +1995,8 @@ static ATTRIBUTES int ec_ioctl_send( ec_ioctl_context_t *ctx /**< Private data structure of file handle. */ ) { + int ret; + if (unlikely(!ctx->requested)) { return -EPERM; } @@ -2003,9 +2004,9 @@ static ATTRIBUTES int ec_ioctl_send( if (ec_ioctl_lock_interruptible(&master->io_mutex)) return -EINTR; - ecrt_master_send(master); + ret = ecrt_master_send(master); ec_ioctl_unlock(&master->io_mutex); - return 0; + return ret; } /****************************************************************************/ @@ -2020,6 +2021,8 @@ static ATTRIBUTES int ec_ioctl_receive( ec_ioctl_context_t *ctx /**< Private data structure of file handle. */ ) { + int ret; + if (unlikely(!ctx->requested)) { return -EPERM; } @@ -2027,9 +2030,9 @@ static ATTRIBUTES int ec_ioctl_receive( if (ec_ioctl_lock_interruptible(&master->io_mutex)) return -EINTR; - ecrt_master_receive(master); + ret = ecrt_master_receive(master); ec_ioctl_unlock(&master->io_mutex); - return 0; + return ret; } /****************************************************************************/ @@ -2045,8 +2048,11 @@ static ATTRIBUTES int ec_ioctl_master_state( ) { ec_master_state_t data; + int ret; - ecrt_master_state(master, &data); + ret = ecrt_master_state(master, &data); + if (ret) + return ret; if (ec_copy_to_user((void __user *) arg, &data, sizeof(data), ctx)) return -EFAULT; @@ -2108,8 +2114,7 @@ static ATTRIBUTES int ec_ioctl_app_time( return -EFAULT; } - ecrt_master_application_time(master, time); - return 0; + return ecrt_master_application_time(master, time); } /****************************************************************************/ @@ -2124,6 +2129,8 @@ static ATTRIBUTES int ec_ioctl_sync_ref( ec_ioctl_context_t *ctx /**< Private data structure of file handle. */ ) { + int ret; + if (unlikely(!ctx->requested)) { return -EPERM; } @@ -2131,9 +2138,9 @@ static ATTRIBUTES int ec_ioctl_sync_ref( if (ec_ioctl_lock_interruptible(&master->io_mutex)) return -EINTR; - ecrt_master_sync_reference_clock(master); + ret = ecrt_master_sync_reference_clock(master); ec_ioctl_unlock(&master->io_mutex); - return 0; + return ret; } /****************************************************************************/ @@ -2148,6 +2155,7 @@ static ATTRIBUTES int ec_ioctl_sync_ref_to( ec_ioctl_context_t *ctx /**< Private data structure of file handle. */ ) { + int ret; uint64_t time; if (unlikely(!ctx->requested)) @@ -2160,9 +2168,9 @@ static ATTRIBUTES int ec_ioctl_sync_ref_to( if (ec_ioctl_lock_interruptible(&master->io_mutex)) return -EINTR; - ecrt_master_sync_reference_clock_to(master, time); + ret = ecrt_master_sync_reference_clock_to(master, time); ec_ioctl_unlock(&master->io_mutex); - return 0; + return ret; } /****************************************************************************/ @@ -2177,6 +2185,8 @@ static ATTRIBUTES int ec_ioctl_sync_slaves( ec_ioctl_context_t *ctx /**< Private data structure of file handle. */ ) { + int ret; + if (unlikely(!ctx->requested)) { return -EPERM; } @@ -2184,9 +2194,9 @@ static ATTRIBUTES int ec_ioctl_sync_slaves( if (ec_ioctl_lock_interruptible(&master->io_mutex)) return -EINTR; - ecrt_master_sync_slave_clocks(master); + ret = ecrt_master_sync_slave_clocks(master); ec_ioctl_unlock(&master->io_mutex); - return 0; + return ret; } /****************************************************************************/ @@ -2232,6 +2242,8 @@ static ATTRIBUTES int ec_ioctl_sync_mon_queue( ec_ioctl_context_t *ctx /**< Private data structure of file handle. */ ) { + int ret; + if (unlikely(!ctx->requested)) { return -EPERM; } @@ -2239,9 +2251,9 @@ static ATTRIBUTES int ec_ioctl_sync_mon_queue( if (ec_ioctl_lock_interruptible(&master->io_mutex)) return -EINTR; - ecrt_master_sync_monitor_queue(master); + ret = ecrt_master_sync_monitor_queue(master); ec_ioctl_unlock(&master->io_mutex); - return 0; + return ret; } /****************************************************************************/ diff --git a/master/master.c b/master/master.c index 916d5d96..5c83a041 100644 --- a/master/master.c +++ b/master/master.c @@ -2350,7 +2350,7 @@ int ecrt_master_activate(ec_master_t *master) /****************************************************************************/ -void ecrt_master_deactivate(ec_master_t *master) +int ecrt_master_deactivate(ec_master_t *master) { ec_slave_t *slave; #ifdef EC_EOE @@ -2362,7 +2362,7 @@ void ecrt_master_deactivate(ec_master_t *master) if (!master->active) { EC_MASTER_WARN(master, "%s: Master not active.\n", __func__); - return; + return -EINVAL; } ec_master_thread_stop(master); @@ -2416,11 +2416,12 @@ void ecrt_master_deactivate(ec_master_t *master) master->allow_scan = 0; master->active = 0; + return 0; } /****************************************************************************/ -void ecrt_master_send(ec_master_t *master) +int ecrt_master_send(ec_master_t *master) { ec_datagram_t *datagram, *n; ec_device_index_t dev_idx; @@ -2460,11 +2461,12 @@ void ecrt_master_send(ec_master_t *master) // send frames ec_master_send_datagrams(master, dev_idx); } + return 0; } /****************************************************************************/ -void ecrt_master_receive(ec_master_t *master) +int ecrt_master_receive(ec_master_t *master) { unsigned int dev_idx; ec_datagram_t *datagram, *next; @@ -2512,11 +2514,12 @@ void ecrt_master_receive(ec_master_t *master) #endif /* RT_SYSLOG */ } } + return 0; } /****************************************************************************/ -void ecrt_master_send_ext(ec_master_t *master) +int ecrt_master_send_ext(ec_master_t *master) { ec_datagram_t *datagram, *next; @@ -2528,7 +2531,7 @@ void ecrt_master_send_ext(ec_master_t *master) } up(&master->ext_queue_sem); - ecrt_master_send(master); + return ecrt_master_send(master); } /****************************************************************************/ @@ -2727,7 +2730,7 @@ void ecrt_master_callbacks(ec_master_t *master, /****************************************************************************/ -void ecrt_master_state(const ec_master_t *master, ec_master_state_t *state) +int ecrt_master_state(const ec_master_t *master, ec_master_state_t *state) { ec_device_index_t dev_idx; @@ -2746,6 +2749,7 @@ void ecrt_master_state(const ec_master_t *master, ec_master_state_t *state) /* Signal link up if at least one device has link. */ state->link_up |= master->devices[dev_idx].link_state; } + return 0; } /****************************************************************************/ @@ -2766,13 +2770,14 @@ int ecrt_master_link_state(const ec_master_t *master, unsigned int dev_idx, /****************************************************************************/ -void ecrt_master_application_time(ec_master_t *master, uint64_t app_time) +int ecrt_master_application_time(ec_master_t *master, uint64_t app_time) { master->app_time = app_time; if (unlikely(!master->dc_ref_time)) { master->dc_ref_time = app_time; } + return 0; } /****************************************************************************/ @@ -2797,17 +2802,20 @@ int ecrt_master_reference_clock_time(const ec_master_t *master, /****************************************************************************/ -void ecrt_master_sync_reference_clock(ec_master_t *master) +int ecrt_master_sync_reference_clock(ec_master_t *master) { if (master->dc_ref_clock) { EC_WRITE_U32(master->ref_sync_datagram.data, master->app_time); ec_master_queue_datagram(master, &master->ref_sync_datagram); + } else { + return -ENXIO; } + return 0; } /****************************************************************************/ -void ecrt_master_sync_reference_clock_to( +int ecrt_master_sync_reference_clock_to( ec_master_t *master, uint64_t sync_time ) @@ -2815,25 +2823,32 @@ void ecrt_master_sync_reference_clock_to( if (master->dc_ref_clock) { EC_WRITE_U32(master->ref_sync_datagram.data, sync_time); ec_master_queue_datagram(master, &master->ref_sync_datagram); + } else { + return -ENXIO; } + return 0; } /****************************************************************************/ -void ecrt_master_sync_slave_clocks(ec_master_t *master) +int ecrt_master_sync_slave_clocks(ec_master_t *master) { if (master->dc_ref_clock) { ec_datagram_zero(&master->sync_datagram); ec_master_queue_datagram(master, &master->sync_datagram); + } else { + return -ENXIO; } + return 0; } /****************************************************************************/ -void ecrt_master_sync_monitor_queue(ec_master_t *master) +int ecrt_master_sync_monitor_queue(ec_master_t *master) { ec_datagram_zero(&master->sync_mon_datagram); ec_master_queue_datagram(master, &master->sync_mon_datagram); + return 0; } /****************************************************************************/ @@ -3252,7 +3267,7 @@ int ecrt_master_read_idn(ec_master_t *master, uint16_t slave_position, /****************************************************************************/ -void ecrt_master_reset(ec_master_t *master) +int ecrt_master_reset(ec_master_t *master) { ec_slave_config_t *sc; @@ -3261,6 +3276,7 @@ void ecrt_master_reset(ec_master_t *master) ec_slave_request_state(sc->slave, EC_SLAVE_STATE_OP); } } + return 0; } /****************************************************************************/ From 5248b967d2627267dfe3015d1ee61b6ca2639784 Mon Sep 17 00:00:00 2001 From: Bjarne von Horn Date: Fri, 9 Feb 2024 11:06:19 +0100 Subject: [PATCH 3/8] use `int` as return type for ecrt_slave_* See #101 --- include/ecrt.h | 15 ++++++++++----- lib/slave_config.c | 24 +++++++++++++++--------- master/ioctl.c | 18 ++++++++++-------- master/slave_config.c | 17 +++++++++++------ 4 files changed, 46 insertions(+), 28 deletions(-) diff --git a/include/ecrt.h b/include/ecrt.h index 016a1441..0eeeddc6 100644 --- a/include/ecrt.h +++ b/include/ecrt.h @@ -1291,8 +1291,10 @@ EC_PUBLIC_API int ecrt_slave_config_sync_manager( * * This method has to be called in non-realtime context before * ecrt_master_activate(). + * + * \return 0 on success, otherwise negative error code. */ -EC_PUBLIC_API void ecrt_slave_config_watchdog( +EC_PUBLIC_API int ecrt_slave_config_watchdog( ec_slave_config_t *sc, /**< Slave configuration. */ uint16_t watchdog_divider, /**< Number of 40 ns intervals (register 0x0400). Used as a base unit for all @@ -1330,8 +1332,9 @@ EC_PUBLIC_API int ecrt_slave_config_pdo_assign_add( * ecrt_master_activate(). * * \see ecrt_slave_config_pdos() + * \return 0 on success, otherwise negative error code. */ -EC_PUBLIC_API void ecrt_slave_config_pdo_assign_clear( +EC_PUBLIC_API int ecrt_slave_config_pdo_assign_clear( ec_slave_config_t *sc, /**< Slave configuration. */ uint8_t sync_index /**< Sync manager index. Must be less than #EC_MAX_SYNC_MANAGERS. */ @@ -1364,8 +1367,9 @@ EC_PUBLIC_API int ecrt_slave_config_pdo_mapping_add( * ecrt_master_activate(). * * \see ecrt_slave_config_pdos() + * \return 0 on success, otherwise negative error code. */ -EC_PUBLIC_API void ecrt_slave_config_pdo_mapping_clear( +EC_PUBLIC_API int ecrt_slave_config_pdo_mapping_clear( ec_slave_config_t *sc, /**< Slave configuration. */ uint16_t pdo_index /**< Index of the PDO. */ ); @@ -1512,8 +1516,9 @@ EC_PUBLIC_API int ecrt_slave_config_reg_pdo_entry_pos( * ecrt_master_activate(). * * \attention The \a sync1_shift time is ignored. + * \return 0 on success, otherwise negative error code. */ -EC_PUBLIC_API void ecrt_slave_config_dc( +EC_PUBLIC_API int ecrt_slave_config_dc( ec_slave_config_t *sc, /**< Slave configuration. */ uint16_t assign_activate, /**< AssignActivate word. */ uint32_t sync0_cycle, /**< SYNC0 cycle time [ns]. */ @@ -1780,7 +1785,7 @@ EC_PUBLIC_API ec_reg_request_t *ecrt_slave_config_create_reg_request( * * \ingroup ApplicationInterfaceRT */ -EC_PUBLIC_API void ecrt_slave_config_state( +EC_PUBLIC_API int ecrt_slave_config_state( const ec_slave_config_t *sc, /**< Slave configuration */ ec_slave_config_state_t *state /**< State object to write to. */ ); diff --git a/lib/slave_config.c b/lib/slave_config.c index 132158df..aa2da090 100644 --- a/lib/slave_config.c +++ b/lib/slave_config.c @@ -109,7 +109,7 @@ int ecrt_slave_config_sync_manager(ec_slave_config_t *sc, uint8_t sync_index, /****************************************************************************/ -void ecrt_slave_config_watchdog(ec_slave_config_t *sc, +int ecrt_slave_config_watchdog(ec_slave_config_t *sc, uint16_t divider, uint16_t intervals) { ec_ioctl_config_t data; @@ -124,7 +124,9 @@ void ecrt_slave_config_watchdog(ec_slave_config_t *sc, if (EC_IOCTL_IS_ERROR(ret)) { fprintf(stderr, "Failed to config watchdog: %s\n", strerror(EC_IOCTL_ERRNO(ret))); + return -EC_IOCTL_ERRNO(ret); } + return 0; } /****************************************************************************/ @@ -151,7 +153,7 @@ int ecrt_slave_config_pdo_assign_add(ec_slave_config_t *sc, /****************************************************************************/ -void ecrt_slave_config_pdo_assign_clear(ec_slave_config_t *sc, +int ecrt_slave_config_pdo_assign_clear(ec_slave_config_t *sc, uint8_t sync_index) { ec_ioctl_config_pdo_t data; @@ -164,7 +166,9 @@ void ecrt_slave_config_pdo_assign_clear(ec_slave_config_t *sc, if (EC_IOCTL_IS_ERROR(ret)) { fprintf(stderr, "Failed to clear PDOs: %s\n", strerror(EC_IOCTL_ERRNO(ret))); + return -EC_IOCTL_ERRNO(ret); } + return 0; } /****************************************************************************/ @@ -194,7 +198,7 @@ int ecrt_slave_config_pdo_mapping_add(ec_slave_config_t *sc, /****************************************************************************/ -void ecrt_slave_config_pdo_mapping_clear(ec_slave_config_t *sc, +int ecrt_slave_config_pdo_mapping_clear(ec_slave_config_t *sc, uint16_t pdo_index) { ec_ioctl_config_pdo_t data; @@ -207,7 +211,9 @@ void ecrt_slave_config_pdo_mapping_clear(ec_slave_config_t *sc, if (EC_IOCTL_IS_ERROR(ret)) { fprintf(stderr, "Failed to clear PDO entries: %s\n", strerror(EC_IOCTL_ERRNO(ret))); + return -EC_IOCTL_ERRNO(ret); } + return 0; } /****************************************************************************/ @@ -356,7 +362,7 @@ int ecrt_slave_config_reg_pdo_entry_pos( /****************************************************************************/ -void ecrt_slave_config_dc(ec_slave_config_t *sc, uint16_t assign_activate, +int ecrt_slave_config_dc(ec_slave_config_t *sc, uint16_t assign_activate, uint32_t sync0_cycle_time, int32_t sync0_shift_time, uint32_t sync1_cycle_time, int32_t sync1_shift_time) { @@ -372,9 +378,9 @@ void ecrt_slave_config_dc(ec_slave_config_t *sc, uint16_t assign_activate, ret = ioctl(sc->master->fd, EC_IOCTL_SC_DC, &data); if (EC_IOCTL_IS_ERROR(ret)) { - fprintf(stderr, "Failed to set DC parameters: %s\n", - strerror(EC_IOCTL_ERRNO(ret))); + return -EC_IOCTL_ERRNO(ret); } + return 0; } /****************************************************************************/ @@ -813,7 +819,7 @@ ec_voe_handler_t *ecrt_slave_config_create_voe_handler(ec_slave_config_t *sc, /****************************************************************************/ -void ecrt_slave_config_state(const ec_slave_config_t *sc, +int ecrt_slave_config_state(const ec_slave_config_t *sc, ec_slave_config_state_t *state) { ec_ioctl_sc_state_t data; @@ -824,9 +830,9 @@ void ecrt_slave_config_state(const ec_slave_config_t *sc, ret = ioctl(sc->master->fd, EC_IOCTL_SC_STATE, &data); if (EC_IOCTL_IS_ERROR(ret)) { - fprintf(stderr, "Failed to get slave configuration state: %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 f0440e50..4282bf85 100644 --- a/master/ioctl.c +++ b/master/ioctl.c @@ -2392,7 +2392,7 @@ static ATTRIBUTES int ec_ioctl_sc_watchdog( goto out_up; } - ecrt_slave_config_watchdog(sc, + ret = ecrt_slave_config_watchdog(sc, data.watchdog_divider, data.watchdog_intervals); out_up: @@ -2466,8 +2466,7 @@ static ATTRIBUTES int ec_ioctl_sc_clear_pdos( up(&master->master_sem); /** \todo sc could be invalidated */ - ecrt_slave_config_pdo_assign_clear(sc, data.sync_index); - return 0; + return ecrt_slave_config_pdo_assign_clear(sc, data.sync_index); } /****************************************************************************/ @@ -2536,8 +2535,7 @@ static ATTRIBUTES int ec_ioctl_sc_clear_entries( up(&master->master_sem); /** \todo sc could be invalidated */ - ecrt_slave_config_pdo_mapping_clear(sc, data.index); - return 0; + return ecrt_slave_config_pdo_mapping_clear(sc, data.index); } /****************************************************************************/ @@ -2651,6 +2649,7 @@ static ATTRIBUTES int ec_ioctl_sc_dc( { ec_ioctl_config_t data; ec_slave_config_t *sc; + int ret; if (unlikely(!ctx->requested)) return -EPERM; @@ -2666,7 +2665,7 @@ static ATTRIBUTES int ec_ioctl_sc_dc( return -ENOENT; } - ecrt_slave_config_dc(sc, data.dc_assign_activate, + ret = ecrt_slave_config_dc(sc, data.dc_assign_activate, data.dc_sync[0].cycle_time, data.dc_sync[0].shift_time, data.dc_sync[1].cycle_time, @@ -2674,7 +2673,7 @@ static ATTRIBUTES int ec_ioctl_sc_dc( up(&master->master_sem); - return 0; + return ret; } /****************************************************************************/ @@ -3119,6 +3118,7 @@ static ATTRIBUTES int ec_ioctl_sc_state( ec_ioctl_sc_state_t data; const ec_slave_config_t *sc; ec_slave_config_state_t state; + int ret; if (unlikely(!ctx->requested)) return -EPERM; @@ -3134,7 +3134,9 @@ static ATTRIBUTES int ec_ioctl_sc_state( return -ENOENT; } - ecrt_slave_config_state(sc, &state); + ret = ecrt_slave_config_state(sc, &state); + if (ret) + return ret; if (ec_copy_to_user((void __user *) data.state, &state, sizeof(state), ctx)) diff --git a/master/slave_config.c b/master/slave_config.c index 16f5fe99..a2cbf2ce 100644 --- a/master/slave_config.c +++ b/master/slave_config.c @@ -647,7 +647,7 @@ int ecrt_slave_config_sync_manager(ec_slave_config_t *sc, uint8_t sync_index, /****************************************************************************/ -void ecrt_slave_config_watchdog(ec_slave_config_t *sc, +int ecrt_slave_config_watchdog(ec_slave_config_t *sc, uint16_t divider, uint16_t intervals) { EC_CONFIG_DBG(sc, 1, "%s(sc = 0x%p, divider = %u, intervals = %u)\n", @@ -655,6 +655,7 @@ void ecrt_slave_config_watchdog(ec_slave_config_t *sc, sc->watchdog_divider = divider; sc->watchdog_intervals = intervals; + return 0; } /****************************************************************************/ @@ -689,7 +690,7 @@ int ecrt_slave_config_pdo_assign_add(ec_slave_config_t *sc, /****************************************************************************/ -void ecrt_slave_config_pdo_assign_clear(ec_slave_config_t *sc, +int ecrt_slave_config_pdo_assign_clear(ec_slave_config_t *sc, uint8_t sync_index) { EC_CONFIG_DBG(sc, 1, "%s(sc = 0x%p, sync_index = %u)\n", @@ -697,12 +698,13 @@ void ecrt_slave_config_pdo_assign_clear(ec_slave_config_t *sc, if (sync_index >= EC_MAX_SYNC_MANAGERS) { EC_CONFIG_ERR(sc, "Invalid sync manager index %u!\n", sync_index); - return; + return -EINVAL; } down(&sc->master->master_sem); ec_pdo_list_clear_pdos(&sc->sync_configs[sync_index].pdos); up(&sc->master->master_sem); + return 0; } /****************************************************************************/ @@ -744,7 +746,7 @@ int ecrt_slave_config_pdo_mapping_add(ec_slave_config_t *sc, /****************************************************************************/ -void ecrt_slave_config_pdo_mapping_clear(ec_slave_config_t *sc, +int ecrt_slave_config_pdo_mapping_clear(ec_slave_config_t *sc, uint16_t pdo_index) { uint8_t sync_index; @@ -765,6 +767,7 @@ void ecrt_slave_config_pdo_mapping_clear(ec_slave_config_t *sc, } else { EC_CONFIG_WARN(sc, "PDO 0x%04X is not assigned.\n", pdo_index); } + return 0; } /****************************************************************************/ @@ -956,7 +959,7 @@ int ecrt_slave_config_reg_pdo_entry_pos( /****************************************************************************/ -void ecrt_slave_config_dc(ec_slave_config_t *sc, uint16_t assign_activate, +int ecrt_slave_config_dc(ec_slave_config_t *sc, uint16_t assign_activate, uint32_t sync0_cycle_time, int32_t sync0_shift_time, uint32_t sync1_cycle_time, int32_t sync1_shift_time) { @@ -971,6 +974,7 @@ void ecrt_slave_config_dc(ec_slave_config_t *sc, uint16_t assign_activate, sc->dc_sync[0].shift_time = sync0_shift_time; sc->dc_sync[1].cycle_time = sync1_cycle_time; sc->dc_sync[1].shift_time = sync1_shift_time; + return 0; } /****************************************************************************/ @@ -1317,7 +1321,7 @@ ec_voe_handler_t *ecrt_slave_config_create_voe_handler( /****************************************************************************/ -void ecrt_slave_config_state(const ec_slave_config_t *sc, +int ecrt_slave_config_state(const ec_slave_config_t *sc, ec_slave_config_state_t *state) { const ec_slave_t *slave = sc->slave; @@ -1331,6 +1335,7 @@ void ecrt_slave_config_state(const ec_slave_config_t *sc, state->operational = 0; state->al_state = EC_SLAVE_STATE_UNKNOWN; } + return 0; } /****************************************************************************/ From 885b8717e16e141bbc3895a7e3d6a8974b7924e1 Mon Sep 17 00:00:00 2001 From: Bjarne von Horn Date: Fri, 9 Feb 2024 11:23:35 +0100 Subject: [PATCH 4/8] use `int` as return type for ecrt_sdo_request_* See #101 --- include/ecrt.h | 12 ++++++++---- lib/sdo_request.c | 24 ++++++++++++------------ master/ioctl.c | 12 ++++-------- master/sdo_request.c | 12 ++++++++---- 4 files changed, 32 insertions(+), 28 deletions(-) diff --git a/include/ecrt.h b/include/ecrt.h index 0eeeddc6..315d4883 100644 --- a/include/ecrt.h +++ b/include/ecrt.h @@ -1974,8 +1974,9 @@ EC_PUBLIC_API int ecrt_domain_state( * set via ecrt_slave_config_create_sdo_request(). * * \ingroup ApplicationInterfaceRT + * \return 0 on success, otherwise negative error code. */ -EC_PUBLIC_API void ecrt_sdo_request_index( +EC_PUBLIC_API int ecrt_sdo_request_index( ec_sdo_request_t *req, /**< SDO request. */ uint16_t index, /**< SDO index. */ uint8_t subindex /**< SDO subindex. */ @@ -1991,8 +1992,9 @@ EC_PUBLIC_API void ecrt_sdo_request_index( * * The timeout should be defined in non-realtime context, but can also be * changed afterwards. + * \return 0 on success, otherwise negative error code. */ -EC_PUBLIC_API void ecrt_sdo_request_timeout( +EC_PUBLIC_API int ecrt_sdo_request_timeout( ec_sdo_request_t *req, /**< SDO request. */ uint32_t timeout /**< Timeout in milliseconds. Zero means no timeout. */ @@ -2075,8 +2077,9 @@ ec_request_state_t ecrt_sdo_request_state( * activation). * * \ingroup ApplicationInterfaceRT + * \return 0 on success, otherwise negative error code. */ -EC_PUBLIC_API void ecrt_sdo_request_write( +EC_PUBLIC_API int ecrt_sdo_request_write( ec_sdo_request_t *req /**< SDO request. */ ); @@ -2093,8 +2096,9 @@ EC_PUBLIC_API void ecrt_sdo_request_write( * activation). * * \ingroup ApplicationInterfaceRT + * \return 0 on success, otherwise negative error code. */ -EC_PUBLIC_API void ecrt_sdo_request_read( +EC_PUBLIC_API int ecrt_sdo_request_read( ec_sdo_request_t *req /**< SDO request. */ ); diff --git a/lib/sdo_request.c b/lib/sdo_request.c index 6271f642..509a349c 100644 --- a/lib/sdo_request.c +++ b/lib/sdo_request.c @@ -48,7 +48,7 @@ void ec_sdo_request_clear(ec_sdo_request_t *req) * Application interface. ****************************************************************************/ -void ecrt_sdo_request_index(ec_sdo_request_t *req, uint16_t index, +int ecrt_sdo_request_index(ec_sdo_request_t *req, uint16_t index, uint8_t subindex) { ec_ioctl_sdo_request_t data; @@ -61,14 +61,14 @@ void ecrt_sdo_request_index(ec_sdo_request_t *req, uint16_t index, ret = ioctl(req->config->master->fd, EC_IOCTL_SDO_REQUEST_INDEX, &data); if (EC_IOCTL_IS_ERROR(ret)) { - fprintf(stderr, "Failed to set SDO request index/subindex: %s\n", - strerror(EC_IOCTL_ERRNO(ret))); + return -EC_IOCTL_ERRNO(ret); } + return 0; } /****************************************************************************/ -void ecrt_sdo_request_timeout(ec_sdo_request_t *req, uint32_t timeout) +int ecrt_sdo_request_timeout(ec_sdo_request_t *req, uint32_t timeout) { ec_ioctl_sdo_request_t data; int ret; @@ -79,9 +79,9 @@ void ecrt_sdo_request_timeout(ec_sdo_request_t *req, uint32_t timeout) ret = ioctl(req->config->master->fd, EC_IOCTL_SDO_REQUEST_TIMEOUT, &data); if (EC_IOCTL_IS_ERROR(ret)) { - fprintf(stderr, "Failed to set SDO request timeout: %s\n", - strerror(EC_IOCTL_ERRNO(ret))); + return -EC_IOCTL_ERRNO(ret); } + return 0; } /****************************************************************************/ @@ -139,7 +139,7 @@ ec_request_state_t ecrt_sdo_request_state(ec_sdo_request_t *req) /****************************************************************************/ -void ecrt_sdo_request_read(ec_sdo_request_t *req) +int ecrt_sdo_request_read(ec_sdo_request_t *req) { ec_ioctl_sdo_request_t data; int ret; @@ -149,14 +149,14 @@ void ecrt_sdo_request_read(ec_sdo_request_t *req) ret = ioctl(req->config->master->fd, EC_IOCTL_SDO_REQUEST_READ, &data); if (EC_IOCTL_IS_ERROR(ret)) { - fprintf(stderr, "Failed to command an SDO read operation : %s\n", - strerror(EC_IOCTL_ERRNO(ret))); + return -EC_IOCTL_ERRNO(ret); } + return 0; } /****************************************************************************/ -void ecrt_sdo_request_write(ec_sdo_request_t *req) +int ecrt_sdo_request_write(ec_sdo_request_t *req) { ec_ioctl_sdo_request_t data; int ret; @@ -168,9 +168,9 @@ void ecrt_sdo_request_write(ec_sdo_request_t *req) ret = ioctl(req->config->master->fd, EC_IOCTL_SDO_REQUEST_WRITE, &data); if (EC_IOCTL_IS_ERROR(ret)) { - fprintf(stderr, "Failed to command an SDO write operation : %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 4282bf85..04afb142 100644 --- a/master/ioctl.c +++ b/master/ioctl.c @@ -3459,8 +3459,7 @@ static ATTRIBUTES int ec_ioctl_sdo_request_index( return -ENOENT; } - ecrt_sdo_request_index(req, data.sdo_index, data.sdo_subindex); - return 0; + return ecrt_sdo_request_index(req, data.sdo_index, data.sdo_subindex); } /****************************************************************************/ @@ -3496,8 +3495,7 @@ static ATTRIBUTES int ec_ioctl_sdo_request_timeout( return -ENOENT; } - ecrt_sdo_request_timeout(req, data.timeout); - return 0; + return ecrt_sdo_request_timeout(req, data.timeout); } /****************************************************************************/ @@ -3580,8 +3578,7 @@ static ATTRIBUTES int ec_ioctl_sdo_request_read( return -ENOENT; } - ecrt_sdo_request_read(req); - return 0; + return ecrt_sdo_request_read(req); } /****************************************************************************/ @@ -3630,8 +3627,7 @@ static ATTRIBUTES int ec_ioctl_sdo_request_write( return -EFAULT; req->data_size = data.size; - ecrt_sdo_request_write(req); - return 0; + return ecrt_sdo_request_write(req); } /****************************************************************************/ diff --git a/master/sdo_request.c b/master/sdo_request.c index d0de57db..040c6b5d 100644 --- a/master/sdo_request.c +++ b/master/sdo_request.c @@ -178,18 +178,20 @@ int ec_sdo_request_timed_out(const ec_sdo_request_t *req /**< SDO request. */) * Application interface. ****************************************************************************/ -void ecrt_sdo_request_index(ec_sdo_request_t *req, uint16_t index, +int ecrt_sdo_request_index(ec_sdo_request_t *req, uint16_t index, uint8_t subindex) { req->index = index; req->subindex = subindex; + return 0; } /****************************************************************************/ -void ecrt_sdo_request_timeout(ec_sdo_request_t *req, uint32_t timeout) +int ecrt_sdo_request_timeout(ec_sdo_request_t *req, uint32_t timeout) { req->issue_timeout = timeout; + return 0; } /****************************************************************************/ @@ -215,24 +217,26 @@ ec_request_state_t ecrt_sdo_request_state(const ec_sdo_request_t *req) /****************************************************************************/ -void ecrt_sdo_request_read(ec_sdo_request_t *req) +int ecrt_sdo_request_read(ec_sdo_request_t *req) { req->dir = EC_DIR_INPUT; req->state = EC_INT_REQUEST_QUEUED; req->errno = 0; req->abort_code = 0x00000000; req->jiffies_start = jiffies; + return 0; } /****************************************************************************/ -void ecrt_sdo_request_write(ec_sdo_request_t *req) +int ecrt_sdo_request_write(ec_sdo_request_t *req) { req->dir = EC_DIR_OUTPUT; req->state = EC_INT_REQUEST_QUEUED; req->errno = 0; req->abort_code = 0x00000000; req->jiffies_start = jiffies; + return 0; } /****************************************************************************/ From 8c30331e6e725d30743bdc1b643fd29d0bf82ee6 Mon Sep 17 00:00:00 2001 From: Bjarne von Horn Date: Fri, 9 Feb 2024 11:39:48 +0100 Subject: [PATCH 5/8] use `int` as return type for ecrt_soe_request_* See #101 --- include/ecrt.h | 18 ++++++++++++++---- lib/soe_request.c | 24 ++++++++++++------------ master/ioctl.c | 12 ++++-------- master/soe_request.c | 20 ++++++++++++-------- master/soe_request.h | 4 ++-- 5 files changed, 44 insertions(+), 34 deletions(-) diff --git a/include/ecrt.h b/include/ecrt.h index 315d4883..82138d7f 100644 --- a/include/ecrt.h +++ b/include/ecrt.h @@ -2078,6 +2078,9 @@ ec_request_state_t ecrt_sdo_request_state( * * \ingroup ApplicationInterfaceRT * \return 0 on success, otherwise negative error code. + * \retval -EINVAL Invalid input data, e.g. data size == 0. + * \retval -ENOMEM Reserved memory in ecrt_slave_config_create_sdo_request() + * too small. */ EC_PUBLIC_API int ecrt_sdo_request_write( ec_sdo_request_t *req /**< SDO request. */ @@ -2117,8 +2120,9 @@ EC_PUBLIC_API int ecrt_sdo_request_read( * set via ecrt_slave_config_create_soe_request(). * * \ingroup ApplicationInterfaceRT + * \return 0 on success, otherwise negative error code. */ -EC_PUBLIC_API void ecrt_soe_request_idn( +EC_PUBLIC_API int ecrt_soe_request_idn( ec_soe_request_t *req, /**< IDN request. */ uint8_t drive_no, /**< SDO index. */ uint16_t idn /**< SoE IDN. */ @@ -2134,8 +2138,9 @@ EC_PUBLIC_API void ecrt_soe_request_idn( * * The timeout should be defined in non-realtime context, but can also be * changed afterwards. + * \return 0 on success, otherwise negative error code. */ -EC_PUBLIC_API void ecrt_soe_request_timeout( +EC_PUBLIC_API int ecrt_soe_request_timeout( ec_soe_request_t *req, /**< SoE request. */ uint32_t timeout /**< Timeout in milliseconds. Zero means no timeout. */ @@ -2213,8 +2218,12 @@ EC_PUBLIC_API ec_request_state_t ecrt_soe_request_state( * activation). * * \ingroup ApplicationInterfaceRT + * \return 0 on success, otherwise negative error code. + * \retval -EINVAL Invalid input data, e.g. data size == 0. + * \retval -ENOMEM Reserved memory in ecrt_slave_config_create_soe_request() + * too small. */ -EC_PUBLIC_API void ecrt_soe_request_write( +EC_PUBLIC_API int ecrt_soe_request_write( ec_soe_request_t *req /**< SoE request. */ ); @@ -2231,8 +2240,9 @@ EC_PUBLIC_API void ecrt_soe_request_write( * activation). * * \ingroup ApplicationInterfaceRT + * \return 0 on success, otherwise negative error code. */ -EC_PUBLIC_API void ecrt_soe_request_read( +EC_PUBLIC_API int ecrt_soe_request_read( ec_soe_request_t *req /**< SoE request. */ ); diff --git a/lib/soe_request.c b/lib/soe_request.c index d95a4ef1..822e3c1e 100644 --- a/lib/soe_request.c +++ b/lib/soe_request.c @@ -48,7 +48,7 @@ void ec_soe_request_clear(ec_soe_request_t *req) * Application interface. ****************************************************************************/ -void ecrt_soe_request_idn(ec_soe_request_t *req, uint8_t drive_no, +int ecrt_soe_request_idn(ec_soe_request_t *req, uint8_t drive_no, uint16_t idn) { ec_ioctl_soe_request_t data; @@ -61,14 +61,14 @@ void ecrt_soe_request_idn(ec_soe_request_t *req, uint8_t drive_no, ret = ioctl(req->config->master->fd, EC_IOCTL_SOE_REQUEST_IDN, &data); if (EC_IOCTL_IS_ERROR(ret)) { - fprintf(stderr, "Failed to set SoE request IDN: %s\n", - strerror(EC_IOCTL_ERRNO(ret))); + return -EC_IOCTL_ERRNO(ret); } + return 0; } /****************************************************************************/ -void ecrt_soe_request_timeout(ec_soe_request_t *req, uint32_t timeout) +int ecrt_soe_request_timeout(ec_soe_request_t *req, uint32_t timeout) { ec_ioctl_soe_request_t data; int ret; @@ -79,9 +79,9 @@ void ecrt_soe_request_timeout(ec_soe_request_t *req, uint32_t timeout) ret = ioctl(req->config->master->fd, EC_IOCTL_SOE_REQUEST_TIMEOUT, &data); if (EC_IOCTL_IS_ERROR(ret)) { - fprintf(stderr, "Failed to set SoE request timeout: %s\n", - strerror(EC_IOCTL_ERRNO(ret))); + return -EC_IOCTL_ERRNO(ret); } + return 0; } /****************************************************************************/ @@ -139,7 +139,7 @@ ec_request_state_t ecrt_soe_request_state(ec_soe_request_t *req) /****************************************************************************/ -void ecrt_soe_request_read(ec_soe_request_t *req) +int ecrt_soe_request_read(ec_soe_request_t *req) { ec_ioctl_soe_request_t data; int ret; @@ -149,14 +149,14 @@ void ecrt_soe_request_read(ec_soe_request_t *req) ret = ioctl(req->config->master->fd, EC_IOCTL_SOE_REQUEST_READ, &data); if (EC_IOCTL_IS_ERROR(ret)) { - fprintf(stderr, "Failed to command an SoE read operation : %s\n", - strerror(EC_IOCTL_ERRNO(ret))); + return -EC_IOCTL_ERRNO(ret); } + return 0; } /****************************************************************************/ -void ecrt_soe_request_write(ec_soe_request_t *req) +int ecrt_soe_request_write(ec_soe_request_t *req) { ec_ioctl_soe_request_t data; int ret; @@ -168,9 +168,9 @@ void ecrt_soe_request_write(ec_soe_request_t *req) ret = ioctl(req->config->master->fd, EC_IOCTL_SOE_REQUEST_WRITE, &data); if (EC_IOCTL_IS_ERROR(ret)) { - fprintf(stderr, "Failed to command an SDO write operation : %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 04afb142..134b2edc 100644 --- a/master/ioctl.c +++ b/master/ioctl.c @@ -3703,8 +3703,7 @@ static ATTRIBUTES int ec_ioctl_soe_request_index( return -ENOENT; } - ecrt_soe_request_idn(req, data.drive_no, data.idn); - return 0; + return ecrt_soe_request_idn(req, data.drive_no, data.idn); } /****************************************************************************/ @@ -3740,8 +3739,7 @@ static ATTRIBUTES int ec_ioctl_soe_request_timeout( return -ENOENT; } - ecrt_soe_request_timeout(req, data.timeout); - return 0; + return ecrt_soe_request_timeout(req, data.timeout); } /****************************************************************************/ @@ -3824,8 +3822,7 @@ static ATTRIBUTES int ec_ioctl_soe_request_read( return -ENOENT; } - ecrt_soe_request_read(req); - return 0; + return ecrt_soe_request_read(req); } /****************************************************************************/ @@ -3874,8 +3871,7 @@ static ATTRIBUTES int ec_ioctl_soe_request_write( return -EFAULT; req->data_size = data.size; - ecrt_soe_request_write(req); - return 0; + return ecrt_soe_request_write(req); } /****************************************************************************/ diff --git a/master/soe_request.c b/master/soe_request.c index 3960d2b4..ef90124b 100644 --- a/master/soe_request.c +++ b/master/soe_request.c @@ -223,7 +223,7 @@ int ec_soe_request_append_data( /** Request a read operation. */ -void ec_soe_request_read( +int ec_soe_request_read( ec_soe_request_t *req /**< SoE request. */ ) { @@ -231,13 +231,14 @@ void ec_soe_request_read( req->state = EC_INT_REQUEST_QUEUED; req->error_code = 0x0000; req->jiffies_start = jiffies; + return 0; } /****************************************************************************/ /** Request a write operation. */ -void ec_soe_request_write( +int ec_soe_request_write( ec_soe_request_t *req /**< SoE request. */ ) { @@ -245,6 +246,7 @@ void ec_soe_request_write( req->state = EC_INT_REQUEST_QUEUED; req->error_code = 0x0000; req->jiffies_start = jiffies; + return 0; } /****************************************************************************/ @@ -263,18 +265,20 @@ int ec_soe_request_timed_out(const ec_soe_request_t *req /**< SDO request. */) * Application interface. ****************************************************************************/ -void ecrt_soe_request_idn(ec_soe_request_t *req, uint8_t drive_no, +int ecrt_soe_request_idn(ec_soe_request_t *req, uint8_t drive_no, uint16_t idn) { req->drive_no = drive_no; req->idn = idn; + return 0; } /****************************************************************************/ -void ecrt_soe_request_timeout(ec_soe_request_t *req, uint32_t timeout) +int ecrt_soe_request_timeout(ec_soe_request_t *req, uint32_t timeout) { req->issue_timeout = timeout; + return 0; } /****************************************************************************/ @@ -300,16 +304,16 @@ ec_request_state_t ecrt_soe_request_state(const ec_soe_request_t *req) /****************************************************************************/ -void ecrt_soe_request_read(ec_soe_request_t *req) +int ecrt_soe_request_read(ec_soe_request_t *req) { - ec_soe_request_read(req); + return ec_soe_request_read(req); } /****************************************************************************/ -void ecrt_soe_request_write(ec_soe_request_t *req) +int ecrt_soe_request_write(ec_soe_request_t *req) { - ec_soe_request_write(req); + return ec_soe_request_write(req); } /****************************************************************************/ diff --git a/master/soe_request.h b/master/soe_request.h index 67422ff7..ced4c9a1 100644 --- a/master/soe_request.h +++ b/master/soe_request.h @@ -67,8 +67,8 @@ void ec_soe_request_set_idn(ec_soe_request_t *, uint16_t); int ec_soe_request_alloc(ec_soe_request_t *, size_t); int ec_soe_request_copy_data(ec_soe_request_t *, const uint8_t *, size_t); int ec_soe_request_append_data(ec_soe_request_t *, const uint8_t *, size_t); -void ec_soe_request_read(ec_soe_request_t *); -void ec_soe_request_write(ec_soe_request_t *); +int ec_soe_request_read(ec_soe_request_t *); +int ec_soe_request_write(ec_soe_request_t *); int ec_soe_request_timed_out(const ec_soe_request_t *); /****************************************************************************/ From e78237ed31075d06df781dcdde928253242ada1c Mon Sep 17 00:00:00 2001 From: Bjarne von Horn Date: Fri, 9 Feb 2024 11:48:14 +0100 Subject: [PATCH 6/8] use `int` as return type for ecrt_voe_handler_* See #101 --- include/ecrt.h | 15 ++++++++++----- lib/voe_handler.c | 30 +++++++++++++++--------------- master/ioctl.c | 17 ++++++++--------- master/voe_handler.c | 15 ++++++++++----- 4 files changed, 43 insertions(+), 34 deletions(-) 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; } /****************************************************************************/ From 614a309bccac5f023fab9ce2fe43c79d217e46a9 Mon Sep 17 00:00:00 2001 From: Bjarne von Horn Date: Fri, 9 Feb 2024 11:59:47 +0100 Subject: [PATCH 7/8] use `int` as return type for ecrt_reg_request_* See #101 --- include/ecrt.h | 6 ++++-- lib/reg_request.c | 12 ++++++------ master/ioctl.c | 16 ++++++++++------ master/reg_request.c | 6 ++++-- 4 files changed, 24 insertions(+), 16 deletions(-) diff --git a/include/ecrt.h b/include/ecrt.h index 754821f6..ba36d4d3 100644 --- a/include/ecrt.h +++ b/include/ecrt.h @@ -2472,8 +2472,9 @@ ec_request_state_t ecrt_reg_request_state( * activation). * * \ingroup ApplicationInterfaceRT + * \return 0 on success, otherwise negative error code. */ -EC_PUBLIC_API void ecrt_reg_request_write( +EC_PUBLIC_API int ecrt_reg_request_write( ec_reg_request_t *req, /**< Register request. */ uint16_t address, /**< Register address. */ size_t size /**< Size to write. */ @@ -2491,8 +2492,9 @@ EC_PUBLIC_API void ecrt_reg_request_write( * activation). * * \ingroup ApplicationInterfaceRT + * \return 0 on success, otherwise negative error code. */ -EC_PUBLIC_API void ecrt_reg_request_read( +EC_PUBLIC_API int ecrt_reg_request_read( ec_reg_request_t *req, /**< Register request. */ uint16_t address, /**< Register address. */ size_t size /**< Size to write. */ diff --git a/lib/reg_request.c b/lib/reg_request.c index 6fb04c98..f52afd15 100644 --- a/lib/reg_request.c +++ b/lib/reg_request.c @@ -89,7 +89,7 @@ ec_request_state_t ecrt_reg_request_state(const ec_reg_request_t *reg) /****************************************************************************/ -void ecrt_reg_request_write(ec_reg_request_t *reg, uint16_t address, +int ecrt_reg_request_write(ec_reg_request_t *reg, uint16_t address, size_t size) { ec_ioctl_reg_request_t io; @@ -103,14 +103,14 @@ void ecrt_reg_request_write(ec_reg_request_t *reg, uint16_t address, ret = ioctl(reg->config->master->fd, EC_IOCTL_REG_REQUEST_WRITE, &io); if (EC_IOCTL_IS_ERROR(ret)) { - fprintf(stderr, "Failed to command an register write operation: %s\n", - strerror(EC_IOCTL_ERRNO(ret))); + return -EC_IOCTL_ERRNO(ret); } + return 0; } /****************************************************************************/ -void ecrt_reg_request_read(ec_reg_request_t *reg, uint16_t address, +int ecrt_reg_request_read(ec_reg_request_t *reg, uint16_t address, size_t size) { ec_ioctl_reg_request_t io; @@ -123,9 +123,9 @@ void ecrt_reg_request_read(ec_reg_request_t *reg, uint16_t address, ret = ioctl(reg->config->master->fd, EC_IOCTL_REG_REQUEST_READ, &io); if (EC_IOCTL_IS_ERROR(ret)) { - fprintf(stderr, "Failed to command an register read operation: %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 ed07d063..1289e27d 100644 --- a/master/ioctl.c +++ b/master/ioctl.c @@ -1069,7 +1069,10 @@ static ATTRIBUTES int ec_ioctl_slave_reg_read( return ret; } - ecrt_reg_request_read(&request, io.address, io.size); + ret = ecrt_reg_request_read(&request, io.address, io.size); + if (ret) { + return ret; + } if (down_interruptible(&master->master_sem)) { ec_reg_request_clear(&request); @@ -1153,7 +1156,10 @@ static ATTRIBUTES int ec_ioctl_slave_reg_write( return -EFAULT; } - ecrt_reg_request_write(&request, io.address, io.size); + ret = ecrt_reg_request_write(&request, io.address, io.size); + if (ret) { + return ret; + } if (down_interruptible(&master->master_sem)) { ec_reg_request_clear(&request); @@ -4050,8 +4056,7 @@ static ATTRIBUTES int ec_ioctl_reg_request_write( return -EFAULT; } - ecrt_reg_request_write(reg, io.address, io.transfer_size); - return 0; + return ecrt_reg_request_write(reg, io.address, io.transfer_size); } /****************************************************************************/ @@ -4093,8 +4098,7 @@ static ATTRIBUTES int ec_ioctl_reg_request_read( return -EOVERFLOW; } - ecrt_reg_request_read(reg, io.address, io.transfer_size); - return 0; + return ecrt_reg_request_read(reg, io.address, io.transfer_size); } /****************************************************************************/ diff --git a/master/reg_request.c b/master/reg_request.c index 29f7d4e2..eab70b1d 100644 --- a/master/reg_request.c +++ b/master/reg_request.c @@ -89,24 +89,26 @@ ec_request_state_t ecrt_reg_request_state(const ec_reg_request_t *reg) /****************************************************************************/ -void ecrt_reg_request_write(ec_reg_request_t *reg, uint16_t address, +int ecrt_reg_request_write(ec_reg_request_t *reg, uint16_t address, size_t size) { reg->dir = EC_DIR_OUTPUT; reg->address = address; reg->transfer_size = min(size, reg->mem_size); reg->state = EC_INT_REQUEST_QUEUED; + return 0; } /****************************************************************************/ -void ecrt_reg_request_read(ec_reg_request_t *reg, uint16_t address, +int ecrt_reg_request_read(ec_reg_request_t *reg, uint16_t address, size_t size) { reg->dir = EC_DIR_INPUT; reg->address = address; reg->transfer_size = min(size, reg->mem_size); reg->state = EC_INT_REQUEST_QUEUED; + return 0; } /****************************************************************************/ From fe160f5c8657e390da657e9b8a5dafc494babfe8 Mon Sep 17 00:00:00 2001 From: Bjarne von Horn Date: Wed, 3 Apr 2024 10:14:59 +0200 Subject: [PATCH 8/8] Use -ENOBUFS to indicate insufficient preallocated buffer --- include/ecrt.h | 10 ++++++++-- master/fsm_coe.c | 4 ++-- master/ioctl.c | 12 ++++++------ master/mailbox.c | 2 +- master/master.c | 4 ++-- 5 files changed, 19 insertions(+), 13 deletions(-) diff --git a/include/ecrt.h b/include/ecrt.h index ba36d4d3..ae4dc9d6 100644 --- a/include/ecrt.h +++ b/include/ecrt.h @@ -2079,7 +2079,7 @@ ec_request_state_t ecrt_sdo_request_state( * \ingroup ApplicationInterfaceRT * \return 0 on success, otherwise negative error code. * \retval -EINVAL Invalid input data, e.g. data size == 0. - * \retval -ENOMEM Reserved memory in ecrt_slave_config_create_sdo_request() + * \retval -ENOBUFS Reserved memory in ecrt_slave_config_create_sdo_request() * too small. */ EC_PUBLIC_API int ecrt_sdo_request_write( @@ -2220,7 +2220,7 @@ EC_PUBLIC_API ec_request_state_t ecrt_soe_request_state( * \ingroup ApplicationInterfaceRT * \return 0 on success, otherwise negative error code. * \retval -EINVAL Invalid input data, e.g. data size == 0. - * \retval -ENOMEM Reserved memory in ecrt_slave_config_create_soe_request() + * \retval -ENOBUFS Reserved memory in ecrt_slave_config_create_soe_request() * too small. */ EC_PUBLIC_API int ecrt_soe_request_write( @@ -2342,6 +2342,8 @@ EC_PUBLIC_API size_t ecrt_voe_handler_data_size( * * \ingroup ApplicationInterfaceRT * \return 0 on success, otherwise negative error code. + * \retval -ENOBUFS Reserved memory in ecrt_slave_config_create_voe_handler + * too small. */ EC_PUBLIC_API int ecrt_voe_handler_write( ec_voe_handler_t *voe, /**< VoE handler. */ @@ -2473,6 +2475,8 @@ ec_request_state_t ecrt_reg_request_state( * * \ingroup ApplicationInterfaceRT * \return 0 on success, otherwise negative error code. + * \retval -ENOBUFS Reserved memory in ecrt_slave_config_create_reg_request + * too small. */ EC_PUBLIC_API int ecrt_reg_request_write( ec_reg_request_t *req, /**< Register request. */ @@ -2493,6 +2497,8 @@ EC_PUBLIC_API int ecrt_reg_request_write( * * \ingroup ApplicationInterfaceRT * \return 0 on success, otherwise negative error code. + * \retval -ENOBUFS Reserved memory in ecrt_slave_config_create_reg_request + * too small. */ EC_PUBLIC_API int ecrt_reg_request_read( ec_reg_request_t *req, /**< Register request. */ diff --git a/master/fsm_coe.c b/master/fsm_coe.c index f12bbcd8..9b015de1 100644 --- a/master/fsm_coe.c +++ b/master/fsm_coe.c @@ -1309,7 +1309,7 @@ void ec_fsm_coe_down_start( if (slave->configured_rx_mailbox_size < EC_MBOX_HEADER_SIZE + EC_COE_DOWN_REQ_HEADER_SIZE) { EC_SLAVE_ERR(slave, "Mailbox too small!\n"); - request->errno = EOVERFLOW; + request->errno = ENOBUFS; fsm->state = ec_fsm_coe_error; return; } @@ -2463,7 +2463,7 @@ void ec_fsm_coe_up_seg_response( EC_SLAVE_ERR(slave, "SDO upload 0x%04X:%02X failed: Fragment" " exceeding complete size!\n", request->index, request->subindex); - request->errno = EOVERFLOW; + request->errno = ENOBUFS; fsm->state = ec_fsm_coe_error; return; } diff --git a/master/ioctl.c b/master/ioctl.c index 1289e27d..9361b6b9 100644 --- a/master/ioctl.c +++ b/master/ioctl.c @@ -3626,7 +3626,7 @@ static ATTRIBUTES int ec_ioctl_sdo_request_write( } if (data.size > req->mem_size) - return -ENOMEM; + return -ENOBUFS; if (ec_copy_from_user(req->data, (void __user *) data.data, data.size, ctx)) @@ -3870,7 +3870,7 @@ static ATTRIBUTES int ec_ioctl_soe_request_write( } if (data.size > req->mem_size) - return -ENOMEM; + return -ENOBUFS; if (ec_copy_from_user(req->data, (void __user *) data.data, data.size, ctx)) @@ -4048,7 +4048,7 @@ static ATTRIBUTES int ec_ioctl_reg_request_write( } if (io.transfer_size > reg->mem_size) { - return -EOVERFLOW; + return -ENOBUFS; } if (ec_copy_from_user(reg->data, (void __user *) io.data, @@ -4095,7 +4095,7 @@ static ATTRIBUTES int ec_ioctl_reg_request_read( } if (io.transfer_size > reg->mem_size) { - return -EOVERFLOW; + return -ENOBUFS; } return ecrt_reg_request_read(reg, io.address, io.transfer_size); @@ -4306,7 +4306,7 @@ static ATTRIBUTES int ec_ioctl_voe_write( if (data.size) { if (data.size > ec_voe_handler_mem_size(voe)) - return -EOVERFLOW; + return -ENOBUFS; if (ec_copy_from_user(ecrt_voe_handler_data(voe), (void __user *) data.data, data.size, ctx)) @@ -4482,7 +4482,7 @@ static ATTRIBUTES int ec_ioctl_slave_foe_read( if (request.data_size > io.buffer_size) { EC_SLAVE_ERR(slave, "%s(): Buffer too small.\n", __func__); ec_foe_request_clear(&request); - return -EOVERFLOW; + return -ENOBUFS; } io.data_size = request.data_size; if (copy_to_user((void __user *) io.buffer, diff --git a/master/mailbox.c b/master/mailbox.c index dacf3392..05a10fd1 100644 --- a/master/mailbox.c +++ b/master/mailbox.c @@ -60,7 +60,7 @@ uint8_t *ec_slave_mbox_prepare_send(const ec_slave_t *slave, /**< slave */ if (unlikely(total_size > slave->configured_rx_mailbox_size)) { EC_SLAVE_ERR(slave, "Data size (%zu) does not fit in mailbox (%u)!\n", total_size, slave->configured_rx_mailbox_size); - return ERR_PTR(-EOVERFLOW); + return ERR_PTR(-ENOBUFS); } ret = ec_datagram_fpwr(datagram, slave->station_address, diff --git a/master/master.c b/master/master.c index 5c83a041..d327337a 100644 --- a/master/master.c +++ b/master/master.c @@ -3092,7 +3092,7 @@ int ecrt_master_sdo_upload(ec_master_t *master, uint16_t slave_position, } else { if (request.data_size > target_size) { EC_SLAVE_ERR(slave, "%s(): Buffer too small.\n", __func__); - ret = -EOVERFLOW; + ret = -ENOBUFS; } else { memcpy(target, request.data, request.data_size); @@ -3250,7 +3250,7 @@ int ecrt_master_read_idn(ec_master_t *master, uint16_t slave_position, } else { // success if (request.data_size > target_size) { EC_SLAVE_ERR(slave, "%s(): Buffer too small.\n", __func__); - ret = -EOVERFLOW; + ret = -ENOBUFS; } else { // data fits in buffer if (result_size) {