Index: uspace/drv/bus/usb/xhci/trb_ring.c
===================================================================
--- uspace/drv/bus/usb/xhci/trb_ring.c	(revision a2b0ba37f6b2c642126f2a41e1b946bbb423c3dd)
+++ uspace/drv/bus/usb/xhci/trb_ring.c	(revision a1eb7c6711d57d16ae07155edf22015e87fe39ae)
@@ -208,5 +208,4 @@
 
 		usb_log_debug2("TRB ring(%p): Enqueued TRB %p", ring, trb);
-		usb_log_error("RING->PCS: %u", ring->pcs);
 		ring->enqueue_trb++;
 
@@ -264,4 +263,6 @@
 	ring->ccs = 1;
 
+	fibril_mutex_initialize(&ring->guard);
+
 	usb_log_debug("Initialized event ring.");
 
@@ -295,4 +296,6 @@
 int xhci_event_ring_dequeue(xhci_event_ring_t *ring, xhci_trb_t *event)
 {
+	fibril_mutex_lock(&ring->guard);
+
 	/**
 	 * The ERDP reported to the HC is a half-phase off the one we need to
@@ -301,6 +304,8 @@
 	ring->dequeue_ptr = event_ring_dequeue_phys(ring);
 
-	if (TRB_CYCLE(*ring->dequeue_trb) != ring->ccs)
+	if (TRB_CYCLE(*ring->dequeue_trb) != ring->ccs) {
+		fibril_mutex_unlock(&ring->guard);
 		return ENOENT; /* The ring is empty. */
+	}
 
 	memcpy(event, ring->dequeue_trb, sizeof(xhci_trb_t));
@@ -323,4 +328,5 @@
 	}
 
-	return EOK;
-}
+	fibril_mutex_unlock(&ring->guard);
+	return EOK;
+}
Index: uspace/drv/bus/usb/xhci/trb_ring.h
===================================================================
--- uspace/drv/bus/usb/xhci/trb_ring.h	(revision a2b0ba37f6b2c642126f2a41e1b946bbb423c3dd)
+++ uspace/drv/bus/usb/xhci/trb_ring.h	(revision a1eb7c6711d57d16ae07155edf22015e87fe39ae)
@@ -106,4 +106,6 @@
 
 	bool ccs;                       /* Consumer Cycle State: section 4.9.2 */
+
+	fibril_mutex_t guard;
 } xhci_event_ring_t;
 
