Index: uspace/drv/uhci-rhd/port.c
===================================================================
--- uspace/drv/uhci-rhd/port.c	(revision 8855939d0fb1f02b1aff28a4af1a25fcb0e6ac7f)
+++ uspace/drv/uhci-rhd/port.c	(revision 11349a852e86ea2e72b2ef3e7b100153778c78c4)
@@ -212,5 +212,5 @@
 
 	/*
-	 * Resets from root ports should be nominally 50ms
+	 * Resets from root ports should be nominally 50ms (USB spec 7.1.7.3)
 	 */
 	{
@@ -223,9 +223,17 @@
 		port_status &= ~STATUS_IN_RESET;
 		uhci_port_write_status(port, port_status);
-		usb_log_debug("%s: Reset Signal stop.\n", port->id_string);
-	}
-
+		while (uhci_port_read_status(port) & STATUS_IN_RESET);
+		// TODO: find a better way to waste time (it should be less than
+		// 10ms, if we reschedule it takes too much time (random
+		// interrupts can be solved by multiple attempts).
+		usb_log_debug2("%s: Reset Signal stop.\n", port->id_string);
+	}
 	/* Enable the port. */
 	uhci_port_set_enabled(port, true);
+
+	/* Reset recovery period,
+	 * devices do not have to respond during this period
+	 */
+	async_usleep(10000);
 	return EOK;
 }
@@ -246,8 +254,11 @@
 	usb_log_debug("%s: Detected new device.\n", port->id_string);
 
+	int ret, count = 0;
 	usb_address_t dev_addr;
-	int ret = usb_hc_new_device_wrapper(port->rh, &port->hc_connection,
-	    speed, uhci_port_reset_enable, port->number, port,
-	    &dev_addr, &port->attached_device, NULL, NULL, NULL);
+	do {
+		ret = usb_hc_new_device_wrapper(port->rh, &port->hc_connection,
+		    speed, uhci_port_reset_enable, port->number, port,
+		    &dev_addr, &port->attached_device, NULL, NULL, NULL);
+	} while (ret != EOK && ++count < 4);
 
 	if (ret != EOK) {
