diff -r 26c74f035ab0 -r 71425e6120d8 master/device.c --- a/master/device.c Wed Nov 09 09:55:58 2011 +0100 +++ b/master/device.c Wed Nov 09 12:05:44 2011 +0100 @@ -496,10 +496,21 @@ void ecdev_withdraw(ec_device_t *device /**< EtherCAT device */) { ec_master_t *master = device->master; - char str[20]; - - ec_mac_print(device->dev->dev_addr, str); - EC_MASTER_INFO(master, "Releasing main device %s.\n", str); + char dev_str[20], mac_str[20]; + + ec_mac_print(device->dev->dev_addr, mac_str); + + if (device == &master->main_device) { + sprintf(dev_str, "main"); + } else if (device == &master->backup_device) { + sprintf(dev_str, "backup"); + } else { + EC_MASTER_WARN(master, "%s() called with unknown device %s!\n", + __func__, mac_str); + sprintf(dev_str, "UNKNOWN"); + } + + EC_MASTER_INFO(master, "Releasing %s device %s.\n", dev_str, mac_str); down(&master->device_sem); ec_device_detach(device); @@ -516,17 +527,22 @@ int ecdev_open(ec_device_t *device /**< EtherCAT device */) { int ret; + ec_master_t *master = device->master; ret = ec_device_open(device); if (ret) { - EC_MASTER_ERR(device->master, "Failed to open device!\n"); + EC_MASTER_ERR(master, "Failed to open device!\n"); return ret; } - ret = ec_master_enter_idle_phase(device->master); - if (ret) { - EC_MASTER_ERR(device->master, "Failed to enter IDLE phase!\n"); - return ret; + if (master->main_device.open && + (ec_mac_is_zero(master->backup_mac) || + master->backup_device.open)) { + ret = ec_master_enter_idle_phase(device->master); + if (ret) { + EC_MASTER_ERR(device->master, "Failed to enter IDLE phase!\n"); + return ret; + } } return 0; @@ -541,10 +557,15 @@ */ void ecdev_close(ec_device_t *device /**< EtherCAT device */) { - ec_master_leave_idle_phase(device->master); - - if (ec_device_close(device)) - EC_MASTER_WARN(device->master, "Failed to close device!\n"); + ec_master_t *master = device->master; + + if (master->phase == EC_IDLE) { + ec_master_leave_idle_phase(master); + } + + if (ec_device_close(device)) { + EC_MASTER_WARN(master, "Failed to close device!\n"); + } } /*****************************************************************************/