Index: uspace/drv/bus/usb/xhci/endpoint.c
===================================================================
--- uspace/drv/bus/usb/xhci/endpoint.c	(revision c21e6a5172262a245f7e805a5cb9885ee65024b4)
+++ uspace/drv/bus/usb/xhci/endpoint.c	(revision af16ebece2cb3bc7592cffdd6e1a6da6698dc8db)
@@ -92,7 +92,4 @@
 			ep->max_transfer_size = ep->max_packet_size * ep->packets_per_uframe;
 		}
-		else {
-			ep->max_transfer_size = 200 * PAGE_SIZE;
-		}
 	}
 
Index: uspace/drv/bus/usb/xhci/trb_ring.c
===================================================================
--- uspace/drv/bus/usb/xhci/trb_ring.c	(revision c21e6a5172262a245f7e805a5cb9885ee65024b4)
+++ uspace/drv/bus/usb/xhci/trb_ring.c	(revision af16ebece2cb3bc7592cffdd6e1a6da6698dc8db)
@@ -223,4 +223,8 @@
 	errno_t err;
 	assert(trbs > 0);
+
+	if (trbs > xhci_trb_ring_size(ring))
+		return ELIMIT;
+
 	fibril_mutex_lock(&ring->guard);
 
@@ -309,4 +313,9 @@
 }
 
+size_t xhci_trb_ring_size(xhci_trb_ring_t *ring)
+{
+	return ring->segment_count * SEGMENT_TRB_USEFUL_COUNT;
+}
+
 /**
  * Initializes an event ring.
Index: uspace/drv/bus/usb/xhci/trb_ring.h
===================================================================
--- uspace/drv/bus/usb/xhci/trb_ring.h	(revision c21e6a5172262a245f7e805a5cb9885ee65024b4)
+++ uspace/drv/bus/usb/xhci/trb_ring.h	(revision af16ebece2cb3bc7592cffdd6e1a6da6698dc8db)
@@ -78,4 +78,5 @@
 extern errno_t xhci_trb_ring_enqueue(xhci_trb_ring_t *, xhci_trb_t *, uintptr_t *);
 extern errno_t xhci_trb_ring_enqueue_multiple(xhci_trb_ring_t *, xhci_trb_t *, size_t, uintptr_t *);
+extern size_t xhci_trb_ring_size(xhci_trb_ring_t *);
 
 extern void xhci_trb_ring_reset_dequeue_state(xhci_trb_ring_t *ring, uintptr_t *addr);
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. */
