Index: uspace/drv/bus/usb/xhci/hc.c
===================================================================
--- uspace/drv/bus/usb/xhci/hc.c	(revision 8b415cc4c71cba63d47161127c7adf6911a277b9)
+++ uspace/drv/bus/usb/xhci/hc.c	(revision decfc8d1ee4490ba5e7b9b806d65f5fe006ec089)
@@ -202,5 +202,5 @@
 		return ENOMEM;
 
-	hc->dcbaa_virt = malloc32((1 + hc->max_slots) * sizeof(xhci_device_ctx_t*));
+	hc->dcbaa_virt = malloc32((1 + hc->max_slots) * sizeof(xhci_virt_device_ctx_t));
 	if (!hc->dcbaa_virt) {
 		err = ENOMEM;
@@ -507,18 +507,16 @@
 	/* Idx 0 already deallocated by xhci_scratchpad_free. */
 	for (unsigned i = 1; i < hc->max_slots + 1; ++i) {
-		if (hc->dcbaa_virt[i]) {
-			if (hc->dcbaa_virt[i]->dev_ctx)
-				free32(hc->dcbaa_virt[i]->dev_ctx);
-
-			for (unsigned i = 0; i < XHCI_EP_COUNT; ++i) {
-				trb_ring = hc->dcbaa_virt[i]->trs[i];
-				if (trb_ring) {
-					xhci_trb_ring_fini(trb_ring);
-					free32(trb_ring);
-				}
+		if (hc->dcbaa_virt[i].dev_ctx) {
+			free32(hc->dcbaa_virt[i].dev_ctx);
+			hc->dcbaa_virt[i].dev_ctx = NULL;
+		}
+
+		for (unsigned i = 0; i < XHCI_EP_COUNT; ++i) {
+			trb_ring = hc->dcbaa_virt[i].trs[i];
+			if (trb_ring) {
+				hc->dcbaa_virt[i].trs[i] = NULL;
+				xhci_trb_ring_fini(trb_ring);
+				free32(trb_ring);
 			}
-
-			free32(hc->dcbaa_virt[i]);
-			hc->dcbaa_virt[i] = NULL;
 		}
 	}
Index: uspace/drv/bus/usb/xhci/hc.h
===================================================================
--- uspace/drv/bus/usb/xhci/hc.h	(revision 8b415cc4c71cba63d47161127c7adf6911a277b9)
+++ uspace/drv/bus/usb/xhci/hc.h	(revision decfc8d1ee4490ba5e7b9b806d65f5fe006ec089)
@@ -73,5 +73,5 @@
 	xhci_event_ring_t event_ring;
 	uint64_t *dcbaa;
-	xhci_virt_device_ctx_t **dcbaa_virt;
+	xhci_virt_device_ctx_t *dcbaa_virt;
 	xhci_scratchpad_t *scratchpad;
 
Index: uspace/drv/bus/usb/xhci/rh.c
===================================================================
--- uspace/drv/bus/usb/xhci/rh.c	(revision 8b415cc4c71cba63d47161127c7adf6911a277b9)
+++ uspace/drv/bus/usb/xhci/rh.c	(revision decfc8d1ee4490ba5e7b9b806d65f5fe006ec089)
@@ -126,5 +126,7 @@
 
 	hc->dcbaa[slot_id] = addr_to_phys(dctx);
-	hc->dcbaa_virt[slot_id]->dev_ctx = dctx;
+
+	memset(&hc->dcbaa_virt[slot_id], 0, sizeof(xhci_virt_device_ctx_t));
+	hc->dcbaa_virt[slot_id].dev_ctx = dctx;
 
 	cmd = xhci_alloc_command();
@@ -145,5 +147,5 @@
 		free32(dctx);
 		hc->dcbaa[slot_id] = 0;
-		hc->dcbaa_virt[slot_id] = NULL;
+		memset(&hc->dcbaa_virt[slot_id], 0, sizeof(xhci_virt_device_ctx_t));
 	}
 err_ring:
Index: uspace/drv/bus/usb/xhci/scratchpad.c
===================================================================
--- uspace/drv/bus/usb/xhci/scratchpad.c	(revision 8b415cc4c71cba63d47161127c7adf6911a277b9)
+++ uspace/drv/bus/usb/xhci/scratchpad.c	(revision decfc8d1ee4490ba5e7b9b806d65f5fe006ec089)
@@ -132,5 +132,6 @@
 
 	hc->dcbaa[0] = 0;
-	hc->dcbaa_virt[0] = NULL;
+	memset(&hc->dcbaa_virt[0], 0, sizeof(xhci_virt_device_ctx_t));
+
 	return;
 }
