Index: uspace/drv/bus/usb/usbhub/usbhub.c
===================================================================
--- uspace/drv/bus/usb/usbhub/usbhub.c	(revision 24fcb8b69b06013d4cc7929a28d48942f07601b3)
+++ uspace/drv/bus/usb/usbhub/usbhub.c	(revision 45e49e65244f085359a080a0a043bc9b3a697503)
@@ -318,9 +318,12 @@
 	    usb_device_get_default_pipe(hub_dev->usb_device);
 
+	usb_descriptor_type_t desc_type = hub_dev->speed >= USB_SPEED_SUPER
+		? USB_DESCTYPE_SSPEED_HUB : USB_DESCTYPE_HUB;
+
 	usb_hub_descriptor_header_t descriptor;
 	size_t received_size;
 	int opResult = usb_request_get_descriptor(control_pipe,
 	    USB_REQUEST_TYPE_CLASS, USB_REQUEST_RECIPIENT_DEVICE,
-	    USB_DESCTYPE_HUB, 0, 0, &descriptor,
+	    desc_type, 0, 0, &descriptor,
 	    sizeof(usb_hub_descriptor_header_t), &received_size);
 	if (opResult != EOK) {
@@ -334,4 +337,10 @@
 	hub_dev->port_count = descriptor.port_count;
 	hub_dev->control_pipe = control_pipe;
+
+	if ((opResult = usb_hub_set_depth(hub_dev))) {
+		usb_log_error("(%p): Failed to set hub depth: %s.",
+		    hub_dev, str_error(opResult));
+		return opResult;
+	}
 
 	hub_dev->ports = calloc(hub_dev->port_count, sizeof(usb_hub_port_t));
@@ -458,4 +467,29 @@
 		}
 	}
+}
+
+/**
+ * Set feature on the real hub port.
+ *
+ * @param port Port structure.
+ * @param feature Feature selector.
+ */
+int usb_hub_set_depth(const usb_hub_dev_t *hub)
+{
+	assert(hub);
+
+	/* Slower hubs do not care about depth */
+	if (hub->speed < USB_SPEED_SUPER)
+		return EOK;
+
+	const usb_device_request_setup_packet_t set_request = {
+		.request_type = USB_HUB_REQ_TYPE_SET_HUB_DEPTH,
+		.request = USB_HUB_REQUEST_SET_HUB_DEPTH,
+		.value = uint16_host2usb(usb_device_get_depth(hub->usb_device)),
+		.index = 0,
+		.length = 0,
+	};
+	return usb_pipe_control_write(hub->control_pipe, &set_request,
+	    sizeof(set_request), NULL, 0);
 }
 
Index: uspace/drv/bus/usb/usbhub/usbhub.h
===================================================================
--- uspace/drv/bus/usb/usbhub/usbhub.h	(revision 24fcb8b69b06013d4cc7929a28d48942f07601b3)
+++ uspace/drv/bus/usb/usbhub/usbhub.h	(revision 45e49e65244f085359a080a0a043bc9b3a697503)
@@ -85,4 +85,5 @@
 int usb_hub_device_gone(usb_device_t *);
 
+int usb_hub_set_depth(const usb_hub_dev_t *);
 int usb_hub_get_port_status(const usb_hub_dev_t *, size_t, usb_port_status_t *);
 int usb_hub_set_port_feature(const usb_hub_dev_t *, size_t, usb_hub_class_feature_t);
Index: uspace/lib/usbdev/include/usb/dev/device.h
===================================================================
--- uspace/lib/usbdev/include/usb/dev/device.h	(revision 24fcb8b69b06013d4cc7929a28d48942f07601b3)
+++ uspace/lib/usbdev/include/usb/dev/device.h	(revision 45e49e65244f085359a080a0a043bc9b3a697503)
@@ -42,4 +42,5 @@
 #include <usb/dev/alternate_ifaces.h>
 #include <usb/dev/pipes.h>
+#include <usbhc_iface.h>
 
 #include <assert.h>
@@ -90,7 +91,9 @@
 int usb_device_unmap_ep(usb_endpoint_mapping_t *);
 
-usb_speed_t usb_device_get_speed(usb_device_t *);
-int usb_device_get_iface_number(usb_device_t *);
-devman_handle_t usb_device_get_devman_handle(usb_device_t *);
+usb_address_t usb_device_get_address(const usb_device_t *);
+usb_speed_t usb_device_get_depth(const usb_device_t *);
+usb_speed_t usb_device_get_speed(const usb_device_t *);
+int usb_device_get_iface_number(const usb_device_t *);
+devman_handle_t usb_device_get_devman_handle(const usb_device_t *);
 
 const usb_device_descriptors_t * usb_device_descriptors(usb_device_t *);
Index: uspace/lib/usbdev/src/devdrv.c
===================================================================
--- uspace/lib/usbdev/src/devdrv.c	(revision 24fcb8b69b06013d4cc7929a28d48942f07601b3)
+++ uspace/lib/usbdev/src/devdrv.c	(revision 45e49e65244f085359a080a0a043bc9b3a697503)
@@ -76,4 +76,7 @@
 	/** USB address of this device */
 	usb_address_t address;
+
+	/** Depth in the USB hub hiearchy */
+	unsigned depth;
 
 	/** USB speed of this device */
@@ -364,5 +367,17 @@
 }
 
-usb_speed_t usb_device_get_speed(usb_device_t *usb_dev)
+usb_address_t usb_device_get_address(const usb_device_t *usb_dev)
+{
+	assert(usb_dev);
+	return usb_dev->depth;
+}
+
+unsigned usb_device_get_depth(const usb_device_t *usb_dev)
+{
+	assert(usb_dev);
+	return usb_dev->depth;
+}
+
+usb_speed_t usb_device_get_speed(const usb_device_t *usb_dev)
 {
 	assert(usb_dev);
@@ -370,5 +385,5 @@
 }
 
-int usb_device_get_iface_number(usb_device_t *usb_dev)
+int usb_device_get_iface_number(const usb_device_t *usb_dev)
 {
 	assert(usb_dev);
@@ -376,5 +391,5 @@
 }
 
-devman_handle_t usb_device_get_devman_handle(usb_device_t *usb_dev)
+devman_handle_t usb_device_get_devman_handle(const usb_device_t *usb_dev)
 {
 	assert(usb_dev);
@@ -498,4 +513,5 @@
 	if (ret == EOK) {
 		dev->address = dev_desc.address;
+		dev->depth = dev_desc.depth;
 		dev->speed = dev_desc.speed;
 		dev->handle = dev_desc.handle;
