Index: uspace/drv/bus/usb/xhci/endpoint.c
===================================================================
--- uspace/drv/bus/usb/xhci/endpoint.c	(revision ec700c75765e920cd0cb4090eb421a98256eb4b3)
+++ uspace/drv/bus/usb/xhci/endpoint.c	(revision 894f58c6a9276891cb9de8f06bba34477d4b7f50)
@@ -79,4 +79,14 @@
 }
 
+static bool primary_stream_ctx_has_secondary_array(xhci_stream_ctx_t *primary_ctx) {
+	/* Section 6.2.4.1, SCT values */
+	return XHCI_STREAM_SCT(*primary_ctx) >= 2;
+}
+
+static size_t secondary_stream_ctx_array_size(xhci_stream_ctx_t *primary_ctx) {
+	if (XHCI_STREAM_SCT(*primary_ctx) < 2) return 0;
+	return 2 << XHCI_STREAM_SCT(*primary_ctx);
+}
+
 int xhci_endpoint_alloc_transfer_ds(xhci_endpoint_t *xhci_ep)
 {
@@ -114,5 +124,13 @@
 		    xhci_ep->base.target.address, xhci_ep->base.target.endpoint);
 
-		// TODO: What about secondaries?
+		// maybe check if LSA, then skip?
+		for (size_t index = 0; index < primary_stream_ctx_array_size(xhci_ep); ++index) {
+			xhci_stream_ctx_t *primary_ctx = xhci_ep->primary_stream_ctx_array + index;
+			if (primary_stream_ctx_has_secondary_array(primary_ctx)) {
+				// uintptr_t phys = XHCI_STREAM_DEQ_PTR(*primary_ctx);
+				/* size_t size = */ secondary_stream_ctx_array_size(primary_ctx);
+				// TODO: somehow map the address to virtual and free the secondary array
+			}
+		}
 		free32(xhci_ep->primary_stream_ctx_array);
 	} else {
