--- a/master/domain.c Mon Nov 17 15:04:28 2008 +0000
+++ b/master/domain.c Mon Nov 17 17:18:02 2008 +0000
@@ -133,7 +133,8 @@
* The datagram type and expected working counters are determined by the
* number of input and output fmmus that share the datagram.
*
- * \return 0 in case of success, else < 0
+ * \retval 0 Success.
+ * \retval <0 Error code.
*/
int ec_domain_add_datagram(
ec_domain_t *domain, /**< EtherCAT domain. */
@@ -144,10 +145,11 @@
)
{
ec_datagram_t *datagram;
+ int ret;
if (!(datagram = kmalloc(sizeof(ec_datagram_t), GFP_KERNEL))) {
EC_ERR("Failed to allocate domain datagram!\n");
- return -1;
+ return -ENOMEM;
}
ec_datagram_init(datagram);
@@ -155,24 +157,27 @@
"domain%u-%u", domain->index, logical_offset);
if (used[EC_DIR_OUTPUT] && used[EC_DIR_INPUT]) { // inputs and outputs
- if (ec_datagram_lrw(datagram, logical_offset, data_size, data)) {
+ ret = ec_datagram_lrw(datagram, logical_offset, data_size, data);
+ if (ret < 0) {
kfree(datagram);
- return -1;
+ return ret;
}
// If LRW is used, output FMMUs increment the working counter by 2,
// while input FMMUs increment it by 1.
domain->expected_working_counter +=
used[EC_DIR_OUTPUT] * 2 + used[EC_DIR_INPUT];
} else if (used[EC_DIR_OUTPUT]) { // outputs only
- if (ec_datagram_lwr(datagram, logical_offset, data_size, data)) {
+ ret = ec_datagram_lwr(datagram, logical_offset, data_size, data);
+ if (ret < 0) {
kfree(datagram);
- return -1;
+ return ret;
}
domain->expected_working_counter += used[EC_DIR_OUTPUT];
} else { // inputs only (or nothing)
- if (ec_datagram_lrd(datagram, logical_offset, data_size, data)) {
+ ret = ec_datagram_lrd(datagram, logical_offset, data_size, data);
+ if (ret < 0) {
kfree(datagram);
- return -1;
+ return ret;
}
domain->expected_working_counter += used[EC_DIR_INPUT];
}
@@ -191,8 +196,8 @@
*
* \todo Check for FMMUs that do not fit into any datagram.
*
- * \retval 0 in case of success
- * \retval <0 on failure.
+ * \retval 0 Success
+ * \retval <0 Error code.
*/
int ec_domain_finish(
ec_domain_t *domain, /**< EtherCAT domain. */
@@ -205,6 +210,7 @@
unsigned int datagram_used[EC_DIR_COUNT];
ec_fmmu_config_t *fmmu;
const ec_datagram_t *datagram;
+ int ret;
domain->logical_base_address = base_address;
@@ -213,7 +219,7 @@
(uint8_t *) kmalloc(domain->data_size, GFP_KERNEL))) {
EC_ERR("Failed to allocate %u bytes internal memory for"
" domain %u!\n", domain->data_size, domain->index);
- return -1;
+ return -ENOMEM;
}
}
@@ -237,11 +243,12 @@
// If the current FMMU's data do not fit in the current datagram,
// allocate a new one.
if (datagram_size + fmmu->data_size > EC_MAX_DATA_SIZE) {
- if (ec_domain_add_datagram(domain,
- domain->logical_base_address + datagram_offset,
- datagram_size, domain->data + datagram_offset,
- datagram_used))
- return -1;
+ ret = ec_domain_add_datagram(domain,
+ domain->logical_base_address + datagram_offset,
+ datagram_size, domain->data + datagram_offset,
+ datagram_used);
+ if (ret < 0)
+ return ret;
datagram_offset += datagram_size;
datagram_size = 0;
datagram_count++;
@@ -255,11 +262,12 @@
// Allocate last datagram, if data are left (this is also the case if the
// process data fit into a single datagram)
if (datagram_size) {
- if (ec_domain_add_datagram(domain,
- domain->logical_base_address + datagram_offset,
- datagram_size, domain->data + datagram_offset,
- datagram_used))
- return -1;
+ ret = ec_domain_add_datagram(domain,
+ domain->logical_base_address + datagram_offset,
+ datagram_size, domain->data + datagram_offset,
+ datagram_used);
+ if (ret < 0)
+ return ret;
datagram_count++;
}
@@ -328,13 +336,15 @@
(u32) domain, (u32) regs);
for (reg = regs; reg->index; reg++) {
- if (!(sc = ecrt_master_slave_config(domain->master, reg->alias,
- reg->position, reg->vendor_id, reg->product_code)))
- return -1;
-
- if ((ret = ecrt_slave_config_reg_pdo_entry(sc, reg->index,
- reg->subindex, domain, reg->bit_position)) < 0)
- return -1;
+ sc = ecrt_master_slave_config_err(domain->master, reg->alias,
+ reg->position, reg->vendor_id, reg->product_code);
+ if (IS_ERR(sc))
+ return PTR_ERR(sc);
+
+ ret = ecrt_slave_config_reg_pdo_entry(sc, reg->index,
+ reg->subindex, domain, reg->bit_position);
+ if (ret < 0)
+ return ret;
*reg->offset = ret;
}