master/master.h
branchstable-1.3
changeset 1744 7bc131b92039
parent 1739 5fcbd29151d2
child 1745 07fd94c5119d
--- 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 *);
 
 /*****************************************************************************/