Index: uspace/drv/bus/usb/usbhub/main.c
===================================================================
--- uspace/drv/bus/usb/usbhub/main.c	(revision effbef3ebe269cdcd3eb5581cbca65148114d4e1)
+++ uspace/drv/bus/usb/usbhub/main.c	(revision 9f685aace1dc51b76751b3d54828f261a0f0e875)
@@ -52,9 +52,4 @@
 };
 
-/** Hub endpoints, excluding control endpoint. */
-static const usb_endpoint_description_t *usb_hub_endpoints[] = {
-	&hub_status_change_endpoint_description,
-	NULL,
-};
 /** Static usb hub driver information. */
 static const usb_driver_t usb_hub_driver = {
Index: uspace/drv/bus/usb/usbhub/usbhub.c
===================================================================
--- uspace/drv/bus/usb/usbhub/usbhub.c	(revision effbef3ebe269cdcd3eb5581cbca65148114d4e1)
+++ uspace/drv/bus/usb/usbhub/usbhub.c	(revision 9f685aace1dc51b76751b3d54828f261a0f0e875)
@@ -58,17 +58,26 @@
 #define HUB_FNC_NAME "hub"
 
+#define HUB_STATUS_CHANGE_EP(protocol) { \
+	.transfer_type = USB_TRANSFER_INTERRUPT, \
+	.direction = USB_DIRECTION_IN, \
+	.interface_class = USB_CLASS_HUB, \
+	.interface_subclass = 0, \
+	.interface_protocol = (protocol), \
+	.flags = 0 \
+}
+
 /** Hub status-change endpoint description.
  *
  * For more information see section 11.15.1 of USB 1.1 specification.
  */
-const usb_endpoint_description_t hub_status_change_endpoint_description =
-{
-	.transfer_type = USB_TRANSFER_INTERRUPT,
-	.direction = USB_DIRECTION_IN,
-	.interface_class = USB_CLASS_HUB,
-	.interface_subclass = 0,
-	.interface_protocol = -1,
-	.flags = 0
+static const usb_endpoint_description_t
+	status_change_single_tt_only = HUB_STATUS_CHANGE_EP(0),
+	status_change_mtt_available = HUB_STATUS_CHANGE_EP(1);
+
+const usb_endpoint_description_t *usb_hub_endpoints [] = {
+	&status_change_single_tt_only,
+	&status_change_mtt_available,
 };
+
 
 /** Standard get hub global status request */
@@ -135,4 +144,15 @@
 		    str_error(opResult));
 		return opResult;
+	}
+
+	const usb_endpoint_description_t *status_change = hub_dev->mtt_available
+	    ? &status_change_mtt_available
+	    : &status_change_single_tt_only;
+
+	usb_endpoint_mapping_t *status_change_mapping
+		= usb_device_get_mapped_ep_desc(hub_dev->usb_device, status_change);
+	if (!status_change_mapping) {
+		usb_log_error("Failed to map the Status Change Endpoint of a hub.");
+		return EIO;
 	}
 
@@ -168,6 +188,5 @@
 
 	polling->device = hub_dev->usb_device;
-	polling->ep_mapping = usb_device_get_mapped_ep_desc(hub_dev->usb_device,
-	    &hub_status_change_endpoint_description);
+	polling->ep_mapping = status_change_mapping;
 	polling->request_size = ((hub_dev->port_count + 1 + 7) / 8);
 	polling->buffer = malloc(polling->request_size);
@@ -339,6 +358,5 @@
 	/* Get hub descriptor. */
 	usb_log_debug("(%p): Retrieving descriptor.", hub_dev);
-	usb_pipe_t *control_pipe =
-	    usb_device_get_default_pipe(hub_dev->usb_device);
+	usb_pipe_t *control_pipe = usb_device_get_default_pipe(hub_dev->usb_device);
 
 	usb_descriptor_type_t desc_type = hub_dev->speed >= USB_SPEED_SUPER
@@ -383,4 +401,8 @@
 	hub_dev->per_port_power =
 	    descriptor.characteristics & HUB_CHAR_POWER_PER_PORT_FLAG;
+
+	const uint8_t protocol = usb_device_descriptors(hub_dev->usb_device)
+		->device.device_protocol;
+	hub_dev->mtt_available = (protocol == 2);
 
 	usb_hub_power_ports(hub_dev);
@@ -434,13 +456,4 @@
 	}
 
-	/* Check if this is a MTT hub */
-	const size_t device_protocol =
-	    usb_device_descriptors(usb_device)->device.device_protocol;
-	if (device_protocol == 2) {
-		usb_log_debug("This is a MTT hub. MTT not supported, switching to Single-TT.");
-		opResult = usb_request_set_interface(usb_device_get_default_pipe(usb_device), 1, 0);
-		if (opResult != EOK)
-			usb_log_error("Failed to switch to Single-TT protocol.");
-	}
 	return opResult;
 }
Index: uspace/drv/bus/usb/usbhub/usbhub.h
===================================================================
--- uspace/drv/bus/usb/usbhub/usbhub.h	(revision effbef3ebe269cdcd3eb5581cbca65148114d4e1)
+++ uspace/drv/bus/usb/usbhub/usbhub.h	(revision 9f685aace1dc51b76751b3d54828f261a0f0e875)
@@ -72,4 +72,6 @@
 	/** Each port is switched individually. */
 	bool per_port_power;
+	/** Whether MTT is available */
+	bool mtt_available;
 
 	/** Default address management */
@@ -79,5 +81,5 @@
 };
 
-extern const usb_endpoint_description_t hub_status_change_endpoint_description;
+extern const usb_endpoint_description_t *usb_hub_endpoints [];
 
 int usb_hub_device_add(usb_device_t *);
