drivers/ec_slave.c
changeset 39 6965c23a6826
parent 26 60435f959e5c
child 42 a22a202d0f42
--- a/drivers/ec_slave.c	Fri Dec 16 16:21:22 2005 +0000
+++ b/drivers/ec_slave.c	Mon Dec 19 08:13:11 2005 +0000
@@ -1,20 +1,19 @@
-/****************************************************************
+/******************************************************************************
  *
  *  e c _ s l a v e . c
  *
  *  Methoden für einen EtherCAT-Slave.
  *
- *  $Date$
- *  $Author$
+ *  $Id$
  *
- ***************************************************************/
+ *****************************************************************************/
 
 #include <linux/module.h>
 
 #include "ec_globals.h"
 #include "ec_slave.h"
 
-/***************************************************************/
+/*****************************************************************************/
 
 /**
    EtherCAT-Slave-Konstruktor.
@@ -29,24 +28,20 @@
   slave->type = 0;
   slave->revision = 0;
   slave->build = 0;
-
   slave->ring_position = 0;
   slave->station_address = 0;
-
   slave->vendor_id = 0;
   slave->product_code = 0;
   slave->revision_number = 0;
   slave->serial_number = 0;
-
-  slave->desc = 0;
-
+  slave->desc = NULL;
   slave->logical_address0 = 0;
-
   slave->current_state = ECAT_STATE_UNKNOWN;
   slave->requested_state = ECAT_STATE_UNKNOWN;
+  slave->error_reported = 0;
 }
 
-/***************************************************************/
+/*****************************************************************************/
 
 /**
    EtherCAT-Slave-Destruktor.
@@ -61,7 +56,7 @@
   // Nothing yet...
 }
 
-/***************************************************************/
+/*****************************************************************************/
 
 /**
    Liest einen bestimmten Kanal des Slaves als Integer-Wert.
@@ -81,37 +76,46 @@
 int EtherCAT_read_value(EtherCAT_slave_t *slave,
                         unsigned int channel)
 {
-  if (!slave->desc)
-  {
-    printk(KERN_WARNING "EtherCAT: Reading failed on slave %04X (addr %0X)"
-           " - Slave has no description.\n",
-           slave->station_address, (unsigned int) slave);
+  if (unlikely(!slave->desc)) {
+    if (likely(slave->error_reported)) {
+      printk(KERN_WARNING "EtherCAT: Reading failed on slave %04X (addr %0X)"
+             " - Slave has no description.\n",
+             slave->station_address, (unsigned int) slave);
+      slave->error_reported = 1;
+    }
     return 0;
   }
 
-  if (!slave->desc->read)
-  {
-    printk(KERN_WARNING "EtherCAT: Reading failed on slave %04X (addr %0X)"
-           " - Slave type (%s %s) has no read method.\n",
-           slave->station_address, (unsigned int) slave,
-           slave->desc->vendor_name, slave->desc->product_name);
+  if (unlikely(!slave->desc->read)) {
+    if (likely(slave->error_reported)) {
+      printk(KERN_WARNING "EtherCAT: Reading failed on slave %04X (addr %0X)"
+             " - Slave type (%s %s) has no read method.\n",
+             slave->station_address, (unsigned int) slave,
+             slave->desc->vendor_name, slave->desc->product_name);
+      slave->error_reported = 1;
+    }
     return 0;
   }
 
-  if (channel >= slave->desc->channels)
-  {
-    printk(KERN_WARNING "EtherCAT: Reading failed on slave %4X (addr %0X)"
-           " - Type (%s %s) has no channel %i.\n",
-           slave->station_address, (unsigned int) slave,
-           slave->desc->vendor_name, slave->desc->product_name,
-           channel);
+  if (unlikely(channel >= slave->desc->channels)) {
+    if (likely(slave->error_reported)) {
+      printk(KERN_WARNING "EtherCAT: Reading failed on slave %4X (addr %0X)"
+             " - Type (%s %s) has no channel %i.\n",
+             slave->station_address, (unsigned int) slave,
+             slave->desc->vendor_name, slave->desc->product_name,
+             channel);
+      slave->error_reported = 1;
+    }
     return 0;
   }
 
+  if (unlikely(slave->error_reported))
+    slave->error_reported = 0;
+
   return slave->desc->read(slave->process_data, channel);
 }
 
-/***************************************************************/
+/*****************************************************************************/
 
 /**
    Schreibt einen bestimmten Kanal des Slaves als Integer-Wert .
@@ -131,37 +135,48 @@
                           unsigned int channel,
                           int value)
 {
-  if (!slave->desc)
-  {
-    printk(KERN_WARNING "EtherCAT: Writing failed on slave %04X (addr %0X)"
-           " - Slave has no description.\n",
-           slave->station_address, (unsigned int) slave);
+  if (unlikely(!slave->desc)) {
+    if (likely(slave->error_reported)) {
+      printk(KERN_WARNING "EtherCAT: Writing failed on slave %04X (addr %0X)"
+             " - Slave has no description.\n",
+             slave->station_address, (unsigned int) slave);
+      slave->error_reported = 1;
+    }
     return;
   }
 
-  if (!slave->desc->write)
-  {
-    printk(KERN_WARNING "EtherCAT: Writing failed on slave %04X (addr %0X)"
-           " - Type (%s %s) has no write method.\n",
-           slave->station_address, (unsigned int) slave,
-           slave->desc->vendor_name, slave->desc->product_name);
+  if (unlikely(!slave->desc->write)) {
+    if (likely(slave->error_reported)) {
+      printk(KERN_WARNING "EtherCAT: Writing failed on slave %04X (addr %0X)"
+             " - Type (%s %s) has no write method.\n",
+             slave->station_address, (unsigned int) slave,
+             slave->desc->vendor_name, slave->desc->product_name);
+      slave->error_reported = 1;
+    }
     return;
   }
 
-  if (channel >= slave->desc->channels)
-  {
-    printk(KERN_WARNING "EtherCAT: Writing failed on slave %4X (addr %0X)"
-           " - Type (%s %s) has no channel %i.\n",
-           slave->station_address, (unsigned int) slave,
-           slave->desc->vendor_name, slave->desc->product_name,
-           channel);
+  if (unlikely(channel >= slave->desc->channels)) {
+    if (likely(slave->error_reported)) {
+      printk(KERN_WARNING "EtherCAT: Writing failed on slave %4X (addr %0X)"
+             " - Type (%s %s) has no channel %i.\n",
+             slave->station_address, (unsigned int) slave,
+             slave->desc->vendor_name, slave->desc->product_name,
+             channel);
+      slave->error_reported = 1;
+    }
     return;
   }
 
+  if (unlikely(slave->error_reported))
+    slave->error_reported = 0;
+
   slave->desc->write(slave->process_data, channel, value);
 }
 
-/***************************************************************/
+/*****************************************************************************/
 
 EXPORT_SYMBOL(EtherCAT_write_value);
 EXPORT_SYMBOL(EtherCAT_read_value);
+
+/*****************************************************************************/