--- a/master/master.c Thu Dec 23 09:48:56 2010 +0100
+++ b/master/master.c Wed Jan 05 08:36:53 2011 +0100
@@ -130,12 +130,12 @@
master->index = index;
master->reserved = 0;
- sema_init(&master->master_sem, 1);
+ ec_mutex_init(&master->master_mutex);
master->main_mac = main_mac;
master->backup_mac = backup_mac;
- sema_init(&master->device_sem, 1);
+ ec_mutex_init(&master->device_mutex);
master->phase = EC_ORPHANED;
master->active = 0;
@@ -158,18 +158,18 @@
master->scan_busy = 0;
master->allow_scan = 1;
- sema_init(&master->scan_sem, 1);
+ ec_mutex_init(&master->scan_mutex);
init_waitqueue_head(&master->scan_queue);
master->config_busy = 0;
master->allow_config = 1;
- sema_init(&master->config_sem, 1);
+ ec_mutex_init(&master->config_mutex);
init_waitqueue_head(&master->config_queue);
INIT_LIST_HEAD(&master->datagram_queue);
master->datagram_index = 0;
- sema_init(&master->fsm_queue_sem, 1);
+ ec_mutex_init(&master->fsm_queue_mutex);
INIT_LIST_HEAD(&master->fsm_datagram_queue);
// send interval in IDLE phase
@@ -190,7 +190,7 @@
INIT_LIST_HEAD(&master->eoe_handlers);
#endif
- sema_init(&master->io_sem, 1);
+ ec_mutex_init(&master->io_mutex);
master->fsm_queue_lock_cb = NULL;
master->fsm_queue_unlock_cb = NULL;
master->fsm_queue_locking_data = NULL;
@@ -447,10 +447,10 @@
ec_master_t *master /**< EtherCAT master. */
)
{
- down(&master->master_sem);
+ ec_mutex_lock(&master->master_mutex);
ec_master_clear_domains(master);
ec_master_clear_slave_configs(master);
- up(&master->master_sem);
+ ec_mutex_unlock(&master->master_mutex);
}
/*****************************************************************************/
@@ -545,9 +545,9 @@
ec_master_thread_stop(master);
- down(&master->master_sem);
+ ec_mutex_lock(&master->master_mutex);
ec_master_clear_slaves(master);
- up(&master->master_sem);
+ ec_mutex_unlock(&master->master_mutex);
}
/*****************************************************************************/
@@ -564,10 +564,10 @@
EC_MASTER_DBG(master, 1, "IDLE -> OPERATION.\n");
- down(&master->config_sem);
+ ec_mutex_lock(&master->config_mutex);
master->allow_config = 0; // temporarily disable slave configuration
if (master->config_busy) {
- up(&master->config_sem);
+ ec_mutex_unlock(&master->config_mutex);
// wait for slave configuration to complete
ret = wait_event_interruptible(master->config_queue,
@@ -581,15 +581,15 @@
EC_MASTER_DBG(master, 1, "Waiting for pending slave"
" configuration returned.\n");
} else {
- up(&master->config_sem);
- }
-
- down(&master->scan_sem);
+ ec_mutex_unlock(&master->config_mutex);
+ }
+
+ ec_mutex_lock(&master->scan_mutex);
master->allow_scan = 0; // 'lock' the slave list
if (!master->scan_busy) {
- up(&master->scan_sem);
+ ec_mutex_unlock(&master->scan_mutex);
} else {
- up(&master->scan_sem);
+ ec_mutex_unlock(&master->scan_mutex);
// wait for slave scan to complete
ret = wait_event_interruptible(master->scan_queue, !master->scan_busy);
@@ -662,9 +662,10 @@
if (master->fsm_queue_lock_cb)
master->fsm_queue_lock_cb(master->fsm_queue_locking_data);
- down(&master->fsm_queue_sem);
+ if (ec_mutex_trylock(&master->fsm_queue_mutex) == 0)
+ return;
if (list_empty(&master->fsm_datagram_queue)) {
- up(&master->fsm_queue_sem);
+ ec_mutex_unlock(&master->fsm_queue_mutex);
if (master->fsm_queue_unlock_cb)
master->fsm_queue_unlock_cb(master->fsm_queue_locking_data);
return;
@@ -736,7 +737,7 @@
}
}
}
- up(&master->fsm_queue_sem);
+ ec_mutex_unlock(&master->fsm_queue_mutex);
if (master->fsm_queue_unlock_cb)
master->fsm_queue_unlock_cb(master->fsm_queue_locking_data);
}
@@ -783,14 +784,14 @@
if (master->fsm_queue_lock_cb)
master->fsm_queue_lock_cb(master->fsm_queue_locking_data);
- down(&master->fsm_queue_sem);
+ ec_mutex_lock(&master->fsm_queue_mutex);
// check, if the datagram is already queued
list_for_each_entry(queued_datagram, &master->fsm_datagram_queue,
queue) {
if (queued_datagram == datagram) {
datagram->state = EC_DATAGRAM_QUEUED;
- up(&master->fsm_queue_sem);
+ ec_mutex_unlock(&master->fsm_queue_mutex);
if (master->fsm_queue_unlock_cb)
master->fsm_queue_unlock_cb(master->fsm_queue_locking_data);
return;
@@ -809,7 +810,7 @@
#endif
datagram->jiffies_sent = jiffies;
- up(&master->fsm_queue_sem);
+ ec_mutex_unlock(&master->fsm_queue_mutex);
if (master->fsm_queue_unlock_cb)
master->fsm_queue_unlock_cb(master->fsm_queue_locking_data);
}
@@ -1252,12 +1253,12 @@
ec_datagram_output_stats(&master->fsm_datagram);
// receive
- down(&master->io_sem);
+ ec_mutex_lock(&master->io_mutex);
ecrt_master_receive(master);
- up(&master->io_sem);
+ ec_mutex_unlock(&master->io_mutex);
// execute master & slave state machines
- if (down_interruptible(&master->master_sem))
+ if (ec_mutex_lock_interruptible(&master->master_mutex))
break;
if (ec_fsm_master_exec(&master->fsm)) {
ec_master_queue_fsm_datagram(master, &master->fsm_datagram);
@@ -1271,14 +1272,14 @@
if (!ec_master_eoe_processing(master))
master->fsm.idle = 0; // pump the bus as fast as possible
#endif
- up(&master->master_sem);
+ ec_mutex_unlock(&master->master_mutex);
// queue and send
- down(&master->io_sem);
+ ec_mutex_lock(&master->io_mutex);
ecrt_master_send(master);
sent_bytes = master->main_device.tx_skb[
master->main_device.tx_ring_index]->len;
- up(&master->io_sem);
+ ec_mutex_unlock(&master->io_mutex);
if (ec_fsm_master_idle(&master->fsm)) {
#ifdef EC_USE_HRTIMER
@@ -1321,7 +1322,7 @@
ec_master_output_stats(master);
// execute master & slave state machines
- if (down_interruptible(&master->master_sem))
+ if (ec_mutex_lock_interruptible(&master->master_mutex))
break;
if (ec_fsm_master_exec(&master->fsm))
ec_master_queue_fsm_datagram(master, &master->fsm_datagram);
@@ -1333,7 +1334,7 @@
#if defined(EC_EOE)
ec_master_eoe_processing(master);
#endif
- up(&master->master_sem);
+ ec_mutex_unlock(&master->master_mutex);
#ifdef EC_USE_HRTIMER
// the op thread should not work faster than the sending RT thread
@@ -1858,7 +1859,7 @@
return ERR_PTR(-ENOMEM);
}
- down(&master->master_sem);
+ ec_mutex_lock(&master->master_mutex);
if (list_empty(&master->domains)) {
index = 0;
@@ -1870,7 +1871,7 @@
ec_domain_init(domain, master, index);
list_add_tail(&domain->list, &master->domains);
- up(&master->master_sem);
+ ec_mutex_unlock(&master->master_mutex);
EC_MASTER_DBG(master, 1, "Created domain %u.\n", domain->index);
@@ -1902,21 +1903,21 @@
return 0;
}
- down(&master->master_sem);
+ ec_mutex_lock(&master->master_mutex);
// finish all domains
domain_offset = 0;
list_for_each_entry(domain, &master->domains, list) {
ret = ec_domain_finish(domain, domain_offset);
if (ret < 0) {
- up(&master->master_sem);
+ ec_mutex_unlock(&master->master_mutex);
EC_MASTER_ERR(master, "Failed to finish domain 0x%p!\n", domain);
return ret;
}
domain_offset += domain->data_size;
}
- up(&master->master_sem);
+ ec_mutex_unlock(&master->master_mutex);
// restart EoE process and master thread with new locking
@@ -2128,14 +2129,14 @@
ec_slave_config_init(sc, master,
alias, position, vendor_id, product_code);
- down(&master->master_sem);
+ ec_mutex_lock(&master->master_mutex);
// try to find the addressed slave
ec_slave_config_attach(sc);
ec_slave_config_load_default_sync_config(sc);
list_add_tail(&sc->list, &master->configs);
- up(&master->master_sem);
+ ec_mutex_unlock(&master->master_mutex);
}
return sc;
@@ -2173,7 +2174,7 @@
{
const ec_slave_t *slave;
- if (down_interruptible(&master->master_sem)) {
+ if (ec_mutex_lock_interruptible(&master->master_mutex)) {
return -EINTR;
}
@@ -2196,7 +2197,7 @@
slave_info->name[0] = 0;
}
- up(&master->master_sem);
+ ec_mutex_unlock(&master->master_mutex);
return 0;
}
@@ -2325,12 +2326,12 @@
request.req.data_size = data_size;
ec_soe_request_write(&request.req);
- if (down_interruptible(&master->master_sem))
+ if (ec_mutex_lock_interruptible(&master->master_mutex))
return -EINTR;
if (!(request.slave = ec_master_find_slave(
master, 0, slave_position))) {
- up(&master->master_sem);
+ ec_mutex_unlock(&master->master_mutex);
EC_MASTER_ERR(master, "Slave %u does not exist!\n",
slave_position);
ec_soe_request_clear(&request.req);
@@ -2342,21 +2343,21 @@
// schedule SoE write request.
list_add_tail(&request.list, &request.slave->soe_requests);
- up(&master->master_sem);
+ ec_mutex_unlock(&master->master_mutex);
// wait for processing through FSM
if (wait_event_interruptible(request.slave->soe_queue,
request.req.state != EC_INT_REQUEST_QUEUED)) {
// interrupted by signal
- down(&master->master_sem);
+ ec_mutex_lock(&master->master_mutex);
if (request.req.state == EC_INT_REQUEST_QUEUED) {
// abort request
list_del(&request.list);
- up(&master->master_sem);
+ ec_mutex_unlock(&master->master_mutex);
ec_soe_request_clear(&request.req);
return -EINTR;
}
- up(&master->master_sem);
+ ec_mutex_unlock(&master->master_mutex);
}
// wait until master FSM has finished processing
@@ -2391,11 +2392,11 @@
ec_soe_request_set_idn(&request.req, idn);
ec_soe_request_read(&request.req);
- if (down_interruptible(&master->master_sem))
+ if (ec_mutex_lock_interruptible(&master->master_mutex))
return -EINTR;
if (!(request.slave = ec_master_find_slave(master, 0, slave_position))) {
- up(&master->master_sem);
+ ec_mutex_unlock(&master->master_mutex);
ec_soe_request_clear(&request.req);
EC_MASTER_ERR(master, "Slave %u does not exist!\n", slave_position);
return -EINVAL;
@@ -2404,7 +2405,7 @@
// schedule request.
list_add_tail(&request.list, &request.slave->soe_requests);
- up(&master->master_sem);
+ ec_mutex_unlock(&master->master_mutex);
EC_SLAVE_DBG(request.slave, 1, "Scheduled SoE read request.\n");
@@ -2412,15 +2413,15 @@
if (wait_event_interruptible(request.slave->soe_queue,
request.req.state != EC_INT_REQUEST_QUEUED)) {
// interrupted by signal
- down(&master->master_sem);
+ ec_mutex_lock(&master->master_mutex);
if (request.req.state == EC_INT_REQUEST_QUEUED) {
list_del(&request.list);
- up(&master->master_sem);
+ ec_mutex_unlock(&master->master_mutex);
ec_soe_request_clear(&request.req);
return -EINTR;
}
// request already processing: interrupt not possible.
- up(&master->master_sem);
+ ec_mutex_unlock(&master->master_mutex);
}
// wait until master FSM has finished processing