master/master.c
changeset 1075 94c6e36e0f8d
parent 1055 2be8918682fa
child 1077 c95cd717b852
--- a/master/master.c	Mon Jun 30 15:51:46 2008 +0000
+++ b/master/master.c	Tue Jul 01 15:38:20 2008 +0000
@@ -85,6 +85,8 @@
     master->index = index;
     master->reserved = 0;
 
+    init_MUTEX(&master->master_sem);
+
     master->main_mac = main_mac;
     master->backup_mac = backup_mac;
     init_MUTEX(&master->device_sem);
@@ -360,13 +362,13 @@
         ec_master_t *master /**< EtherCAT master */
         )
 {
+    if (master->debug_level)
+        EC_DBG("ORPHANED -> IDLE.\n");
+
     master->request_cb = ec_master_request_cb;
     master->release_cb = ec_master_release_cb;
     master->cb_data = master;
 
-    if (master->debug_level)
-        EC_DBG("ORPHANED -> IDLE.\n");
-
     master->phase = EC_IDLE;
     if (ec_master_thread_start(master, ec_master_idle_thread)) {
         master->phase = EC_ORPHANED;
@@ -391,7 +393,10 @@
     ec_master_eoe_stop(master);
 #endif
     ec_master_thread_stop(master);
+
+    down(&master->master_sem);
     ec_master_clear_slaves(master);
+    up(&master->master_sem);
 }
 
 /*****************************************************************************/
@@ -457,9 +462,6 @@
     }
 #endif
 
-    if (master->debug_level)
-        EC_DBG("Switching to operation phase.\n");
-
     master->phase = EC_OPERATION;
     master->ext_request_cb = NULL;
     master->ext_release_cb = NULL;
@@ -498,8 +500,10 @@
     master->release_cb = ec_master_release_cb;
     master->cb_data = master;
     
+    down(&master->master_sem);
     ec_master_clear_domains(master);
     ec_master_clear_slave_configs(master);
+    up(&master->master_sem);
 
     // set states for all slaves
     for (slave = master->slaves;
@@ -826,7 +830,9 @@
             goto schedule;
 
         // execute master state machine
+        down(&master->master_sem);
         ec_fsm_master_exec(&master->fsm);
+        up(&master->master_sem);
 
         // queue and send
         spin_lock_bh(&master->internal_lock);
@@ -870,7 +876,9 @@
         ec_master_output_stats(master);
 
         // execute master state machine
+        down(&master->master_sem);
         ec_fsm_master_exec(&master->fsm);
+        up(&master->master_sem);
 
         // inject datagram
         master->injection_seq_fsm++;
@@ -1146,6 +1154,8 @@
         return NULL;
     }
 
+    down(&master->master_sem);
+
     if (list_empty(&master->domains)) {
         index = 0;
     } else {
@@ -1156,6 +1166,8 @@
     ec_domain_init(domain, master, index);
     list_add_tail(&domain->list, &master->domains);
 
+    up(&master->master_sem);
+
     return domain;
 }
 
@@ -1166,6 +1178,8 @@
     uint32_t domain_offset;
     ec_domain_t *domain;
 
+    down(&master->master_sem);
+
     // finish all domains
     domain_offset = 0;
     list_for_each_entry(domain, &master->domains, list) {
@@ -1175,6 +1189,8 @@
         }
         domain_offset += domain->data_size;
     }
+    
+    up(&master->master_sem);
 
     // restart EoE process and master thread with new locking
 #ifdef EC_EOE
@@ -1327,11 +1343,15 @@
         ec_slave_config_init(sc, master,
                 alias, position, vendor_id, product_code);
 
+
+        down(&master->master_sem);
+
         // try to find the addressed slave
         ec_slave_config_attach(sc);
         ec_slave_config_load_default_sync_config(sc);
-
         list_add_tail(&sc->list, &master->configs);
+
+        up(&master->master_sem);
     }
 
     return sc;