Index: uspace/lib/usb/src/devdrv.c
===================================================================
--- uspace/lib/usb/src/devdrv.c	(revision c7c0984abd146b8b0c0fe4967d83486b28accc5d)
+++ uspace/lib/usb/src/devdrv.c	(revision f240d30763cebda64838465333c6bcffb2029c84)
@@ -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/devpoll.c
===================================================================
--- uspace/lib/usb/src/devpoll.c	(revision c7c0984abd146b8b0c0fe4967d83486b28accc5d)
+++ uspace/lib/usb/src/devpoll.c	(revision f240d30763cebda64838465333c6bcffb2029c84)
@@ -78,5 +78,5 @@
 		usb_endpoint_mapping_t *mapping
 		    = &polling_data->dev->pipes[polling_data->pipe_index];
-		usb_log_debug("Poll0x%x: started polling of `%s' - " \
+		usb_log_debug("Poll%p: started polling of `%s' - " \
 		    "interface %d (%s,%d,%d), %zuB/%zu.\n",
 		    polling_data,
@@ -100,5 +100,5 @@
 			if (rc == EOK) {
 				usb_log_debug(
-				    "Poll0x%x: received: '%s' (%zuB).\n",
+				    "Poll%p: received: '%s' (%zuB).\n",
 				    polling_data,
 				    usb_debug_str_buffer(polling_data->buffer,
@@ -107,5 +107,5 @@
 			} else {
 				usb_log_debug(
-				    "Poll0x%x: polling failed: %s.\n",
+				    "Poll%p: polling failed: %s.\n",
 				    polling_data, str_error(rc));
 			}
Index: uspace/lib/usb/src/hidreport.c
===================================================================
--- uspace/lib/usb/src/hidreport.c	(revision c7c0984abd146b8b0c0fe4967d83486b28accc5d)
+++ uspace/lib/usb/src/hidreport.c	(revision f240d30763cebda64838465333c6bcffb2029c84)
@@ -109,5 +109,5 @@
 	
 	if (*d != sizeof(usb_standard_hid_descriptor_t)) {
-		usb_log_error("HID descriptor hass wrong size (%u, expected %u"
+		usb_log_error("HID descriptor has wrong size (%u, expected %zu"
 		    ")\n", *d, sizeof(usb_standard_hid_descriptor_t));
 		return EINVAL;
@@ -149,5 +149,5 @@
 		free(*report_desc);
 		*report_desc = NULL;
-		usb_log_error("Report descriptor has wrong size (%u, expected "
+		usb_log_error("Report descriptor has wrong size (%zu, expected "
 		    "%u)\n", actual_size, length);
 		return EINVAL;
Index: uspace/lib/usb/src/pipepriv.c
===================================================================
--- uspace/lib/usb/src/pipepriv.c	(revision c7c0984abd146b8b0c0fe4967d83486b28accc5d)
+++ uspace/lib/usb/src/pipepriv.c	(revision f240d30763cebda64838465333c6bcffb2029c84)
@@ -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 c7c0984abd146b8b0c0fe4967d83486b28accc5d)
+++ uspace/lib/usb/src/pipepriv.h	(revision f240d30763cebda64838465333c6bcffb2029c84)
@@ -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 c7c0984abd146b8b0c0fe4967d83486b28accc5d)
+++ uspace/lib/usb/src/pipes.c	(revision f240d30763cebda64838465333c6bcffb2029c84)
@@ -229,62 +229,4 @@
 }
 
-
-/** Start a session on the endpoint pipe.
- *
- * A session is something inside what any communication occurs.
- * It is expected that sessions would be started right before the transfer
- * and ended - see usb_pipe_end_session() - after the last
- * transfer.
- * The reason for this is that session actually opens some communication
- * channel to the host controller (or to the physical hardware if you
- * wish) and thus it involves acquiring kernel resources.
- * Since they are limited, sessions shall not be longer than strictly
- * necessary.
- *
- * @deprecated
- * Obsoleted with introduction of usb_pipe_start_long_transfer
- *
- * @param pipe Endpoint pipe to start the session on.
- * @return Error code.
- */
-int usb_pipe_start_session(usb_pipe_t *pipe)
-{
-	usb_log_warning("usb_pipe_start_session() was deprecated.\n");
-	return EOK;
-}
-
-
-/** Ends a session on the endpoint pipe.
- *
- * @deprecated
- * Obsoleted with introduction of usb_pipe_end_long_transfer
- *
- * @see usb_pipe_start_session
- *
- * @param pipe Endpoint pipe to end the session on.
- * @return Error code.
- */
-int usb_pipe_end_session(usb_pipe_t *pipe)
-{
-	usb_log_warning("usb_pipe_end_session() was deprecated.\n");
-	return EOK;
-}
-
-/** Tell whether a session is started (open) on the endpoint pipe.
- *
- * The expected usage of this function is in assertions for some
- * nested functions.
- *
- * @param pipe Endpoint pipe in question.
- * @return Whether @p pipe has opened a session.
- */
-bool usb_pipe_is_session_started(usb_pipe_t *pipe)
-{
-	pipe_acquire(pipe);
-	bool started = pipe->refcount > 0;
-	pipe_release(pipe);
-	return started;
-}
-
 /** Prepare pipe for a long transfer.
  *
@@ -297,7 +239,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 c7c0984abd146b8b0c0fe4967d83486b28accc5d)
+++ uspace/lib/usb/src/pipesinit.c	(revision f240d30763cebda64838465333c6bcffb2029c84)
@@ -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 c7c0984abd146b8b0c0fe4967d83486b28accc5d)
+++ uspace/lib/usb/src/pipesio.c	(revision f240d30763cebda64838465333c6bcffb2029c84)
@@ -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;
