diff --git a/configure.ac b/configure.ac index 61bf31e1..8a1d71e4 100644 --- a/configure.ac +++ b/configure.ac @@ -812,6 +812,35 @@ else AC_MSG_RESULT([no]) fi +#------------------------------------------------------------------------------ +# Realtime Mutex support +#------------------------------------------------------------------------------ + +AC_MSG_CHECKING([whether to use rtmutexes]) + +AC_ARG_ENABLE([rtmutex], + AS_HELP_STRING([--enable-rtmutex], + [Use rtmutexes for synchronization (default: no)]), + [ + case "${enableval}" in + yes) rtmutex=1 + ;; + no) rtmutex=0 + ;; + *) AC_MSG_ERROR([Invalid value for --enable-rtmutex]) + ;; + esac + ], + [rtmutex=0] +) + +if test "x${rtmutex}" = "x1"; then + AC_DEFINE([EC_USE_RTMUTEX], [1], [Use rtmutex for synchronization]) + AC_MSG_RESULT([yes]) +else + AC_MSG_RESULT([no]) +fi + #------------------------------------------------------------------------------ # High-resolution timer support #------------------------------------------------------------------------------ diff --git a/master/Makefile.am b/master/Makefile.am index 505b6a7f..382fab77 100644 --- a/master/Makefile.am +++ b/master/Makefile.am @@ -57,6 +57,7 @@ noinst_HEADERS = \ fsm_soe.c fsm_soe.h \ globals.h \ ioctl.c ioctl.h \ + locks.h \ mailbox.c mailbox.h \ master.c master.h \ module.c \ diff --git a/master/device.c b/master/device.c index deb938fa..337dea40 100644 --- a/master/device.c +++ b/master/device.c @@ -559,9 +559,9 @@ void ecdev_withdraw(ec_device_t *device /**< EtherCAT device */) EC_MASTER_INFO(master, "Releasing %s device %s.\n", dev_str, mac_str); - down(&master->device_sem); + ec_lock_down(&master->device_sem); ec_device_detach(device); - up(&master->device_sem); + ec_lock_up(&master->device_sem); } /*****************************************************************************/ diff --git a/master/domain.c b/master/domain.c index 96db67e5..1ac08341 100755 --- a/master/domain.c +++ b/master/domain.c @@ -512,14 +512,14 @@ void ecrt_domain_external_memory(ec_domain_t *domain, uint8_t *mem) EC_MASTER_DBG(domain->master, 1, "ecrt_domain_external_memory(" "domain = 0x%p, mem = 0x%p)\n", domain, mem); - down(&domain->master->master_sem); + ec_lock_down(&domain->master->master_sem); ec_domain_clear_data(domain); domain->data = mem; domain->data_origin = EC_ORIG_EXTERNAL; - up(&domain->master->master_sem); + ec_lock_up(&domain->master->master_sem); } /*****************************************************************************/ diff --git a/master/ethernet.c b/master/ethernet.c index 37bb1afe..f51dc92e 100644 --- a/master/ethernet.c +++ b/master/ethernet.c @@ -153,7 +153,7 @@ int ec_eoe_init( eoe->tx_queue_size = EC_EOE_TX_QUEUE_SIZE; eoe->tx_queued_frames = 0; - sema_init(&eoe->tx_queue_sem, 1); + ec_lock_init(&eoe->tx_queue_sem); eoe->tx_frame_number = 0xFF; memset(&eoe->stats, 0, sizeof(struct net_device_stats)); @@ -323,7 +323,7 @@ void ec_eoe_flush(ec_eoe_t *eoe /**< EoE handler */) { ec_eoe_frame_t *frame, *next; - down(&eoe->tx_queue_sem); + ec_lock_down(&eoe->tx_queue_sem); list_for_each_entry_safe(frame, next, &eoe->tx_queue, queue) { list_del(&frame->queue); @@ -332,7 +332,7 @@ void ec_eoe_flush(ec_eoe_t *eoe /**< EoE handler */) } eoe->tx_queued_frames = 0; - up(&eoe->tx_queue_sem); + ec_lock_up(&eoe->tx_queue_sem); } /*****************************************************************************/ @@ -727,10 +727,10 @@ void ec_eoe_state_tx_start(ec_eoe_t *eoe /**< EoE handler */) return; } - down(&eoe->tx_queue_sem); + ec_lock_down(&eoe->tx_queue_sem); if (!eoe->tx_queued_frames || list_empty(&eoe->tx_queue)) { - up(&eoe->tx_queue_sem); + ec_lock_up(&eoe->tx_queue_sem); eoe->tx_idle = 1; // no data available. // start a new receive immediately. @@ -751,7 +751,7 @@ void ec_eoe_state_tx_start(ec_eoe_t *eoe /**< EoE handler */) } eoe->tx_queued_frames--; - up(&eoe->tx_queue_sem); + ec_lock_up(&eoe->tx_queue_sem); eoe->tx_idle = 0; @@ -923,14 +923,14 @@ int ec_eoedev_tx(struct sk_buff *skb, /**< transmit socket buffer */ frame->skb = skb; - down(&eoe->tx_queue_sem); + ec_lock_down(&eoe->tx_queue_sem); list_add_tail(&frame->queue, &eoe->tx_queue); eoe->tx_queued_frames++; if (eoe->tx_queued_frames == eoe->tx_queue_size) { netif_stop_queue(dev); eoe->tx_queue_active = 0; } - up(&eoe->tx_queue_sem); + ec_lock_up(&eoe->tx_queue_sem); #if EOE_DEBUG_LEVEL >= 2 EC_SLAVE_DBG(eoe->slave, 0, "EoE %s TX queued frame" diff --git a/master/ethernet.h b/master/ethernet.h index 024ec9a3..85a31822 100644 --- a/master/ethernet.h +++ b/master/ethernet.h @@ -40,13 +40,8 @@ #include #include -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27) -#include -#else -#include -#endif - #include "globals.h" +#include "locks.h" #include "slave.h" #include "datagram.h" @@ -109,7 +104,7 @@ struct ec_eoe unsigned int tx_queue_size; /**< Transmit queue size. */ unsigned int tx_queue_active; /**< kernel netif queue started */ unsigned int tx_queued_frames; /**< number of frames in the queue */ - struct semaphore tx_queue_sem; /**< Semaphore for the send queue. */ + ec_lock_t tx_queue_sem; /**< Semaphore for the send queue. */ ec_eoe_frame_t *tx_frame; /**< current TX frame */ uint8_t tx_frame_number; /**< number of the transmitted frame */ uint8_t tx_fragment_number; /**< number of the fragment */ diff --git a/master/fsm_master.c b/master/fsm_master.c index 56164f27..1ae6466e 100644 --- a/master/fsm_master.c +++ b/master/fsm_master.c @@ -334,15 +334,15 @@ void ec_fsm_master_state_broadcast( } if (fsm->rescan_required) { - down(&master->scan_sem); + ec_lock_down(&master->scan_sem); if (!master->allow_scan) { - up(&master->scan_sem); + ec_lock_up(&master->scan_sem); } else { unsigned int count = 0, next_dev_slave, ring_position; ec_device_index_t dev_idx; master->scan_busy = 1; - up(&master->scan_sem); + ec_lock_up(&master->scan_sem); // clear all slaves and scan the bus fsm->rescan_required = 0; @@ -826,9 +826,9 @@ void ec_fsm_master_action_configure( || slave->force_config) && !slave->error_flag) { // Start slave configuration - down(&master->config_sem); + ec_lock_down(&master->config_sem); master->config_busy = 1; - up(&master->config_sem); + ec_lock_up(&master->config_sem); if (master->debug_level) { char old_state[EC_STATE_STRING_SIZE], diff --git a/master/ioctl.c b/master/ioctl.c index d13b2c20..afd8e902 100755 --- a/master/ioctl.c +++ b/master/ioctl.c @@ -109,7 +109,7 @@ static ATTRIBUTES int ec_ioctl_master( ec_ioctl_master_t io; unsigned int dev_idx, j; - if (down_interruptible(&master->master_sem)) { + if (ec_lock_down_interruptible(&master->master_sem)) { return -EINTR; } @@ -123,9 +123,9 @@ static ATTRIBUTES int ec_ioctl_master( io.active = (uint8_t) master->active; io.scan_busy = master->scan_busy; - up(&master->master_sem); + ec_lock_up(&master->master_sem); - if (down_interruptible(&master->device_sem)) { + if (ec_lock_down_interruptible(&master->device_sem)) { return -EINTR; } @@ -177,7 +177,7 @@ static ATTRIBUTES int ec_ioctl_master( master->device_stats.loss_rates[j]; } - up(&master->device_sem); + ec_lock_up(&master->device_sem); io.app_time = master->app_time; io.dc_ref_time = master->dc_ref_time; @@ -210,12 +210,12 @@ static ATTRIBUTES int ec_ioctl_slave( return -EFAULT; } - if (down_interruptible(&master->master_sem)) + if (ec_lock_down_interruptible(&master->master_sem)) return -EINTR; if (!(slave = ec_master_find_slave_const( master, 0, data.position))) { - up(&master->master_sem); + ec_lock_up(&master->master_sem); EC_MASTER_DBG(master, 1, "Slave %u does not exist!\n", data.position); return -EINVAL; } @@ -270,7 +270,7 @@ static ATTRIBUTES int ec_ioctl_slave( ec_ioctl_strcpy(data.order, slave->sii.order); ec_ioctl_strcpy(data.name, slave->sii.name); - up(&master->master_sem); + ec_lock_up(&master->master_sem); if (copy_to_user((void __user *) arg, &data, sizeof(data))) return -EFAULT; @@ -297,19 +297,19 @@ static ATTRIBUTES int ec_ioctl_slave_sync( return -EFAULT; } - if (down_interruptible(&master->master_sem)) + if (ec_lock_down_interruptible(&master->master_sem)) return -EINTR; if (!(slave = ec_master_find_slave_const( master, 0, data.slave_position))) { - up(&master->master_sem); + ec_lock_up(&master->master_sem); EC_MASTER_ERR(master, "Slave %u does not exist!\n", data.slave_position); return -EINVAL; } if (data.sync_index >= slave->sii.sync_count) { - up(&master->master_sem); + ec_lock_up(&master->master_sem); EC_SLAVE_ERR(slave, "Sync manager %u does not exist!\n", data.sync_index); return -EINVAL; @@ -323,7 +323,7 @@ static ATTRIBUTES int ec_ioctl_slave_sync( data.enable = sync->enable; data.pdo_count = ec_pdo_list_count(&sync->pdos); - up(&master->master_sem); + ec_lock_up(&master->master_sem); if (copy_to_user((void __user *) arg, &data, sizeof(data))) return -EFAULT; @@ -351,19 +351,19 @@ static ATTRIBUTES int ec_ioctl_slave_sync_pdo( return -EFAULT; } - if (down_interruptible(&master->master_sem)) + if (ec_lock_down_interruptible(&master->master_sem)) return -EINTR; if (!(slave = ec_master_find_slave_const( master, 0, data.slave_position))) { - up(&master->master_sem); + ec_lock_up(&master->master_sem); EC_MASTER_ERR(master, "Slave %u does not exist!\n", data.slave_position); return -EINVAL; } if (data.sync_index >= slave->sii.sync_count) { - up(&master->master_sem); + ec_lock_up(&master->master_sem); EC_SLAVE_ERR(slave, "Sync manager %u does not exist!\n", data.sync_index); return -EINVAL; @@ -372,7 +372,7 @@ static ATTRIBUTES int ec_ioctl_slave_sync_pdo( sync = &slave->sii.syncs[data.sync_index]; if (!(pdo = ec_pdo_list_find_pdo_by_pos_const( &sync->pdos, data.pdo_pos))) { - up(&master->master_sem); + ec_lock_up(&master->master_sem); EC_SLAVE_ERR(slave, "Sync manager %u does not contain a PDO with " "position %u!\n", data.sync_index, data.pdo_pos); return -EINVAL; @@ -382,7 +382,7 @@ static ATTRIBUTES int ec_ioctl_slave_sync_pdo( data.entry_count = ec_pdo_entry_count(pdo); ec_ioctl_strcpy(data.name, pdo->name); - up(&master->master_sem); + ec_lock_up(&master->master_sem); if (copy_to_user((void __user *) arg, &data, sizeof(data))) return -EFAULT; @@ -411,19 +411,19 @@ static ATTRIBUTES int ec_ioctl_slave_sync_pdo_entry( return -EFAULT; } - if (down_interruptible(&master->master_sem)) + if (ec_lock_down_interruptible(&master->master_sem)) return -EINTR; if (!(slave = ec_master_find_slave_const( master, 0, data.slave_position))) { - up(&master->master_sem); + ec_lock_up(&master->master_sem); EC_MASTER_ERR(master, "Slave %u does not exist!\n", data.slave_position); return -EINVAL; } if (data.sync_index >= slave->sii.sync_count) { - up(&master->master_sem); + ec_lock_up(&master->master_sem); EC_SLAVE_ERR(slave, "Sync manager %u does not exist!\n", data.sync_index); return -EINVAL; @@ -432,7 +432,7 @@ static ATTRIBUTES int ec_ioctl_slave_sync_pdo_entry( sync = &slave->sii.syncs[data.sync_index]; if (!(pdo = ec_pdo_list_find_pdo_by_pos_const( &sync->pdos, data.pdo_pos))) { - up(&master->master_sem); + ec_lock_up(&master->master_sem); EC_SLAVE_ERR(slave, "Sync manager %u does not contain a PDO with " "position %u!\n", data.sync_index, data.pdo_pos); return -EINVAL; @@ -440,7 +440,7 @@ static ATTRIBUTES int ec_ioctl_slave_sync_pdo_entry( if (!(entry = ec_pdo_find_entry_by_pos_const( pdo, data.entry_pos))) { - up(&master->master_sem); + ec_lock_up(&master->master_sem); EC_SLAVE_ERR(slave, "PDO 0x%04X does not contain an entry with " "position %u!\n", data.pdo_pos, data.entry_pos); return -EINVAL; @@ -451,7 +451,7 @@ static ATTRIBUTES int ec_ioctl_slave_sync_pdo_entry( data.bit_length = entry->bit_length; ec_ioctl_strcpy(data.name, entry->name); - up(&master->master_sem); + ec_lock_up(&master->master_sem); if (copy_to_user((void __user *) arg, &data, sizeof(data))) return -EFAULT; @@ -478,11 +478,11 @@ static ATTRIBUTES int ec_ioctl_domain( return -EFAULT; } - if (down_interruptible(&master->master_sem)) + if (ec_lock_down_interruptible(&master->master_sem)) return -EINTR; if (!(domain = ec_master_find_domain_const(master, data.index))) { - up(&master->master_sem); + ec_lock_up(&master->master_sem); EC_MASTER_ERR(master, "Domain %u does not exist!\n", data.index); return -EINVAL; } @@ -496,7 +496,7 @@ static ATTRIBUTES int ec_ioctl_domain( data.expected_working_counter = domain->expected_working_counter; data.fmmu_count = ec_domain_fmmu_count(domain); - up(&master->master_sem); + ec_lock_up(&master->master_sem); if (copy_to_user((void __user *) arg, &data, sizeof(data))) return -EFAULT; @@ -523,18 +523,18 @@ static ATTRIBUTES int ec_ioctl_domain_fmmu( return -EFAULT; } - if (down_interruptible(&master->master_sem)) + if (ec_lock_down_interruptible(&master->master_sem)) return -EINTR; if (!(domain = ec_master_find_domain_const(master, data.domain_index))) { - up(&master->master_sem); + ec_lock_up(&master->master_sem); EC_MASTER_ERR(master, "Domain %u does not exist!\n", data.domain_index); return -EINVAL; } if (!(fmmu = ec_domain_find_fmmu(domain, data.fmmu_index))) { - up(&master->master_sem); + ec_lock_up(&master->master_sem); EC_MASTER_ERR(master, "Domain %u has less than %u" " fmmu configurations.\n", data.domain_index, data.fmmu_index + 1); @@ -548,7 +548,7 @@ static ATTRIBUTES int ec_ioctl_domain_fmmu( data.logical_address = fmmu->domain->logical_base_address + fmmu->logical_domain_offset; data.data_size = fmmu->data_size; - up(&master->master_sem); + ec_lock_up(&master->master_sem); if (copy_to_user((void __user *) arg, &data, sizeof(data))) return -EFAULT; @@ -574,18 +574,18 @@ static ATTRIBUTES int ec_ioctl_domain_data( return -EFAULT; } - if (down_interruptible(&master->master_sem)) + if (ec_lock_down_interruptible(&master->master_sem)) return -EINTR; if (!(domain = ec_master_find_domain_const(master, data.domain_index))) { - up(&master->master_sem); + ec_lock_up(&master->master_sem); EC_MASTER_ERR(master, "Domain %u does not exist!\n", data.domain_index); return -EINVAL; } if (domain->data_size != data.data_size) { - up(&master->master_sem); + ec_lock_up(&master->master_sem); EC_MASTER_ERR(master, "Data size mismatch %u/%zu!\n", data.data_size, domain->data_size); return -EFAULT; @@ -593,11 +593,11 @@ static ATTRIBUTES int ec_ioctl_domain_data( if (copy_to_user((void __user *) data.target, domain->data, domain->data_size)) { - up(&master->master_sem); + ec_lock_up(&master->master_sem); return -EFAULT; } - up(&master->master_sem); + ec_lock_up(&master->master_sem); return 0; } @@ -648,12 +648,12 @@ static ATTRIBUTES int ec_ioctl_slave_state( return -EFAULT; } - if (down_interruptible(&master->master_sem)) + if (ec_lock_down_interruptible(&master->master_sem)) return -EINTR; if (!(slave = ec_master_find_slave( master, 0, data.slave_position))) { - up(&master->master_sem); + ec_lock_up(&master->master_sem); EC_MASTER_ERR(master, "Slave %u does not exist!\n", data.slave_position); return -EINVAL; @@ -661,7 +661,7 @@ static ATTRIBUTES int ec_ioctl_slave_state( ec_slave_request_state(slave, data.al_state); - up(&master->master_sem); + ec_lock_up(&master->master_sem); return 0; } @@ -684,12 +684,12 @@ static ATTRIBUTES int ec_ioctl_slave_sdo( return -EFAULT; } - if (down_interruptible(&master->master_sem)) + if (ec_lock_down_interruptible(&master->master_sem)) return -EINTR; if (!(slave = ec_master_find_slave_const( master, 0, data.slave_position))) { - up(&master->master_sem); + ec_lock_up(&master->master_sem); EC_MASTER_ERR(master, "Slave %u does not exist!\n", data.slave_position); return -EINVAL; @@ -697,7 +697,7 @@ static ATTRIBUTES int ec_ioctl_slave_sdo( if (!(sdo = ec_slave_get_sdo_by_pos_const( slave, data.sdo_position))) { - up(&master->master_sem); + ec_lock_up(&master->master_sem); EC_SLAVE_ERR(slave, "SDO %u does not exist!\n", data.sdo_position); return -EINVAL; } @@ -706,7 +706,7 @@ static ATTRIBUTES int ec_ioctl_slave_sdo( data.max_subindex = sdo->max_subindex; ec_ioctl_strcpy(data.name, sdo->name); - up(&master->master_sem); + ec_lock_up(&master->master_sem); if (copy_to_user((void __user *) arg, &data, sizeof(data))) return -EFAULT; @@ -734,12 +734,12 @@ static ATTRIBUTES int ec_ioctl_slave_sdo_entry( return -EFAULT; } - if (down_interruptible(&master->master_sem)) + if (ec_lock_down_interruptible(&master->master_sem)) return -EINTR; if (!(slave = ec_master_find_slave_const( master, 0, data.slave_position))) { - up(&master->master_sem); + ec_lock_up(&master->master_sem); EC_MASTER_ERR(master, "Slave %u does not exist!\n", data.slave_position); return -EINVAL; @@ -748,14 +748,14 @@ static ATTRIBUTES int ec_ioctl_slave_sdo_entry( if (data.sdo_spec <= 0) { if (!(sdo = ec_slave_get_sdo_by_pos_const( slave, -data.sdo_spec))) { - up(&master->master_sem); + ec_lock_up(&master->master_sem); EC_SLAVE_ERR(slave, "SDO %u does not exist!\n", -data.sdo_spec); return -EINVAL; } } else { if (!(sdo = ec_slave_get_sdo_const( slave, data.sdo_spec))) { - up(&master->master_sem); + ec_lock_up(&master->master_sem); EC_SLAVE_ERR(slave, "SDO 0x%04X does not exist!\n", data.sdo_spec); return -EINVAL; @@ -764,7 +764,7 @@ static ATTRIBUTES int ec_ioctl_slave_sdo_entry( if (!(entry = ec_sdo_get_entry_const( sdo, data.sdo_entry_subindex))) { - up(&master->master_sem); + ec_lock_up(&master->master_sem); EC_SLAVE_ERR(slave, "SDO entry 0x%04X:%02X does not exist!\n", sdo->index, data.sdo_entry_subindex); return -EINVAL; @@ -786,7 +786,7 @@ static ATTRIBUTES int ec_ioctl_slave_sdo_entry( entry->write_access[EC_SDO_ENTRY_ACCESS_OP]; ec_ioctl_strcpy(data.description, entry->description); - up(&master->master_sem); + ec_lock_up(&master->master_sem); if (copy_to_user((void __user *) arg, &data, sizeof(data))) return -EFAULT; @@ -907,12 +907,12 @@ static ATTRIBUTES int ec_ioctl_slave_sii_read( return -EFAULT; } - if (down_interruptible(&master->master_sem)) + if (ec_lock_down_interruptible(&master->master_sem)) return -EINTR; if (!(slave = ec_master_find_slave_const( master, 0, data.slave_position))) { - up(&master->master_sem); + ec_lock_up(&master->master_sem); EC_MASTER_ERR(master, "Slave %u does not exist!\n", data.slave_position); return -EINVAL; @@ -920,7 +920,7 @@ static ATTRIBUTES int ec_ioctl_slave_sii_read( if (!data.nwords || data.offset + data.nwords > slave->sii_nwords) { - up(&master->master_sem); + ec_lock_up(&master->master_sem); EC_SLAVE_ERR(slave, "Invalid SII read offset/size %u/%u for slave SII" " size %zu!\n", data.offset, data.nwords, slave->sii_nwords); return -EINVAL; @@ -932,7 +932,7 @@ static ATTRIBUTES int ec_ioctl_slave_sii_read( else retval = 0; - up(&master->master_sem); + ec_lock_up(&master->master_sem); return retval; } @@ -974,14 +974,14 @@ static ATTRIBUTES int ec_ioctl_slave_sii_write( return -EFAULT; } - if (down_interruptible(&master->master_sem)) { + if (ec_lock_down_interruptible(&master->master_sem)) { kfree(words); return -EINTR; } if (!(slave = ec_master_find_slave( master, 0, data.slave_position))) { - up(&master->master_sem); + ec_lock_up(&master->master_sem); EC_MASTER_ERR(master, "Slave %u does not exist!\n", data.slave_position); kfree(words); @@ -999,21 +999,21 @@ static ATTRIBUTES int ec_ioctl_slave_sii_write( // schedule SII write request. list_add_tail(&request.list, &master->sii_requests); - up(&master->master_sem); + ec_lock_up(&master->master_sem); // wait for processing through FSM if (wait_event_interruptible(master->request_queue, request.state != EC_INT_REQUEST_QUEUED)) { // interrupted by signal - down(&master->master_sem); + ec_lock_down(&master->master_sem); if (request.state == EC_INT_REQUEST_QUEUED) { // abort request list_del(&request.list); - up(&master->master_sem); + ec_lock_up(&master->master_sem); kfree(words); return -EINTR; } - up(&master->master_sem); + ec_lock_up(&master->master_sem); } // wait until master FSM has finished processing @@ -1056,14 +1056,14 @@ static ATTRIBUTES int ec_ioctl_slave_reg_read( ecrt_reg_request_read(&request, io.address, io.size); - if (down_interruptible(&master->master_sem)) { + if (ec_lock_down_interruptible(&master->master_sem)) { ec_reg_request_clear(&request); return -EINTR; } if (!(slave = ec_master_find_slave( master, 0, io.slave_position))) { - up(&master->master_sem); + ec_lock_up(&master->master_sem); ec_reg_request_clear(&request); EC_MASTER_ERR(master, "Slave %u does not exist!\n", io.slave_position); @@ -1073,21 +1073,21 @@ static ATTRIBUTES int ec_ioctl_slave_reg_read( // schedule request. list_add_tail(&request.list, &slave->reg_requests); - up(&master->master_sem); + ec_lock_up(&master->master_sem); // wait for processing through FSM if (wait_event_interruptible(master->request_queue, request.state != EC_INT_REQUEST_QUEUED)) { // interrupted by signal - down(&master->master_sem); + ec_lock_down(&master->master_sem); if (request.state == EC_INT_REQUEST_QUEUED) { // abort request list_del(&request.list); - up(&master->master_sem); + ec_lock_up(&master->master_sem); ec_reg_request_clear(&request); return -EINTR; } - up(&master->master_sem); + ec_lock_up(&master->master_sem); } // wait until master FSM has finished processing @@ -1140,7 +1140,7 @@ static ATTRIBUTES int ec_ioctl_slave_reg_write( ecrt_reg_request_write(&request, io.address, io.size); - if (down_interruptible(&master->master_sem)) { + if (ec_lock_down_interruptible(&master->master_sem)) { ec_reg_request_clear(&request); return -EINTR; } @@ -1152,7 +1152,7 @@ static ATTRIBUTES int ec_ioctl_slave_reg_write( } else { if (!(slave = ec_master_find_slave(master, 0, io.slave_position))) { - up(&master->master_sem); + ec_lock_up(&master->master_sem); ec_reg_request_clear(&request); EC_MASTER_ERR(master, "Slave %u does not exist!\n", io.slave_position); @@ -1163,21 +1163,21 @@ static ATTRIBUTES int ec_ioctl_slave_reg_write( list_add_tail(&request.list, &slave->reg_requests); } - up(&master->master_sem); + ec_lock_up(&master->master_sem); // wait for processing through FSM if (wait_event_interruptible(master->request_queue, request.state != EC_INT_REQUEST_QUEUED)) { // interrupted by signal - down(&master->master_sem); + ec_lock_down(&master->master_sem); if (request.state == EC_INT_REQUEST_QUEUED) { // abort request list_del(&request.list); - up(&master->master_sem); + ec_lock_up(&master->master_sem); ec_reg_request_clear(&request); return -EINTR; } - up(&master->master_sem); + ec_lock_up(&master->master_sem); } // wait until master FSM has finished processing @@ -1207,12 +1207,12 @@ static ATTRIBUTES int ec_ioctl_config( return -EFAULT; } - if (down_interruptible(&master->master_sem)) + if (ec_lock_down_interruptible(&master->master_sem)) return -EINTR; if (!(sc = ec_master_get_config_const( master, data.config_index))) { - up(&master->master_sem); + ec_lock_up(&master->master_sem); EC_MASTER_ERR(master, "Slave config %u does not exist!\n", data.config_index); return -EINVAL; @@ -1239,7 +1239,7 @@ static ATTRIBUTES int ec_ioctl_config( data.dc_sync[i] = sc->dc_sync[i]; } - up(&master->master_sem); + ec_lock_up(&master->master_sem); if (copy_to_user((void __user *) arg, &data, sizeof(data))) return -EFAULT; @@ -1272,12 +1272,12 @@ static ATTRIBUTES int ec_ioctl_config_pdo( return -EINVAL; } - if (down_interruptible(&master->master_sem)) + if (ec_lock_down_interruptible(&master->master_sem)) return -EINTR; if (!(sc = ec_master_get_config_const( master, data.config_index))) { - up(&master->master_sem); + ec_lock_up(&master->master_sem); EC_MASTER_ERR(master, "Slave config %u does not exist!\n", data.config_index); return -EINVAL; @@ -1286,7 +1286,7 @@ static ATTRIBUTES int ec_ioctl_config_pdo( if (!(pdo = ec_pdo_list_find_pdo_by_pos_const( &sc->sync_configs[data.sync_index].pdos, data.pdo_pos))) { - up(&master->master_sem); + ec_lock_up(&master->master_sem); EC_MASTER_ERR(master, "Invalid PDO position!\n"); return -EINVAL; } @@ -1295,7 +1295,7 @@ static ATTRIBUTES int ec_ioctl_config_pdo( data.entry_count = ec_pdo_entry_count(pdo); ec_ioctl_strcpy(data.name, pdo->name); - up(&master->master_sem); + ec_lock_up(&master->master_sem); if (copy_to_user((void __user *) arg, &data, sizeof(data))) return -EFAULT; @@ -1329,12 +1329,12 @@ static ATTRIBUTES int ec_ioctl_config_pdo_entry( return -EINVAL; } - if (down_interruptible(&master->master_sem)) + if (ec_lock_down_interruptible(&master->master_sem)) return -EINTR; if (!(sc = ec_master_get_config_const( master, data.config_index))) { - up(&master->master_sem); + ec_lock_up(&master->master_sem); EC_MASTER_ERR(master, "Slave config %u does not exist!\n", data.config_index); return -EINVAL; @@ -1343,14 +1343,14 @@ static ATTRIBUTES int ec_ioctl_config_pdo_entry( if (!(pdo = ec_pdo_list_find_pdo_by_pos_const( &sc->sync_configs[data.sync_index].pdos, data.pdo_pos))) { - up(&master->master_sem); + ec_lock_up(&master->master_sem); EC_MASTER_ERR(master, "Invalid PDO position!\n"); return -EINVAL; } if (!(entry = ec_pdo_find_entry_by_pos_const( pdo, data.entry_pos))) { - up(&master->master_sem); + ec_lock_up(&master->master_sem); EC_MASTER_ERR(master, "Entry not found!\n"); return -EINVAL; } @@ -1360,7 +1360,7 @@ static ATTRIBUTES int ec_ioctl_config_pdo_entry( data.bit_length = entry->bit_length; ec_ioctl_strcpy(data.name, entry->name); - up(&master->master_sem); + ec_lock_up(&master->master_sem); if (copy_to_user((void __user *) arg, &data, sizeof(data))) return -EFAULT; @@ -1392,14 +1392,14 @@ static ATTRIBUTES int ec_ioctl_config_sdo( return -EFAULT; } - if (down_interruptible(&master->master_sem)) { + if (ec_lock_down_interruptible(&master->master_sem)) { kfree(ioctl); return -EINTR; } if (!(sc = ec_master_get_config_const( master, ioctl->config_index))) { - up(&master->master_sem); + ec_lock_up(&master->master_sem); EC_MASTER_ERR(master, "Slave config %u does not exist!\n", ioctl->config_index); kfree(ioctl); @@ -1408,7 +1408,7 @@ static ATTRIBUTES int ec_ioctl_config_sdo( if (!(req = ec_slave_config_get_sdo_by_pos_const( sc, ioctl->sdo_pos))) { - up(&master->master_sem); + ec_lock_up(&master->master_sem); EC_MASTER_ERR(master, "Invalid SDO position!\n"); kfree(ioctl); return -EINVAL; @@ -1421,7 +1421,7 @@ static ATTRIBUTES int ec_ioctl_config_sdo( min((u32) ioctl->size, (u32) EC_MAX_SDO_DATA_SIZE)); ioctl->complete_access = req->complete_access; - up(&master->master_sem); + ec_lock_up(&master->master_sem); if (copy_to_user((void __user *) arg, ioctl, sizeof(*ioctl))) { kfree(ioctl); @@ -1456,14 +1456,14 @@ static ATTRIBUTES int ec_ioctl_config_idn( return -EFAULT; } - if (down_interruptible(&master->master_sem)) { + if (ec_lock_down_interruptible(&master->master_sem)) { kfree(ioctl); return -EINTR; } if (!(sc = ec_master_get_config_const( master, ioctl->config_index))) { - up(&master->master_sem); + ec_lock_up(&master->master_sem); EC_MASTER_ERR(master, "Slave config %u does not exist!\n", ioctl->config_index); kfree(ioctl); @@ -1472,7 +1472,7 @@ static ATTRIBUTES int ec_ioctl_config_idn( if (!(req = ec_slave_config_get_idn_by_pos_const( sc, ioctl->idn_pos))) { - up(&master->master_sem); + ec_lock_up(&master->master_sem); EC_MASTER_ERR(master, "Invalid IDN position!\n"); kfree(ioctl); return -EINVAL; @@ -1485,7 +1485,7 @@ static ATTRIBUTES int ec_ioctl_config_idn( memcpy(ioctl->data, req->data, min((u32) ioctl->size, (u32) EC_MAX_IDN_DATA_SIZE)); - up(&master->master_sem); + ec_lock_up(&master->master_sem); if (copy_to_user((void __user *) arg, ioctl, sizeof(*ioctl))) { kfree(ioctl); @@ -1579,11 +1579,11 @@ static ATTRIBUTES int ec_ioctl_eoe_handler( return -EFAULT; } - if (down_interruptible(&master->master_sem)) + if (ec_lock_down_interruptible(&master->master_sem)) return -EINTR; if (!(eoe = ec_master_get_eoe_handler_const(master, data.eoe_index))) { - up(&master->master_sem); + ec_lock_up(&master->master_sem); EC_MASTER_ERR(master, "EoE handler %u does not exist!\n", data.eoe_index); return -EINVAL; @@ -1603,7 +1603,7 @@ static ATTRIBUTES int ec_ioctl_eoe_handler( data.tx_queued_frames = eoe->tx_queued_frames; data.tx_queue_size = eoe->tx_queue_size; - up(&master->master_sem); + ec_lock_up(&master->master_sem); if (copy_to_user((void __user *) arg, &data, sizeof(data))) return -EFAULT; @@ -1652,13 +1652,13 @@ static ATTRIBUTES int ec_ioctl_slave_eoe_ip_param( req.state = EC_INT_REQUEST_QUEUED; - if (down_interruptible(&master->master_sem)) { + if (ec_lock_down_interruptible(&master->master_sem)) { return -EINTR; } if (!(slave = ec_master_find_slave( master, 0, io.slave_position))) { - up(&master->master_sem); + ec_lock_up(&master->master_sem); EC_MASTER_ERR(master, "Slave %u does not exist!\n", io.slave_position); return -EINVAL; @@ -1669,20 +1669,20 @@ static ATTRIBUTES int ec_ioctl_slave_eoe_ip_param( // schedule request. list_add_tail(&req.list, &slave->eoe_requests); - up(&master->master_sem); + ec_lock_up(&master->master_sem); // wait for processing through FSM if (wait_event_interruptible(master->request_queue, req.state != EC_INT_REQUEST_QUEUED)) { // interrupted by signal - down(&master->master_sem); + ec_lock_down(&master->master_sem); if (req.state == EC_INT_REQUEST_QUEUED) { // abort request list_del(&req.list); - up(&master->master_sem); + ec_lock_up(&master->master_sem); return -EINTR; } - up(&master->master_sem); + ec_lock_up(&master->master_sem); } // wait until master FSM has finished processing @@ -1776,7 +1776,7 @@ static ATTRIBUTES int ec_ioctl_create_slave_config( data.config_index = 0; - if (down_interruptible(&master->master_sem)) + if (ec_lock_down_interruptible(&master->master_sem)) return -EINTR; list_for_each_entry(entry, &master->configs, list) { @@ -1785,7 +1785,7 @@ static ATTRIBUTES int ec_ioctl_create_slave_config( data.config_index++; } - up(&master->master_sem); + ec_lock_up(&master->master_sem); if (copy_to_user((void __user *) arg, &data, sizeof(data))) return -EFAULT; @@ -1814,7 +1814,7 @@ static ATTRIBUTES int ec_ioctl_select_ref_clock( goto out_return; } - if (down_interruptible(&master->master_sem)) { + if (ec_lock_down_interruptible(&master->master_sem)) { ret = -EINTR; goto out_return; } @@ -1829,7 +1829,7 @@ static ATTRIBUTES int ec_ioctl_select_ref_clock( ecrt_master_select_reference_clock(master, sc); out_up: - up(&master->master_sem); + ec_lock_up(&master->master_sem); out_return: return ret; } @@ -1865,14 +1865,14 @@ static ATTRIBUTES int ec_ioctl_setup_domain_memory( ctx->process_data_size = 0; - if (down_interruptible(&master->master_sem)) + if (ec_lock_down_interruptible(&master->master_sem)) return -EINTR; list_for_each_entry(domain, &master->domains, list) { ctx->process_data_size += ecrt_domain_size(domain); } - up(&master->master_sem); + ec_lock_up(&master->master_sem); if (ctx->process_data_size) { ctx->process_data = vmalloc(ctx->process_data_size); @@ -1949,14 +1949,14 @@ static ATTRIBUTES int ec_ioctl_activate( ctx->process_data_size = 0; - if (down_interruptible(&master->master_sem)) + if (ec_lock_down_interruptible(&master->master_sem)) return -EINTR; list_for_each_entry(domain, &master->domains, list) { ctx->process_data_size += ecrt_domain_size(domain); } - up(&master->master_sem); + ec_lock_up(&master->master_sem); if (ctx->process_data_size) { ctx->process_data = vmalloc(ctx->process_data_size); @@ -2073,12 +2073,12 @@ static ATTRIBUTES int ec_ioctl_set_send_interval( return -EFAULT; } - if (down_interruptible(&master->master_sem)) + if (ec_lock_down_interruptible(&master->master_sem)) return -EINTR; ec_master_set_send_interval(master, send_interval); - up(&master->master_sem); + ec_lock_up(&master->master_sem); return 0; } @@ -2412,9 +2412,9 @@ static ATTRIBUTES int ec_ioctl_reset( ec_ioctl_context_t *ctx /**< Private data structure of file handle. */ ) { - down(&master->master_sem); + ec_lock_down(&master->master_sem); ecrt_master_reset(master); - up(&master->master_sem); + ec_lock_up(&master->master_sem); return 0; } @@ -2445,7 +2445,7 @@ static ATTRIBUTES int ec_ioctl_sc_sync( goto out_return; } - if (down_interruptible(&master->master_sem)) { + if (ec_lock_down_interruptible(&master->master_sem)) { ret = -EINTR; goto out_return; } @@ -2466,7 +2466,7 @@ static ATTRIBUTES int ec_ioctl_sc_sync( } out_up: - up(&master->master_sem); + ec_lock_up(&master->master_sem); out_return: return ret; } @@ -2497,7 +2497,7 @@ static ATTRIBUTES int ec_ioctl_sc_watchdog( goto out_return; } - if (down_interruptible(&master->master_sem)) { + if (ec_lock_down_interruptible(&master->master_sem)) { ret = -EINTR; goto out_return; } @@ -2511,7 +2511,7 @@ static ATTRIBUTES int ec_ioctl_sc_watchdog( data.watchdog_divider, data.watchdog_intervals); out_up: - up(&master->master_sem); + ec_lock_up(&master->master_sem); out_return: return ret; } @@ -2540,7 +2540,7 @@ static ATTRIBUTES int ec_ioctl_sc_allow_overlapping_pdos( goto out_return; } - if (down_interruptible(&master->master_sem)) { + if (ec_lock_down_interruptible(&master->master_sem)) { ret = -EINTR; goto out_return; } @@ -2554,7 +2554,7 @@ static ATTRIBUTES int ec_ioctl_sc_allow_overlapping_pdos( data.allow_overlapping_pdos); out_up: - up(&master->master_sem); + ec_lock_up(&master->master_sem); out_return: return ret; } @@ -2579,15 +2579,15 @@ static ATTRIBUTES int ec_ioctl_sc_add_pdo( if (copy_from_user(&data, (void __user *) arg, sizeof(data))) return -EFAULT; - if (down_interruptible(&master->master_sem)) + if (ec_lock_down_interruptible(&master->master_sem)) return -EINTR; if (!(sc = ec_master_get_config(master, data.config_index))) { - up(&master->master_sem); + ec_lock_up(&master->master_sem); return -ENOENT; } - up(&master->master_sem); /** \todo sc could be invalidated */ + ec_lock_up(&master->master_sem); /** \todo sc could be invalidated */ return ecrt_slave_config_pdo_assign_add(sc, data.sync_index, data.index); } @@ -2613,15 +2613,15 @@ static ATTRIBUTES int ec_ioctl_sc_clear_pdos( if (copy_from_user(&data, (void __user *) arg, sizeof(data))) return -EFAULT; - if (down_interruptible(&master->master_sem)) + if (ec_lock_down_interruptible(&master->master_sem)) return -EINTR; if (!(sc = ec_master_get_config(master, data.config_index))) { - up(&master->master_sem); + ec_lock_up(&master->master_sem); return -ENOENT; } - up(&master->master_sem); /** \todo sc could be invalidated */ + ec_lock_up(&master->master_sem); /** \todo sc could be invalidated */ ecrt_slave_config_pdo_assign_clear(sc, data.sync_index); return 0; @@ -2648,15 +2648,15 @@ static ATTRIBUTES int ec_ioctl_sc_add_entry( if (copy_from_user(&data, (void __user *) arg, sizeof(data))) return -EFAULT; - if (down_interruptible(&master->master_sem)) + if (ec_lock_down_interruptible(&master->master_sem)) return -EINTR; if (!(sc = ec_master_get_config(master, data.config_index))) { - up(&master->master_sem); + ec_lock_up(&master->master_sem); return -ENOENT; } - up(&master->master_sem); /** \todo sc could be invalidated */ + ec_lock_up(&master->master_sem); /** \todo sc could be invalidated */ return ecrt_slave_config_pdo_mapping_add(sc, data.pdo_index, data.entry_index, data.entry_subindex, data.entry_bit_length); @@ -2683,15 +2683,15 @@ static ATTRIBUTES int ec_ioctl_sc_clear_entries( if (copy_from_user(&data, (void __user *) arg, sizeof(data))) return -EFAULT; - if (down_interruptible(&master->master_sem)) + if (ec_lock_down_interruptible(&master->master_sem)) return -EINTR; if (!(sc = ec_master_get_config(master, data.config_index))) { - up(&master->master_sem); + ec_lock_up(&master->master_sem); return -ENOENT; } - up(&master->master_sem); /** \todo sc could be invalidated */ + ec_lock_up(&master->master_sem); /** \todo sc could be invalidated */ ecrt_slave_config_pdo_mapping_clear(sc, data.index); return 0; @@ -2720,20 +2720,20 @@ static ATTRIBUTES int ec_ioctl_sc_reg_pdo_entry( if (copy_from_user(&data, (void __user *) arg, sizeof(data))) return -EFAULT; - if (down_interruptible(&master->master_sem)) + if (ec_lock_down_interruptible(&master->master_sem)) return -EINTR; if (!(sc = ec_master_get_config(master, data.config_index))) { - up(&master->master_sem); + ec_lock_up(&master->master_sem); return -ENOENT; } if (!(domain = ec_master_find_domain(master, data.domain_index))) { - up(&master->master_sem); + ec_lock_up(&master->master_sem); return -ENOENT; } - up(&master->master_sem); /** \todo sc or domain could be invalidated */ + ec_lock_up(&master->master_sem); /** \todo sc or domain could be invalidated */ ret = ecrt_slave_config_reg_pdo_entry(sc, data.entry_index, data.entry_subindex, domain, &data.bit_position); @@ -2769,21 +2769,21 @@ static ATTRIBUTES int ec_ioctl_sc_reg_pdo_pos( return -EFAULT; } - if (down_interruptible(&master->master_sem)) { + if (ec_lock_down_interruptible(&master->master_sem)) { return -EINTR; } if (!(sc = ec_master_get_config(master, io.config_index))) { - up(&master->master_sem); + ec_lock_up(&master->master_sem); return -ENOENT; } if (!(domain = ec_master_find_domain(master, io.domain_index))) { - up(&master->master_sem); + ec_lock_up(&master->master_sem); return -ENOENT; } - up(&master->master_sem); /** \todo sc or domain could be invalidated */ + ec_lock_up(&master->master_sem); /** \todo sc or domain could be invalidated */ ret = ecrt_slave_config_reg_pdo_entry_pos(sc, io.sync_index, io.pdo_pos, io.entry_pos, domain, &io.bit_position); @@ -2815,11 +2815,11 @@ static ATTRIBUTES int ec_ioctl_sc_dc( if (copy_from_user(&data, (void __user *) arg, sizeof(data))) return -EFAULT; - if (down_interruptible(&master->master_sem)) + if (ec_lock_down_interruptible(&master->master_sem)) return -EINTR; if (!(sc = ec_master_get_config(master, data.config_index))) { - up(&master->master_sem); + ec_lock_up(&master->master_sem); return -ENOENT; } @@ -2829,7 +2829,7 @@ static ATTRIBUTES int ec_ioctl_sc_dc( data.dc_sync[1].cycle_time, data.dc_sync[1].shift_time); - up(&master->master_sem); + ec_lock_up(&master->master_sem); return 0; } @@ -2869,18 +2869,18 @@ static ATTRIBUTES int ec_ioctl_sc_sdo( return -EFAULT; } - if (down_interruptible(&master->master_sem)) { + if (ec_lock_down_interruptible(&master->master_sem)) { kfree(sdo_data); return -EINTR; } if (!(sc = ec_master_get_config(master, data.config_index))) { - up(&master->master_sem); + ec_lock_up(&master->master_sem); kfree(sdo_data); return -ENOENT; } - up(&master->master_sem); /** \todo sc could be invalidated */ + ec_lock_up(&master->master_sem); /** \todo sc could be invalidated */ if (data.complete_access) { ret = ecrt_slave_config_complete_sdo(sc, @@ -2915,18 +2915,18 @@ static ATTRIBUTES int ec_ioctl_sc_emerg_size( if (copy_from_user(&io, (void __user *) arg, sizeof(io))) return -EFAULT; - if (down_interruptible(&master->master_sem)) { + if (ec_lock_down_interruptible(&master->master_sem)) { return -EINTR; } if (!(sc = ec_master_get_config(master, io.config_index))) { - up(&master->master_sem); + ec_lock_up(&master->master_sem); return -ENOENT; } ret = ecrt_slave_config_emerg_size(sc, io.size); - up(&master->master_sem); + ec_lock_up(&master->master_sem); return ret; } @@ -3078,12 +3078,12 @@ static ATTRIBUTES int ec_ioctl_sc_create_sdo_request( data.request_index = 0; - if (down_interruptible(&master->master_sem)) + if (ec_lock_down_interruptible(&master->master_sem)) return -EINTR; sc = ec_master_get_config(master, data.config_index); if (!sc) { - up(&master->master_sem); + ec_lock_up(&master->master_sem); return -ENOENT; } @@ -3091,7 +3091,7 @@ static ATTRIBUTES int ec_ioctl_sc_create_sdo_request( data.request_index++; } - up(&master->master_sem); /** \todo sc could be invalidated */ + ec_lock_up(&master->master_sem); /** \todo sc could be invalidated */ req = ecrt_slave_config_create_sdo_request_err(sc, data.sdo_index, data.sdo_subindex, data.size); @@ -3130,13 +3130,13 @@ static ATTRIBUTES int ec_ioctl_sc_create_reg_request( io.request_index = 0; - if (down_interruptible(&master->master_sem)) { + if (ec_lock_down_interruptible(&master->master_sem)) { return -EINTR; } sc = ec_master_get_config(master, io.config_index); if (!sc) { - up(&master->master_sem); + ec_lock_up(&master->master_sem); return -ENOENT; } @@ -3144,7 +3144,7 @@ static ATTRIBUTES int ec_ioctl_sc_create_reg_request( io.request_index++; } - up(&master->master_sem); /** \todo sc could be invalidated */ + ec_lock_up(&master->master_sem); /** \todo sc could be invalidated */ reg = ecrt_slave_config_create_reg_request_err(sc, io.mem_size); if (IS_ERR(reg)) { @@ -3183,12 +3183,12 @@ static ATTRIBUTES int ec_ioctl_sc_create_voe_handler( data.voe_index = 0; - if (down_interruptible(&master->master_sem)) + if (ec_lock_down_interruptible(&master->master_sem)) return -EINTR; sc = ec_master_get_config(master, data.config_index); if (!sc) { - up(&master->master_sem); + ec_lock_up(&master->master_sem); return -ENOENT; } @@ -3196,7 +3196,7 @@ static ATTRIBUTES int ec_ioctl_sc_create_voe_handler( data.voe_index++; } - up(&master->master_sem); /** \todo sc could be invalidated */ + ec_lock_up(&master->master_sem); /** \todo sc could be invalidated */ voe = ecrt_slave_config_create_voe_handler_err(sc, data.size); if (IS_ERR(voe)) @@ -3281,18 +3281,18 @@ static ATTRIBUTES int ec_ioctl_sc_idn( return -EFAULT; } - if (down_interruptible(&master->master_sem)) { + if (ec_lock_down_interruptible(&master->master_sem)) { kfree(data); return -EINTR; } if (!(sc = ec_master_get_config(master, ioctl.config_index))) { - up(&master->master_sem); + ec_lock_up(&master->master_sem); kfree(data); return -ENOENT; } - up(&master->master_sem); /** \todo sc could be invalidated */ + ec_lock_up(&master->master_sem); /** \todo sc could be invalidated */ ret = ecrt_slave_config_idn( sc, ioctl.drive_no, ioctl.idn, ioctl.al_state, data, ioctl.size); @@ -3374,19 +3374,19 @@ static ATTRIBUTES int ec_ioctl_domain_size( return -EPERM; } - if (down_interruptible(&master->master_sem)) { + if (ec_lock_down_interruptible(&master->master_sem)) { return -EINTR; } list_for_each_entry(domain, &master->domains, list) { if (domain->index == (unsigned long) arg) { size_t size = ecrt_domain_size(domain); - up(&master->master_sem); + ec_lock_up(&master->master_sem); return size; } } - up(&master->master_sem); + ec_lock_up(&master->master_sem); return -ENOENT; } @@ -3408,19 +3408,19 @@ static ATTRIBUTES int ec_ioctl_domain_offset( if (unlikely(!ctx->requested)) return -EPERM; - if (down_interruptible(&master->master_sem)) { + if (ec_lock_down_interruptible(&master->master_sem)) { return -EINTR; } list_for_each_entry(domain, &master->domains, list) { if (domain->index == (unsigned long) arg) { - up(&master->master_sem); + ec_lock_up(&master->master_sem); return offset; } offset += ecrt_domain_size(domain); } - up(&master->master_sem); + ec_lock_up(&master->master_sem); return -ENOENT; } @@ -4275,13 +4275,13 @@ static ATTRIBUTES int ec_ioctl_slave_foe_read( ec_foe_request_read(&request); - if (down_interruptible(&master->master_sem)) { + if (ec_lock_down_interruptible(&master->master_sem)) { ec_foe_request_clear(&request); return -EINTR; } if (!(slave = ec_master_find_slave(master, 0, io.slave_position))) { - up(&master->master_sem); + ec_lock_up(&master->master_sem); ec_foe_request_clear(&request); EC_MASTER_ERR(master, "Slave %u does not exist!\n", io.slave_position); @@ -4293,21 +4293,21 @@ static ATTRIBUTES int ec_ioctl_slave_foe_read( // schedule request. list_add_tail(&request.list, &slave->foe_requests); - up(&master->master_sem); + ec_lock_up(&master->master_sem); // wait for processing through FSM if (wait_event_interruptible(master->request_queue, request.state != EC_INT_REQUEST_QUEUED)) { // interrupted by signal - down(&master->master_sem); + ec_lock_down(&master->master_sem); if (request.state == EC_INT_REQUEST_QUEUED) { list_del(&request.list); - up(&master->master_sem); + ec_lock_up(&master->master_sem); ec_foe_request_clear(&request); return -EINTR; } // request already processing: interrupt not possible. - up(&master->master_sem); + ec_lock_up(&master->master_sem); } // wait until master FSM has finished processing @@ -4379,13 +4379,13 @@ static ATTRIBUTES int ec_ioctl_slave_foe_write( request.data_size = io.buffer_size; ec_foe_request_write(&request); - if (down_interruptible(&master->master_sem)) { + if (ec_lock_down_interruptible(&master->master_sem)) { ec_foe_request_clear(&request); return -EINTR; } if (!(slave = ec_master_find_slave(master, 0, io.slave_position))) { - up(&master->master_sem); + ec_lock_up(&master->master_sem); EC_MASTER_ERR(master, "Slave %u does not exist!\n", io.slave_position); ec_foe_request_clear(&request); @@ -4397,21 +4397,21 @@ static ATTRIBUTES int ec_ioctl_slave_foe_write( // schedule FoE write request. list_add_tail(&request.list, &slave->foe_requests); - up(&master->master_sem); + ec_lock_up(&master->master_sem); // wait for processing through FSM if (wait_event_interruptible(master->request_queue, request.state != EC_INT_REQUEST_QUEUED)) { // interrupted by signal - down(&master->master_sem); + ec_lock_down(&master->master_sem); if (request.state == EC_INT_REQUEST_QUEUED) { // abort request list_del(&request.list); - up(&master->master_sem); + ec_lock_up(&master->master_sem); ec_foe_request_clear(&request); return -EINTR; } - up(&master->master_sem); + ec_lock_up(&master->master_sem); } // wait until master FSM has finished processing diff --git a/master/locks.h b/master/locks.h new file mode 100644 index 00000000..ecbe2ff1 --- /dev/null +++ b/master/locks.h @@ -0,0 +1,80 @@ +/****************************************************************************** + * + * $Id$ + * + * Copyright (C) 2006-2008 Florian Pose, Ingenieurgemeinschaft IgH + * + * This file is part of the IgH EtherCAT Master. + * + * The IgH EtherCAT Master is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License version 2, as + * published by the Free Software Foundation. + * + * The IgH EtherCAT Master is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General + * Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with the IgH EtherCAT Master; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + * --- + * + * The license mentioned above concerns the source code only. Using the + * EtherCAT technology and brand is only permitted in compliance with the + * industrial property and similar rights of Beckhoff Automation GmbH. + * + *****************************************************************************/ + +/** + \file + Abstract locks +*/ + +/*****************************************************************************/ + +#ifndef __EC_LOCKS_H__ +#define __EC_LOCKS_H__ + +#include "globals.h" + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27) +#include +#else +#include +#endif + +/*****************************************************************************/ + +#ifdef EC_USE_RTMUTEX + +#include + +typedef struct rt_mutex ec_lock_t; + +static inline void ec_lock_init(ec_lock_t *sem) { rt_mutex_init(sem); } +static inline void ec_lock_down(ec_lock_t *sem) { rt_mutex_lock(sem); } +#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 14, 34) +static inline int ec_lock_down_interruptible(ec_lock_t *sem) { return rt_mutex_lock_interruptible(sem); } +#else +static inline int ec_lock_down_interruptible(ec_lock_t *sem) { return rt_mutex_lock_interruptible(sem, 1); } +#endif +static inline void ec_lock_up(ec_lock_t *sem) { rt_mutex_unlock(sem); } + +#else + +typedef struct semaphore ec_lock_t; + +static inline void ec_lock_init(ec_lock_t *sem) { sema_init(sem, 1); } +static inline void ec_lock_down(ec_lock_t *sem) { down(sem); } +static inline int ec_lock_down_interruptible(ec_lock_t *sem) { return down_interruptible(sem); } +static inline void ec_lock_up(ec_lock_t *sem) { up(sem); } + +#endif + +/*****************************************************************************/ + +#endif + +/*****************************************************************************/ diff --git a/master/master.c b/master/master.c index dfe39081..db1e1082 100644 --- a/master/master.c +++ b/master/master.c @@ -153,7 +153,7 @@ int ec_master_init(ec_master_t *master, /**< EtherCAT master */ master->index = index; master->reserved = 0; - sema_init(&master->master_sem, 1); + ec_lock_init(&master->master_sem); for (dev_idx = EC_DEVICE_MAIN; dev_idx < EC_MAX_NUM_DEVICES; dev_idx++) { master->macs[dev_idx] = NULL; @@ -172,7 +172,7 @@ int ec_master_init(ec_master_t *master, /**< EtherCAT master */ ec_master_clear_device_stats(master); - sema_init(&master->device_sem, 1); + ec_lock_init(&master->device_sem); master->phase = EC_ORPHANED; master->active = 0; @@ -192,18 +192,18 @@ int ec_master_init(ec_master_t *master, /**< EtherCAT master */ master->scan_busy = 0; master->allow_scan = 1; - sema_init(&master->scan_sem, 1); + ec_lock_init(&master->scan_sem); init_waitqueue_head(&master->scan_queue); master->config_busy = 0; - sema_init(&master->config_sem, 1); + ec_lock_init(&master->config_sem); init_waitqueue_head(&master->config_queue); INIT_LIST_HEAD(&master->datagram_queue); master->datagram_index = 0; INIT_LIST_HEAD(&master->ext_datagram_queue); - sema_init(&master->ext_queue_sem, 1); + ec_lock_init(&master->ext_queue_sem); master->ext_ring_idx_rt = 0; master->ext_ring_idx_fsm = 0; @@ -235,7 +235,7 @@ int ec_master_init(ec_master_t *master, /**< EtherCAT master */ INIT_LIST_HEAD(&master->eoe_handlers); #endif - sema_init(&master->io_sem, 1); + ec_lock_init(&master->io_sem); master->send_cb = NULL; master->receive_cb = NULL; master->cb_data = NULL; @@ -548,10 +548,10 @@ void ec_master_clear_config( ec_master_t *master /**< EtherCAT master. */ ) { - down(&master->master_sem); + ec_lock_down(&master->master_sem); ec_master_clear_domains(master); ec_master_clear_slave_configs(master); - up(&master->master_sem); + ec_lock_up(&master->master_sem); } /*****************************************************************************/ @@ -563,9 +563,9 @@ void ec_master_internal_send_cb( ) { ec_master_t *master = (ec_master_t *) cb_data; - down(&master->io_sem); + ec_lock_down(&master->io_sem); ecrt_master_send_ext(master); - up(&master->io_sem); + ec_lock_up(&master->io_sem); } /*****************************************************************************/ @@ -577,9 +577,9 @@ void ec_master_internal_receive_cb( ) { ec_master_t *master = (ec_master_t *) cb_data; - down(&master->io_sem); + ec_lock_down(&master->io_sem); ecrt_master_receive(master); - up(&master->io_sem); + ec_lock_up(&master->io_sem); } /*****************************************************************************/ @@ -688,9 +688,9 @@ void ec_master_leave_idle_phase(ec_master_t *master /**< EtherCAT master */) #endif ec_master_thread_stop(master); - down(&master->master_sem); + ec_lock_down(&master->master_sem); ec_master_clear_slaves(master); - up(&master->master_sem); + ec_lock_up(&master->master_sem); ec_fsm_master_reset(&master->fsm); } @@ -710,9 +710,9 @@ int ec_master_enter_operation_phase( EC_MASTER_DBG(master, 1, "IDLE -> OPERATION.\n"); - down(&master->config_sem); + ec_lock_down(&master->config_sem); if (master->config_busy) { - up(&master->config_sem); + ec_lock_up(&master->config_sem); // wait for slave configuration to complete ret = wait_event_interruptible(master->config_queue, @@ -726,15 +726,15 @@ int ec_master_enter_operation_phase( EC_MASTER_DBG(master, 1, "Waiting for pending slave" " configuration returned.\n"); } else { - up(&master->config_sem); + ec_lock_up(&master->config_sem); } - down(&master->scan_sem); + ec_lock_down(&master->scan_sem); master->allow_scan = 0; // 'lock' the slave list if (!master->scan_busy) { - up(&master->scan_sem); + ec_lock_up(&master->scan_sem); } else { - up(&master->scan_sem); + ec_lock_up(&master->scan_sem); // wait for slave scan to complete ret = wait_event_interruptible(master->scan_queue, @@ -982,9 +982,9 @@ void ec_master_queue_datagram_ext( ec_datagram_t *datagram /**< datagram */ ) { - down(&master->ext_queue_sem); + ec_lock_down(&master->ext_queue_sem); list_add_tail(&datagram->queue, &master->ext_datagram_queue); - up(&master->ext_queue_sem); + ec_lock_up(&master->ext_queue_sem); } /*****************************************************************************/ @@ -1592,12 +1592,12 @@ static int ec_master_idle_thread(void *priv_data) ec_datagram_output_stats(&master->fsm_datagram); // receive - down(&master->io_sem); + ec_lock_down(&master->io_sem); ecrt_master_receive(master); - up(&master->io_sem); + ec_lock_up(&master->io_sem); // execute master & slave state machines - if (down_interruptible(&master->master_sem)) { + if (ec_lock_down_interruptible(&master->master_sem)) { break; } @@ -1605,15 +1605,15 @@ static int ec_master_idle_thread(void *priv_data) ec_master_exec_slave_fsms(master); - up(&master->master_sem); + ec_lock_up(&master->master_sem); // queue and send - down(&master->io_sem); + ec_lock_down(&master->io_sem); if (fsm_exec) { ec_master_queue_datagram(master, &master->fsm_datagram); } sent_bytes = ecrt_master_send(master); - up(&master->io_sem); + ec_lock_up(&master->io_sem); if (ec_fsm_master_idle(&master->fsm)) { #ifdef EC_USE_HRTIMER @@ -1657,7 +1657,7 @@ static int ec_master_operation_thread(void *priv_data) ec_master_output_stats(master); // execute master & slave state machines - if (down_interruptible(&master->master_sem)) { + if (ec_lock_down_interruptible(&master->master_sem)) { break; } @@ -1669,7 +1669,7 @@ static int ec_master_operation_thread(void *priv_data) ec_master_exec_slave_fsms(master); - up(&master->master_sem); + ec_lock_up(&master->master_sem); } #ifdef EC_USE_HRTIMER @@ -1802,9 +1802,9 @@ static int ec_master_eoe_thread(void *priv_data) ec_eoe_queue(eoe); } // (try to) send datagrams - down(&master->ext_queue_sem); + ec_lock_down(&master->ext_queue_sem); master->send_cb(master->cb_data); - up(&master->ext_queue_sem); + ec_lock_up(&master->ext_queue_sem); } schedule: @@ -2331,7 +2331,7 @@ ec_domain_t *ecrt_master_create_domain_err( return ERR_PTR(-ENOMEM); } - down(&master->master_sem); + ec_lock_down(&master->master_sem); if (list_empty(&master->domains)) { index = 0; @@ -2343,7 +2343,7 @@ ec_domain_t *ecrt_master_create_domain_err( ec_domain_init(domain, master, index); list_add_tail(&domain->list, &master->domains); - up(&master->master_sem); + ec_lock_up(&master->master_sem); EC_MASTER_DBG(master, 1, "Created domain %u.\n", domain->index); @@ -2386,21 +2386,21 @@ int ecrt_master_activate(ec_master_t *master) return 0; } - down(&master->master_sem); + ec_lock_down(&master->master_sem); // 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_lock_up(&master->master_sem); EC_MASTER_ERR(master, "Failed to finish domain 0x%p!\n", domain); return ret; } domain_offset += domain->data_size; } - up(&master->master_sem); + ec_lock_up(&master->master_sem); // restart EoE process and master thread with new locking @@ -2726,14 +2726,14 @@ ec_slave_config_t *ecrt_master_slave_config_err(ec_master_t *master, ec_slave_config_init(sc, master, alias, position, vendor_id, product_code); - down(&master->master_sem); + ec_lock_down(&master->master_sem); // 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_lock_up(&master->master_sem); } return sc; @@ -2797,7 +2797,7 @@ int ecrt_master_get_slave(ec_master_t *master, uint16_t slave_position, unsigned int i; int ret = 0; - if (down_interruptible(&master->master_sem)) { + if (ec_lock_down_interruptible(&master->master_sem)) { return -EINTR; } @@ -2845,7 +2845,7 @@ int ecrt_master_get_slave(ec_master_t *master, uint16_t slave_position, } out_get_slave: - up(&master->master_sem); + ec_lock_up(&master->master_sem); return ret; } @@ -3055,13 +3055,13 @@ int ecrt_master_sdo_download(ec_master_t *master, uint16_t slave_position, request.data_size = data_size; ecrt_sdo_request_write(&request); - if (down_interruptible(&master->master_sem)) { + if (ec_lock_down_interruptible(&master->master_sem)) { ec_sdo_request_clear(&request); return -EINTR; } if (!(slave = ec_master_find_slave(master, 0, slave_position))) { - up(&master->master_sem); + ec_lock_up(&master->master_sem); EC_MASTER_ERR(master, "Slave %u does not exist!\n", slave_position); ec_sdo_request_clear(&request); return -EINVAL; @@ -3072,21 +3072,21 @@ int ecrt_master_sdo_download(ec_master_t *master, uint16_t slave_position, // schedule request. list_add_tail(&request.list, &slave->sdo_requests); - up(&master->master_sem); + ec_lock_up(&master->master_sem); // wait for processing through FSM if (wait_event_interruptible(master->request_queue, request.state != EC_INT_REQUEST_QUEUED)) { // interrupted by signal - down(&master->master_sem); + ec_lock_down(&master->master_sem); if (request.state == EC_INT_REQUEST_QUEUED) { list_del(&request.list); - up(&master->master_sem); + ec_lock_up(&master->master_sem); ec_sdo_request_clear(&request); return -EINTR; } // request already processing: interrupt not possible. - up(&master->master_sem); + ec_lock_up(&master->master_sem); } // wait until master FSM has finished processing @@ -3140,13 +3140,13 @@ int ecrt_master_sdo_download_complete(ec_master_t *master, request.data_size = data_size; ecrt_sdo_request_write(&request); - if (down_interruptible(&master->master_sem)) { + if (ec_lock_down_interruptible(&master->master_sem)) { ec_sdo_request_clear(&request); return -EINTR; } if (!(slave = ec_master_find_slave(master, 0, slave_position))) { - up(&master->master_sem); + ec_lock_up(&master->master_sem); EC_MASTER_ERR(master, "Slave %u does not exist!\n", slave_position); ec_sdo_request_clear(&request); return -EINVAL; @@ -3158,21 +3158,21 @@ int ecrt_master_sdo_download_complete(ec_master_t *master, // schedule request. list_add_tail(&request.list, &slave->sdo_requests); - up(&master->master_sem); + ec_lock_up(&master->master_sem); // wait for processing through FSM if (wait_event_interruptible(master->request_queue, request.state != EC_INT_REQUEST_QUEUED)) { // interrupted by signal - down(&master->master_sem); + ec_lock_down(&master->master_sem); if (request.state == EC_INT_REQUEST_QUEUED) { list_del(&request.list); - up(&master->master_sem); + ec_lock_up(&master->master_sem); ec_sdo_request_clear(&request); return -EINTR; } // request already processing: interrupt not possible. - up(&master->master_sem); + ec_lock_up(&master->master_sem); } // wait until master FSM has finished processing @@ -3213,13 +3213,13 @@ int ecrt_master_sdo_upload(ec_master_t *master, uint16_t slave_position, ecrt_sdo_request_index(&request, index, subindex); ecrt_sdo_request_read(&request); - if (down_interruptible(&master->master_sem)) { + if (ec_lock_down_interruptible(&master->master_sem)) { ec_sdo_request_clear(&request); return -EINTR; } if (!(slave = ec_master_find_slave(master, 0, slave_position))) { - up(&master->master_sem); + ec_lock_up(&master->master_sem); ec_sdo_request_clear(&request); EC_MASTER_ERR(master, "Slave %u does not exist!\n", slave_position); return -EINVAL; @@ -3230,21 +3230,21 @@ int ecrt_master_sdo_upload(ec_master_t *master, uint16_t slave_position, // schedule request. list_add_tail(&request.list, &slave->sdo_requests); - up(&master->master_sem); + ec_lock_up(&master->master_sem); // wait for processing through FSM if (wait_event_interruptible(master->request_queue, request.state != EC_INT_REQUEST_QUEUED)) { // interrupted by signal - down(&master->master_sem); + ec_lock_down(&master->master_sem); if (request.state == EC_INT_REQUEST_QUEUED) { list_del(&request.list); - up(&master->master_sem); + ec_lock_up(&master->master_sem); ec_sdo_request_clear(&request); return -EINTR; } // request already processing: interrupt not possible. - up(&master->master_sem); + ec_lock_up(&master->master_sem); } // wait until master FSM has finished processing @@ -3304,13 +3304,13 @@ int ecrt_master_write_idn(ec_master_t *master, uint16_t slave_position, request.data_size = data_size; ec_soe_request_write(&request); - if (down_interruptible(&master->master_sem)) { + if (ec_lock_down_interruptible(&master->master_sem)) { ec_soe_request_clear(&request); return -EINTR; } if (!(slave = ec_master_find_slave(master, 0, slave_position))) { - up(&master->master_sem); + ec_lock_up(&master->master_sem); EC_MASTER_ERR(master, "Slave %u does not exist!\n", slave_position); ec_soe_request_clear(&request); @@ -3322,21 +3322,21 @@ int ecrt_master_write_idn(ec_master_t *master, uint16_t slave_position, // schedule SoE write request. list_add_tail(&request.list, &slave->soe_requests); - up(&master->master_sem); + ec_lock_up(&master->master_sem); // wait for processing through FSM if (wait_event_interruptible(master->request_queue, request.state != EC_INT_REQUEST_QUEUED)) { // interrupted by signal - down(&master->master_sem); + ec_lock_down(&master->master_sem); if (request.state == EC_INT_REQUEST_QUEUED) { // abort request list_del(&request.list); - up(&master->master_sem); + ec_lock_up(&master->master_sem); ec_soe_request_clear(&request); return -EINTR; } - up(&master->master_sem); + ec_lock_up(&master->master_sem); } // wait until master FSM has finished processing @@ -3371,13 +3371,13 @@ int ecrt_master_read_idn(ec_master_t *master, uint16_t slave_position, ec_soe_request_set_idn(&request, idn); ec_soe_request_read(&request); - if (down_interruptible(&master->master_sem)) { + if (ec_lock_down_interruptible(&master->master_sem)) { ec_soe_request_clear(&request); return -EINTR; } if (!(slave = ec_master_find_slave(master, 0, slave_position))) { - up(&master->master_sem); + ec_lock_up(&master->master_sem); ec_soe_request_clear(&request); EC_MASTER_ERR(master, "Slave %u does not exist!\n", slave_position); return -EINVAL; @@ -3388,21 +3388,21 @@ int ecrt_master_read_idn(ec_master_t *master, uint16_t slave_position, // schedule request. list_add_tail(&request.list, &slave->soe_requests); - up(&master->master_sem); + ec_lock_up(&master->master_sem); // wait for processing through FSM if (wait_event_interruptible(master->request_queue, request.state != EC_INT_REQUEST_QUEUED)) { // interrupted by signal - down(&master->master_sem); + ec_lock_down(&master->master_sem); if (request.state == EC_INT_REQUEST_QUEUED) { list_del(&request.list); - up(&master->master_sem); + ec_lock_up(&master->master_sem); ec_soe_request_clear(&request); return -EINTR; } // request already processing: interrupt not possible. - up(&master->master_sem); + ec_lock_up(&master->master_sem); } // wait until master FSM has finished processing diff --git a/master/master.h b/master/master.h index 5f421e1a..89debd1f 100644 --- a/master/master.h +++ b/master/master.h @@ -43,16 +43,11 @@ #include #include -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27) -#include -#else -#include -#endif - #include "device.h" #include "domain.h" #include "ethernet.h" #include "fsm_master.h" +#include "locks.h" #include "cdev.h" #ifdef EC_RTDM @@ -206,7 +201,7 @@ struct ec_master { ec_rtdm_dev_t rtdm_dev; /**< RTDM device. */ #endif - struct semaphore master_sem; /**< Master semaphore. */ + ec_lock_t master_sem; /**< Master semaphore. */ ec_device_t devices[EC_MAX_NUM_DEVICES]; /**< EtherCAT devices. */ const uint8_t *macs[EC_MAX_NUM_DEVICES]; /**< Device MAC addresses. */ @@ -215,7 +210,7 @@ struct ec_master { ec_master_num_devices(), because it may be optimized! */ #endif - struct semaphore device_sem; /**< Device semaphore. */ + ec_lock_t device_sem; /**< Device semaphore. */ ec_device_stats_t device_stats; /**< Device statistics. */ ec_fsm_master_t fsm; /**< Master state machine. */ @@ -252,13 +247,13 @@ struct ec_master { unsigned int scan_busy; /**< Current scan state. */ unsigned int allow_scan; /**< \a True, if slave scanning is allowed. */ - struct semaphore scan_sem; /**< Semaphore protecting the \a scan_busy + ec_lock_t scan_sem; /**< Semaphore protecting the \a scan_busy variable and the \a allow_scan flag. */ wait_queue_head_t scan_queue; /**< Queue for processes that wait for slave scanning. */ unsigned int config_busy; /**< State of slave configuration. */ - struct semaphore config_sem; /**< Semaphore protecting the \a config_busy + ec_lock_t config_sem; /**< Semaphore protecting the \a config_busy variable and the allow_config flag. */ wait_queue_head_t config_queue; /**< Queue for processes that wait for slave configuration. */ @@ -268,7 +263,7 @@ struct ec_master { struct list_head ext_datagram_queue; /**< Queue for non-application datagrams. */ - struct semaphore ext_queue_sem; /**< Semaphore protecting the \a + ec_lock_t ext_queue_sem; /**< Semaphore protecting the \a ext_datagram_queue. */ ec_datagram_t ext_datagram_ring[EC_EXT_RING_SIZE]; /**< External datagram @@ -295,7 +290,7 @@ struct ec_master { struct list_head eoe_handlers; /**< Ethernet over EtherCAT handlers. */ #endif - struct semaphore io_sem; /**< Semaphore used in \a IDLE phase. */ + ec_lock_t io_sem; /**< Semaphore used in \a IDLE phase. */ void (*send_cb)(void *); /**< Current send datagrams callback. */ void (*receive_cb)(void *); /**< Current receive datagrams callback. */ diff --git a/master/module.c b/master/module.c index 250f6121..3d818480 100644 --- a/master/module.c +++ b/master/module.c @@ -61,7 +61,7 @@ static unsigned int backup_count; /**< Number of backup devices. */ static unsigned int debug_level; /**< Debug level parameter. */ static ec_master_t *masters; /**< Array of masters. */ -static struct semaphore master_sem; /**< Master semaphore. */ +static ec_lock_t master_sem; /**< Master semaphore. */ dev_t device_number; /**< Device number for master cdevs. */ struct class *class; /**< Device class. */ @@ -101,7 +101,7 @@ int __init ec_init_module(void) EC_INFO("Master driver %s\n", EC_MASTER_VERSION); - sema_init(&master_sem, 1); + ec_lock_init(&master_sem); if (master_count) { if (alloc_chrdev_region(&device_number, @@ -484,7 +484,7 @@ ec_device_t *ecdev_offer( master = &masters[i]; ec_mac_print(net_dev->dev_addr, str); - if (down_interruptible(&master->device_sem)) { + if (ec_lock_down_interruptible(&master->device_sem)) { EC_MASTER_WARN(master, "%s() interrupted!\n", __func__); return NULL; } @@ -500,7 +500,7 @@ ec_device_t *ecdev_offer( ec_device_attach(&master->devices[dev_idx], net_dev, poll, module); - up(&master->device_sem); + ec_lock_up(&master->device_sem); snprintf(net_dev->name, IFNAMSIZ, "ec%c%u", ec_device_names[dev_idx != 0][0], master->index); @@ -509,7 +509,7 @@ ec_device_t *ecdev_offer( } } - up(&master->device_sem); + ec_lock_up(&master->device_sem); EC_MASTER_DBG(master, 1, "Master declined device %s.\n", str); } @@ -543,27 +543,27 @@ ec_master_t *ecrt_request_master_err( } master = &masters[master_index]; - if (down_interruptible(&master_sem)) { + if (ec_lock_down_interruptible(&master_sem)) { errptr = ERR_PTR(-EINTR); goto out_return; } if (master->reserved) { - up(&master_sem); + ec_lock_up(&master_sem); EC_MASTER_ERR(master, "Master already in use!\n"); errptr = ERR_PTR(-EBUSY); goto out_return; } master->reserved = 1; - up(&master_sem); + ec_lock_up(&master_sem); - if (down_interruptible(&master->device_sem)) { + if (ec_lock_down_interruptible(&master->device_sem)) { errptr = ERR_PTR(-EINTR); goto out_release; } if (master->phase != EC_IDLE) { - up(&master->device_sem); + ec_lock_up(&master->device_sem); EC_MASTER_ERR(master, "Master still waiting for devices!\n"); errptr = ERR_PTR(-ENODEV); goto out_release; @@ -572,14 +572,14 @@ ec_master_t *ecrt_request_master_err( for (; dev_idx < ec_master_num_devices(master); dev_idx++) { ec_device_t *device = &master->devices[dev_idx]; if (!try_module_get(device->module)) { - up(&master->device_sem); + ec_lock_up(&master->device_sem); EC_MASTER_ERR(master, "Device module is unloading!\n"); errptr = ERR_PTR(-ENODEV); goto out_module_put; } } - up(&master->device_sem); + ec_lock_up(&master->device_sem); if (ec_master_enter_operation_phase(master)) { EC_MASTER_ERR(master, "Failed to enter OPERATION phase!\n"); diff --git a/master/slave_config.c b/master/slave_config.c index cf88a637..35bb951c 100755 --- a/master/slave_config.c +++ b/master/slave_config.c @@ -202,7 +202,7 @@ int ec_slave_config_prepare_fmmu( fmmu = &sc->fmmu_configs[sc->used_fmmus]; - down(&sc->master->master_sem); + ec_lock_down(&sc->master->master_sem); ec_fmmu_config_init(fmmu, sc, domain, sync_index, dir); #if 0 //TODO overlapping PDOs @@ -235,7 +235,7 @@ int ec_slave_config_prepare_fmmu( #endif sc->used_fmmus++; - up(&sc->master->master_sem); + ec_lock_up(&sc->master->master_sem); return fmmu->logical_domain_offset; } @@ -731,18 +731,18 @@ int ecrt_slave_config_pdo_assign_add(ec_slave_config_t *sc, return -EINVAL; } - down(&sc->master->master_sem); + ec_lock_down(&sc->master->master_sem); pdo = ec_pdo_list_add_pdo(&sc->sync_configs[sync_index].pdos, pdo_index); if (IS_ERR(pdo)) { - up(&sc->master->master_sem); + ec_lock_up(&sc->master->master_sem); return PTR_ERR(pdo); } pdo->sync_index = sync_index; ec_slave_config_load_default_mapping(sc, pdo); - up(&sc->master->master_sem); + ec_lock_up(&sc->master->master_sem); return 0; } @@ -759,9 +759,9 @@ void ecrt_slave_config_pdo_assign_clear(ec_slave_config_t *sc, return; } - down(&sc->master->master_sem); + ec_lock_down(&sc->master->master_sem); ec_pdo_list_clear_pdos(&sc->sync_configs[sync_index].pdos); - up(&sc->master->master_sem); + ec_lock_up(&sc->master->master_sem); } /*****************************************************************************/ @@ -787,10 +787,10 @@ int ecrt_slave_config_pdo_mapping_add(ec_slave_config_t *sc, break; if (pdo) { - down(&sc->master->master_sem); + ec_lock_down(&sc->master->master_sem); entry = ec_pdo_add_entry(pdo, entry_index, entry_subindex, entry_bit_length); - up(&sc->master->master_sem); + ec_lock_up(&sc->master->master_sem); if (IS_ERR(entry)) retval = PTR_ERR(entry); } else { @@ -818,9 +818,9 @@ void ecrt_slave_config_pdo_mapping_clear(ec_slave_config_t *sc, break; if (pdo) { - down(&sc->master->master_sem); + ec_lock_down(&sc->master->master_sem); ec_pdo_clear_entries(pdo); - up(&sc->master->master_sem); + ec_lock_up(&sc->master->master_sem); } else { EC_CONFIG_WARN(sc, "PDO 0x%04X is not assigned.\n", pdo_index); } @@ -1066,9 +1066,9 @@ int ecrt_slave_config_sdo(ec_slave_config_t *sc, uint16_t index, return ret; } - down(&sc->master->master_sem); + ec_lock_down(&sc->master->master_sem); list_add_tail(&req->list, &sc->sdo_configs); - up(&sc->master->master_sem); + ec_lock_up(&sc->master->master_sem); return 0; } @@ -1151,9 +1151,9 @@ int ecrt_slave_config_complete_sdo(ec_slave_config_t *sc, uint16_t index, return ret; } - down(&sc->master->master_sem); + ec_lock_down(&sc->master->master_sem); list_add_tail(&req->list, &sc->sdo_configs); - up(&sc->master->master_sem); + ec_lock_up(&sc->master->master_sem); return 0; } @@ -1220,9 +1220,9 @@ ec_sdo_request_t *ecrt_slave_config_create_sdo_request_err( memset(req->data, 0x00, size); req->data_size = size; - down(&sc->master->master_sem); + ec_lock_down(&sc->master->master_sem); list_add_tail(&req->list, &sc->sdo_requests); - up(&sc->master->master_sem); + ec_lock_up(&sc->master->master_sem); return req; } @@ -1263,9 +1263,9 @@ ec_reg_request_t *ecrt_slave_config_create_reg_request_err( return ERR_PTR(ret); } - down(&sc->master->master_sem); + ec_lock_down(&sc->master->master_sem); list_add_tail(®->list, &sc->reg_requests); - up(&sc->master->master_sem); + ec_lock_up(&sc->master->master_sem); return reg; } @@ -1305,9 +1305,9 @@ ec_voe_handler_t *ecrt_slave_config_create_voe_handler_err( return ERR_PTR(ret); } - down(&sc->master->master_sem); + ec_lock_down(&sc->master->master_sem); list_add_tail(&voe->list, &sc->voe_handlers); - up(&sc->master->master_sem); + ec_lock_up(&sc->master->master_sem); return voe; } @@ -1388,9 +1388,9 @@ int ecrt_slave_config_idn(ec_slave_config_t *sc, uint8_t drive_no, return ret; } - down(&sc->master->master_sem); + ec_lock_down(&sc->master->master_sem); list_add_tail(&req->list, &sc->soe_configs); - up(&sc->master->master_sem); + ec_lock_up(&sc->master->master_sem); return 0; }