diff -r 1a7067207637 -r 7bc131b92039 master/master.h --- 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 #include #include -#include +#include #include #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 *); /*****************************************************************************/