Index: uspace/drv/bus/usb/usbhub/usbhub.c
===================================================================
--- uspace/drv/bus/usb/usbhub/usbhub.c	(revision 0b90f49facd0f9492b99893d5ce89620a02711c6)
+++ uspace/drv/bus/usb/usbhub/usbhub.c	(revision b233821094426bc1c07a4eb170426c511fa3bdd1)
@@ -263,15 +263,11 @@
 	usb_log_info("(%p) USB hub gone, joining polling fibril.", hub);
 
-	// TODO: Join the polling fibril in a better way?
-	unsigned tries = 10;
-	while (hub->running) {
-		async_usleep(100000);
-		if (!tries--) {
-			usb_log_error("(%p): Can't remove hub, still running.",
-			    hub);
-			return EBUSY;
-		}
-	}
-
+	/* Join polling fibril. */
+	fibril_mutex_lock(&hub->poll_guard);
+	while (hub->running)
+		fibril_condvar_wait(&hub->poll_cv, &hub->poll_guard);
+	fibril_mutex_unlock(&hub->poll_guard);
+
+	/* Destroy hub. */
 	return usb_hub_cleanup(hub);
 }
