--- 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;
}