--- a/master/master.h Fri Aug 10 15:08:44 2007 +0000
+++ b/master/master.h Fri Aug 10 15:27:08 2007 +0000
@@ -44,7 +44,7 @@
#include <linux/list.h>
#include <linux/sysfs.h>
#include <linux/timer.h>
-#include <asm/atomic.h>
+#include <linux/wait.h>
#include <asm/semaphore.h>
#include "device.h"
@@ -92,21 +92,40 @@
struct ec_master
{
- struct list_head list; /**< list item for module's master list */
- atomic_t available; /**< zero, if the master is reserved for RT */
+ struct kobject kobj; /**< kobject */
unsigned int index; /**< master index */
-
- struct kobject kobj; /**< kobject */
-
- ec_device_t *device; /**< EtherCAT device */
+ unsigned int reserved; /**< non-zero, if the master is reserved for RT */
+
+ ec_device_t main_device; /**< EtherCAT device */
+ const uint8_t *main_mac; /**< MAC address of main device */
+ ec_device_t backup_device; /**< EtherCAT backup device */
+ const uint8_t *backup_mac; /**< MAC address of backup device */
struct semaphore device_sem; /**< device semaphore */
ec_fsm_master_t fsm; /**< master state machine */
ec_datagram_t fsm_datagram; /**< datagram used for state machines */
ec_master_mode_t mode; /**< master mode */
+ unsigned int injection_seq_fsm; /**< datagram injection sequence number
+ for the FSM side */
+ unsigned int injection_seq_rt; /**< datagram injection sequence number
+ for the realtime side */
struct list_head slaves; /**< list of slaves on the bus */
unsigned int slave_count; /**< number of slaves on the bus */
+
+ ec_request_state_t scan_state; /**< current scanning state */
+ unsigned int allow_scan; /**< non-zero, if slave scanning is allowed */
+ struct semaphore scan_sem; /**< semaphore protecting the scan_state
+ variable and the allow_scan flag */
+ wait_queue_head_t scan_queue; /**< queue for processes that wait for
+ slave scanning */
+
+ ec_request_state_t config_state; /**< state of slave configuration */
+ unsigned int allow_config; /**< non-zero, if slave scanning is allowed */
+ struct semaphore config_sem; /**< semaphore protecting the config_state
+ variable and the allow_config flag */
+ wait_queue_head_t config_queue; /**< queue for processes that wait for
+ slave configuration */
struct list_head datagram_queue; /**< datagram queue */
uint8_t datagram_index; /**< current datagram index */
@@ -115,6 +134,11 @@
int debug_level; /**< master debug level */
ec_stats_t stats; /**< cyclic statistics */
+ unsigned int pdo_slaves_offline; /** number of slaves, for which PDOs
+ were registered and that are offline
+ (used for bus status) */
+ unsigned int frames_timed_out; /**< there were frame timeouts in the last
+ call to ecrt_master_receive() */
int thread_id; /**< master thread PID */
struct completion thread_exit; /**< thread completion object */
@@ -122,33 +146,38 @@
unsigned int idle_cycle_time_pos; /**< time ring buffer position */
struct timer_list eoe_timer; /**< EoE timer object */
+ unsigned int eoe_running; /**< non-zero, if EoE processing is active. */
+ struct list_head eoe_handlers; /**< Ethernet-over-EtherCAT handlers */
uint32_t eoe_cycle_times[HZ]; /**< EoE cycle times ring */
unsigned int eoe_cycle_time_pos; /**< time ring buffer position */
- unsigned int eoe_running; /**< non-zero, if EoE processing is active. */
- unsigned int eoe_checked; /**< non-zero, if EoE processing is not
- necessary. */
- struct list_head eoe_handlers; /**< Ethernet-over-EtherCAT handlers */
spinlock_t internal_lock; /**< spinlock used in idle mode */
int (*request_cb)(void *); /**< lock request callback */
void (*release_cb)(void *); /**< lock release callback */
void *cb_data; /**< data parameter of locking callbacks */
-
- uint8_t eeprom_write_enable; /**< allow write operations to EEPROMs */
-
- ec_sdo_request_t *sdo_request; /**< pointer to the current SDO request */
- unsigned int sdo_seq_user; /**< sequence number for user space */
- unsigned int sdo_seq_master; /**< sequence number for master */
- struct semaphore sdo_sem; /**< SDO semaphore */
- struct timer_list sdo_timer; /**< timer for polling sdo processing */
- struct completion sdo_complete; /**< SDO request completion object */
+ int (*ext_request_cb)(void *); /**< external lock request callback */
+ void (*ext_release_cb)(void *); /**< externam lock release callback */
+ void *ext_cb_data; /**< data parameter of external locking callbacks */
+
+ struct list_head eeprom_requests; /**< EEPROM write requests */
+ struct semaphore eeprom_sem; /**< semaphore protecting the list of
+ EEPROM write requests */
+ wait_queue_head_t eeprom_queue; /**< wait queue for EEPROM
+ write requests from user space */
+
+ struct list_head sdo_requests; /**< SDO access requests */
+ struct semaphore sdo_sem; /**< semaphore protecting the list of
+ SDO access requests */
+ wait_queue_head_t sdo_queue; /**< wait queue for SDO access requests
+ from user space */
};
/*****************************************************************************/
// master creation/deletion
-int ec_master_init(ec_master_t *, unsigned int, unsigned int);
-void ec_master_destroy(ec_master_t *);
+int ec_master_init(ec_master_t *, struct kobject *, unsigned int,
+ const uint8_t *, const uint8_t *);
+void ec_master_clear(ec_master_t *);
// mode transitions
int ec_master_enter_idle_mode(ec_master_t *);
@@ -166,8 +195,8 @@
// misc.
void ec_master_output_stats(ec_master_t *);
+void ec_master_clear_eoe_handlers(ec_master_t *);
void ec_master_destroy_slaves(ec_master_t *);
-void ec_master_calc_addressing(ec_master_t *);
/*****************************************************************************/