Allow bus configuration when link is down.

This commit is contained in:
Florian Pose 2008-02-19 09:58:48 +00:00
parent b955b2d529
commit 3a50cd0ff1
4 changed files with 26 additions and 22 deletions

View File

@ -86,7 +86,7 @@ static uint8_t off_ana_out;
const static ec_pdo_entry_reg_t domain1_regs[] = {
{0, 1, Beckhoff_EL3162, 0x3101, 2, &off_ana_in},
{0, 2, Beckhoff_EL4102, 0x3001, 1, &off_ana_out},
//{0, 2, Beckhoff_EL4102, 0x3001, 1, &off_ana_out},
{}
};
#endif

View File

@ -845,6 +845,8 @@ void ec_fsm_master_state_clear_addresses(
if (datagram->state != EC_DATAGRAM_RECEIVED) {
EC_ERR("Failed to receive address clearing datagram (state %i).\n",
datagram->state);
master->scan_state = EC_REQUEST_FAILURE;
wake_up_interruptible(&master->scan_queue);
fsm->state = ec_fsm_master_state_error;
return;
}

View File

@ -126,7 +126,7 @@ int ec_master_init(ec_master_t *master, /**< EtherCAT master */
INIT_LIST_HEAD(&master->configs);
master->scan_state = EC_REQUEST_IN_PROGRESS;
master->scan_state = EC_REQUEST_COMPLETE;
master->allow_scan = 1;
init_MUTEX(&master->scan_sem);
init_waitqueue_head(&master->scan_queue);
@ -454,15 +454,20 @@ int ec_master_enter_operation_mode(ec_master_t *master /**< EtherCAT master */)
if (master->debug_level)
EC_DBG("Waiting for pending slave configuration returned.\n");
if (master->debug_level)
EC_DBG("Disable scanning, current scan state: %u\n",
master->scan_state);
down(&master->scan_sem);
master->allow_scan = 0; // 'lock' the slave list
up(&master->scan_sem);
// wait for slave scan to complete
if (wait_event_interruptible(master->scan_queue,
master->scan_state != EC_REQUEST_IN_PROGRESS)) {
EC_INFO("Waiting for slave scan interrupted by signal.\n");
goto out_allow;
if (master->scan_state == EC_REQUEST_IN_PROGRESS) {
// wait for slave scan to complete
if (wait_event_interruptible(master->scan_queue,
master->scan_state != EC_REQUEST_IN_PROGRESS)) {
EC_INFO("Waiting for slave scan interrupted by signal.\n");
goto out_allow;
}
}
if (master->debug_level)
@ -1347,19 +1352,21 @@ int ecrt_master_activate(ec_master_t *master)
// request slave configuration
down(&master->config_sem);
master->allow_config = 1; // request the current configuration
master->config_state = EC_REQUEST_IN_PROGRESS;
up(&master->config_sem);
// wait for configuration to complete
if (wait_event_interruptible(master->config_queue,
master->config_state != EC_REQUEST_IN_PROGRESS)) {
EC_INFO("Waiting for configuration interrupted by signal.\n");
return -1;
}
if (master->main_device.link_state) {
// wait for configuration to complete
master->config_state = EC_REQUEST_IN_PROGRESS;
if (wait_event_interruptible(master->config_queue,
master->config_state != EC_REQUEST_IN_PROGRESS)) {
EC_INFO("Waiting for configuration interrupted by signal.\n");
return -1;
}
if (master->config_state != EC_REQUEST_COMPLETE) {
EC_ERR("Failed to configure slaves.\n");
return -1;
if (master->config_state != EC_REQUEST_COMPLETE) {
EC_ERR("Failed to configure slaves.\n");
return -1;
}
}
// restart EoE process and master thread with new locking

View File

@ -577,11 +577,6 @@ ec_master_t *ecrt_request_master(unsigned int master_index)
up(&master->device_sem);
if (!master->main_device.link_state) {
EC_ERR("Link is DOWN.\n");
goto out_module_put;
}
if (ec_master_enter_operation_mode(master)) {
EC_ERR("Failed to enter OPERATION mode!\n");
goto out_module_put;