From 13e99008c3fec479dd270d7a0589b844a76b03b0 Mon Sep 17 00:00:00 2001 From: Bjarne von Horn Date: Fri, 9 Feb 2024 10:29:57 +0100 Subject: [PATCH] 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; } /****************************************************************************/