Index: uspace/lib/usbdev/src/hub.c
===================================================================
--- uspace/lib/usbdev/src/hub.c	(revision 160b75e098f96312d13cf8c93e26f0ee3e46c1a5)
+++ uspace/lib/usbdev/src/hub.c	(revision 98d7550d28862bbe21bae962d6ae020bf1c43268)
@@ -41,4 +41,5 @@
 #include <assert.h>
 #include <usb/debug.h>
+#include <time.h>
 
 /** How much time to wait between attempts to register endpoint 0:0.
@@ -218,4 +219,10 @@
 
 	int rc;
+	struct timeval start_time;
+
+	rc = gettimeofday(&start_time, NULL);
+	if (rc != EOK) {
+		return rc;
+	}
 
 	rc = usb_hc_connection_open(&hc_conn);
@@ -264,4 +271,20 @@
 		}
 	} while (rc != EOK);
+	struct timeval end_time;
+
+	rc = gettimeofday(&end_time, NULL);
+	if (rc != EOK) {
+		goto leave_release_default_address;
+	}
+
+	/* According to the USB spec part 9.1.2 host allows 100ms time for
+	 * the insertion process to complete. According to 7.1.7.1 this is the
+	 * time between attach detected and port reset. However, the setup done
+	 * above might use much of this time so we should only wait to fill
+	 * up the 100ms quota*/
+	suseconds_t elapsed = tv_sub(&end_time, &start_time);
+	if (elapsed < 100000) {
+		async_usleep(100000 - elapsed);
+	}
 
 	/*
@@ -273,4 +296,10 @@
 		goto leave_release_default_address;
 	}
+	/* USB spec 7.1.7.1: The USB System Software guarantees a minimum of
+	 * 10ms for reset recovery. Device response to any bus transactions
+	 * addressed to the default device address during the reset recovery
+	 * time is undefined.
+	 */
+	async_usleep(10000);
 
 	rc = usb_pipe_probe_default_control(&ctrl_pipe);
