Index: uspace/drv/bus/usb/xhci/rh.c
===================================================================
--- uspace/drv/bus/usb/xhci/rh.c	(revision 94e9c294482692a2f5cfc2be7949454ed7e3c65c)
+++ uspace/drv/bus/usb/xhci/rh.c	(revision 230ef1c75b26447104e88810105f205e628abffd)
@@ -98,4 +98,10 @@
 }
 
+typedef struct rh_event {
+	uint8_t port_id;
+	uint32_t events;
+	unsigned readers_to_go;
+} rh_event_t;
+
 static int rh_event_wait_timeout(xhci_rh_t *rh, uint8_t port_id, uint32_t mask, suseconds_t timeout)
 {
@@ -109,25 +115,38 @@
 		if (r != EOK)
 			break;
-	} while (rh->event.port_id != port_id || (rh->event.events & mask) != mask);
+
+		assert(rh->event);
+		if (--rh->event->readers_to_go == 0)
+			fibril_condvar_broadcast(&rh->event_handled);
+	} while (rh->event->port_id != port_id || (rh->event->events & mask) != mask);
 
 	if (r == EOK)
-		rh->event.events &= ~mask;
+		rh->event->events &= ~mask;
 
 	--rh->event_readers_waiting;
-	if (--rh->event_readers_to_go == 0)
-		fibril_condvar_broadcast(&rh->event_handled);
 
 	return r;
 }
 
-static void rh_event_run_handlers(xhci_rh_t *rh)
+static void rh_event_run_handlers(xhci_rh_t *rh, uint8_t port_id, uint32_t *events)
 {
 	assert(fibril_mutex_is_locked(&rh->event_guard));
-	assert(rh->event_readers_to_go == 0);
-
-	rh->event_readers_to_go = rh->event_readers_waiting;
+
+	/* There can be different event running already */
+	while (rh->event)
+		fibril_condvar_wait(&rh->event_handled, &rh->event_guard);
+
+	rh_event_t event = {
+		.port_id = port_id,
+		.events = *events,
+		.readers_to_go = rh->event_readers_waiting,
+	};
+
+	rh->event = &event;
 	fibril_condvar_broadcast(&rh->event_ready);
-	while (rh->event_readers_to_go)
+	while (event.readers_to_go)
 		fibril_condvar_wait(&rh->event_handled, &rh->event_guard);
+	*events = event.events;
+	rh->event = NULL;
 }
 
@@ -194,5 +213,4 @@
 	const int r = rh_event_wait_timeout(rh, port_id, XHCI_REG_MASK(XHCI_PORT_PRC), 0);
 	fibril_mutex_unlock(&rh->event_guard);
-
 	return r;
 }
@@ -324,12 +342,9 @@
 		}
 
-		if (events != 0) {
-			rh->event.port_id = port_id;
-			rh->event.events = events;
-			rh_event_run_handlers(rh);
-		}
-
-		if (rh->event.events != 0)
-			usb_log_debug("RH port %u change not handled: 0x%x", port_id, rh->event.events);
+		if (events != 0)
+			rh_event_run_handlers(rh, port_id, &events);
+
+		if (events != 0)
+			usb_log_debug("RH port %u change not handled: 0x%x", port_id, events);
 		
 		/* Make sure that PSCEG is 0 before exiting the loop. */
Index: uspace/drv/bus/usb/xhci/rh.h
===================================================================
--- uspace/drv/bus/usb/xhci/rh.h	(revision 94e9c294482692a2f5cfc2be7949454ed7e3c65c)
+++ uspace/drv/bus/usb/xhci/rh.h	(revision 230ef1c75b26447104e88810105f205e628abffd)
@@ -58,4 +58,5 @@
 typedef struct hcd_roothub hcd_roothub_t;
 typedef struct xhci_bus xhci_bus_t;
+typedef struct rh_event rh_event_t;
 
 /* XHCI root hub instance */
@@ -79,9 +80,6 @@
 	fibril_mutex_t event_guard;
 	fibril_condvar_t event_ready, event_handled;
-	unsigned event_readers_waiting, event_readers_to_go;
-	struct {
-		uint8_t port_id;
-		uint32_t events;
-	} event;
+	unsigned event_readers_waiting;
+	rh_event_t *event;
 } xhci_rh_t;
 
