Index: uspace/lib/usb/src/devdrv.c
===================================================================
--- uspace/lib/usb/src/devdrv.c	(revision 6ee6e6ffbdb1c1ee460bb140a4c1438fd91690c5)
+++ uspace/lib/usb/src/devdrv.c	(revision 4fa0a384bb0891c3fab420cc3babfe0bbd6a4798)
@@ -343,5 +343,5 @@
 /** Retrieve basic descriptors from the device.
  *
- * @param[in] ctrl_pipe Control pipe with opened session.
+ * @param[in] ctrl_pipe Control endpoint pipe.
  * @param[out] descriptors Where to store the descriptors.
  * @return Error code.
@@ -351,14 +351,19 @@
 {
 	assert(descriptors != NULL);
-	assert(usb_pipe_is_session_started(ctrl_pipe));
 
 	descriptors->configuration = NULL;
 
 	int rc;
+
+	/* It is worth to start a long transfer. */
+	rc = usb_pipe_start_long_transfer(ctrl_pipe);
+	if (rc != EOK) {
+		return rc;
+	}
 
 	/* Get the device descriptor. */
 	rc = usb_request_get_device_descriptor(ctrl_pipe, &descriptors->device);
 	if (rc != EOK) {
-		return rc;
+		goto leave;
 	}
 
@@ -367,9 +372,9 @@
 	    ctrl_pipe, 0, (void **) &descriptors->configuration,
 	    &descriptors->configuration_size);
-	if (rc != EOK) {
-		return rc;
-	}
-
-	return EOK;
+
+leave:
+	usb_pipe_end_long_transfer(ctrl_pipe);
+
+	return rc;
 }
 
@@ -575,14 +580,4 @@
 	dev->interface_no = usb_device_get_assigned_interface(dev->ddf_dev);
 
-	/*
-	 * We will do some querying of the device, it is worth to prepare
-	 * the long transfer.
-	 */
-	rc = usb_pipe_start_long_transfer(&dev->ctrl_pipe);
-	if (rc != EOK) {
-		*errmsg = "transfer start";
-		return rc;
-	}
-
 	/* Retrieve the descriptors. */
 	rc = usb_device_retrieve_descriptors(&dev->ctrl_pipe,
@@ -591,6 +586,4 @@
 		*errmsg = "descriptor retrieval";
 	}
-
-	usb_pipe_end_long_transfer(&dev->ctrl_pipe);
 
 	return rc;
