Index: uspace/drv/uhci-hcd/uhci.c
===================================================================
--- uspace/drv/uhci-hcd/uhci.c	(revision 86c2ccd245273c6c81f7d0d55fe8ea474dbd9cfd)
+++ uspace/drv/uhci-hcd/uhci.c	(revision eb292a05b69cf76c5960f6c504e2653a2880fe6d)
@@ -153,8 +153,13 @@
 void uhci_init_hw(uhci_t *instance)
 {
-	/* reset hc, who knows what touched it before us */
+	/* reset everything, who knows what touched it before us */
 	pio_write_16(&instance->registers->usbcmd, UHCI_CMD_GLOBAL_RESET);
 	async_usleep(10000); /* 10ms according to USB spec */
 	pio_write_16(&instance->registers->usbcmd, 0);
+
+	/* reset hc, all states and counters */
+	pio_write_16(&instance->registers->usbcmd, UHCI_CMD_HCRESET);
+	while ((pio_read_16(&instance->registers->usbcmd) & UHCI_CMD_HCRESET) != 0)
+		{ async_usleep(10); }
 
 	/* set framelist pointer */
@@ -284,5 +289,5 @@
 	if ((status & (UHCI_STATUS_INTERRUPT | UHCI_STATUS_ERROR_INTERRUPT)) == 0)
 		return;
-	usb_log_debug("UHCI interrupt: %X.\n", status);
+	usb_log_debug2("UHCI interrupt: %X.\n", status);
 	transfer_list_remove_finished(&instance->transfers_interrupt);
 	transfer_list_remove_finished(&instance->transfers_control_slow);
@@ -299,5 +304,5 @@
 	while (1) {
 		uint16_t status = pio_read_16(&instance->registers->usbsts);
-		usb_log_debug("UHCI status: %x.\n", status);
+		usb_log_debug2("UHCI status: %x.\n", status);
 		status |= 1;
 		uhci_interrupt(instance, status);
Index: uspace/drv/uhci-hcd/uhci_struct/transfer_descriptor.c
===================================================================
--- uspace/drv/uhci-hcd/uhci_struct/transfer_descriptor.c	(revision 86c2ccd245273c6c81f7d0d55fe8ea474dbd9cfd)
+++ uspace/drv/uhci-hcd/uhci_struct/transfer_descriptor.c	(revision eb292a05b69cf76c5960f6c504e2653a2880fe6d)
@@ -77,8 +77,8 @@
 
 	if ((instance->status & TD_STATUS_ERROR_STALLED) != 0)
-		return EIO;
+		return ESTALL;
 
 	if ((instance->status & TD_STATUS_ERROR_CRC) != 0)
-		return EAGAIN;
+		return EBADCHECKSUM;
 
 	if ((instance->status & TD_STATUS_ERROR_BUFFER) != 0)
