Index: uspace/drv/bus/usb/xhci/bus.c
===================================================================
--- uspace/drv/bus/usb/xhci/bus.c	(revision eb928c41f71932f3f5d29785e9599d8fa22a271d)
+++ uspace/drv/bus/usb/xhci/bus.c	(revision bdd8842c8d5229ebdbb16f829986f5abb8cafae5)
@@ -134,4 +134,5 @@
 
 	ep0->base.max_packet_size = max_packet_size;
+	ep0->base.max_transfer_size = max_packet_size * ep0->base.packets_per_uframe;
 
 	xhci_ep_ctx_t ep_ctx;
Index: uspace/drv/bus/usb/xhci/endpoint.c
===================================================================
--- uspace/drv/bus/usb/xhci/endpoint.c	(revision eb928c41f71932f3f5d29785e9599d8fa22a271d)
+++ uspace/drv/bus/usb/xhci/endpoint.c	(revision bdd8842c8d5229ebdbb16f829986f5abb8cafae5)
@@ -61,5 +61,5 @@
 	endpoint_init(ep, dev, desc);
 
-	xhci_ep->max_streams = USB_SSC_MAX_STREAMS(desc->companion);
+	xhci_ep->max_streams = 1 << (USB_SSC_MAX_STREAMS(desc->companion));
 	xhci_ep->max_burst = desc->companion.max_burst + 1;
 	xhci_ep->mult = USB_SSC_MULT(desc->companion) + 1;
@@ -74,9 +74,16 @@
 
 	xhci_ep->interval = desc->endpoint.poll_interval;
-	/* Only Low/Full speed interrupt endpoints have interval set directly,
+
+	/*
+	 * Only Low/Full speed interrupt endpoints have interval as a linear field,
 	 * others have 2-based log of it.
 	 */
 	if (dev->speed >= USB_SPEED_HIGH || ep->transfer_type != USB_TRANSFER_INTERRUPT) {
-		xhci_ep->interval = 1 << (xhci_ep->interval - 1);
+		xhci_ep->interval = desc->endpoint.poll_interval;
+	}
+
+	/* Full speed devices have interval in frames */
+	if (dev->speed <= USB_SPEED_FULL) {
+		xhci_ep->interval *= 8;
 	}
 
@@ -149,18 +156,4 @@
 {
 	return xhci_ep->primary_stream_ctx_array != NULL;
-}
-
-/** Determine maximum size of XHCI endpoint's Primary Stream Context Array.
- * @param[in] xhci_ep XHCI endpoint to query.
- *
- * @return Number of items in the Primary Stream Context Array.
- */
-static size_t primary_stream_ctx_array_max_size(xhci_endpoint_t *xhci_ep)
-{
-	if (!xhci_ep->max_streams)
-		return 0;
-
-	/* Section 6.2.3, Table 61 */
-	return 1 << (xhci_ep->max_streams + 1);
 }
 
@@ -202,5 +195,5 @@
 	XHCI_EP_TYPE_SET(*ctx, xhci_endpoint_type(xhci_ep));
 	XHCI_EP_MAX_PACKET_SIZE_SET(*ctx, xhci_ep->base.max_packet_size);
-	XHCI_EP_MAX_BURST_SIZE_SET(*ctx, xhci_ep->max_burst);
+	XHCI_EP_MAX_BURST_SIZE_SET(*ctx, xhci_ep->max_burst - 1);
 	XHCI_EP_ERROR_COUNT_SET(*ctx, 3);
 
@@ -220,5 +213,5 @@
 	}
 
-	if (!primary_stream_ctx_array_max_size(xhci_ep)) {
+	if (xhci_ep->max_streams == 1) {
 		usb_log_error("Streams are not supported by endpoint " XHCI_EP_FMT, XHCI_EP_ARGS(*xhci_ep));
 		return EINVAL;
@@ -231,7 +224,7 @@
 	}
 
-	if (count > (unsigned) (1 << xhci_ep->max_streams)) {
-		usb_log_error("Endpoint " XHCI_EP_FMT " supports only %u streams.",
-			XHCI_EP_ARGS(*xhci_ep), (1 << xhci_ep->max_streams));
+	if (count > xhci_ep->max_streams) {
+		usb_log_error("Endpoint " XHCI_EP_FMT " supports only %" PRIu32 " streams.",
+			XHCI_EP_ARGS(*xhci_ep), xhci_ep->max_streams);
 		return EINVAL;
 	}
@@ -386,6 +379,6 @@
 	XHCI_EP_TYPE_SET(*ctx, xhci_endpoint_type(ep));
 	XHCI_EP_MAX_PACKET_SIZE_SET(*ctx, ep->base.max_packet_size);
-	XHCI_EP_MAX_BURST_SIZE_SET(*ctx, ep->max_burst);
-	XHCI_EP_MULT_SET(*ctx, ep->mult);
+	XHCI_EP_MAX_BURST_SIZE_SET(*ctx, ep->max_burst - 1);
+	XHCI_EP_MULT_SET(*ctx, ep->mult - 1);
 	XHCI_EP_ERROR_COUNT_SET(*ctx, 3);
 	XHCI_EP_TR_DPTR_SET(*ctx, ep->ring.dequeue);
@@ -401,5 +394,5 @@
 	XHCI_EP_TYPE_SET(*ctx, xhci_endpoint_type(ep));
 	XHCI_EP_MAX_PACKET_SIZE_SET(*ctx, ep->base.max_packet_size);
-	XHCI_EP_MAX_BURST_SIZE_SET(*ctx, ep->max_burst);
+	XHCI_EP_MAX_BURST_SIZE_SET(*ctx, ep->max_burst - 1);
 	XHCI_EP_ERROR_COUNT_SET(*ctx, 3);
 
@@ -417,10 +410,10 @@
 	XHCI_EP_TYPE_SET(*ctx, xhci_endpoint_type(ep));
 	XHCI_EP_MAX_PACKET_SIZE_SET(*ctx, ep->base.max_packet_size & 0x07FF);
-	XHCI_EP_MAX_BURST_SIZE_SET(*ctx, ep->max_burst);
-	XHCI_EP_MULT_SET(*ctx, ep->mult);
+	XHCI_EP_MAX_BURST_SIZE_SET(*ctx, ep->max_burst - 1);
+	XHCI_EP_MULT_SET(*ctx, ep->mult - 1);
 	XHCI_EP_ERROR_COUNT_SET(*ctx, 0);
 	XHCI_EP_TR_DPTR_SET(*ctx, ep->ring.dequeue);
 	XHCI_EP_DCS_SET(*ctx, 1);
-	XHCI_EP_INTERVAL_SET(*ctx, ep->interval);
+	XHCI_EP_INTERVAL_SET(*ctx, fnzb32(ep->interval) % 32 - 1);
 
 	XHCI_EP_MAX_ESIT_PAYLOAD_LO_SET(*ctx, ep->isoch_max_size & 0xFFFF);
@@ -436,11 +429,10 @@
 	XHCI_EP_TYPE_SET(*ctx, xhci_endpoint_type(ep));
 	XHCI_EP_MAX_PACKET_SIZE_SET(*ctx, ep->base.max_packet_size & 0x07FF);
-	XHCI_EP_MAX_BURST_SIZE_SET(*ctx, ep->max_burst);
+	XHCI_EP_MAX_BURST_SIZE_SET(*ctx, ep->max_burst - 1);
 	XHCI_EP_MULT_SET(*ctx, 0);
 	XHCI_EP_ERROR_COUNT_SET(*ctx, 3);
 	XHCI_EP_TR_DPTR_SET(*ctx, ep->ring.dequeue);
 	XHCI_EP_DCS_SET(*ctx, 1);
-
-	XHCI_EP_INTERVAL_SET(*ctx, ep->interval);
+	XHCI_EP_INTERVAL_SET(*ctx, fnzb32(ep->interval) % 32 - 1);
 	// TODO: max ESIT payload
 }
Index: uspace/drv/bus/usb/xhci/endpoint.h
===================================================================
--- uspace/drv/bus/usb/xhci/endpoint.h	(revision eb928c41f71932f3f5d29785e9599d8fa22a271d)
+++ uspace/drv/bus/usb/xhci/endpoint.h	(revision bdd8842c8d5229ebdbb16f829986f5abb8cafae5)
@@ -81,6 +81,6 @@
 	uint16_t primary_stream_ctx_array_size;
 
-	/** 2-log of maximum number of primary streams (0-16). Not to be used directly. */
-	uint8_t max_streams;
+	/* Maximum number of primary streams (0 - 2^16). */
+	uint32_t max_streams;
 
 	/** Maximum number of consecutive USB transactions (0-15) that should be executed per scheduling opportunity */
@@ -90,6 +90,6 @@
 	uint8_t mult;
 
-	/** Scheduling interval for periodic endpoints */
-	size_t interval;
+	/** Scheduling interval for periodic endpoints, as a number of 125us units. (0 - 2^16) */
+	uint32_t interval;
 
 	/** The maximum size of an isochronous transfer and therefore the size of buffers */
Index: uspace/drv/bus/usb/xhci/transfers.c
===================================================================
--- uspace/drv/bus/usb/xhci/transfers.c	(revision eb928c41f71932f3f5d29785e9599d8fa22a271d)
+++ uspace/drv/bus/usb/xhci/transfers.c	(revision bdd8842c8d5229ebdbb16f829986f5abb8cafae5)
@@ -263,8 +263,8 @@
 	// see 4.14.1 and 4.11.2.3 for the explanation, how to calculate those
 	size_t tdpc = len / 1024 + ((len % 1024) ? 1 : 0);
-	size_t tbc = tdpc / (ep->max_burst + 1);
-	if (!tdpc % (ep->max_burst + 1)) --tbc;
-	size_t bsp = tdpc % (ep->max_burst + 1);
-	size_t tlbpc = (bsp ? bsp - 1 : ep->max_burst);
+	size_t tbc = tdpc / ep->max_burst;
+	if (!tdpc % ep->max_burst) --tbc;
+	size_t bsp = tdpc % ep->max_burst;
+	size_t tlbpc = (bsp ? bsp : ep->max_burst) - 1;
 
 	TRB_CTRL_SET_TBC(*trb, tbc);
