master/master.c
changeset 74 9bf603942791
parent 73 9f4ea66d89a3
child 77 677967864795
--- a/master/master.c	Thu Feb 23 09:58:50 2006 +0000
+++ b/master/master.c	Thu Feb 23 13:38:54 2006 +0000
@@ -71,14 +71,7 @@
 {
     unsigned int i;
 
-    if (master->slaves) {
-        for (i = 0; i < master->slave_count; i++) {
-            ec_slave_clear(master->slaves + i);
-        }
-        kfree(master->slaves);
-        master->slaves = NULL;
-    }
-    master->slave_count = 0;
+    ec_master_clear_slaves(master);
 
     for (i = 0; i < master->domain_count; i++) {
         ec_domain_clear(master->domains[i]);
@@ -96,6 +89,26 @@
 /*****************************************************************************/
 
 /**
+   Entfernt alle Slaves.
+*/
+
+void ec_master_clear_slaves(ec_master_t *master /**< EtherCAT-Master */)
+{
+    unsigned int i;
+
+    if (master->slaves) {
+        for (i = 0; i < master->slave_count; i++) {
+            ec_slave_clear(master->slaves + i);
+        }
+        kfree(master->slaves);
+        master->slaves = NULL;
+    }
+    master->slave_count = 0;
+}
+
+/*****************************************************************************/
+
+/**
    Öffnet das EtherCAT-Geraet des Masters.
 
    \return 0, wenn alles o.k., < 0, wenn kein Gerät registriert wurde oder
@@ -152,10 +165,9 @@
     unsigned int i;
     unsigned char data[2];
 
-    if (master->slaves || master->slave_count) {
-        printk(KERN_ERR "EtherCAT: Slave scan already done!\n");
-        return -1;
-    }
+    if (master->slaves || master->slave_count)
+        printk(KERN_WARNING "EtherCAT: Slave scan already done!\n");
+    ec_master_clear_slaves(master);
 
     // Determine number of slaves on bus
 
@@ -434,6 +446,8 @@
     return domain;
 }
 
+/*****************************************************************************/
+
 /**
    Konfiguriert alle Slaves und setzt den Operational-Zustand.
 
@@ -486,6 +500,9 @@
 
         type = slave->type;
 
+        // Check and reset CRC fault counters
+        ec_slave_check_crc(slave);
+
         // Resetting FMMU's
         if (slave->base_fmmu_count) {
             memset(data, 0x00, EC_FMMU_SIZE * slave->base_fmmu_count);
@@ -581,6 +598,9 @@
     {
         slave = master->slaves + i;
 
+        // CRC-Zählerstände ausgeben
+        ec_slave_check_crc(slave);
+
         if (unlikely(ec_slave_state_change(slave, EC_SLAVE_STATE_INIT) != 0))
             return -1;
     }