Index: uspace/drv/bus/usb/xhci/hw_struct/trb.h
===================================================================
--- uspace/drv/bus/usb/xhci/hw_struct/trb.h	(revision 375211d28fc7a4d4021c4ee78a966d1b369b562f)
+++ uspace/drv/bus/usb/xhci/hw_struct/trb.h	(revision 6d918889a2c99f48b3fbda631a4e421e12b9e3e4)
@@ -211,5 +211,5 @@
 }
 
-enum xhci_trb_completion_code {
+typedef enum xhci_trb_completion_code {
 	XHCI_TRBC_INVALID = 0,
 	XHCI_TRBC_SUCCESS,
@@ -255,5 +255,5 @@
 	 * 224 - 255 vendor defined info
 	 */
-};
+} xhci_trb_completion_code_t;
 
 #endif
Index: uspace/drv/bus/usb/xhci/transfers.c
===================================================================
--- uspace/drv/bus/usb/xhci/transfers.c	(revision 375211d28fc7a4d4021c4ee78a966d1b369b562f)
+++ uspace/drv/bus/usb/xhci/transfers.c	(revision 6d918889a2c99f48b3fbda631a4e421e12b9e3e4)
@@ -444,6 +444,19 @@
 	}
 
-	batch->error = (TRB_COMPLETION_CODE(*trb) == XHCI_TRBC_SUCCESS) ? EOK : ENAK;
-	batch->transfered_size = batch->buffer_size - TRB_TRANSFER_LENGTH(*trb);
+	const xhci_trb_completion_code_t completion_code = TRB_COMPLETION_CODE(*trb);
+	switch (completion_code) {
+		case XHCI_TRBC_SHORT_PACKET:
+			usb_log_debug("Short transfer.");
+			/* fallthrough */
+		case XHCI_TRBC_SUCCESS:
+			batch->error = EOK;
+			batch->transfered_size = batch->buffer_size - TRB_TRANSFER_LENGTH(*trb);
+			break;
+
+		default:
+			usb_log_warning("Transfer not successfull: %u", completion_code);
+			batch->error = EIO;
+	}
+
 	usb_transfer_batch_reset_toggle(batch);
 	endpoint_deactivate_locked(&ep->base);
