Index: uspace/drv/bus/usb/usbhub/port.c
===================================================================
--- uspace/drv/bus/usb/usbhub/port.c	(revision 9b8dac4abaf1b95ace858acca3c0e5f72ebcc6f3)
+++ uspace/drv/bus/usb/usbhub/port.c	(revision 0f79283b7df80ab620570d6d06d69dc4e747cdac)
@@ -134,5 +134,5 @@
 	port_log(debug, port, "Port reset, enumerating device.");
 
-	if ((err = usbhc_device_enumerate(exch, port->port_number, port->base.speed))) {
+	if ((err = usbhc_device_enumerate(exch, port->port_number, port->speed))) {
 		port_log(error, port, "Failed to enumerate device: %s", str_error(err));
 		/* Disable the port */
@@ -200,7 +200,10 @@
 	const bool enabled = !!(status & USB_HUB_PORT_STATUS_ENABLED);
 
-	if (enabled)
-		usb_port_enabled(&port->base, usb_port_speed(status));
-	else
+	if (enabled) {
+		// The connecting fibril do not touch speed until the port is enabled,
+		// so we do not have to lock
+		port->speed = usb_port_speed(status);
+		usb_port_enabled(&port->base);
+	} else
 		usb_port_disabled(&port->base, &remove_device);
 }
Index: uspace/drv/bus/usb/usbhub/port.h
===================================================================
--- uspace/drv/bus/usb/usbhub/port.h	(revision 9b8dac4abaf1b95ace858acca3c0e5f72ebcc6f3)
+++ uspace/drv/bus/usb/usbhub/port.h	(revision 0f79283b7df80ab620570d6d06d69dc4e747cdac)
@@ -52,4 +52,6 @@
 	/** Port number as reported in descriptors. */
 	unsigned int port_number;
+	/** Speed at the time of enabling the port */
+	usb_speed_t speed;
 } usb_hub_port_t;
 
Index: uspace/drv/bus/usb/xhci/rh.c
===================================================================
--- uspace/drv/bus/usb/xhci/rh.c	(revision 9b8dac4abaf1b95ace858acca3c0e5f72ebcc6f3)
+++ uspace/drv/bus/usb/xhci/rh.c	(revision 0f79283b7df80ab620570d6d06d69dc4e747cdac)
@@ -136,5 +136,19 @@
 	}
 
-	device_t *dev = hcd_ddf_fun_create(&port->rh->hc->base, port->base.speed);
+	/*
+	 * We cannot know in advance, whether the speed in the status register
+	 * is valid - it depends on the protocol. So we read it later, but then
+	 * we have to check if the port is still enabled.
+	 */
+	uint32_t status = XHCI_REG_RD_FIELD(&port->regs->portsc, 32);
+
+	bool enabled = !!(status & XHCI_REG_MASK(XHCI_PORT_PED));
+	if (!enabled)
+		return ENOENT;
+
+	unsigned psiv = (status & XHCI_REG_MASK(XHCI_PORT_PS)) >> XHCI_REG_SHIFT(XHCI_PORT_PS);
+	const usb_speed_t speed = port->rh->hc->speeds[psiv].usb_speed;
+
+	device_t *dev = hcd_ddf_fun_create(&port->rh->hc->base, speed);
 	if (!dev) {
 		usb_log_error("Failed to create USB device function.");
@@ -223,7 +237,5 @@
 
 			if (enabled) {
-				unsigned psiv = (status & XHCI_REG_MASK(XHCI_PORT_PS)) >> XHCI_REG_SHIFT(XHCI_PORT_PS);
-				const usb_speed_t speed = rh->hc->speeds[psiv].usb_speed;
-				usb_port_enabled(&port->base, speed);
+				usb_port_enabled(&port->base);
 			} else {
 				usb_port_disabled(&port->base, &rh_remove_device);
