Index: uspace/lib/usb/include/usb/pipes.h
===================================================================
--- uspace/lib/usb/include/usb/pipes.h	(revision 5fd22d8be680d4036dc4a403a57dea056a7d3083)
+++ uspace/lib/usb/include/usb/pipes.h	(revision 206f71ae21a040a7540499adee488e4c575500b1)
@@ -129,4 +129,5 @@
 int usb_endpoint_pipe_initialize_default_control(usb_endpoint_pipe_t *,
     usb_device_connection_t *);
+int usb_endpoint_pipe_probe_default_control(usb_endpoint_pipe_t *);
 int usb_endpoint_pipe_initialize_from_configuration(usb_endpoint_mapping_t *,
     size_t, uint8_t *, size_t, usb_device_connection_t *);
Index: uspace/lib/usb/src/devdrv.c
===================================================================
--- uspace/lib/usb/src/devdrv.c	(revision 5fd22d8be680d4036dc4a403a57dea056a7d3083)
+++ uspace/lib/usb/src/devdrv.c	(revision 206f71ae21a040a7540499adee488e4c575500b1)
@@ -228,4 +228,12 @@
 	}
 
+	rc = usb_endpoint_pipe_probe_default_control(&dev->ctrl_pipe);
+	if (rc != EOK) {
+		usb_log_error(
+		    "Probing default control pipe on device `%s' failed: %s.\n",
+		    dev->ddf_dev->name, str_error(rc));
+		return rc;
+	}
+
 	/*
 	 * Initialization of other pipes requires open session on
Index: uspace/lib/usb/src/hub.c
===================================================================
--- uspace/lib/usb/src/hub.c	(revision 5fd22d8be680d4036dc4a403a57dea056a7d3083)
+++ uspace/lib/usb/src/hub.c	(revision 206f71ae21a040a7540499adee488e4c575500b1)
@@ -235,4 +235,9 @@
 		goto leave_release_default_address;
 	}
+	rc = usb_endpoint_pipe_probe_default_control(&ctrl_pipe);
+	if (rc != EOK) {
+		rc = ENOTCONN;
+		goto leave_release_default_address;
+	}
 
 	rc = usb_endpoint_pipe_start_session(&ctrl_pipe);
Index: uspace/lib/usb/src/pipesinit.c
===================================================================
--- uspace/lib/usb/src/pipesinit.c	(revision 5fd22d8be680d4036dc4a403a57dea056a7d3083)
+++ uspace/lib/usb/src/pipesinit.c	(revision 206f71ae21a040a7540499adee488e4c575500b1)
@@ -41,4 +41,7 @@
 #include <errno.h>
 #include <assert.h>
+
+#define CTRL_PIPE_MIN_PACKET_SIZE 8
+#define DEV_DESCR_MAX_PACKET_SIZE_OFFSET 7
 
 
@@ -371,25 +374,72 @@
 
 	int rc = usb_endpoint_pipe_initialize(pipe, connection,
-	    0, USB_TRANSFER_CONTROL, 8, USB_DIRECTION_BOTH);
+	    0, USB_TRANSFER_CONTROL, CTRL_PIPE_MIN_PACKET_SIZE,
+	    USB_DIRECTION_BOTH);
+
+	return rc;
+}
+
+/** Probe default control pipe for max packet size.
+ *
+ * The function tries to get the correct value of max packet size several
+ * time before giving up.
+ *
+ * The session on the pipe shall not be started.
+ *
+ * @param pipe Default control pipe.
+ * @return Error code.
+ */
+int usb_endpoint_pipe_probe_default_control(usb_endpoint_pipe_t *pipe)
+{
+	assert(pipe);
+	assert(DEV_DESCR_MAX_PACKET_SIZE_OFFSET < CTRL_PIPE_MIN_PACKET_SIZE);
+
+	if ((pipe->direction != USB_DIRECTION_BOTH) ||
+	    (pipe->transfer_type != USB_TRANSFER_CONTROL) ||
+	    (pipe->endpoint_no != 0)) {
+		return EINVAL;
+	}
+
+#define TRY_LOOP(attempt_var) \
+	for (attempt_var = 0; attempt_var < 3; attempt_var++)
+
+	size_t failed_attempts;
+	int rc;
+
+	TRY_LOOP(failed_attempts) {
+		rc = usb_endpoint_pipe_start_session(pipe);
+		if (rc == EOK) {
+			break;
+		}
+	}
 	if (rc != EOK) {
 		return rc;
 	}
-	rc = usb_endpoint_pipe_start_session(pipe);
+
+
+	uint8_t dev_descr_start[CTRL_PIPE_MIN_PACKET_SIZE];
+	size_t transferred_size;
+	TRY_LOOP(failed_attempts) {
+		rc = usb_request_get_descriptor(pipe, USB_REQUEST_TYPE_STANDARD,
+		    USB_REQUEST_RECIPIENT_DEVICE, USB_DESCTYPE_DEVICE,
+		    0, 0, dev_descr_start, CTRL_PIPE_MIN_PACKET_SIZE,
+		    &transferred_size);
+		if (rc == EOK) {
+			if (transferred_size != CTRL_PIPE_MIN_PACKET_SIZE) {
+				rc = ELIMIT;
+				continue;
+			}
+			break;
+		}
+	}
+	usb_endpoint_pipe_end_session(pipe);
 	if (rc != EOK) {
 		return rc;
 	}
 
-	uint8_t first[8];
-	size_t size = 0;
-	rc = usb_control_request_get(pipe, USB_REQUEST_TYPE_STANDARD,
-	    USB_REQUEST_RECIPIENT_DEVICE, USB_DEVREQ_GET_DESCRIPTOR, 1 << 8,
-			0, first, 8, &size);
-	usb_endpoint_pipe_end_session(pipe);
-	if (rc != EOK || size  != 8) {
-		return rc;
-	}
-
-	pipe->max_packet_size = first[7];
-	return rc;
+	pipe->max_packet_size
+	    = dev_descr_start[DEV_DESCR_MAX_PACKET_SIZE_OFFSET];
+
+	return EOK;
 }
 
Index: uspace/lib/usb/src/recognise.c
===================================================================
--- uspace/lib/usb/src/recognise.c	(revision 5fd22d8be680d4036dc4a403a57dea056a7d3083)
+++ uspace/lib/usb/src/recognise.c	(revision 206f71ae21a040a7540499adee488e4c575500b1)
@@ -369,4 +369,8 @@
 		goto failure;
 	}
+	rc = usb_endpoint_pipe_probe_default_control(&ctrl_pipe);
+	if (rc != EOK) {
+		goto failure;
+	}
 
 	/*
