Index: uspace/lib/usb/include/usb/pipes.h
===================================================================
--- uspace/lib/usb/include/usb/pipes.h	(revision 8595577b1bae16ef32d246ec3defd163cf7519f0)
+++ uspace/lib/usb/include/usb/pipes.h	(revision 2c2cbcf6d5258e8737126d8a8296ae162428dab7)
@@ -99,4 +99,18 @@
 	/** Number of active transfers over the pipe. */
 	int refcount;
+	/** Number of failed attempts to open the HC phone.
+	 * When user requests usb_pipe_start_long_transfer() and the operation
+	 * fails, there is no way to report this to the user.
+	 * That the soft reference counter is increased to record the attempt.
+	 * When the user then request e.g. usb_pipe_read(), it will try to
+	 * add reference as well.
+	 * If that fails, it is reported to the user. If it is okay, the
+	 * real reference counter is incremented.
+	 * The problem might arise when ending the long transfer (since
+	 * the number of references would be only 1, but logically it shall be
+	 * two).
+	 * Decrementing the soft counter first shall solve this.
+	 */
+	int refcount_soft;
 
 	/** Whether to automatically reset halt on the endpoint.
@@ -167,5 +181,5 @@
 bool usb_pipe_is_session_started(usb_pipe_t *);
 
-int usb_pipe_start_long_transfer(usb_pipe_t *);
+void usb_pipe_start_long_transfer(usb_pipe_t *);
 void usb_pipe_end_long_transfer(usb_pipe_t *);
 
Index: uspace/lib/usb/src/devdrv.c
===================================================================
--- uspace/lib/usb/src/devdrv.c	(revision 8595577b1bae16ef32d246ec3defd163cf7519f0)
+++ uspace/lib/usb/src/devdrv.c	(revision 2c2cbcf6d5258e8737126d8a8296ae162428dab7)
@@ -236,8 +236,5 @@
 
 	/* It is worth to start a long transfer. */
-	rc = usb_pipe_start_long_transfer(ctrl_pipe);
-	if (rc != EOK) {
-		return rc;
-	}
+	usb_pipe_start_long_transfer(ctrl_pipe);
 
 	/* Get the device descriptor. */
Index: uspace/lib/usb/src/pipepriv.c
===================================================================
--- uspace/lib/usb/src/pipepriv.c	(revision 8595577b1bae16ef32d246ec3defd163cf7519f0)
+++ uspace/lib/usb/src/pipepriv.c	(revision 2c2cbcf6d5258e8737126d8a8296ae162428dab7)
@@ -77,10 +77,11 @@
  *
  * @param pipe The USB pipe.
+ * @param hide_failure Whether to hide failure when adding reference
+ *	(use soft refcount).
  * @return Error code.
  * @retval EOK Currently always.
  */
-int pipe_add_ref(usb_pipe_t *pipe)
+int pipe_add_ref(usb_pipe_t *pipe, bool hide_failure)
 {
-another_try:
 	pipe_acquire(pipe);
 
@@ -89,8 +90,10 @@
 		int phone = devman_device_connect(pipe->wire->hc_handle, 0);
 		if (phone < 0) {
-			// TODO: treat some error as non-recoverable
-			// and return error from here
+			if (hide_failure) {
+				pipe->refcount_soft++;
+				phone = EOK;
+			}
 			pipe_release(pipe);
-			goto another_try;
+			return phone;
 		}
 		/*
@@ -114,4 +117,9 @@
 {
 	pipe_acquire(pipe);
+	if (pipe->refcount_soft > 0) {
+		pipe->refcount_soft--;
+		pipe_release(pipe);
+		return;
+	}
 	assert(pipe->refcount > 0);
 	pipe->refcount--;
Index: uspace/lib/usb/src/pipepriv.h
===================================================================
--- uspace/lib/usb/src/pipepriv.h	(revision 8595577b1bae16ef32d246ec3defd163cf7519f0)
+++ uspace/lib/usb/src/pipepriv.h	(revision 2c2cbcf6d5258e8737126d8a8296ae162428dab7)
@@ -37,4 +37,5 @@
 
 #include <usb/pipes.h>
+#include <bool.h>
 
 void pipe_acquire(usb_pipe_t *);
@@ -44,5 +45,5 @@
 void pipe_end_transaction(usb_pipe_t *);
 
-int pipe_add_ref(usb_pipe_t *);
+int pipe_add_ref(usb_pipe_t *, bool);
 void pipe_drop_ref(usb_pipe_t *);
 
Index: uspace/lib/usb/src/pipes.c
===================================================================
--- uspace/lib/usb/src/pipes.c	(revision 8595577b1bae16ef32d246ec3defd163cf7519f0)
+++ uspace/lib/usb/src/pipes.c	(revision 2c2cbcf6d5258e8737126d8a8296ae162428dab7)
@@ -297,7 +297,7 @@
  * @return Error code.
  */
-int usb_pipe_start_long_transfer(usb_pipe_t *pipe)
-{
-	return pipe_add_ref(pipe);
+void usb_pipe_start_long_transfer(usb_pipe_t *pipe)
+{
+	(void) pipe_add_ref(pipe, true);
 }
 
Index: uspace/lib/usb/src/pipesinit.c
===================================================================
--- uspace/lib/usb/src/pipesinit.c	(revision 8595577b1bae16ef32d246ec3defd163cf7519f0)
+++ uspace/lib/usb/src/pipesinit.c	(revision 2c2cbcf6d5258e8737126d8a8296ae162428dab7)
@@ -365,4 +365,5 @@
 	pipe->direction = direction;
 	pipe->refcount = 0;
+	pipe->refcount_soft = 0;
 	pipe->auto_reset_halt = false;
 
@@ -419,9 +420,5 @@
 	int rc;
 
-	rc = usb_pipe_start_long_transfer(pipe);
-	if (rc != EOK) {
-		return rc;
-	}
-
+	usb_pipe_start_long_transfer(pipe);
 
 	uint8_t dev_descr_start[CTRL_PIPE_MIN_PACKET_SIZE];
Index: uspace/lib/usb/src/pipesio.c
===================================================================
--- uspace/lib/usb/src/pipesio.c	(revision 8595577b1bae16ef32d246ec3defd163cf7519f0)
+++ uspace/lib/usb/src/pipesio.c	(revision 2c2cbcf6d5258e8737126d8a8296ae162428dab7)
@@ -173,5 +173,5 @@
 
 	int rc;
-	rc = pipe_add_ref(pipe);
+	rc = pipe_add_ref(pipe, false);
 	if (rc != EOK) {
 		return rc;
@@ -296,5 +296,5 @@
 	int rc;
 
-	rc = pipe_add_ref(pipe);
+	rc = pipe_add_ref(pipe, false);
 	if (rc != EOK) {
 		return rc;
@@ -447,5 +447,5 @@
 	int rc;
 
-	rc = pipe_add_ref(pipe);
+	rc = pipe_add_ref(pipe, false);
 	if (rc != EOK) {
 		return rc;
@@ -579,5 +579,5 @@
 	int rc;
 
-	rc = pipe_add_ref(pipe);
+	rc = pipe_add_ref(pipe, false);
 	if (rc != EOK) {
 		return rc;
