--- a/master/master.c Mon Nov 17 15:04:28 2008 +0000
+++ b/master/master.c Mon Nov 17 17:18:02 2008 +0000
@@ -111,6 +111,8 @@
struct class *class /**< Device class. */
)
{
+ int ret;
+
master->index = index;
master->reserved = 0;
@@ -176,16 +178,19 @@
init_waitqueue_head(&master->phy_queue);
// init devices
- if (ec_device_init(&master->main_device, master))
+ ret = ec_device_init(&master->main_device, master);
+ if (ret < 0)
goto out_return;
- if (ec_device_init(&master->backup_device, master))
+ ret = ec_device_init(&master->backup_device, master);
+ if (ret < 0)
goto out_clear_main;
// init state machine datagram
ec_datagram_init(&master->fsm_datagram);
snprintf(master->fsm_datagram.name, EC_DATAGRAM_NAME_SIZE, "master-fsm");
- if (ec_datagram_prealloc(&master->fsm_datagram, EC_MAX_DATA_SIZE)) {
+ ret = ec_datagram_prealloc(&master->fsm_datagram, EC_MAX_DATA_SIZE);
+ if (ret < 0) {
EC_ERR("Failed to allocate FSM datagram.\n");
goto out_clear_backup;
}
@@ -194,7 +199,8 @@
ec_fsm_master_init(&master->fsm, master, &master->fsm_datagram);
// init character device
- if (ec_cdev_init(&master->cdev, master, device_number))
+ ret = ec_cdev_init(&master->cdev, master, device_number);
+ if (ret)
goto out_clear_fsm;
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 26)
@@ -212,6 +218,7 @@
#endif
if (IS_ERR(master->class_device)) {
EC_ERR("Failed to create class device!\n");
+ ret = PTR_ERR(master->class_device);
goto out_clear_cdev;
}
@@ -227,7 +234,7 @@
out_clear_main:
ec_device_clear(&master->main_device);
out_return:
- return -1;
+ return ret;
}
/*****************************************************************************/
@@ -349,6 +356,9 @@
/*****************************************************************************/
/** Starts the master thread.
+ *
+ * \retval 0 Success.
+ * \retval <0 Error code.
*/
int ec_master_thread_start(
ec_master_t *master, /**< EtherCAT master */
@@ -359,10 +369,10 @@
EC_INFO("Starting %s thread.\n", name);
master->thread = kthread_run(thread_func, master, name);
if (IS_ERR(master->thread)) {
- EC_ERR("Failed to start master thread (error %i)!\n",
- (int) PTR_ERR(master->thread));
+ int err = (int) PTR_ERR(master->thread);
+ EC_ERR("Failed to start master thread (error %i)!\n", err);
master->thread = NULL;
- return -1;
+ return err;
}
return 0;
@@ -406,6 +416,8 @@
ec_master_t *master /**< EtherCAT master */
)
{
+ int ret;
+
if (master->debug_level)
EC_DBG("ORPHANED -> IDLE.\n");
@@ -414,13 +426,12 @@
master->cb_data = master;
master->phase = EC_IDLE;
- if (ec_master_thread_start(master, ec_master_idle_thread,
- "EtherCAT-IDLE")) {
+ ret = ec_master_thread_start(master, ec_master_idle_thread,
+ "EtherCAT-IDLE");
+ if (ret)
master->phase = EC_ORPHANED;
- return -1;
- }
-
- return 0;
+
+ return ret;
}
/*****************************************************************************/
@@ -450,6 +461,7 @@
*/
int ec_master_enter_operation_phase(ec_master_t *master /**< EtherCAT master */)
{
+ int ret = 0;
ec_slave_t *slave;
#ifdef EC_EOE
ec_eoe_t *eoe;
@@ -464,8 +476,9 @@
up(&master->config_sem);
// wait for slave configuration to complete
- if (wait_event_interruptible(master->config_queue,
- !master->config_busy)) {
+ ret = wait_event_interruptible(master->config_queue,
+ !master->config_busy);
+ if (ret) {
EC_INFO("Finishing slave configuration interrupted by signal.\n");
goto out_allow;
}
@@ -484,7 +497,8 @@
up(&master->scan_sem);
// wait for slave scan to complete
- if (wait_event_interruptible(master->scan_queue, !master->scan_busy)) {
+ ret = wait_event_interruptible(master->scan_queue, !master->scan_busy);
+ if (ret) {
EC_INFO("Waiting for slave scan interrupted by signal.\n");
goto out_allow;
}
@@ -511,12 +525,12 @@
master->ext_request_cb = NULL;
master->ext_release_cb = NULL;
master->ext_cb_data = NULL;
- return 0;
+ return ret;
out_allow:
master->allow_scan = 1;
master->allow_config = 1;
- return -1;
+ return ret;
}
/*****************************************************************************/
@@ -1275,8 +1289,8 @@
/** Set the debug level.
*
- * \retval 0 Success.
- * \retval -1 Invalid debug level.
+ * \retval 0 Success.
+ * \retval -EINVAL Invalid debug level.
*/
int ec_master_debug_level(
ec_master_t *master, /**< EtherCAT master. */
@@ -1285,7 +1299,7 @@
{
if (level < 0 || level > 2) {
EC_ERR("Invalid debug level %i!\n", level);
- return -1;
+ return -EINVAL;
}
if (level != master->debug_level) {
@@ -1351,6 +1365,7 @@
{
uint32_t domain_offset;
ec_domain_t *domain;
+ int ret;
if (master->debug_level)
EC_DBG("ecrt_master_activate(master = 0x%x)\n", (u32) master);
@@ -1360,10 +1375,11 @@
// finish all domains
domain_offset = 0;
list_for_each_entry(domain, &master->domains, list) {
- if (ec_domain_finish(domain, domain_offset)) {
+ ret = ec_domain_finish(domain, domain_offset);
+ if (ret < 0) {
up(&master->master_sem);
EC_ERR("Failed to finish domain 0x%08X!\n", (u32) domain);
- return -1;
+ return ret;
}
domain_offset += domain->data_size;
}
@@ -1385,10 +1401,11 @@
master->release_cb = master->ext_release_cb;
master->cb_data = master->ext_cb_data;
- if (ec_master_thread_start(master, ec_master_operation_thread,
- "EtherCAT-OP")) {
+ ret = ec_master_thread_start(master, ec_master_operation_thread,
+ "EtherCAT-OP");
+ if (ret < 0) {
EC_ERR("Failed to start master thread!\n");
- return -1;
+ return ret;
}
#ifdef EC_EOE
ec_master_eoe_start(master);