diff -r 74853e018898 -r ed15eef57d5c master/slave_config.c --- a/master/slave_config.c Mon Nov 17 15:04:28 2008 +0000 +++ b/master/slave_config.c Mon Nov 17 17:18:02 2008 +0000 @@ -135,7 +135,7 @@ * returns with success. * * \retval >=0 Success, logical offset byte address. - * \retval -1 Error, FMMU limit reached. + * \retval <0 Error code. */ int ec_slave_config_prepare_fmmu( ec_slave_config_t *sc, /**< Slave configuration. */ @@ -157,7 +157,7 @@ if (sc->used_fmmus == EC_MAX_FMMUS) { EC_ERR("FMMU limit reached for slave configuration %u:%u!\n", sc->alias, sc->position); - return -1; + return -EOVERFLOW; } fmmu = &sc->fmmu_configs[sc->used_fmmus++]; @@ -173,10 +173,8 @@ /** Attaches the configuration to the addressed slave object. * - * \retval 0 Success. - * \retval -1 Slave not found. - * \retval -2 Slave already configured. - * \retval -3 Invalid slave type found at the given position. + * \retval 0 Success. + * \retval <0 Error code. */ int ec_slave_config_attach( ec_slave_config_t *sc /**< Slave configuration. */ @@ -192,7 +190,7 @@ if (sc->master->debug_level) EC_DBG("Failed to find slave for configuration %u:%u.\n", sc->alias, sc->position); - return -1; + return -ENOENT; } if (slave->config) { @@ -200,7 +198,7 @@ EC_DBG("Failed to attach slave configuration %u:%u. Slave %u" " already has a configuration!\n", sc->alias, sc->position, slave->ring_position); - return -2; + return -EEXIST; } if (slave->sii.vendor_id != sc->vendor_id @@ -211,7 +209,7 @@ slave->ring_position, slave->sii.vendor_id, slave->sii.product_code, sc->alias, sc->position, sc->vendor_id, sc->product_code); - return -3; + return -EINVAL; } // attach slave @@ -399,12 +397,12 @@ if (sync_index >= EC_MAX_SYNC_MANAGERS) { EC_ERR("Invalid sync manager index %u!\n", sync_index); - return -1; + return -ENOENT; } if (dir != EC_DIR_OUTPUT && dir != EC_DIR_INPUT) { EC_ERR("Invalid direction %u!\n", (u32) dir); - return -1; + return -EINVAL; } sync_config = &sc->sync_configs[sync_index]; @@ -425,15 +423,15 @@ if (sync_index >= EC_MAX_SYNC_MANAGERS) { EC_ERR("Invalid sync manager index %u!\n", sync_index); - return -1; + return -EINVAL; } down(&sc->master->master_sem); - if (!(pdo = ec_pdo_list_add_pdo(&sc->sync_configs[sync_index].pdos, - pdo_index))) { + pdo = ec_pdo_list_add_pdo(&sc->sync_configs[sync_index].pdos, pdo_index); + if (IS_ERR(pdo)) { up(&sc->master->master_sem); - return -1; + return PTR_ERR(pdo); } pdo->sync_index = sync_index; @@ -470,7 +468,8 @@ { uint8_t sync_index; ec_pdo_t *pdo = NULL; - int retval = -1; + ec_pdo_entry_t *entry; + int retval = 0; if (sc->master->debug_level) EC_DBG("ecrt_slave_config_pdo_mapping_add(sc = 0x%x, " @@ -486,12 +485,15 @@ if (pdo) { down(&sc->master->master_sem); - retval = ec_pdo_add_entry(pdo, entry_index, entry_subindex, - entry_bit_length) ? 0 : -1; + entry = ec_pdo_add_entry(pdo, entry_index, entry_subindex, + entry_bit_length); up(&sc->master->master_sem); + if (IS_ERR(entry)) + retval = PTR_ERR(entry); } else { EC_ERR("Pdo 0x%04X is not assigned in config %u:%u.\n", pdo_index, sc->alias, sc->position); + retval = -ENOENT; } return retval; @@ -529,6 +531,7 @@ int ecrt_slave_config_pdos(ec_slave_config_t *sc, unsigned int n_syncs, const ec_sync_info_t syncs[]) { + int ret; unsigned int i, j, k; const ec_sync_info_t *sync_info; const ec_pdo_info_t *pdo_info; @@ -549,12 +552,13 @@ if (sync_info->index >= EC_MAX_SYNC_MANAGERS) { EC_ERR("Invalid sync manager index %u!\n", sync_info->index); - return -1; + return -ENOENT; } - if (ecrt_slave_config_sync_manager( - sc, sync_info->index, sync_info->dir)) - return -1; + ret = ecrt_slave_config_sync_manager( + sc, sync_info->index, sync_info->dir); + if (ret) + return ret; if (sync_info->n_pdos && sync_info->pdos) { ecrt_slave_config_pdo_assign_clear(sc, sync_info->index); @@ -562,9 +566,10 @@ for (j = 0; j < sync_info->n_pdos; j++) { pdo_info = &sync_info->pdos[j]; - if (ecrt_slave_config_pdo_assign_add( - sc, sync_info->index, pdo_info->index)) - return -1; + ret = ecrt_slave_config_pdo_assign_add( + sc, sync_info->index, pdo_info->index); + if (ret) + return ret; if (pdo_info->n_entries && pdo_info->entries) { ecrt_slave_config_pdo_mapping_clear(sc, pdo_info->index); @@ -572,11 +577,12 @@ for (k = 0; k < pdo_info->n_entries; k++) { entry_info = &pdo_info->entries[k]; - if (ecrt_slave_config_pdo_mapping_add(sc, - pdo_info->index, entry_info->index, - entry_info->subindex, - entry_info->bit_length)) - return -1; + ret = ecrt_slave_config_pdo_mapping_add(sc, + pdo_info->index, entry_info->index, + entry_info->subindex, + entry_info->bit_length); + if (ret) + return ret; } } } @@ -624,13 +630,13 @@ EC_ERR("Pdo entry 0x%04X:%02X does not byte-align " "in config %u:%u.\n", index, subindex, sc->alias, sc->position); - return -3; + return -EFAULT; } sync_offset = ec_slave_config_prepare_fmmu( sc, domain, sync_index, sync_config->dir); if (sync_offset < 0) - return -2; + return sync_offset; return sync_offset + bit_offset / 8; } @@ -640,7 +646,7 @@ EC_ERR("Pdo entry 0x%04X:%02X is not mapped in slave config %u:%u.\n", index, subindex, sc->alias, sc->position); - return -1; + return -ENOENT; } @@ -651,6 +657,7 @@ { ec_slave_t *slave = sc->slave; ec_sdo_request_t *req; + int ret; if (sc->master->debug_level) EC_DBG("ecrt_slave_config_sdo(sc = 0x%x, index = 0x%04X, " @@ -659,28 +666,28 @@ if (slave && !(slave->sii.mailbox_protocols & EC_MBOX_COE)) { EC_ERR("Slave %u does not support CoE!\n", slave->ring_position); - return -1; + return -EPROTONOSUPPORT; // protocol not supported } if (!(req = (ec_sdo_request_t *) kmalloc(sizeof(ec_sdo_request_t), GFP_KERNEL))) { EC_ERR("Failed to allocate memory for Sdo configuration!\n"); - return -1; + return -ENOMEM; } ec_sdo_request_init(req); ec_sdo_request_address(req, index, subindex); - if (ec_sdo_request_copy_data(req, data, size)) { + ret = ec_sdo_request_copy_data(req, data, size); + if (ret < 0) { ec_sdo_request_clear(req); kfree(req); - return -1; + return ret; } down(&sc->master->master_sem); list_add_tail(&req->list, &sc->sdo_configs); up(&sc->master->master_sem); - return 0; }