Index: uspace/lib/usbhost/include/usb/host/endpoint.h
===================================================================
--- uspace/lib/usbhost/include/usb/host/endpoint.h	(revision e8277c08c42306cd41c856f8c5f4dde41373117c)
+++ uspace/lib/usbhost/include/usb/host/endpoint.h	(revision 5f0b36652626bacf358059d5959ca96fd2331605)
@@ -87,6 +87,4 @@
 	fibril_condvar_t avail;
 
-	/** Reserved bandwidth. Needed for USB2 bus. */
-	size_t bandwidth;
 	/** Endpoint number */
 	usb_endpoint_t endpoint;
@@ -121,7 +119,4 @@
 extern void endpoint_deactivate_locked(endpoint_t *);
 
-/* Calculate bandwidth */
-ssize_t endpoint_count_bw(endpoint_t *, size_t);
-
 int endpoint_send_batch(endpoint_t *, usb_target_t, usb_direction_t,
     char *, size_t, uint64_t, usbhc_iface_transfer_callback_t, void *,
Index: uspace/lib/usbhost/src/endpoint.c
===================================================================
--- uspace/lib/usbhost/src/endpoint.c	(revision e8277c08c42306cd41c856f8c5f4dde41373117c)
+++ uspace/lib/usbhost/src/endpoint.c	(revision 5f0b36652626bacf358059d5959ca96fd2331605)
@@ -74,6 +74,4 @@
 
 	ep->max_transfer_size = ep->max_packet_size * ep->packets_per_uframe;
-
-	ep->bandwidth = endpoint_count_bw(ep, ep->max_transfer_size);
 }
 
@@ -201,21 +199,4 @@
 	ep->active_batch = NULL;
 	fibril_condvar_signal(&ep->avail);
-}
-
-/**
- * Call the bus operation to count bandwidth.
- *
- * @param ep Endpoint on which the transfer will take place.
- * @param size The payload size.
- */
-ssize_t endpoint_count_bw(endpoint_t *ep, size_t size)
-{
-	assert(ep);
-
-	const bus_ops_t *ops = BUS_OPS_LOOKUP(get_bus_ops(ep), endpoint_count_bw);
-	if (!ops)
-		return 0;
-
-	return ops->endpoint_count_bw(ep, size);
 }
 
@@ -262,17 +243,13 @@
 	}
 
+	/** Limit transfers with reserved bandwidth to the amount reserved */
+	if ((ep->transfer_type == USB_TRANSFER_INTERRUPT
+	    || ep->transfer_type == USB_TRANSFER_ISOCHRONOUS)
+	    && size > ep->max_transfer_size)
+		return ENOSPC;
+
 	/* Offline devices don't schedule transfers other than on EP0. */
-	if (!device->online && ep->endpoint > 0) {
+	if (!device->online && ep->endpoint > 0)
 		return EAGAIN;
-	}
-
-	const size_t bw = endpoint_count_bw(ep, size);
-	/* Check if we have enough bandwidth reserved */
-	if (ep->bandwidth < bw) {
-		usb_log_error("Endpoint(%d:%d) %s needs %zu bw "
-		    "but only %zu is reserved.\n",
-		    device->address, ep->endpoint, name, bw, ep->bandwidth);
-		return ENOSPC;
-	}
 
 	usb_transfer_batch_t *batch = usb_transfer_batch_create(ep);
Index: uspace/lib/usbhost/src/usb2_bus.c
===================================================================
--- uspace/lib/usbhost/src/usb2_bus.c	(revision e8277c08c42306cd41c856f8c5f4dde41373117c)
+++ uspace/lib/usbhost/src/usb2_bus.c	(revision 5f0b36652626bacf358059d5959ca96fd2331605)
@@ -210,4 +210,22 @@
 
 /**
+ * Call the bus operation to count bandwidth.
+ *
+ * @param ep Endpoint on which the transfer will take place.
+ * @param size The payload size.
+ */
+static ssize_t endpoint_count_bw(endpoint_t *ep)
+{
+	assert(ep);
+
+	bus_t *bus = ep->device->bus;
+	const bus_ops_t *ops = BUS_OPS_LOOKUP(bus->ops, endpoint_count_bw);
+	if (!ops)
+		return 0;
+
+	return ops->endpoint_count_bw(ep, ep->max_transfer_size);
+}
+
+/**
  * Register an endpoint to the bus. Reserves bandwidth.
  */
@@ -218,9 +236,11 @@
 	assert(ep);
 
+	size_t bw = endpoint_count_bw(ep);
+
 	/* Check for available bandwidth */
-	if (ep->bandwidth > bus->free_bw)
+	if (bw > bus->free_bw)
 		return ENOSPC;
 
-	bus->free_bw -= ep->bandwidth;
+	bus->free_bw -= bw;
 
 	return EOK;
@@ -235,5 +255,5 @@
 	assert(ep);
 
-	bus->free_bw += ep->bandwidth;
+	bus->free_bw += endpoint_count_bw(ep);
 }
 
