master/master.c
branchredundancy
changeset 2374 e898451c054a
parent 2372 d895cd1db2bf
child 2380 cf9db49bcce8
--- a/master/master.c	Fri Apr 06 23:30:35 2012 +0200
+++ b/master/master.c	Fri Apr 06 23:35:05 2012 +0200
@@ -554,6 +554,7 @@
         )
 {
     int ret;
+    ec_device_index_t dev_idx;
 
     EC_MASTER_DBG(master, 1, "ORPHANED -> IDLE.\n");
 
@@ -564,7 +565,9 @@
     master->phase = EC_IDLE;
 
     // reset number of responding slaves to trigger scanning
-    master->fsm.slaves_responding = 0;
+    for (dev_idx = EC_DEVICE_MAIN; dev_idx < EC_NUM_DEVICES; dev_idx++) {
+        master->fsm.slaves_responding[dev_idx] = 0;
+    }
 
     ret = ec_master_thread_start(master, ec_master_idle_thread,
             "EtherCAT-IDLE");
@@ -727,8 +730,7 @@
             datagram->cycles_sent = 0;
 #endif
             datagram->jiffies_sent = 0;
-            ec_master_queue_datagram(master, datagram,
-                    datagram->device_index);
+            ec_master_queue_datagram(master, datagram);
         } else {
             if (datagram->data_size > master->max_queue_size) {
                 list_del_init(&datagram->queue);
@@ -800,8 +802,7 @@
  */
 void ec_master_queue_external_datagram(
         ec_master_t *master, /**< EtherCAT master */
-        ec_datagram_t *datagram, /**< datagram */
-        ec_device_index_t device_index /**< Device index. */
+        ec_datagram_t *datagram /**< datagram */
         )
 {
     ec_datagram_t *queued_datagram;
@@ -824,7 +825,6 @@
 
     list_add_tail(&datagram->queue, &master->external_datagram_queue);
     datagram->state = EC_DATAGRAM_QUEUED;
-    datagram->device_index = device_index;
 #ifdef EC_HAVE_CYCLES
     datagram->cycles_sent = get_cycles();
 #endif
@@ -840,8 +840,7 @@
  */
 void ec_master_queue_datagram(
         ec_master_t *master, /**< EtherCAT master */
-        ec_datagram_t *datagram, /**< datagram */
-        ec_device_index_t device_index /**< Device index. */
+        ec_datagram_t *datagram /**< datagram */
         )
 {
     ec_datagram_t *queued_datagram;
@@ -881,7 +880,6 @@
 
     list_add_tail(&datagram->queue, &master->datagram_queue);
     datagram->state = EC_DATAGRAM_QUEUED;
-    datagram->device_index = device_index;
 }
 
 /*****************************************************************************/
@@ -1388,8 +1386,7 @@
         // queue and send
         down(&master->io_sem);
         if (fsm_exec) {
-            ec_master_queue_datagram(master, &master->fsm_datagram,
-                    EC_DEVICE_MAIN);
+            ec_master_queue_datagram(master, &master->fsm_datagram);
         }
         ecrt_master_send(master);
 #ifdef EC_USE_HRTIMER
@@ -2231,42 +2228,41 @@
 void ecrt_master_send(ec_master_t *master)
 {
     ec_datagram_t *datagram, *n;
-    unsigned int i;
+    ec_device_index_t dev_idx;
 
     if (master->injection_seq_rt != master->injection_seq_fsm) {
-        // inject datagrams produced by master & slave FSMs
-        ec_master_queue_datagram(master, &master->fsm_datagram,
-                EC_DEVICE_MAIN);
+        // inject datagrams produced by master and slave FSMs
+        ec_master_queue_datagram(master, &master->fsm_datagram);
         master->injection_seq_rt = master->injection_seq_fsm;
     }
 
     ec_master_inject_external_datagrams(master);
 
-    for (i = 0; i < EC_NUM_DEVICES; i++) {
-        if (unlikely(!master->devices[i].link_state)) {
+    for (dev_idx = EC_DEVICE_MAIN; dev_idx < EC_NUM_DEVICES; dev_idx++) {
+        if (unlikely(!master->devices[dev_idx].link_state)) {
             // link is down, no datagram can be sent
             list_for_each_entry_safe(datagram, n,
                     &master->datagram_queue, queue) {
-                if (datagram->device_index == i) {
+                if (datagram->device_index == dev_idx) {
                     datagram->state = EC_DATAGRAM_ERROR;
                     list_del_init(&datagram->queue);
                 }
             }
 
-            if (!master->devices[i].dev) {
+            if (!master->devices[dev_idx].dev) {
                 continue;
             }
 
             // query link state
-            ec_device_poll(&master->devices[i]);
+            ec_device_poll(&master->devices[dev_idx]);
 
             // clear frame statistics
-            ec_device_clear_stats(&master->devices[i]);
+            ec_device_clear_stats(&master->devices[dev_idx]);
             continue;
         }
 
         // send frames
-        ec_master_send_datagrams(master, i);
+        ec_master_send_datagrams(master, dev_idx);
     }
 }
 
@@ -2327,7 +2323,7 @@
     list_for_each_entry_safe(datagram, next, &master->ext_datagram_queue,
             queue) {
         list_del(&datagram->queue);
-        ec_master_queue_datagram(master, datagram, EC_DEVICE_MAIN);
+        ec_master_queue_datagram(master, datagram);
     }
 
     ecrt_master_send(master);
@@ -2491,9 +2487,22 @@
 
 void ecrt_master_state(const ec_master_t *master, ec_master_state_t *state)
 {
-    state->slaves_responding = master->fsm.slaves_responding;
-    state->al_states = master->fsm.slave_states;
-    state->link_up = master->devices[EC_DEVICE_MAIN].link_state;
+    ec_device_index_t dev_idx;
+
+    state->slaves_responding = 0U;
+    state->al_states = 0;
+    state->link_up = 0U;
+
+    for (dev_idx = EC_DEVICE_MAIN; dev_idx < EC_NUM_DEVICES; dev_idx++) {
+        /* Announce sum of responding slaves on all links. */
+        state->slaves_responding += master->fsm.slaves_responding[dev_idx];
+
+        /* Binary-or slave states of all links. */
+        state->al_states |= master->fsm.slave_states[dev_idx];
+
+        /* Signal link up if at least one device has link. */
+        state->link_up |= master->devices[dev_idx].link_state;
+    }
 }
 
 /*****************************************************************************/
@@ -2513,8 +2522,7 @@
 void ecrt_master_sync_reference_clock(ec_master_t *master)
 {
     EC_WRITE_U32(master->ref_sync_datagram.data, master->app_time);
-    ec_master_queue_datagram(master, &master->ref_sync_datagram,
-            EC_DEVICE_MAIN);
+    ec_master_queue_datagram(master, &master->ref_sync_datagram);
 }
 
 /*****************************************************************************/
@@ -2522,8 +2530,7 @@
 void ecrt_master_sync_slave_clocks(ec_master_t *master)
 {
     ec_datagram_zero(&master->sync_datagram);
-    ec_master_queue_datagram(master, &master->sync_datagram,
-            EC_DEVICE_MAIN);
+    ec_master_queue_datagram(master, &master->sync_datagram);
 }
 
 /*****************************************************************************/
@@ -2531,8 +2538,7 @@
 void 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,
-            EC_DEVICE_MAIN);
+    ec_master_queue_datagram(master, &master->sync_mon_datagram);
 }
 
 /*****************************************************************************/