Index: uspace/lib/drv/include/usbhc_iface.h
===================================================================
--- uspace/lib/drv/include/usbhc_iface.h	(revision c21e6a5172262a245f7e805a5cb9885ee65024b4)
+++ uspace/lib/drv/include/usbhc_iface.h	(revision af16ebece2cb3bc7592cffdd6e1a6da6698dc8db)
@@ -116,5 +116,8 @@
 	usb_direction_t direction;
 
-	/** Maximum size of one transfer */
+	/**
+	 * Maximum size of one transfer. Non-periodic endpoints may handle
+	 * bigger transfers, but those can be split into multiple USB transfers.
+	 */
 	size_t max_transfer_size;
 
Index: uspace/lib/usbhost/src/endpoint.c
===================================================================
--- uspace/lib/usbhost/src/endpoint.c	(revision c21e6a5172262a245f7e805a5cb9885ee65024b4)
+++ uspace/lib/usbhost/src/endpoint.c	(revision af16ebece2cb3bc7592cffdd6e1a6da6698dc8db)
@@ -244,7 +244,15 @@
 	}
 
-	/** Limit transfers with reserved bandwidth to the amount reserved */
-	if (ep->direction == USB_DIRECTION_OUT && size > ep->max_transfer_size)
-		return ENOSPC;
+	/*
+	 * Limit transfers with reserved bandwidth to the amount reserved.
+	 * OUT transfers are rejected, IN can be just trimmed in advance.
+	 */
+	if ((ep->transfer_type == USB_TRANSFER_INTERRUPT || ep->transfer_type == USB_TRANSFER_ISOCHRONOUS) && size > ep->max_transfer_size) {
+		if (direction == USB_DIRECTION_OUT)
+			return ENOSPC;
+		else
+			size = ep->max_transfer_size;
+
+	}
 
 	/* Offline devices don't schedule transfers other than on EP0. */
