Replaced master variable 'atomic_t available' by integer and used
semaphore in module.c instead.
This commit is contained in:
parent
2907aebfdf
commit
6ef75e4d45
|
|
@ -108,8 +108,8 @@ int ec_master_init(ec_master_t *master, /**< EtherCAT master */
|
|||
ec_eoe_t *eoe, *next_eoe;
|
||||
unsigned int i;
|
||||
|
||||
atomic_set(&master->available, 1);
|
||||
master->index = index;
|
||||
master->reserved = 0;
|
||||
|
||||
master->main_mac = main_mac;
|
||||
master->backup_mac = backup_mac;
|
||||
|
|
|
|||
|
|
@ -45,7 +45,6 @@
|
|||
#include <linux/sysfs.h>
|
||||
#include <linux/timer.h>
|
||||
#include <linux/wait.h>
|
||||
#include <asm/atomic.h>
|
||||
#include <asm/semaphore.h>
|
||||
|
||||
#include "device.h"
|
||||
|
|
@ -93,10 +92,9 @@ ec_stats_t;
|
|||
|
||||
struct ec_master
|
||||
{
|
||||
atomic_t available; /**< zero, if the master is reserved for RT */
|
||||
unsigned int index; /**< master index */
|
||||
|
||||
struct kobject kobj; /**< kobject */
|
||||
unsigned int index; /**< master index */
|
||||
unsigned int reserved; /**< non-zero, if the master is reserved for RT */
|
||||
|
||||
ec_device_t main_device; /**< EtherCAT device */
|
||||
const uint8_t *main_mac; /**< MAC address of main device */
|
||||
|
|
|
|||
|
|
@ -66,6 +66,7 @@ static char *main[MAX_MASTERS]; /**< main devices parameter */
|
|||
static char *backup[MAX_MASTERS]; /**< backup devices parameter */
|
||||
|
||||
static ec_master_t *masters; /**< master array */
|
||||
static struct semaphore master_sem; /**< master semaphore */
|
||||
static unsigned int master_count; /**< number of masters */
|
||||
static unsigned int backup_count; /**< number of backup devices */
|
||||
|
||||
|
|
@ -524,7 +525,7 @@ ec_master_t *ecrt_request_master(unsigned int master_index
|
|||
{
|
||||
ec_master_t *master;
|
||||
|
||||
EC_INFO("Requesting master %i...\n", master_index);
|
||||
EC_INFO("Requesting master %u...\n", master_index);
|
||||
|
||||
if (master_index >= master_count) {
|
||||
EC_ERR("Invalid master index %u.\n", master_index);
|
||||
|
|
@ -532,11 +533,14 @@ ec_master_t *ecrt_request_master(unsigned int master_index
|
|||
}
|
||||
master = &masters[master_index];
|
||||
|
||||
if (!atomic_dec_and_test(&master->available)) {
|
||||
atomic_inc(&master->available);
|
||||
EC_ERR("Master %i is already in use!\n", master_index);
|
||||
down(&master_sem);
|
||||
if (master->reserved) {
|
||||
up(&master_sem);
|
||||
EC_ERR("Master %u is already in use!\n", master_index);
|
||||
goto out_return;
|
||||
}
|
||||
master->reserved = 1;
|
||||
up(&master_sem);
|
||||
|
||||
if (down_interruptible(&master->device_sem)) {
|
||||
EC_ERR("Interrupted while waiting for device!\n");
|
||||
|
|
@ -545,7 +549,7 @@ ec_master_t *ecrt_request_master(unsigned int master_index
|
|||
|
||||
if (master->mode != EC_MASTER_MODE_IDLE) {
|
||||
up(&master->device_sem);
|
||||
EC_ERR("Master %i still waiting for devices!\n", master_index);
|
||||
EC_ERR("Master %u still waiting for devices!\n", master_index);
|
||||
goto out_release;
|
||||
}
|
||||
|
||||
|
|
@ -567,13 +571,13 @@ ec_master_t *ecrt_request_master(unsigned int master_index
|
|||
goto out_module_put;
|
||||
}
|
||||
|
||||
EC_INFO("Successfully requested master %i.\n", master_index);
|
||||
EC_INFO("Successfully requested master %u.\n", master_index);
|
||||
return master;
|
||||
|
||||
out_module_put:
|
||||
module_put(master->main_device.module);
|
||||
out_release:
|
||||
atomic_inc(&master->available);
|
||||
master->reserved = 0;
|
||||
out_return:
|
||||
return NULL;
|
||||
}
|
||||
|
|
@ -587,19 +591,19 @@ ec_master_t *ecrt_request_master(unsigned int master_index
|
|||
|
||||
void ecrt_release_master(ec_master_t *master /**< EtherCAT master */)
|
||||
{
|
||||
EC_INFO("Releasing master %i...\n", master->index);
|
||||
EC_INFO("Releasing master %u...\n", master->index);
|
||||
|
||||
if (master->mode != EC_MASTER_MODE_OPERATION) {
|
||||
EC_WARN("Master %i was was not requested!\n", master->index);
|
||||
EC_WARN("Master %u was was not requested!\n", master->index);
|
||||
return;
|
||||
}
|
||||
|
||||
ec_master_leave_operation_mode(master);
|
||||
|
||||
module_put(master->main_device.module);
|
||||
atomic_inc(&master->available);
|
||||
master->reserved = 0;
|
||||
|
||||
EC_INFO("Released master %i.\n", master->index);
|
||||
EC_INFO("Released master %u.\n", master->index);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
|
|
|||
Loading…
Reference in New Issue