Index: uspace/drv/bus/usb/usbhub/port.c
===================================================================
--- uspace/drv/bus/usb/usbhub/port.c	(revision c952abc49534609ea0afa471026e70ebeb5876d6)
+++ uspace/drv/bus/usb/usbhub/port.c	(revision 7d1dd2b55c7a5309651626ded2ab97671e17687a)
@@ -153,6 +153,32 @@
 {
 	assert(port);
+
 	fibril_mutex_lock(&port->guard);
-	port_make_disabled(port);
+	switch (port->state) {
+	case PORT_ENABLED:
+		/*
+		 * We shall inform the HC that the device is gone.
+		 * However, we can't wait for it, because if the device is hub,
+		 * it would have to use the same IPC handling fibril as we do.
+		 * But we cannot even defer it to another fibril, because then
+		 * the HC would assume our driver didn't cleanup properly, and
+		 * will remove those devices by himself.
+		 *
+		 * So the solutions seems to behave like a bad driver and leave
+		 * the work for HC.
+		 */
+		port_change_state(port, PORT_DISABLED);
+		break;
+
+	case PORT_CONNECTED:
+	case PORT_IN_RESET:
+		port_change_state(port, PORT_ERROR);
+		/* fallthrough */
+	case PORT_ERROR:
+		port_wait_state(port, PORT_DISABLED);
+		/* fallthrough */
+	case PORT_DISABLED:
+		break;
+	}
 	port_log(debug, port, "Finalized.");
 	fibril_mutex_unlock(&port->guard);
