Index: uspace/drv/bus/usb/ehci/ehci_rh.c
===================================================================
--- uspace/drv/bus/usb/ehci/ehci_rh.c	(revision f3ae58b5c7e604cb94bfc012cca168ac37d183c4)
+++ uspace/drv/bus/usb/ehci/ehci_rh.c	(revision ddbd088f06e04013a58d30eea3f2573b86686755)
@@ -100,5 +100,5 @@
  */
 int ehci_rh_init(ehci_rh_t *instance, ehci_caps_regs_t *caps, ehci_regs_t *regs,
-    const char *name)
+    fibril_mutex_t *guard, const char *name)
 {
 	assert(instance);
@@ -127,4 +127,5 @@
 
 	ehci_rh_hub_desc_init(instance, EHCI_RD(caps->hcsparams));
+	instance->guard = guard;
 	instance->status_change_endpoint = NULL;
 
@@ -152,5 +153,5 @@
 
 		/* 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) {
@@ -167,5 +168,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_log_debug("RH(%p): BATCH(%p) virtual request complete: %s",
@@ -185,13 +186,15 @@
 int ehci_rh_interrupt(ehci_rh_t *instance)
 {
+	fibril_mutex_lock(instance->guard);
 	endpoint_t *ep = instance->status_change_endpoint;
-	if (!ep)
-		return EOK;
-
-	fibril_mutex_lock(ep->guard);
+	if (!ep) {
+		fibril_mutex_unlock(instance->guard);
+		return EOK;
+	}
+
 	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/ehci/ehci_rh.h
===================================================================
--- uspace/drv/bus/usb/ehci/ehci_rh.h	(revision f3ae58b5c7e604cb94bfc012cca168ac37d183c4)
+++ uspace/drv/bus/usb/ehci/ehci_rh.h	(revision ddbd088f06e04013a58d30eea3f2573b86686755)
@@ -64,4 +64,7 @@
 	bool resume_flag[EHCI_MAX_PORTS];
 
+	/* HC guard */
+	fibril_mutex_t *guard;
+
 	/*
 	 * This is sort of hacky, but better than duplicating functionality.
@@ -77,5 +80,5 @@
 
 int ehci_rh_init(ehci_rh_t *instance, ehci_caps_regs_t *caps, ehci_regs_t *regs,
-    const char *name);
+    fibril_mutex_t *guard, const char *name);
 int ehci_rh_schedule(ehci_rh_t *instance, usb_transfer_batch_t *batch);
 int ehci_rh_interrupt(ehci_rh_t *instance);
Index: uspace/drv/bus/usb/ehci/hc.c
===================================================================
--- uspace/drv/bus/usb/ehci/hc.c	(revision f3ae58b5c7e604cb94bfc012cca168ac37d183c4)
+++ uspace/drv/bus/usb/ehci/hc.c	(revision ddbd088f06e04013a58d30eea3f2573b86686755)
@@ -187,5 +187,6 @@
 	usb_log_info("HC(%p): Initializing RH(%p).", instance, &instance->rh);
 	ehci_rh_init(
-	    &instance->rh, instance->caps, instance->registers, "ehci rh");
+	    &instance->rh, instance->caps, instance->registers, &instance->guard,
+	    "ehci rh");
 
 	ehci_bus_init(&instance->bus, instance);
