Index: uspace/lib/usb/src/pipesinit.c
===================================================================
--- uspace/lib/usb/src/pipesinit.c	(revision 5e168be1ecefb894ab0fb798368d8b2828b56356)
+++ uspace/lib/usb/src/pipesinit.c	(revision 2471aaf0c3d2f0d812e7b4f6d5a4984f620452cc)
@@ -365,4 +365,5 @@
 	pipe->direction = direction;
 	pipe->refcount = 0;
+	pipe->auto_reset_halt = false;
 
 	return EOK;
@@ -385,4 +386,6 @@
 	    0, USB_TRANSFER_CONTROL, CTRL_PIPE_MIN_PACKET_SIZE,
 	    USB_DIRECTION_BOTH);
+
+	pipe->auto_reset_halt = true;
 
 	return rc;
Index: uspace/lib/usb/src/pipesio.c
===================================================================
--- uspace/lib/usb/src/pipesio.c	(revision 5e168be1ecefb894ab0fb798368d8b2828b56356)
+++ uspace/lib/usb/src/pipesio.c	(revision 2471aaf0c3d2f0d812e7b4f6d5a4984f620452cc)
@@ -49,4 +49,5 @@
 #include <assert.h>
 #include <usbhc_iface.h>
+#include <usb/request.h>
 #include "pipepriv.h"
 
@@ -307,4 +308,23 @@
 }
 
+/** Try to clear endpoint halt of default control pipe.
+ *
+ * @param pipe Pipe for control endpoint zero.
+ */
+static void clear_self_endpoint_halt(usb_pipe_t *pipe)
+{
+	assert(pipe != NULL);
+
+	if (!pipe->auto_reset_halt || (pipe->endpoint_no != 0)) {
+		return;
+	}
+
+
+	/* Prevent indefinite recursion. */
+	pipe->auto_reset_halt = false;
+	usb_request_clear_endpoint_halt(pipe, 0);
+	pipe->auto_reset_halt = true;
+}
+
 
 /** Request a control read transfer, no checking of input parameters.
@@ -436,4 +456,8 @@
 	    setup_buffer, setup_buffer_size,
 	    data_buffer, data_buffer_size, &act_size);
+
+	if (rc == ESTALL) {
+		clear_self_endpoint_halt(pipe);
+	}
 
 	pipe_drop_ref(pipe);
@@ -563,4 +587,8 @@
 	    setup_buffer, setup_buffer_size, data_buffer, data_buffer_size);
 
+	if (rc == ESTALL) {
+		clear_self_endpoint_halt(pipe);
+	}
+
 	pipe_drop_ref(pipe);
 
