# HG changeset patch # User Florian Pose # Date 1203415128 0 # Node ID 684dea874956c8e9f74a8d43c58fd566091b6ba6 # Parent 3b297ff8284f76088aca58c6b80772738068f30b Allow bus configuration when link is down. diff -r 3b297ff8284f -r 684dea874956 examples/mini/mini.c --- a/examples/mini/mini.c Tue Feb 19 09:21:13 2008 +0000 +++ b/examples/mini/mini.c Tue Feb 19 09:58:48 2008 +0000 @@ -86,7 +86,7 @@ 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 diff -r 3b297ff8284f -r 684dea874956 master/fsm_master.c --- a/master/fsm_master.c Tue Feb 19 09:21:13 2008 +0000 +++ b/master/fsm_master.c Tue Feb 19 09:58:48 2008 +0000 @@ -845,6 +845,8 @@ 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; } diff -r 3b297ff8284f -r 684dea874956 master/master.c --- a/master/master.c Tue Feb 19 09:21:13 2008 +0000 +++ b/master/master.c Tue Feb 19 09:58:48 2008 +0000 @@ -126,7 +126,7 @@ 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 @@ 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 @@ // 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->config_state != EC_REQUEST_COMPLETE) { - EC_ERR("Failed to configure slaves.\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; + } } // restart EoE process and master thread with new locking diff -r 3b297ff8284f -r 684dea874956 master/module.c --- a/master/module.c Tue Feb 19 09:21:13 2008 +0000 +++ b/master/module.c Tue Feb 19 09:58:48 2008 +0000 @@ -577,11 +577,6 @@ 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;