Index: uspace/drv/bus/usb/xhci/endpoint.c
===================================================================
--- uspace/drv/bus/usb/xhci/endpoint.c	(revision 9b2f69e92c3d7f9c914f9671cf6478585b138d55)
+++ uspace/drv/bus/usb/xhci/endpoint.c	(revision b7db0091d48cc520f1e342189ef375e6989ea358)
@@ -34,4 +34,5 @@
  */
 
+#include <usb/host/utils/malloc32.h>
 #include <usb/host/endpoint.h>
 #include <usb/descriptor.h>
@@ -84,6 +85,6 @@
 	/* 0 is slot ctx, 1 is EP0, then it's EP1 out, in, EP2 out, in, etc. */
 
-	uint8_t off = 2 + 2 * (ep->base.target.endpoint - 1);
-	if (ep->base.direction == USB_DIRECTION_IN)
+	uint8_t off = 2 * (ep->base.target.endpoint);
+	if (ep->base.direction == USB_DIRECTION_IN || ep->base.target.endpoint == 0)
 		++off;
 
@@ -197,5 +198,5 @@
 
 		// Prepare input context.
-		ictx = malloc(sizeof(xhci_input_ctx_t));
+		ictx = malloc32(sizeof(xhci_input_ctx_t));
 		if (!ictx) {
 			return ENOMEM;
@@ -226,17 +227,17 @@
 		switch (ep->base.transfer_type) {
 		case USB_TRANSFER_CONTROL:
-			setup_control_ep_ctx(ep, &ictx->endpoint_ctx[ep_offset], ep_ring);
+			setup_control_ep_ctx(ep, &ictx->endpoint_ctx[ep_offset - 1], ep_ring);
 			break;
 
 		case USB_TRANSFER_BULK:
-			setup_bulk_ep_ctx(ep, &ictx->endpoint_ctx[ep_offset], ep_ring, &ss_desc);
+			setup_bulk_ep_ctx(ep, &ictx->endpoint_ctx[ep_offset - 1], ep_ring, &ss_desc);
 			break;
 
 		case USB_TRANSFER_ISOCHRONOUS:
-			setup_isoch_ep_ctx(ep, &ictx->endpoint_ctx[ep_offset], ep_ring, &ss_desc);
+			setup_isoch_ep_ctx(ep, &ictx->endpoint_ctx[ep_offset - 1], ep_ring, &ss_desc);
 			break;
 
 		case USB_TRANSFER_INTERRUPT:
-			setup_interrupt_ep_ctx(ep, &ictx->endpoint_ctx[ep_offset], ep_ring, &ss_desc);
+			setup_interrupt_ep_ctx(ep, &ictx->endpoint_ctx[ep_offset - 1], ep_ring, &ss_desc);
 			break;
 
Index: uspace/drv/bus/usb/xhci/transfers.c
===================================================================
--- uspace/drv/bus/usb/xhci/transfers.c	(revision 9b2f69e92c3d7f9c914f9671cf6478585b138d55)
+++ uspace/drv/bus/usb/xhci/transfers.c	(revision b7db0091d48cc520f1e342189ef375e6989ea358)
@@ -306,8 +306,4 @@
 int xhci_schedule_interrupt_transfer(xhci_hc_t* hc, usb_transfer_batch_t* batch)
 {
-	/* FIXME: Removing the next 2 rows causes QEMU to crash lol */
-	usb_log_warning("Interrupt transfers not yet implemented!");
-	return ENOTSUP;
-
 	if (batch->setup_size) {
 		usb_log_warning("Setup packet present for a interrupt transfer.");
