diff -r 19732da2cf86 -r 3001f6523e63 master/module.c --- a/master/module.c Fri May 13 15:33:16 2011 +0200 +++ b/master/module.c Fri May 13 15:34:20 2011 +0200 @@ -61,7 +61,7 @@ static unsigned int debug_level; /**< Debug level parameter. */ static ec_master_t *masters; /**< Array of masters. */ -static struct semaphore master_sem; /**< Master semaphore. */ +static struct ec_mutex_t master_mutex; /**< Master mutex. */ dev_t device_number; /**< Device number for master cdevs. */ struct class *class; /**< Device class. */ @@ -101,7 +101,7 @@ EC_INFO("Master driver %s\n", EC_MASTER_VERSION); - sema_init(&master_sem, 1); + ec_mutex_init(&master_mutex); if (master_count) { if (alloc_chrdev_region(&device_number, @@ -468,9 +468,9 @@ for (i = 0; i < master_count; i++) { master = &masters[i]; - down(&master->device_sem); + ec_mutex_lock(&master->device_mutex); if (master->main_device.dev) { // master already has a device - up(&master->device_sem); + ec_mutex_unlock(&master->device_mutex); continue; } @@ -481,14 +481,14 @@ str, master->index); ec_device_attach(&master->main_device, net_dev, poll, module); - up(&master->device_sem); + ec_mutex_unlock(&master->device_mutex); snprintf(net_dev->name, IFNAMSIZ, "ec%u", master->index); return &master->main_device; // offer accepted } else { - up(&master->device_sem); + ec_mutex_unlock(&master->device_mutex); if (master->debug_level) { ec_mac_print(net_dev->dev_addr, str); @@ -524,40 +524,40 @@ } master = &masters[master_index]; - if (down_interruptible(&master_sem)) { + if (ec_mutex_lock_interruptible(&master_mutex)) { errptr = ERR_PTR(-EINTR); goto out_return; } if (master->reserved) { - up(&master_sem); + ec_mutex_unlock(&master_mutex); EC_MASTER_ERR(master, "Master already in use!\n"); errptr = ERR_PTR(-EBUSY); goto out_return; } master->reserved = 1; - up(&master_sem); - - if (down_interruptible(&master->device_sem)) { + ec_mutex_unlock(&master_mutex); + + if (ec_mutex_lock_interruptible(&master->device_mutex)) { errptr = ERR_PTR(-EINTR); goto out_release; } if (master->phase != EC_IDLE) { - up(&master->device_sem); + ec_mutex_unlock(&master->device_mutex); EC_MASTER_ERR(master, "Master still waiting for devices!\n"); errptr = ERR_PTR(-ENODEV); goto out_release; } if (!try_module_get(master->main_device.module)) { - up(&master->device_sem); + ec_mutex_unlock(&master->device_mutex); EC_ERR("Device module is unloading!\n"); errptr = ERR_PTR(-ENODEV); goto out_release; } - up(&master->device_sem); + ec_mutex_unlock(&master->device_mutex); if (ec_master_enter_operation_phase(master)) { EC_MASTER_ERR(master, "Failed to enter OPERATION phase!\n"); @@ -611,6 +611,37 @@ return ECRT_VERSION_MAGIC; } + + +/** Return pointer to running master +/*****************************************************************************/ +ec_master_t *ecrt_attach_master(unsigned int master_index) +{ + ec_master_t *master = NULL; + + EC_INFO("Requesting master %u...\n", master_index); + + if (master_index >= master_count) { + EC_ERR("Invalid master index %u.\n", master_index); + return master; + } + + master = &masters[master_index]; + if (master->reserved) + { + // ok master is attached + EC_INFO("attaching Master %u!\n", master_index); + } + else + { + EC_ERR("No Master %u in use!\n", master_index); + master = NULL; + } + return master; +} + + + /*****************************************************************************/ /** Global request state type translation table. @@ -637,6 +668,7 @@ EXPORT_SYMBOL(ecrt_request_master); EXPORT_SYMBOL(ecrt_release_master); EXPORT_SYMBOL(ecrt_version_magic); +EXPORT_SYMBOL(ecrt_attach_master); /** \endcond */