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; } /****************************************************************************/