Index: uspace/drv/bus/usb/ohci/hc.c
===================================================================
--- uspace/drv/bus/usb/ohci/hc.c	(revision ddbd088f06e04013a58d30eea3f2573b86686755)
+++ uspace/drv/bus/usb/ohci/hc.c	(revision ee0ffa6a7b35829ac2a78b95c14a3c35997dede4)
@@ -460,5 +460,5 @@
 {
 	hc_t *instance = hcd_to_hc(hcd);
-	ohci_rh_init(&instance->rh, instance->registers, "ohci rh");
+	ohci_rh_init(&instance->rh, instance->registers, &instance->guard, "ohci rh");
 
 	/* OHCI guide page 42 */
Index: uspace/drv/bus/usb/ohci/ohci_rh.c
===================================================================
--- uspace/drv/bus/usb/ohci/ohci_rh.c	(revision ddbd088f06e04013a58d30eea3f2573b86686755)
+++ uspace/drv/bus/usb/ohci/ohci_rh.c	(revision ee0ffa6a7b35829ac2a78b95c14a3c35997dede4)
@@ -109,5 +109,6 @@
  * initializes internal virtual hub.
  */
-int ohci_rh_init(ohci_rh_t *instance, ohci_regs_t *regs, const char *name)
+int ohci_rh_init(ohci_rh_t *instance, ohci_regs_t *regs,
+    fibril_mutex_t *guard, const char *name)
 {
 	assert(instance);
@@ -163,4 +164,5 @@
 	ohci_rh_hub_desc_init(instance);
 	instance->status_change_endpoint = NULL;
+	instance->guard = guard;
 	return virthub_base_init(&instance->base, name, &ops, instance,
 	    NULL, &instance->hub_descriptor.header, HUB_STATUS_CHANGE_PIPE);
@@ -183,5 +185,5 @@
 	if (batch->error == ENAK) {
 		/* Lock the HC guard */
-		fibril_mutex_lock(batch->ep->guard);
+		fibril_mutex_lock(instance->guard);
 		const int err = endpoint_activate_locked(batch->ep, batch);
 		if (err) {
@@ -198,5 +200,5 @@
 		endpoint_add_ref(batch->ep);
 		instance->status_change_endpoint = batch->ep;
-		fibril_mutex_unlock(batch->ep->guard);
+		fibril_mutex_unlock(instance->guard);
 	} else {
 		usb_transfer_batch_finish(batch);
@@ -214,13 +216,15 @@
 int ohci_rh_interrupt(ohci_rh_t *instance)
 {
+	fibril_mutex_lock(instance->guard);
 	endpoint_t *ep = instance->status_change_endpoint;
-	if (!ep)
+	if (!ep) {
+		fibril_mutex_unlock(instance->guard);
 		return EOK;
-
-	fibril_mutex_lock(ep->guard);
+	}
+
 	usb_transfer_batch_t * const batch = ep->active_batch;
 	endpoint_deactivate_locked(ep);
 	instance->status_change_endpoint = NULL;
-	fibril_mutex_unlock(ep->guard);
+	fibril_mutex_unlock(instance->guard);
 
 	endpoint_del_ref(ep);
Index: uspace/drv/bus/usb/ohci/ohci_rh.h
===================================================================
--- uspace/drv/bus/usb/ohci/ohci_rh.h	(revision ddbd088f06e04013a58d30eea3f2573b86686755)
+++ uspace/drv/bus/usb/ohci/ohci_rh.h	(revision ee0ffa6a7b35829ac2a78b95c14a3c35997dede4)
@@ -63,7 +63,8 @@
 	/** A hacky way to emulate interrupts over polling. See ehci_rh. */
 	endpoint_t *status_change_endpoint;
+	fibril_mutex_t *guard;
 } ohci_rh_t;
 
-int ohci_rh_init(ohci_rh_t *instance, ohci_regs_t *regs, const char *name);
+int ohci_rh_init(ohci_rh_t *, ohci_regs_t *, fibril_mutex_t *, const char *);
 int ohci_rh_schedule(ohci_rh_t *instance, usb_transfer_batch_t *batch);
 int ohci_rh_interrupt(ohci_rh_t *instance);
