diff -r a82793a6d1a0 -r 94c6e36e0f8d master/slave_config.c --- a/master/slave_config.c Mon Jun 30 15:51:46 2008 +0000 +++ b/master/slave_config.c Tue Jul 01 15:38:20 2008 +0000 @@ -151,7 +151,11 @@ } fmmu = &sc->fmmu_configs[sc->used_fmmus++]; + + down(&sc->master->master_sem); ec_fmmu_config_init(fmmu, sc, domain, sync_index, dir); + up(&sc->master->master_sem); + return fmmu->logical_start_address; } @@ -388,11 +392,18 @@ return -1; } - if (!(pdo = ec_pdo_list_add_pdo(&sc->sync_configs[sync_index].pdos, pdo_index))) - return -1; + down(&sc->master->master_sem); + + if (!(pdo = ec_pdo_list_add_pdo(&sc->sync_configs[sync_index].pdos, + pdo_index))) { + up(&sc->master->master_sem); + return -1; + } pdo->sync_index = sync_index; ec_slave_config_load_default_mapping(sc, pdo); + + up(&sc->master->master_sem); return 0; } @@ -410,7 +421,9 @@ return; } + down(&sc->master->master_sem); ec_pdo_list_clear_pdos(&sc->sync_configs[sync_index].pdos); + up(&sc->master->master_sem); } /*****************************************************************************/ @@ -421,6 +434,7 @@ { uint8_t sync_index; ec_pdo_t *pdo = NULL; + int retval = -1; if (sc->master->debug_level) EC_DBG("ecrt_slave_config_pdo_mapping_add(sc = 0x%x, " @@ -434,14 +448,17 @@ &sc->sync_configs[sync_index].pdos, pdo_index))) break; - if (!pdo) { + if (pdo) { + down(&sc->master->master_sem); + retval = ec_pdo_add_entry(pdo, entry_index, entry_subindex, + entry_bit_length) ? 0 : -1; + up(&sc->master->master_sem); + } else { EC_ERR("Pdo 0x%04X is not assigned in config %u:%u.\n", pdo_index, sc->alias, sc->position); - return -1; - } - - return ec_pdo_add_entry(pdo, entry_index, entry_subindex, - entry_bit_length) ? 0 : -1; + } + + return retval; } /*****************************************************************************/ @@ -461,13 +478,14 @@ &sc->sync_configs[sync_index].pdos, pdo_index))) break; - if (!pdo) { + if (pdo) { + down(&sc->master->master_sem); + ec_pdo_clear_entries(pdo); + up(&sc->master->master_sem); + } else { EC_WARN("Pdo 0x%04X is not assigned in config %u:%u.\n", pdo_index, sc->alias, sc->position); - return; - } - - ec_pdo_clear_entries(pdo); + } } /*****************************************************************************/ @@ -563,11 +581,6 @@ if (entry->index != index || entry->subindex != subindex) { bit_offset += entry->bit_length; } else { - sync_offset = ec_slave_config_prepare_fmmu( - sc, domain, sync_index, sync_config->dir); - if (sync_offset < 0) - return -2; - bit_pos = bit_offset % 8; if (bit_position) { *bit_position = bit_pos; @@ -578,6 +591,11 @@ return -3; } + sync_offset = ec_slave_config_prepare_fmmu( + sc, domain, sync_index, sync_config->dir); + if (sync_offset < 0) + return -2; + return sync_offset + bit_offset / 8; } } @@ -618,7 +636,10 @@ return -1; } + down(&sc->master->master_sem); list_add_tail(&req->list, &sc->sdo_configs); + up(&sc->master->master_sem); + return 0; } @@ -678,7 +699,10 @@ memset(req->data, 0x00, size); req->data_size = size; + down(&sc->master->master_sem); list_add_tail(&req->list, &sc->sdo_requests); + up(&sc->master->master_sem); + return req; }