Index: uspace/drv/bus/usb/xhci/hc.c
===================================================================
--- uspace/drv/bus/usb/xhci/hc.c	(revision 60ac352545393cff535bedf2ab367cd71cde1290)
+++ uspace/drv/bus/usb/xhci/hc.c	(revision 17f24d9ce1889f764ff46785180319a7ebf2b801)
@@ -369,5 +369,5 @@
 	/* Check for root hub communication */
 	/* FIXME: Zero is a very crude workaround. Detect RH better. */
-	if (batch->ep->address == 0) {
+	if (batch->ep->address == xhci_rh_get_address(&hc->rh)) {
 		usb_log_debug("XHCI root hub request.\n");
 		return xhci_rh_schedule(&hc->rh, batch);
Index: uspace/drv/bus/usb/xhci/rh.h
===================================================================
--- uspace/drv/bus/usb/xhci/rh.h	(revision 60ac352545393cff535bedf2ab367cd71cde1290)
+++ uspace/drv/bus/usb/xhci/rh.h	(revision 17f24d9ce1889f764ff46785180319a7ebf2b801)
@@ -65,4 +65,17 @@
 int xhci_rh_interrupt(xhci_rh_t *);
 
+/** Get XHCI rh address.
+ *
+ * @param rh XHCI rh instance.
+ * @return USB address assigned to the hub.
+ * Wrapper for virtual hub address
+ */
+static inline usb_address_t xhci_rh_get_address(xhci_rh_t *rh)
+{
+	assert(rh);
+	/* FIXME: The line end below causes infinite loop. */
+	return 0; // virthub_base_get_address(&rh->base);
+}
+
 #endif
 
