diff -r 3c628bb7f68b -r e4b89c862c43 master/slave.c --- a/master/slave.c Mon Mar 05 16:59:02 2007 +0000 +++ b/master/slave.c Tue Mar 06 09:06:01 2007 +0000 @@ -127,7 +127,6 @@ slave->base_revision = 0; slave->base_build = 0; slave->base_fmmu_count = 0; - slave->base_sync_count = 0; slave->eeprom_data = NULL; slave->eeprom_size = 0; @@ -149,7 +148,8 @@ slave->sii_current_on_ebus = 0; INIT_LIST_HEAD(&slave->sii_strings); - INIT_LIST_HEAD(&slave->sii_syncs); + slave->sii_syncs = NULL; + slave->sii_sync_count = 0; INIT_LIST_HEAD(&slave->sii_pdos); INIT_LIST_HEAD(&slave->sdo_dictionary); INIT_LIST_HEAD(&slave->sdo_confs); @@ -240,7 +240,6 @@ { ec_slave_t *slave; ec_sii_string_t *string, *next_str; - ec_sii_sync_t *sync, *next_sync; ec_sii_pdo_t *pdo, *next_pdo; ec_sii_pdo_entry_t *entry, *next_ent; ec_sdo_data_t *sdodata, *next_sdodata; @@ -254,10 +253,7 @@ } // free all sync managers - list_for_each_entry_safe(sync, next_sync, &slave->sii_syncs, list) { - list_del(&sync->list); - kfree(sync); - } + if (slave->sii_syncs) kfree(slave->sii_syncs); // free all PDOs list_for_each_entry_safe(pdo, next_pdo, &slave->sii_pdos, list) { @@ -309,7 +305,7 @@ void ec_slave_reset(ec_slave_t *slave /**< EtherCAT slave */) { ec_sdo_data_t *sdodata, *next_sdodata; - ec_sii_sync_t *sync; + unsigned int i; // remove FMMU configurations slave->fmmu_count = 0; @@ -323,8 +319,8 @@ } // remove estimated sync manager sizes - list_for_each_entry(sync, &slave->sii_syncs, list) { - sync->est_length = 0; + for (i = 0; i < slave->sii_sync_count; i++) { + slave->sii_syncs[i].est_length = 0; } } @@ -472,27 +468,28 @@ size_t word_count /**< number of words */ ) { - unsigned int sync_count, i; + unsigned int i; ec_sii_sync_t *sync; - sync_count = word_count / 4; // sync manager struct is 4 words long - - for (i = 0; i < sync_count; i++, data += 8) { - if (!(sync = (ec_sii_sync_t *) - kmalloc(sizeof(ec_sii_sync_t), GFP_ATOMIC))) { - EC_ERR("Failed to allocate Sync-Manager memory.\n"); - return -1; - } - - sync->index = i; + // sync manager struct is 4 words long + slave->sii_sync_count = word_count / 4; + + if (!(slave->sii_syncs = kmalloc(sizeof(ec_sii_sync_t) * + slave->sii_sync_count, GFP_ATOMIC))) { + EC_ERR("Failed to allocate Sync-Manager memory.\n"); + return -1; + } + + for (i = 0; i < slave->sii_sync_count; i++, data += 8) { + sync = &slave->sii_syncs[i]; + + sync->index = i; sync->physical_start_address = EC_READ_U16(data); sync->length = EC_READ_U16(data + 2); sync->control_register = EC_READ_U8 (data + 4); sync->enable = EC_READ_U8 (data + 6); - + sync->est_length = 0; - - list_add_tail(&sync->list, &slave->sii_syncs); } return 0; @@ -785,15 +782,16 @@ if (slave->sii_order) off += sprintf(buffer + off, " Order number: %s\n", slave->sii_order); - if (!list_empty(&slave->sii_syncs)) + if (slave->sii_sync_count) off += sprintf(buffer + off, "\nSync-Managers:\n"); - list_for_each_entry(sync, &slave->sii_syncs, list) { + for (i = 0; i < slave->sii_sync_count; i++) { + sync = &slave->sii_syncs[i]; off += sprintf(buffer + off, " %i: 0x%04X, length %i," - " control 0x%02X, %s\n", - sync->index, sync->physical_start_address, - sync->length, sync->control_register, - sync->enable ? "enable" : "disable"); + " control 0x%02X, %s\n", + sync->index, sync->physical_start_address, + sync->length, sync->control_register, + sync->enable ? "enable" : "disable"); } if (!list_empty(&slave->sii_pdos))