# HG changeset patch # User Florian Pose # Date 1222855611 0 # Node ID b50b93faaf3ec2aed211bab878dfa37c43429846 # Parent 02711963a059b3d843794e8b8bf46fc93b4caab5 Used ERR_PTR() macro for return value of ecrt_request_master(). diff -r 02711963a059 -r b50b93faaf3e examples/mini/mini.c --- a/examples/mini/mini.c Wed Oct 01 08:45:16 2008 +0000 +++ b/examples/mini/mini.c Wed Oct 01 10:06:51 2008 +0000 @@ -35,6 +35,7 @@ #include #include #include +#include #include "../../include/ecrt.h" // EtherCAT realtime interface @@ -368,6 +369,7 @@ int __init init_mini_module(void) { + int ret = -1; #if CONFIGURE_PDOS ec_slave_config_t *sc; #endif @@ -377,8 +379,10 @@ printk(KERN_INFO PFX "Starting...\n"); - if (!(master = ecrt_request_master(0))) { - printk(KERN_ERR PFX "Requesting master 0 failed!\n"); + master = ecrt_request_master(0); + if (IS_ERR(master)) { + ret = PTR_ERR(master); + printk(KERN_ERR PFX "Requesting master 0 failed.\n"); goto out_return; } @@ -493,7 +497,7 @@ ecrt_release_master(master); out_return: printk(KERN_ERR PFX "Failed to load. Aborting.\n"); - return -1; + return ret; } /*****************************************************************************/ diff -r 02711963a059 -r b50b93faaf3e examples/rtai/rtai_sample.c --- a/examples/rtai/rtai_sample.c Wed Oct 01 08:45:16 2008 +0000 +++ b/examples/rtai/rtai_sample.c Wed Oct 01 10:06:51 2008 +0000 @@ -35,6 +35,7 @@ // Linux #include +#include // RTAI #include @@ -268,6 +269,7 @@ int __init init_mod(void) { + int ret = -1; RTIME tick_period, requested_ticks, now; #ifdef CONFIGURE_PDOS ec_slave_config_t *sc; @@ -279,7 +281,10 @@ t_critical = cpu_khz * 1000 / FREQUENCY - cpu_khz * INHIBIT_TIME / 1000; - if (!(master = ecrt_request_master(0))) { + + master = ecrt_request_master(0); + if (IS_ERR(master)) { + ret = PTR_ERR(master); printk(KERN_ERR PFX "Requesting master 0 failed!\n"); goto out_return; } @@ -361,7 +366,7 @@ out_return: rt_sem_delete(&master_sem); printk(KERN_ERR PFX "Failed to load. Aborting.\n"); - return -1; + return ret; } /*****************************************************************************/ diff -r 02711963a059 -r b50b93faaf3e include/ecrt.h --- a/include/ecrt.h Wed Oct 01 08:45:16 2008 +0000 +++ b/include/ecrt.h Wed Oct 01 10:06:51 2008 +0000 @@ -42,6 +42,10 @@ * request a master, to map process data, to communicate with slaves via CoE * and to configure and activate the bus. * + * Changes in version 1.5: + * + * - Changed the return value of ecrt_request_master(). + * * Changes in Version 1.4: * * - Replaced ec_slave_t with ec_slave_config_t, separating the bus @@ -340,7 +344,11 @@ * The first master has index 0, the n-th master has index n - 1. The number * of masters has to be specified when loading the master module. * - * \return Pointer to reserved master, or \a NULL on error. + * \attention In kernel context, the returned pointer has to be checked for + * errors using the IS_ERR() macro. + * + * \return If \a IS_ERR() returns zero, the result is a pointer to the + * reserved master, otherwise, the result is an error code. */ ec_master_t *ecrt_request_master( unsigned int master_index /**< Index of the master to request. */ 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; } /*****************************************************************************/