Index: uspace/lib/usbhost/src/hcd.c
===================================================================
--- uspace/lib/usbhost/src/hcd.c	(revision e9e24f2146ae218d9e3b86ddb7e1f84ec3f2a506)
+++ uspace/lib/usbhost/src/hcd.c	(revision ae03552eb937f4e35adedcd5ff4ad17ed84ab526)
@@ -248,5 +248,7 @@
 
 typedef struct {
-	volatile unsigned done;
+	fibril_mutex_t done_mtx;
+	fibril_condvar_t done_cv;
+	unsigned done;
 	int ret;
 	size_t size;
@@ -258,6 +260,9 @@
 	assert(d);
 	d->ret = ret;
+	d->size = size;
+	fibril_mutex_lock(&d->done_mtx);
 	d->done = 1;
-	d->size = size;
+	fibril_condvar_broadcast(&d->done_cv);
+	fibril_mutex_unlock(&d->done_mtx);
 }
 
@@ -267,5 +272,8 @@
 	assert(data);
 	d->ret = ret;
+	fibril_mutex_lock(&d->done_mtx);
 	d->done = 1;
+	fibril_condvar_broadcast(&d->done_cv);
+	fibril_mutex_unlock(&d->done_mtx);
 }
 
@@ -277,4 +285,6 @@
 	assert(hcd);
 	sync_data_t sd = { .done = 0, .ret = EBUSY, .size = size };
+	fibril_mutex_initialize(&sd.done_mtx);
+	fibril_condvar_initialize(&sd.done_cv);
 
 	const int ret = hcd_send_batch(hcd, target, dir, data, size, setup_data,
@@ -284,7 +294,8 @@
 		return ret;
 
-	while (!sd.done) {
-		async_usleep(1000);
-	}
+	fibril_mutex_lock(&sd.done_mtx);
+	while (!sd.done)
+		fibril_condvar_wait(&sd.done_cv, &sd.done_mtx);
+	fibril_mutex_unlock(&sd.done_mtx);
 
 	if (sd.ret == EOK)
