diff -r 3213cbbd58b7 -r 6965c23a6826 drivers/ec_slave.c --- 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 #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); + +/*****************************************************************************/