--- a/master/master.c Wed Nov 09 17:07:33 2011 +0100
+++ b/master/master.c Thu Jan 12 12:14:33 2012 +0100
@@ -109,11 +109,13 @@
{
#ifdef EC_HAVE_CYCLES
timeout_cycles = (cycles_t) EC_IO_TIMEOUT /* us */ * (cpu_khz / 1000);
- ext_injection_timeout_cycles = (cycles_t) EC_SDO_INJECTION_TIMEOUT /* us */ * (cpu_khz / 1000);
+ ext_injection_timeout_cycles =
+ (cycles_t) EC_SDO_INJECTION_TIMEOUT /* us */ * (cpu_khz / 1000);
#else
// one jiffy may always elapse between time measurement
timeout_jiffies = max(EC_IO_TIMEOUT * HZ / 1000000, 1);
- ext_injection_timeout_jiffies = max(EC_SDO_INJECTION_TIMEOUT * HZ / 1000000, 1);
+ ext_injection_timeout_jiffies =
+ max(EC_SDO_INJECTION_TIMEOUT * HZ / 1000000, 1);
#endif
}
@@ -140,8 +142,8 @@
sema_init(&master->master_sem, 1);
- master->main_mac = main_mac;
- master->backup_mac = backup_mac;
+ master->macs[EC_DEVICE_MAIN] = main_mac;
+ master->macs[EC_DEVICE_BACKUP] = backup_mac;
ec_master_clear_device_stats(master);
sema_init(&master->device_sem, 1);
@@ -211,11 +213,11 @@
init_waitqueue_head(&master->reg_queue);
// init devices
- ret = ec_device_init(&master->main_device, master);
+ ret = ec_device_init(&master->devices[EC_DEVICE_MAIN], master);
if (ret < 0)
goto out_return;
- ret = ec_device_init(&master->backup_device, master);
+ ret = ec_device_init(&master->devices[EC_DEVICE_BACKUP], master);
if (ret < 0)
goto out_clear_main;
@@ -234,7 +236,8 @@
// init reference sync datagram
ec_datagram_init(&master->ref_sync_datagram);
- snprintf(master->ref_sync_datagram.name, EC_DATAGRAM_NAME_SIZE, "refsync");
+ snprintf(master->ref_sync_datagram.name, EC_DATAGRAM_NAME_SIZE,
+ "refsync");
ret = ec_datagram_apwr(&master->ref_sync_datagram, 0, 0x0910, 8);
if (ret < 0) {
ec_datagram_clear(&master->ref_sync_datagram);
@@ -256,7 +259,8 @@
// init sync monitor datagram
ec_datagram_init(&master->sync_mon_datagram);
- snprintf(master->sync_mon_datagram.name, EC_DATAGRAM_NAME_SIZE, "syncmon");
+ snprintf(master->sync_mon_datagram.name, EC_DATAGRAM_NAME_SIZE,
+ "syncmon");
ret = ec_datagram_brd(&master->sync_mon_datagram, 0x092c, 4);
if (ret < 0) {
ec_datagram_clear(&master->sync_mon_datagram);
@@ -309,9 +313,9 @@
ec_fsm_master_clear(&master->fsm);
ec_datagram_clear(&master->fsm_datagram);
out_clear_backup:
- ec_device_clear(&master->backup_device);
+ ec_device_clear(&master->devices[EC_DEVICE_BACKUP]);
out_clear_main:
- ec_device_clear(&master->main_device);
+ ec_device_clear(&master->devices[EC_DEVICE_MAIN]);
out_return:
return ret;
}
@@ -344,8 +348,8 @@
ec_datagram_clear(&master->ref_sync_datagram);
ec_fsm_master_clear(&master->fsm);
ec_datagram_clear(&master->fsm_datagram);
- ec_device_clear(&master->backup_device);
- ec_device_clear(&master->main_device);
+ ec_device_clear(&master->devices[EC_DEVICE_BACKUP]);
+ ec_device_clear(&master->devices[EC_DEVICE_MAIN]);
}
/*****************************************************************************/
@@ -591,7 +595,9 @@
/** Transition function from IDLE to OPERATION phase.
*/
-int ec_master_enter_operation_phase(ec_master_t *master /**< EtherCAT master */)
+int ec_master_enter_operation_phase(
+ ec_master_t *master /**< EtherCAT master */
+ )
{
int ret = 0;
ec_slave_t *slave;
@@ -628,7 +634,8 @@
up(&master->scan_sem);
// wait for slave scan to complete
- ret = wait_event_interruptible(master->scan_queue, !master->scan_busy);
+ ret = wait_event_interruptible(master->scan_queue,
+ !master->scan_busy);
if (ret) {
EC_MASTER_INFO(master, "Waiting for slave scan"
" interrupted by signal.\n");
@@ -908,7 +915,7 @@
do {
// fetch pointer to transmit socket buffer
- frame_data = ec_device_tx_data(&master->main_device);
+ frame_data = ec_device_tx_data(&master->devices[EC_DEVICE_MAIN]);
cur_data = frame_data + EC_FRAME_HEADER_SIZE;
follows_word = NULL;
more_datagrams_waiting = 0;
@@ -933,7 +940,8 @@
// set "datagram following" flag in previous frame
if (follows_word)
- EC_WRITE_U16(follows_word, EC_READ_U16(follows_word) | 0x8000);
+ EC_WRITE_U16(follows_word,
+ EC_READ_U16(follows_word) | 0x8000);
// EtherCAT datagram header
EC_WRITE_U8 (cur_data, datagram->type);
@@ -960,7 +968,7 @@
// EtherCAT frame header
EC_WRITE_U16(frame_data, ((cur_data - frame_data
- - EC_FRAME_HEADER_SIZE) & 0x7FF) | 0x1000);
+ - EC_FRAME_HEADER_SIZE) & 0x7FF) | 0x1000);
// pad frame
while (cur_data - frame_data < ETH_ZLEN - ETH_HLEN)
@@ -969,7 +977,8 @@
EC_MASTER_DBG(master, 2, "frame size: %zu\n", cur_data - frame_data);
// send frame
- ec_device_send(&master->main_device, cur_data - frame_data);
+ ec_device_send(&master->devices[EC_DEVICE_MAIN],
+ cur_data - frame_data);
#ifdef EC_HAVE_CYCLES
cycles_sent = get_cycles();
#endif
@@ -1092,7 +1101,7 @@
EC_DATAGRAM_HEADER_SIZE + data_size
+ EC_DATAGRAM_FOOTER_SIZE);
#ifdef EC_DEBUG_RING
- ec_device_debug_ring_print(&master->main_device);
+ ec_device_debug_ring_print(&master->devices[EC_DEVICE_MAIN]);
#endif
}
@@ -1117,9 +1126,11 @@
// dequeue the received datagram
datagram->state = EC_DATAGRAM_RECEIVED;
#ifdef EC_HAVE_CYCLES
- datagram->cycles_received = master->main_device.cycles_poll;
-#endif
- datagram->jiffies_received = master->main_device.jiffies_poll;
+ datagram->cycles_received =
+ master->devices[EC_DEVICE_MAIN].cycles_poll;
+#endif
+ datagram->jiffies_received =
+ master->devices[EC_DEVICE_MAIN].jiffies_poll;
list_del_init(&datagram->queue);
}
}
@@ -1230,8 +1241,8 @@
s->last_tx_bytes = s->tx_bytes;
s->last_rx_bytes = s->rx_bytes;
- ec_device_update_stats(&master->main_device);
- ec_device_update_stats(&master->backup_device);
+ ec_device_update_stats(&master->devices[EC_DEVICE_MAIN]);
+ ec_device_update_stats(&master->devices[EC_DEVICE_BACKUP]);
s->jiffies = jiffies;
}
@@ -1356,8 +1367,8 @@
}
ec_master_inject_external_datagrams(master);
ecrt_master_send(master);
- sent_bytes = master->main_device.tx_skb[
- master->main_device.tx_ring_index]->len;
+ sent_bytes = master->devices[EC_DEVICE_MAIN].tx_skb[
+ master->devices[EC_DEVICE_MAIN].tx_ring_index]->len;
up(&master->io_sem);
if (ec_fsm_master_idle(&master->fsm)) {
@@ -2000,7 +2011,8 @@
EC_MASTER_DBG(master, 1, "ecrt_master_create_domain(master = 0x%p)\n",
master);
- if (!(domain = (ec_domain_t *) kmalloc(sizeof(ec_domain_t), GFP_KERNEL))) {
+ if (!(domain =
+ (ec_domain_t *) kmalloc(sizeof(ec_domain_t), GFP_KERNEL))) {
EC_MASTER_ERR(master, "Error allocating domain memory!\n");
return ERR_PTR(-ENOMEM);
}
@@ -2186,18 +2198,19 @@
}
ec_master_inject_external_datagrams(master);
- if (unlikely(!master->main_device.link_state)) {
+ if (unlikely(!master->devices[EC_DEVICE_MAIN].link_state)) {
// link is down, no datagram can be sent
- list_for_each_entry_safe(datagram, n, &master->datagram_queue, queue) {
+ list_for_each_entry_safe(datagram, n,
+ &master->datagram_queue, queue) {
datagram->state = EC_DATAGRAM_ERROR;
list_del_init(&datagram->queue);
}
// query link state
- ec_device_poll(&master->main_device);
+ ec_device_poll(&master->devices[EC_DEVICE_MAIN]);
// clear frame statistics
- ec_device_clear_stats(&master->main_device);
+ ec_device_clear_stats(&master->devices[EC_DEVICE_MAIN]);
return;
}
@@ -2212,9 +2225,9 @@
ec_datagram_t *datagram, *next;
// receive datagrams
- ec_device_poll(&master->main_device);
- if (master->backup_device.dev) {
- ec_device_poll(&master->backup_device);
+ ec_device_poll(&master->devices[EC_DEVICE_MAIN]);
+ if (master->devices[EC_DEVICE_BACKUP].dev) {
+ ec_device_poll(&master->devices[EC_DEVICE_BACKUP]);
}
ec_master_update_device_stats(master);
@@ -2223,11 +2236,11 @@
if (datagram->state != EC_DATAGRAM_SENT) continue;
#ifdef EC_HAVE_CYCLES
- if (master->main_device.cycles_poll - datagram->cycles_sent
- > timeout_cycles) {
+ if (master->devices[EC_DEVICE_MAIN].cycles_poll -
+ datagram->cycles_sent > timeout_cycles) {
#else
- if (master->main_device.jiffies_poll - datagram->jiffies_sent
- > timeout_jiffies) {
+ if (master->devices[EC_DEVICE_MAIN].jiffies_poll -
+ datagram->jiffies_sent > timeout_jiffies) {
#endif
list_del_init(&datagram->queue);
datagram->state = EC_DATAGRAM_TIMED_OUT;
@@ -2237,10 +2250,12 @@
if (unlikely(master->debug_level > 0)) {
unsigned int time_us;
#ifdef EC_HAVE_CYCLES
- time_us = (unsigned int) (master->main_device.cycles_poll -
+ time_us = (unsigned int)
+ (master->devices[EC_DEVICE_MAIN].cycles_poll -
datagram->cycles_sent) * 1000 / cpu_khz;
#else
- time_us = (unsigned int) ((master->main_device.jiffies_poll -
+ time_us = (unsigned int)
+ ((master->devices[EC_DEVICE_MAIN].jiffies_poll -
datagram->jiffies_sent) * 1000000 / HZ);
#endif
EC_MASTER_DBG(master, 0, "TIMED OUT datagram %p,"
@@ -2345,7 +2360,7 @@
" master_info = 0x%p)\n", master, master_info);
master_info->slave_count = master->slave_count;
- master_info->link_up = master->main_device.link_state;
+ master_info->link_up = master->devices[EC_DEVICE_MAIN].link_state;
master_info->scan_busy = master->scan_busy;
master_info->app_time = master->app_time;
return 0;
@@ -2406,7 +2421,7 @@
{
state->slaves_responding = master->fsm.slaves_responding;
state->al_states = master->fsm.slave_states;
- state->link_up = master->main_device.link_state;
+ state->link_up = master->devices[EC_DEVICE_MAIN].link_state;
}
/*****************************************************************************/