Index: uspace/drv/bus/usb/xhci/commands.c
===================================================================
--- uspace/drv/bus/usb/xhci/commands.c	(revision 4d28d86c673015ca43ccaa1575c577c8a54673f3)
+++ uspace/drv/bus/usb/xhci/commands.c	(revision 4688350b86a249553314c54ec06ed218cc3dba29)
@@ -81,16 +81,20 @@
 }
 
-int xhci_wait_for_command(xhci_cmd_t *cmd, uint32_t timeout)
-{
-	uint32_t time = 0;
+int xhci_wait_for_command(xhci_cmd_t *cmd, suseconds_t timeout)
+{
+	int rv = EOK;
+
+	fibril_mutex_lock(&cmd->completed_mtx);
 	while (!cmd->completed) {
-		async_usleep(1000);
-		time += 1000;
-
-		if (time > timeout)
-			return ETIMEOUT;
-	}
-
-	return EOK;
+		usb_log_debug2("Waiting for event completion: going to sleep.");
+		rv = fibril_condvar_wait_timeout(&cmd->completed_cv, &cmd->completed_mtx, timeout);
+
+		usb_log_debug2("Waiting for event completion: woken: %s", str_error(rv));
+		if (rv == ETIMEOUT)
+			break;
+	}
+	fibril_mutex_lock(&cmd->completed_mtx);
+
+	return rv;
 }
 
@@ -98,7 +102,16 @@
 {
 	xhci_cmd_t *cmd = malloc32(sizeof(xhci_cmd_t));
-	memset(cmd, 0, sizeof(xhci_cmd_t));
+	xhci_cmd_init(cmd);
+	return cmd;
+}
+
+void xhci_cmd_init(xhci_cmd_t *cmd)
+{
+	memset(cmd, 0, sizeof(*cmd));
 
 	link_initialize(&cmd->link);
+
+	fibril_mutex_initialize(&cmd->completed_mtx);
+	fibril_condvar_initialize(&cmd->completed_cv);
 
 	/**
@@ -108,6 +121,4 @@
 	 */
 	cmd->has_owner = true;
-
-	return cmd;
 }
 
@@ -493,5 +504,9 @@
 	}
 
+	fibril_mutex_lock(&command->completed_mtx);
 	command->completed = true;
+	fibril_condvar_broadcast(&command->completed_cv);
+	fibril_mutex_unlock(&command->completed_mtx);
+
 
 	if (!command->has_owner) {
Index: uspace/drv/bus/usb/xhci/commands.h
===================================================================
--- uspace/drv/bus/usb/xhci/commands.h	(revision 4d28d86c673015ca43ccaa1575c577c8a54673f3)
+++ uspace/drv/bus/usb/xhci/commands.h	(revision 4688350b86a249553314c54ec06ed218cc3dba29)
@@ -39,4 +39,5 @@
 #include <adt/list.h>
 #include <stdbool.h>
+#include <fibril_synch.h>
 #include "hw_struct/trb.h"
 
@@ -56,4 +57,8 @@
 	bool has_owner;
 	bool owns_trb;
+
+	/* Will be unlocked after command completes */
+	fibril_mutex_t completed_mtx;
+	fibril_condvar_t completed_cv;
 } xhci_cmd_t;
 
@@ -62,4 +67,5 @@
 int xhci_wait_for_command(xhci_cmd_t *, uint32_t);
 xhci_cmd_t *xhci_alloc_command(void);
+void xhci_cmd_init(xhci_cmd_t *);
 void xhci_free_command(xhci_cmd_t *);
 
