Index: uspace/drv/bus/usb/xhci/hc.c
===================================================================
--- uspace/drv/bus/usb/xhci/hc.c	(revision c9bec1cc8790d7cbdb7ba511eaaf4e550d98dd52)
+++ uspace/drv/bus/usb/xhci/hc.c	(revision 73e5b6249034e0a254d81d99236c5f71740db6f6)
@@ -198,10 +198,16 @@
 	int err;
 
-	hc->dcbaa = malloc32((1 + hc->max_slots) * sizeof(xhci_device_ctx_t*));
+	hc->dcbaa = malloc32((1 + hc->max_slots) * sizeof(uint64_t));
 	if (!hc->dcbaa)
 		return ENOMEM;
 
+	hc->dcbaa_virt = malloc32((1 + hc->max_slots) * sizeof(xhci_device_ctx_t*));
+	if (!hc->dcbaa_virt) {
+		err = ENOMEM;
+		goto err_dcbaa;
+	}
+
 	if ((err = xhci_trb_ring_init(&hc->command_ring, hc)))
-		goto err_dcbaa;
+		goto err_dcbaa_virt;
 
 	if ((err = xhci_event_ring_init(&hc->event_ring, hc)))
@@ -220,4 +226,6 @@
 err_cmd_ring:
 	xhci_trb_ring_fini(&hc->command_ring);
+err_dcbaa_virt:
+	free32(hc->dcbaa_virt);
 err_dcbaa:
 	free32(hc->dcbaa);
@@ -468,11 +476,12 @@
 	/* Idx 0 already deallocated by xhci_scratchpad_free. */
 	for (unsigned i = 1; i < hc->max_slots + 1; ++i) {
-		if (hc->dcbaa[i] != NULL) {
-			free32(hc->dcbaa[i]);
-			hc->dcbaa[i] = NULL;
+		if (hc->dcbaa_virt[i] != NULL) {
+			free32(hc->dcbaa_virt[i]);
+			hc->dcbaa_virt[i] = NULL;
 		}
 	}
 
 	free32(hc->dcbaa);
+	free32(hc->dcbaa_virt);
 }
 
Index: uspace/drv/bus/usb/xhci/hc.h
===================================================================
--- uspace/drv/bus/usb/xhci/hc.h	(revision c9bec1cc8790d7cbdb7ba511eaaf4e550d98dd52)
+++ uspace/drv/bus/usb/xhci/hc.h	(revision 73e5b6249034e0a254d81d99236c5f71740db6f6)
@@ -66,5 +66,6 @@
 	xhci_trb_ring_t command_ring;
 	xhci_event_ring_t event_ring;
-	xhci_device_ctx_t **dcbaa;
+	uint64_t *dcbaa;
+	xhci_device_ctx_t **dcbaa_virt;
 	xhci_scratchpad_t *scratchpad;
 
Index: uspace/drv/bus/usb/xhci/scratchpad.c
===================================================================
--- uspace/drv/bus/usb/xhci/scratchpad.c	(revision c9bec1cc8790d7cbdb7ba511eaaf4e550d98dd52)
+++ uspace/drv/bus/usb/xhci/scratchpad.c	(revision 73e5b6249034e0a254d81d99236c5f71740db6f6)
@@ -92,5 +92,5 @@
 	bufs->phys_bck = (uint64_t) phys_array;
 
-	hc->dcbaa[0] = (xhci_device_ctx_t *) bufs->phys_ptr;
+	hc->dcbaa[0] = bufs->phys_ptr;
 	hc->scratchpad = bufs;
 
@@ -131,5 +131,6 @@
 	free32((void *) scratchpad->phys_bck);
 
-	hc->dcbaa[0] = NULL;
+	hc->dcbaa[0] = 0;
+	hc->dcbaa_virt[0] = NULL;
 	return;
 }
