Index: uspace/drv/uhci-hcd/uhci_struct/transfer_descriptor.c
===================================================================
--- uspace/drv/uhci-hcd/uhci_struct/transfer_descriptor.c	(revision d3991b2cada019630369dce00f63d18bc2eebcc0)
+++ uspace/drv/uhci-hcd/uhci_struct/transfer_descriptor.c	(revision ebf59e4db7a0f471f276727de8f07371f51b5afd)
@@ -114,21 +114,29 @@
 	assert(instance);
 
-	if ((instance->status & TD_STATUS_ERROR_STALLED) != 0)
-		return ESTALL;
+	/* this is hc internal error it should never be reported */
+	if ((instance->status & TD_STATUS_ERROR_BIT_STUFF) != 0)
+		return EAGAIN;
 
+	/* CRC or timeout error, like device not present or bad data,
+	 * it won't be reported unless err count reached zero */
 	if ((instance->status & TD_STATUS_ERROR_CRC) != 0)
 		return EBADCHECKSUM;
 
-	if ((instance->status & TD_STATUS_ERROR_BUFFER) != 0)
+	/* hc does not end transaction on these, it should never be reported */
+	if ((instance->status & TD_STATUS_ERROR_NAK) != 0)
 		return EAGAIN;
 
+	/* buffer overrun or underrun */
+	if ((instance->status & TD_STATUS_ERROR_BUFFER) != 0)
+		return ERANGE;
+
+	/* device babble is something serious */
 	if ((instance->status & TD_STATUS_ERROR_BABBLE) != 0)
 		return EIO;
 
-	if ((instance->status & TD_STATUS_ERROR_NAK) != 0)
-		return EAGAIN;
-
-	if ((instance->status & TD_STATUS_ERROR_BIT_STUFF) != 0)
-		return EAGAIN;
+	/* stall might represent err count reaching zero or stall response from
+	 * the device, is err count reached zero, one of the above is reported*/
+	if ((instance->status & TD_STATUS_ERROR_STALLED) != 0)
+		return ESTALL;
 
 	return EOK;
