Index: uspace/drv/bus/usb/xhci/hc.c
===================================================================
--- uspace/drv/bus/usb/xhci/hc.c	(revision 47ab89ec6a06ed4cb2f376c53a4c4f3dc79d1f48)
+++ uspace/drv/bus/usb/xhci/hc.c	(revision f668d602a75538d4476f1df11550b29c815f0af8)
@@ -53,15 +53,16 @@
  */
 #define PSI_TO_BPS(psie, psim) (((uint64_t) psim) << (10 * psie))
-#define PORT_SPEED(mjr, psie, psim) { \
+#define PORT_SPEED(usb, mjr, psie, psim) { \
 	.name = "USB ", \
 	.major = mjr, \
 	.minor = 0, \
+	.usb_speed = USB_SPEED_##usb, \
 	.rx_bps = PSI_TO_BPS(psie, psim), \
 	.tx_bps = PSI_TO_BPS(psie, psim) \
 }
-static const xhci_port_speed_t ps_default_full  = PORT_SPEED(2, 2, 12);
-static const xhci_port_speed_t ps_default_low   = PORT_SPEED(2, 1, 1500);
-static const xhci_port_speed_t ps_default_high  = PORT_SPEED(2, 2, 480);
-static const xhci_port_speed_t ps_default_super = PORT_SPEED(3, 3, 5);
+static const xhci_port_speed_t ps_default_full  = PORT_SPEED(FULL, 2, 2, 12);
+static const xhci_port_speed_t ps_default_low   = PORT_SPEED(LOW, 2, 1, 1500);
+static const xhci_port_speed_t ps_default_high  = PORT_SPEED(HIGH, 2, 2, 480);
+static const xhci_port_speed_t ps_default_super = PORT_SPEED(SUPER, 3, 3, 5);
 
 /**
@@ -73,5 +74,5 @@
 	xhci_sp_name_t name;
 
-	xhci_port_speed_t *speeds = hc->rh.speeds;
+	xhci_port_speed_t *speeds = hc->speeds;
 
 	for (xhci_extcap_t *ec = hc->xecp; ec; ec = xhci_extcap_next(ec)) {
@@ -106,6 +107,11 @@
 					speeds[2] = ps_default_low;
 					speeds[3] = ps_default_high;
+
+					hc->speed_to_psiv[USB_SPEED_FULL] = 1;
+					hc->speed_to_psiv[USB_SPEED_LOW] = 2;
+					hc->speed_to_psiv[USB_SPEED_HIGH] = 3;
 				} else if (major == 3) {
 					speeds[4] = ps_default_super;
+					hc->speed_to_psiv[USB_SPEED_SUPER] = 4;
 				} else {
 					return EINVAL;
@@ -124,4 +130,5 @@
 					speeds[psiv].minor = minor;
 					str_ncpy(speeds[psiv].name, 4, name.str, 4);
+					speeds[psiv].usb_speed = USB_SPEED_MAX;
 
 					uint64_t bps = PSI_TO_BPS(psie, psim);
Index: uspace/drv/bus/usb/xhci/hc.h
===================================================================
--- uspace/drv/bus/usb/xhci/hc.h	(revision 47ab89ec6a06ed4cb2f376c53a4c4f3dc79d1f48)
+++ uspace/drv/bus/usb/xhci/hc.h	(revision f668d602a75538d4476f1df11550b29c815f0af8)
@@ -75,4 +75,8 @@
 	bool ac64;
 
+	/** Port speed mapping */
+	xhci_port_speed_t speeds [16];
+	uint8_t speed_to_psiv [USB_SPEED_MAX];
+
 	/* Command list */
 	list_t commands;
Index: uspace/drv/bus/usb/xhci/rh.c
===================================================================
--- uspace/drv/bus/usb/xhci/rh.c	(revision 47ab89ec6a06ed4cb2f376c53a4c4f3dc79d1f48)
+++ uspace/drv/bus/usb/xhci/rh.c	(revision f668d602a75538d4476f1df11550b29c815f0af8)
@@ -74,17 +74,4 @@
 }
 
-static usb_speed_t port_speed_to_usb_speed(const xhci_port_speed_t *port_speed)
-{
-	assert(port_speed->major > 0 && port_speed->major <= USB_SPEED_SUPER);
-
-	switch (port_speed->major) {
-		case 3: return USB_SPEED_SUPER;
-		case 2: return USB_SPEED_HIGH;
-		case 1: return port_speed->minor ? USB_SPEED_FULL : USB_SPEED_LOW;
-	}
-
-	assert(false);
-}
-
 /** Create a device node for device directly connected to RH.
  */
@@ -110,5 +97,5 @@
 	dev->hub = &rh->device;
 	dev->port = port_id;
-	dev->speed = port_speed_to_usb_speed(port_speed);
+	dev->speed = port_speed->usb_speed;
 
 	if ((err = xhci_bus_enumerate_device(bus, rh->hc, dev))) {
@@ -404,5 +391,5 @@
 
 	unsigned psiv = XHCI_REG_RD(port_regs, XHCI_PORT_PS);
-	return &rh->speeds[psiv];
+	return &rh->hc->speeds[psiv];
 }
 
Index: uspace/drv/bus/usb/xhci/rh.h
===================================================================
--- uspace/drv/bus/usb/xhci/rh.h	(revision 47ab89ec6a06ed4cb2f376c53a4c4f3dc79d1f48)
+++ uspace/drv/bus/usb/xhci/rh.h	(revision f668d602a75538d4476f1df11550b29c815f0af8)
@@ -51,4 +51,5 @@
 	uint8_t major, minor;
 	uint64_t rx_bps, tx_bps;
+	usb_speed_t usb_speed;
 } xhci_port_speed_t;
 
@@ -67,7 +68,4 @@
 	/* We need this to attach children to */
 	ddf_dev_t *hc_device;
-
-	/** Port speeds reported from HC */
-	xhci_port_speed_t speeds [16];
 
 	/** Interrupt transfer waiting for an actual interrupt to occur */
