Index: uspace/drv/bus/isa/dma_controller.c
===================================================================
--- uspace/drv/bus/isa/dma_controller.c	(revision 85c4cc45566ebd271cb1eb0c23dd3980d6a8a367)
+++ uspace/drv/bus/isa/dma_controller.c	(revision 1b93658e6a7f59e094263b89049076d3e014a81f)
@@ -35,4 +35,5 @@
 #include <bool.h>
 #include <errno.h>
+#include <fibril_synch.h>
 #include <ddi.h> /* pio_enable */
 #include <libarch/ddi.h> /* pio_write */
@@ -265,9 +266,15 @@
 		return EINVAL;
 
+	static fibril_mutex_t guard = FIBRIL_MUTEX_INITIALIZER(guard);
+
+	fibril_mutex_lock(&guard);
+
 	if (!controller_8237.initialized)
 		dma_controller_init(&controller_8237);
 
-	if (!controller_8237.initialized)
+	if (!controller_8237.initialized) {
+		fibril_mutex_unlock(&guard);
 		return EIO;
+	}
 
 	/* 16 bit transfers are a bit special */
@@ -275,6 +282,8 @@
 	if (channel > 4) {
 		/* Size must be aligned to 16 bits */
-		if ((size & 1) != 0)
+		if ((size & 1) != 0) {
+			fibril_mutex_unlock(&guard);
 			return EINVAL;
+		}
 		size >>= 1;
 		/* Address is fun: lower 16bits need to be shifted by 1 */
@@ -339,4 +348,6 @@
 	pio_write_8(dma_channel.single_mask_address, value);
 
+	fibril_mutex_unlock(&guard);
+
 	return EOK;
 }
