master/master.c
changeset 1313 ed15eef57d5c
parent 1312 74853e018898
child 1326 ef907b0b5125
--- 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);