Index: uspace/drv/bus/usb/uhci/uhci_rh.c
===================================================================
--- uspace/drv/bus/usb/uhci/uhci_rh.c	(revision 51cc6cef3bd862297fd29c0f9f236e5a003f789d)
+++ uspace/drv/bus/usb/uhci/uhci_rh.c	(revision 58d48800a1dfc872cde781d38f530e21bad5f4ec)
@@ -107,7 +107,13 @@
 		.endpoint = batch->ep->endpoint
 	}};
-	batch->error = virthub_base_request(&instance->base, target,
-	    usb_transfer_batch_direction(batch), (void*)batch->setup_buffer,
-	    batch->buffer, batch->buffer_size, &batch->transfered_size);
+	do {
+		batch->error = virthub_base_request(&instance->base, target,
+		    usb_transfer_batch_direction(batch), (void*)batch->setup_buffer,
+		    batch->buffer, batch->buffer_size, &batch->transfered_size);
+		if (batch->error == ENAK)
+			async_usleep(instance->base.endpoint_descriptor.poll_interval * 1000);
+		//TODO This is flimsy, but we can't exit early because
+		//ENAK is technically an error condition
+	} while (batch->error == ENAK);
 	usb_transfer_batch_finish(batch, NULL);
 	usb_transfer_batch_destroy(batch);
@@ -421,5 +427,5 @@
 	((uint8_t *)buffer)[0] = status;
 	*actual_size = 1;
-	return EOK;
+	return (status != 0 ? EOK : ENAK);
 }
 
