Index: uspace/lib/usbdev/include/usb/dev/driver.h
===================================================================
--- uspace/lib/usbdev/include/usb/dev/driver.h	(revision f6b2a76b0bcfe02adf5d21778437749ac56bc83f)
+++ uspace/lib/usbdev/include/usb/dev/driver.h	(revision 945d66cf8dee14cc5321c053cc3ed3c7d7f918bf)
@@ -42,12 +42,4 @@
 #include <usb_iface.h>
 
-/** Descriptors for USB device. */
-typedef struct {
-	/** Standard device descriptor. */
-	usb_standard_device_descriptor_t device;
-	/** Full configuration descriptor of current configuration. */
-	const uint8_t *configuration;
-	size_t configuration_size;
-} usb_device_descriptors_t;
 
 /** Wrapper for data related to alternate interface setting.
@@ -84,4 +76,5 @@
 	/** The default control pipe. */
 	usb_pipe_t ctrl_pipe;
+
 	/** Other endpoint pipes.
 	 * This is an array of other endpoint pipes in the same order as
@@ -100,6 +93,12 @@
 	usb_alternate_interfaces_t alternate_interfaces;
 
-	/** Some useful descriptors. */
-	usb_device_descriptors_t descriptors;
+	/** Some useful descriptors for USB device. */
+	struct {
+		/** Standard device descriptor. */
+		usb_standard_device_descriptor_t device;
+		/** Full configuration descriptor of current configuration. */
+		const uint8_t *configuration;
+		size_t configuration_size;
+	} descriptors;
 
 	/** Generic DDF device backing this one. DO NOT TOUCH! */
@@ -179,7 +178,4 @@
     const usb_endpoint_description_t **);
 
-int usb_device_retrieve_descriptors(usb_pipe_t *, usb_device_descriptors_t *);
-void usb_device_release_descriptors(usb_device_descriptors_t *);
-
 int usb_device_create_pipes(usb_device_connection_t *,
     const usb_endpoint_description_t **, const uint8_t *, size_t, int, int,
@@ -188,4 +184,9 @@
 usb_pipe_t *usb_device_get_default_pipe(usb_device_t *);
 usb_pipe_t *usb_device_get_pipe(usb_device_t *, usb_endpoint_t, usb_direction_t);
+
+const usb_standard_device_descriptor_t *
+usb_device_get_device_descriptor(usb_device_t *);
+const void * usb_device_get_configuration_descriptor(usb_device_t *, size_t *);
+
 
 void * usb_device_data_alloc(usb_device_t *, size_t);
Index: uspace/lib/usbdev/src/devdrv.c
===================================================================
--- uspace/lib/usbdev/src/devdrv.c	(revision f6b2a76b0bcfe02adf5d21778437749ac56bc83f)
+++ uspace/lib/usbdev/src/devdrv.c	(revision 945d66cf8dee14cc5321c053cc3ed3c7d7f918bf)
@@ -233,18 +233,15 @@
  * @return Error code.
  */
-int usb_device_retrieve_descriptors(usb_pipe_t *ctrl_pipe,
-    usb_device_descriptors_t *descriptors)
-{
-	assert(descriptors != NULL);
-
-	descriptors->configuration = NULL;
-
-	int rc;
+static int usb_device_retrieve_descriptors(usb_device_t *usb_dev)
+{
+	assert(usb_dev);
+	assert(usb_dev->descriptors.configuration == NULL);
 
 	/* It is worth to start a long transfer. */
-	usb_pipe_start_long_transfer(ctrl_pipe);
+	usb_pipe_start_long_transfer(&usb_dev->ctrl_pipe);
 
 	/* Get the device descriptor. */
-	rc = usb_request_get_device_descriptor(ctrl_pipe, &descriptors->device);
+	int rc = usb_request_get_device_descriptor(&usb_dev->ctrl_pipe,
+	    &usb_dev->descriptors.device);
 	if (rc != EOK) {
 		goto leave;
@@ -253,9 +250,10 @@
 	/* Get the full configuration descriptor. */
 	rc = usb_request_get_full_configuration_descriptor_alloc(
-	    ctrl_pipe, 0, (void **) &descriptors->configuration,
-	    &descriptors->configuration_size);
+	    &usb_dev->ctrl_pipe, 0,
+	    (void **) &usb_dev->descriptors.configuration,
+	    &usb_dev->descriptors.configuration_size);
 
 leave:
-	usb_pipe_end_long_transfer(ctrl_pipe);
+	usb_pipe_end_long_transfer(&usb_dev->ctrl_pipe);
 
 	return rc;
@@ -266,9 +264,10 @@
  * @param[in] descriptors Where to store the descriptors.
  */
-void usb_device_release_descriptors(usb_device_descriptors_t *descriptors)
-{
-	assert(descriptors);
-	free(descriptors->configuration);
-	descriptors->configuration = NULL;
+static void usb_device_release_descriptors(usb_device_t *usb_dev)
+{
+	assert(usb_dev);
+	free(usb_dev->descriptors.configuration);
+	usb_dev->descriptors.configuration = NULL;
+	usb_dev->descriptors.configuration_size = 0;
 }
 
@@ -394,4 +393,20 @@
 }
 
+const usb_standard_device_descriptor_t *
+usb_device_get_device_descriptor(usb_device_t *usb_dev)
+{
+	assert(usb_dev);
+	return &usb_dev->descriptors.device;
+}
+
+const void * usb_device_get_configuration_descriptor(
+    usb_device_t *usb_dev, size_t *size)
+{
+	assert(usb_dev);
+	if (size)
+		*size = usb_dev->descriptors.configuration_size;
+	return usb_dev->descriptors.configuration;
+}
+
 /** Initialize new instance of USB device.
  *
@@ -462,6 +477,5 @@
 
 	/* Retrieve standard descriptors. */
-	rc = usb_device_retrieve_descriptors(
-	    &usb_dev->ctrl_pipe, &usb_dev->descriptors);
+	rc = usb_device_retrieve_descriptors(usb_dev);
 	if (rc != EOK) {
 		*errstr_ptr = "descriptor retrieval";
@@ -489,5 +503,5 @@
 		usb_hc_connection_close(&usb_dev->hc_conn);
 		/* Full configuration descriptor is allocated. */
-		usb_device_release_descriptors(&usb_dev->descriptors);
+		usb_device_release_descriptors(usb_dev);
 		/* Alternate interfaces may be allocated */
 		usb_alternate_interfaces_deinit(&usb_dev->alternate_interfaces);
@@ -515,5 +529,5 @@
 		usb_hc_connection_deinitialize(&dev->hc_conn);
 		usb_alternate_interfaces_deinit(&dev->alternate_interfaces);
-		usb_device_release_descriptors(&dev->descriptors);
+		usb_device_release_descriptors(dev);
 		free(dev->driver_data);
 		dev->driver_data = NULL;
