Better state-dependent behaviour for EoE-capable slaves.
authorFlorian Pose <fp@igh-essen.com>
Fri, 26 May 2006 14:28:49 +0000
changeset 261 44a3a5833c49
parent 260 5fe7df7f2433
child 262 636d43737371
Better state-dependent behaviour for EoE-capable slaves.
master/ethernet.c
master/master.c
--- a/master/ethernet.c	Fri May 26 14:26:57 2006 +0000
+++ b/master/ethernet.c	Fri May 26 14:28:49 2006 +0000
@@ -250,7 +250,6 @@
 
     eoe->tx_offset += current_size;
     eoe->tx_fragment_number++;
-
     return 0;
 }
 
@@ -302,12 +301,15 @@
 
 /**
    State: RX_START.
-   Starts a new receiving sequence by queuing a command that checks the
-   slave's mailbox for a new command.
+   Starts a new receiving sequence by queueing a command that checks the
+   slave's mailbox for a new EoE command.
 */
 
 void ec_eoe_state_rx_start(ec_eoe_t *eoe /**< EoE handler */)
 {
+    if (!eoe->slave->online || !eoe->slave->master->device->link_state)
+        return;
+
     ec_slave_mbox_prepare_check(eoe->slave);
     ec_master_queue_command(eoe->slave->master, &eoe->slave->mbox_command);
     eoe->state = ec_eoe_state_rx_check;
@@ -493,6 +495,9 @@
     unsigned int wakeup;
 #endif
 
+    if (!eoe->slave->online || !eoe->slave->master->device->link_state)
+        return;
+
     spin_lock_bh(&eoe->tx_queue_lock);
 
     if (!eoe->tx_queued_frames || list_empty(&eoe->tx_queue)) {
@@ -601,6 +606,7 @@
         EC_WARN("device %s is not coupled to any EoE slave!\n", dev->name);
     else {
         eoe->slave->requested_state = EC_SLAVE_STATE_OP;
+        eoe->slave->state_error = 0;
     }
     return 0;
 }
@@ -623,6 +629,7 @@
         EC_WARN("device %s is not coupled to any EoE slave!\n", dev->name);
     else {
         eoe->slave->requested_state = EC_SLAVE_STATE_INIT;
+        eoe->slave->state_error = 0;
     }
     return 0;
 }
--- a/master/master.c	Fri May 26 14:26:57 2006 +0000
+++ b/master/master.c	Fri May 26 14:28:49 2006 +0000
@@ -853,14 +853,20 @@
             coupled++;
             EC_INFO("Coupling device %s to slave %i.\n",
                     eoe->dev->name, slave->ring_position);
-            if (eoe->opened)
+            if (eoe->opened) {
                 slave->requested_state = EC_SLAVE_STATE_OP;
+            }
+            else {
+                slave->requested_state = EC_SLAVE_STATE_INIT;
+            }
+            slave->state_error = 0;
             break;
         }
 
         if (!found) {
             EC_WARN("No EoE handler for slave %i!\n", slave->ring_position);
             slave->requested_state = EC_SLAVE_STATE_INIT;
+            slave->state_error = 0;
         }
     }
 
@@ -898,6 +904,7 @@
     list_for_each_entry(eoe, &master->eoe_handlers, list) {
         if (eoe->slave) {
             eoe->slave->requested_state = EC_SLAVE_STATE_INIT;
+            eoe->slave->state_error = 0;
             eoe->slave = NULL;
         }
     }
@@ -906,7 +913,6 @@
 }
 
 /*****************************************************************************/
-
 /**
    Does the Ethernet-over-EtherCAT processing.
 */