Changes in ecrt_request_master(); minor output changes.
--- a/master/domain.c Tue Sep 26 15:25:49 2006 +0000
+++ b/master/domain.c Tue Sep 26 16:16:13 2006 +0000
@@ -357,7 +357,7 @@
}
}
- EC_INFO("Domain %i - Allocated %i bytes in %i datagram%s\n",
+ EC_INFO("Domain %i - Allocated %i bytes in %i datagram%s.\n",
domain->index, domain->data_size, datagram_count,
datagram_count == 1 ? "" : "s");
--- a/master/master.c Tue Sep 26 15:25:49 2006 +0000
+++ b/master/master.c Tue Sep 26 16:16:13 2006 +0000
@@ -1051,9 +1051,10 @@
/**
Measures the time, a frame is on the bus.
-*/
-
-void ec_master_measure_bus_time(ec_master_t *master)
+ \return 0 in case of success, else < 0
+*/
+
+int ec_master_measure_bus_time(ec_master_t *master)
{
ec_datagram_t datagram;
cycles_t cycles_start, cycles_end, cycles_timeout;
@@ -1064,7 +1065,7 @@
if (ec_datagram_brd(&datagram, 0x130, 2)) {
EC_ERR("Failed to allocate datagram for bus time measuring.\n");
ec_datagram_clear(&datagram);
- return;
+ return -1;
}
cycles_timeout = (cycles_t) EC_IO_TIMEOUT * (cpu_khz / 1000);
@@ -1103,11 +1104,13 @@
EC_INFO("Bus time is (min/avg/max) %u/%u.%u/%u us.\n",
min, sum / 100, sum % 100, max);
+ return 0;
error:
// Dequeue and free datagram
list_del(&datagram.queue);
ec_datagram_clear(&datagram);
+ return -1;
}
/******************************************************************************
--- a/master/master.h Tue Sep 26 15:25:49 2006 +0000
+++ b/master/master.h Tue Sep 26 16:16:13 2006 +0000
@@ -161,7 +161,7 @@
// misc.
void ec_master_output_stats(ec_master_t *);
void ec_master_clear_slaves(ec_master_t *);
-void ec_master_measure_bus_time(ec_master_t *);
+int ec_master_measure_bus_time(ec_master_t *);
// other methods
void ec_sync_config(const ec_sii_sync_t *, const ec_slave_t *, uint8_t *);
--- a/master/module.c Tue Sep 26 15:25:49 2006 +0000
+++ b/master/module.c Tue Sep 26 16:16:13 2006 +0000
@@ -420,34 +420,41 @@
goto out_release;
}
- if (!try_module_get(master->device->module)) {
+ if (!try_module_get(master->device->module)) { // possible race?
EC_ERR("Failed to reserve device module!\n");
goto out_release;
}
- ec_master_measure_bus_time(master);
- ec_master_idle_stop(master);
- ec_master_reset(master);
+ if (!master->device->link_state) {
+ EC_ERR("Link is DOWN.\n");
+ goto out_module_put;
+ }
+
+ ec_master_reset(master); // also stops idle mode
master->mode = EC_MASTER_MODE_OPERATION;
- if (!master->device->link_state) EC_WARN("Link is DOWN.\n");
+ if (ec_master_measure_bus_time(master)) {
+ EC_ERR("Bus time measuring failed!\n");
+ goto out_reset;
+ }
if (ec_master_bus_scan(master)) {
EC_ERR("Bus scan failed!\n");
- goto out_module_put;
- }
-
- EC_INFO("Master %i is ready.\n", master_index);
+ goto out_reset;
+ }
+
+ EC_INFO("Successfully requested master %i.\n", master_index);
return master;
+ out_reset:
+ ec_master_reset(master);
+ ec_master_idle_start(master);
out_module_put:
module_put(master->device->module);
- ec_master_reset(master);
- ec_master_idle_start(master);
out_release:
master->reserved = 0;
out_return:
- EC_ERR("Failed requesting master %i.\n", master_index);
+ EC_ERR("Failed to request master %i.\n", master_index);
return NULL;
}
@@ -473,7 +480,7 @@
module_put(master->device->module);
master->reserved = 0;
- EC_INFO("Released master %i.\n", master->index);
+ EC_INFO("Successfully released master %i.\n", master->index);
return;
}