diff --git a/master/master.c b/master/master.c
index fe8ceaa2c3e30ec20469733f805ea0090c39eb72..89adc7a4c747c03ebfa5cc889faf03cf83db8c6b 100644
--- a/master/master.c
+++ b/master/master.c
@@ -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;
diff --git a/master/master.h b/master/master.h
index 9984b96c223ae68c6a6f918da5791227e55c9f66..d7de13edd4f4d6356ece7fcf4e8f174487a18b64 100644
--- a/master/master.h
+++ b/master/master.h
@@ -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 */
diff --git a/master/module.c b/master/module.c
index c9f6e87140c3638ef0428a5ff2ae1ca1a170dc77..164fe45bac3ab105d206329aabf0476f1f62f782 100644
--- a/master/module.c
+++ b/master/module.c
@@ -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);
 }
 
 /*****************************************************************************/