Index: uspace/lib/usbdev/src/devdrv.c
===================================================================
--- uspace/lib/usbdev/src/devdrv.c	(revision bd575647525ea94b1e4d714096b7971bfb9e5353)
+++ uspace/lib/usbdev/src/devdrv.c	(revision 0681c064ce531622350c1e34d35909ef9a82c007)
@@ -170,5 +170,8 @@
 		return ENOTSUP;
 	/* Just tell the driver to stop whatever it is doing, keep structures */
-	return driver->ops->device_rem(gen_dev->driver_data);
+	const int ret = driver->ops->device_rem(gen_dev->driver_data);
+	if (ret != EOK)
+		return ret;
+	return ENOTSUP;
 }
 /*----------------------------------------------------------------------------*/
@@ -481,7 +484,9 @@
 	usb_dev->pipes = NULL;
 
+	/* Initialize hc connection. */
 	usb_hc_connection_initialize_from_device(&usb_dev->hc_conn, ddf_dev);
 	const usb_address_t address =
 	    usb_get_address_by_handle(ddf_dev->handle);
+
 	/* Initialize backing wire and control pipe. */
 	int rc = usb_device_connection_initialize(
@@ -494,8 +499,14 @@
 	/* This pipe was registered by the hub driver,
 	 * during device initialization. */
-	rc = usb_pipe_initialize_default_control(&usb_dev->ctrl_pipe,
-	    &usb_dev->wire);
+	rc = usb_pipe_initialize_default_control(
+	    &usb_dev->ctrl_pipe, &usb_dev->wire);
 	if (rc != EOK) {
 		*errstr_ptr = "default control pipe initialization";
+		return rc;
+	}
+
+	rc = usb_hc_connection_open(&usb_dev->hc_conn);
+	if (rc != EOK) {
+		*errstr_ptr = "hc connection open";
 		return rc;
 	}
@@ -503,10 +514,10 @@
 	/* Get our interface. */
 	usb_dev->interface_no = usb_device_get_assigned_interface(ddf_dev);
-
 	/* Retrieve standard descriptors. */
-	rc = usb_device_retrieve_descriptors(&usb_dev->ctrl_pipe,
-	    &usb_dev->descriptors);
+	rc = usb_device_retrieve_descriptors(
+	    &usb_dev->ctrl_pipe, &usb_dev->descriptors);
 	if (rc != EOK) {
 		*errstr_ptr = "descriptor retrieval";
+		usb_hc_connection_close(&usb_dev->hc_conn);
 		return rc;
 	}
@@ -525,4 +536,5 @@
 	rc = initialize_other_pipes(endpoints, usb_dev, alternate_iface);
 	if (rc != EOK) {
+		usb_hc_connection_close(&usb_dev->hc_conn);
 		/* Full configuration descriptor is allocated. */
 		usb_device_release_descriptors(&usb_dev->descriptors);
@@ -533,4 +545,5 @@
 	}
 
+	usb_hc_connection_close(&usb_dev->hc_conn);
 	return EOK;
 }
