Index: uspace/drv/bus/usb/ohci/root_hub.c
===================================================================
--- uspace/drv/bus/usb/ohci/root_hub.c	(revision 0fe2ff1066bd20d937f5ffb8589c4a6d74ca42ce)
+++ uspace/drv/bus/usb/ohci/root_hub.c	(revision 19746a9652979f3c98e4a326025b7ecd1261599d)
@@ -35,6 +35,9 @@
 #include <errno.h>
 #include <str_error.h>
+#include <fibril_synch.h>
 
 #include <usb/debug.h>
+#include <usb/dev/request.h>
+#include <usb/classes/hub.h>
 
 #include "root_hub.h"
@@ -43,7 +46,4 @@
 #include <usb/dev/driver.h>
 #include "ohci_regs.h"
-
-#include <usb/dev/request.h>
-#include <usb/classes/hub.h>
 
 /**
@@ -189,4 +189,5 @@
 #endif
 
+	fibril_mutex_initialize(&instance->guard);
 	rh_init_descriptors(instance);
 
@@ -216,13 +217,16 @@
 	case USB_TRANSFER_INTERRUPT:
 		usb_log_debug("Root hub got INTERRUPT packet\n");
+		fibril_mutex_lock(&instance->guard);
+		assert(instance->unfinished_interrupt_transfer == NULL);
 		const uint16_t mask = create_interrupt_mask(instance);
 		if (mask == 0) {
 			usb_log_debug("No changes..\n");
-			assert(instance->unfinished_interrupt_transfer == NULL);
 			instance->unfinished_interrupt_transfer = request;
+			fibril_mutex_unlock(&instance->guard);
 			return;
 		}
 		usb_log_debug("Processing changes...\n");
 		interrupt_request(request, mask, instance->interrupt_mask_size);
+		fibril_mutex_unlock(&instance->guard);
 		break;
 
@@ -244,14 +248,15 @@
 	assert(instance);
 
-	if (!instance->unfinished_interrupt_transfer)
-		return;
-
-	usb_log_debug("Finalizing interrupt transfer\n");
-	const uint16_t mask = create_interrupt_mask(instance);
-	interrupt_request(instance->unfinished_interrupt_transfer,
-	    mask, instance->interrupt_mask_size);
-	usb_transfer_batch_dispose(instance->unfinished_interrupt_transfer);
-
-	instance->unfinished_interrupt_transfer = NULL;
+	fibril_mutex_lock(&instance->guard);
+	if (instance->unfinished_interrupt_transfer) {
+		usb_log_debug("Finalizing interrupt transfer\n");
+		const uint16_t mask = create_interrupt_mask(instance);
+		interrupt_request(instance->unfinished_interrupt_transfer,
+		    mask, instance->interrupt_mask_size);
+		usb_transfer_batch_dispose(
+		    instance->unfinished_interrupt_transfer);
+		instance->unfinished_interrupt_transfer = NULL;
+	}
+	fibril_mutex_unlock(&instance->guard);
 }
 /*----------------------------------------------------------------------------*/
Index: uspace/drv/bus/usb/ohci/root_hub.h
===================================================================
--- uspace/drv/bus/usb/ohci/root_hub.h	(revision 0fe2ff1066bd20d937f5ffb8589c4a6d74ca42ce)
+++ uspace/drv/bus/usb/ohci/root_hub.h	(revision 19746a9652979f3c98e4a326025b7ecd1261599d)
@@ -47,4 +47,5 @@
  */
 typedef struct rh {
+	fibril_mutex_t guard;
 	/** pointer to ohci driver registers */
 	ohci_regs_t *registers;
