diff -r 02711963a059 -r b50b93faaf3e master/module.c --- a/master/module.c Wed Oct 01 08:45:16 2008 +0000 +++ b/master/module.c Wed Oct 01 10:06:51 2008 +0000 @@ -39,6 +39,7 @@ #include #include +#include #include "globals.h" #include "master.h" @@ -463,39 +464,47 @@ ec_master_t *ecrt_request_master(unsigned int master_index) { - ec_master_t *master; + ec_master_t *master, *errptr = NULL; EC_INFO("Requesting master %u...\n", master_index); if (master_index >= master_count) { EC_ERR("Invalid master index %u.\n", master_index); + errptr = ERR_PTR(-EINVAL); goto out_return; } master = &masters[master_index]; - if (down_interruptible(&master_sem)) + if (down_interruptible(&master_sem)) { + errptr = ERR_PTR(-EINTR); goto out_return; + } if (master->reserved) { up(&master_sem); EC_ERR("Master %u is already in use!\n", master_index); + errptr = ERR_PTR(-EBUSY); goto out_return; } master->reserved = 1; up(&master_sem); - if (down_interruptible(&master->device_sem)) + if (down_interruptible(&master->device_sem)) { + errptr = ERR_PTR(-EINTR); goto out_release; + } if (master->phase != EC_IDLE) { up(&master->device_sem); EC_ERR("Master %u still waiting for devices!\n", master_index); + errptr = ERR_PTR(-ENODEV); goto out_release; } if (!try_module_get(master->main_device.module)) { up(&master->device_sem); EC_ERR("Device module is unloading!\n"); + errptr = ERR_PTR(-ENODEV); goto out_release; } @@ -503,6 +512,7 @@ if (ec_master_enter_operation_phase(master)) { EC_ERR("Failed to enter OPERATION phase!\n"); + errptr = ERR_PTR(-EIO); goto out_module_put; } @@ -514,7 +524,7 @@ out_release: master->reserved = 0; out_return: - return NULL; + return errptr; } /*****************************************************************************/