Index: uspace/drv/bus/usb/xhci/hw_struct/trb.h
===================================================================
--- uspace/drv/bus/usb/xhci/hw_struct/trb.h	(revision 9162b27c0985e8e5c40afe8e921a403b97e66a8c)
+++ uspace/drv/bus/usb/xhci/hw_struct/trb.h	(revision ae303ade42795baa819f366954464d3f83b17b8b)
@@ -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 9162b27c0985e8e5c40afe8e921a403b97e66a8c)
+++ uspace/drv/bus/usb/xhci/transfers.c	(revision ae303ade42795baa819f366954464d3f83b17b8b)
@@ -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);
