diff -r fdc24bf62f80 -r 11a82e4fd31b master/master.c --- a/master/master.c Mon Apr 03 10:03:34 2006 +0000 +++ b/master/master.c Mon Apr 03 14:12:45 2006 +0000 @@ -21,6 +21,7 @@ #include "types.h" #include "device.h" #include "command.h" +#include "ethernet.h" /*****************************************************************************/ @@ -35,6 +36,7 @@ INIT_LIST_HEAD(&master->command_queue); INIT_LIST_HEAD(&master->domains); + INIT_LIST_HEAD(&master->eoe_slaves); ec_command_init(&master->simple_command); ec_command_init(&master->watch_command); @@ -80,6 +82,7 @@ unsigned int i; ec_command_t *command, *next_c; ec_domain_t *domain, *next_d; + ec_eoe_t *eoe, *next_eoe; // Alle Slaves entfernen if (master->slaves) { @@ -104,6 +107,13 @@ kfree(domain); } + // EOE-Liste leeren + list_for_each_entry_safe(eoe, next_eoe, &master->domains, list) { + list_del(&eoe->list); + ec_eoe_clear(eoe); + kfree(eoe); + } + master->command_index = 0; master->debug_level = 0; master->timeout = 100; // us @@ -372,13 +382,13 @@ \return 0 bei Erfolg, sonst < 0 */ -int ec_master_simple_io(ec_master_t *master /**< EtherCAT-Master */) +int ec_master_simple_io(ec_master_t *master, /**< EtherCAT-Master */ + ec_command_t *command /**< Kommando */ + ) { unsigned int response_tries_left; - ec_command_t *command; response_tries_left = 10; - command = &master->simple_command; while (1) { @@ -425,6 +435,7 @@ ec_slave_ident_t *ident; unsigned int i; ec_command_t *command; + ec_eoe_t *eoe; if (master->slaves || master->slave_count) { EC_ERR("Slave scan already done!\n"); @@ -435,7 +446,7 @@ // Determine number of slaves on bus if (ec_command_brd(command, 0x0000, 4)) return -1; - if (unlikely(ec_master_simple_io(master))) return -1; + if (unlikely(ec_master_simple_io(master, command))) return -1; master->slave_count = command->working_counter; EC_INFO("Found %i slaves on bus.\n", master->slave_count); @@ -465,7 +476,7 @@ if (ec_command_apwr(command, slave->ring_position, 0x0010, sizeof(uint16_t))) return -1; EC_WRITE_U16(command->data, slave->station_address); - if (unlikely(ec_master_simple_io(master))) { + if (unlikely(ec_master_simple_io(master, command))) { EC_ERR("Writing station address failed on slave %i!\n", i); return -1; } @@ -488,6 +499,17 @@ EC_WARN("Unknown slave device (vendor 0x%08X, code 0x%08X) at" " position %i.\n", slave->sii_vendor_id, slave->sii_product_code, i); + + // Does the slave support EoE? + if (slave->sii_mailbox_protocols & EC_MBOX_EOE) { + if (!(eoe = kmalloc(sizeof(ec_eoe_t), GFP_KERNEL))) { + EC_ERR("Failed to allocate memory for EoE-Object.\n"); + return -1; + } + + ec_eoe_init(eoe, slave); + list_add_tail(&eoe->list, &master->eoe_slaves); + } } return 0; @@ -525,6 +547,10 @@ EC_WARN("%i command(s) UNMATCHED!\n", master->stats.unmatched); master->stats.unmatched = 0; } + if (master->stats.eoe_errors) { + EC_WARN("%i EOE ERROR(S)!\n", master->stats.eoe_errors); + master->stats.eoe_errors = 0; + } master->stats.t_last = t_now; } } @@ -615,7 +641,8 @@ if (alias_requested) { for (i = alias_slave_index + 1; i < master->slave_count; i++) { slave = master->slaves + i; - if (!slave->type || slave->type->bus_coupler) break; + if (!slave->type || + slave->type->special == EC_TYPE_BUS_COUPLER) break; if (i - alias_slave_index == second) return slave; } EC_ERR("Slave address \"%s\" - Bus coupler %i has no %lu. slave" @@ -630,7 +657,7 @@ for (i = 0; i < master->slave_count; i++, slave_idx++) { slave = master->slaves + i; if (!slave->type) continue; - if (slave->type->bus_coupler) { + if (slave->type->special == EC_TYPE_BUS_COUPLER) { coupler_idx++; slave_idx = 0; } @@ -845,7 +872,7 @@ EC_FMMU_SIZE * slave->base_fmmu_count)) return -1; memset(command->data, 0x00, EC_FMMU_SIZE * slave->base_fmmu_count); - if (unlikely(ec_master_simple_io(master))) { + if (unlikely(ec_master_simple_io(master, command))) { EC_ERR("Resetting FMMUs failed on slave %i!\n", slave->ring_position); return -1; @@ -858,7 +885,7 @@ EC_SYNC_SIZE * slave->base_sync_count)) return -1; memset(command->data, 0x00, EC_SYNC_SIZE * slave->base_sync_count); - if (unlikely(ec_master_simple_io(master))) { + if (unlikely(ec_master_simple_io(master, command))) { EC_ERR("Resetting sync managers failed on slave %i!\n", slave->ring_position); return -1; @@ -874,7 +901,7 @@ 0x0800 + j * EC_SYNC_SIZE, EC_SYNC_SIZE)) return -1; ec_sync_config(sync, command->data); - if (unlikely(ec_master_simple_io(master))) { + if (unlikely(ec_master_simple_io(master, command))) { EC_ERR("Setting sync manager %i failed on slave %i!\n", j, slave->ring_position); return -1; @@ -887,7 +914,7 @@ 0x800 + eeprom_sync->index * EC_SYNC_SIZE, EC_SYNC_SIZE)) return -1; ec_eeprom_sync_config(eeprom_sync, command->data); - if (unlikely(ec_master_simple_io(master))) { + if (unlikely(ec_master_simple_io(master, command))) { EC_ERR("Setting sync manager %i failed on slave %i!\n", eeprom_sync->index, slave->ring_position); return -1; @@ -903,8 +930,8 @@ if (!type) continue; // Slaves that are not registered are only brought into PREOP - // state -> nice blinking and mailbox comm. possible - if (!slave->registered && !slave->type->bus_coupler) { + // state -> nice blinking and mailbox communication possible + if (!slave->registered && !slave->type->special) { EC_WARN("Slave %i was not registered!\n", slave->ring_position); continue; } @@ -917,7 +944,7 @@ 0x0600 + j * EC_FMMU_SIZE, EC_FMMU_SIZE)) return -1; ec_fmmu_config(fmmu, command->data); - if (unlikely(ec_master_simple_io(master))) { + if (unlikely(ec_master_simple_io(master, command))) { EC_ERR("Setting FMMU %i failed on slave %i!\n", j, slave->ring_position); return -1; @@ -1147,6 +1174,9 @@ // Watchdog-Kommando ec_master_process_watch_command(master); ec_master_queue_command(master, &master->watch_command); + + // Ethernet-over-EtherCAT + ec_master_run_eoe(master); } /*****************************************************************************/ @@ -1186,15 +1216,36 @@ ) { unsigned int i; + ec_eoe_t *eoe; EC_INFO("*** Begin master information ***\n"); - for (i = 0; i < master->slave_count; i++) - ec_slave_print(&master->slaves[i], verbosity); + if (master->slave_count) { + EC_INFO("Slave list:\n"); + for (i = 0; i < master->slave_count; i++) + ec_slave_print(&master->slaves[i], verbosity); + } + if (!list_empty(&master->eoe_slaves)) { + EC_INFO("Ethernet-over-EtherCAT (EoE) objects:\n"); + list_for_each_entry(eoe, &master->eoe_slaves, list) { + ec_eoe_print(eoe); + } + } EC_INFO("*** End master information ***\n"); } /*****************************************************************************/ +void ec_master_run_eoe(ec_master_t *master /**< EtherCAT-Master */) +{ + ec_eoe_t *eoe; + + list_for_each_entry(eoe, &master->eoe_slaves, list) { + ec_eoe_run(eoe); + } +} + +/*****************************************************************************/ + EXPORT_SYMBOL(ecrt_master_create_domain); EXPORT_SYMBOL(ecrt_master_activate); EXPORT_SYMBOL(ecrt_master_deactivate);