Index: uspace/drv/usbmouse/init.c
===================================================================
--- uspace/drv/usbmouse/init.c	(revision d70e0a3c4086971fa7bff2c800db92306f06ce65)
+++ uspace/drv/usbmouse/init.c	(revision a6567ed8cbe044e5c40b6e4a73c7b222c9fcbf17)
@@ -36,9 +36,9 @@
 #include "mouse.h"
 #include <usb/debug.h>
+#include <usb/classes/classes.h>
 #include <usb/classes/hid.h>
 #include <usb/request.h>
 #include <errno.h>
 
-#if 0
 /** Mouse polling endpoint description for boot protocol subclass. */
 static usb_endpoint_description_t poll_endpoint_description = {
@@ -50,5 +50,48 @@
 	.flags = 0
 };
-#endif
+
+/** Initialize poll pipe.
+ *
+ * Expects that session is already started on control pipe zero.
+ *
+ * @param mouse Mouse device.
+ * @param my_interface Interface number.
+ * @return Error code.
+ */
+static int intialize_poll_pipe(usb_mouse_t *mouse, int my_interface)
+{
+	assert(usb_endpoint_pipe_is_session_started(&mouse->ctrl_pipe));
+
+	int rc;
+
+	void *config_descriptor;
+	size_t config_descriptor_size;
+
+	rc = usb_request_get_full_configuration_descriptor_alloc(
+	    &mouse->ctrl_pipe, 0, &config_descriptor, &config_descriptor_size);
+	if (rc != EOK) {
+		return rc;
+	}
+
+	usb_endpoint_mapping_t endpoint_mapping[1] = {
+		{
+			.pipe = &mouse->poll_pipe,
+			.description = &poll_endpoint_description,
+			.interface_no = my_interface
+		}
+	};
+
+	rc = usb_endpoint_pipe_initialize_from_configuration(endpoint_mapping,
+	    1, config_descriptor, config_descriptor_size, &mouse->wire);
+	if (rc != EOK) {
+		return rc;
+	}
+
+	if (!endpoint_mapping[0].present) {
+		return ENOENT;
+	}
+
+	return EOK;
+}
 
 
@@ -76,7 +119,14 @@
 	}
 
-	/* FIXME: initialize to the proper endpoint. */
-	rc = usb_endpoint_pipe_initialize(&mouse->poll_pipe, &mouse->wire,
-	    1, USB_TRANSFER_INTERRUPT, 8, USB_DIRECTION_IN);
+	rc = usb_endpoint_pipe_start_session(&mouse->ctrl_pipe);
+	if (rc != EOK) {
+		goto leave;
+	}
+
+	rc = intialize_poll_pipe(mouse, usb_device_get_assigned_interface(dev));
+
+	/* We can ignore error here. */
+	usb_endpoint_pipe_end_session(&mouse->ctrl_pipe);
+
 	if (rc != EOK) {
 		goto leave;
Index: uspace/drv/usbmouse/mouse.c
===================================================================
--- uspace/drv/usbmouse/mouse.c	(revision d70e0a3c4086971fa7bff2c800db92306f06ce65)
+++ uspace/drv/usbmouse/mouse.c	(revision a6567ed8cbe044e5c40b6e4a73c7b222c9fcbf17)
@@ -46,8 +46,20 @@
 	assert(mouse);
 
+	size_t buffer_size = mouse->poll_pipe.max_packet_size;
+
+	if (buffer_size < 4) {
+		usb_log_error("Weird mouse, results will be skewed.\n");
+		buffer_size = 4;
+	}
+
+	uint8_t *buffer = malloc(buffer_size);
+	if (buffer == NULL) {
+		usb_log_error("Out of memory, poll fibril aborted.\n");
+		return ENOMEM;
+	}
+
 	while (true) {
 		async_usleep(10 * 1000);
 
-		uint8_t buffer[8];
 		size_t actual_size;
 
@@ -55,5 +67,6 @@
 		usb_endpoint_pipe_start_session(&mouse->poll_pipe);
 
-		usb_endpoint_pipe_read(&mouse->poll_pipe, buffer, 8, &actual_size);
+		usb_endpoint_pipe_read(&mouse->poll_pipe,
+		    buffer, buffer_size, &actual_size);
 
 		usb_endpoint_pipe_end_session(&mouse->poll_pipe);
