Index: uspace/drv/bus/usb/ehci/ehci_rh.c
===================================================================
--- uspace/drv/bus/usb/ehci/ehci_rh.c	(revision ce735cc2430e8f0bfa1d2e2c249371c607b68bfb)
+++ uspace/drv/bus/usb/ehci/ehci_rh.c	(revision 5ee3ce050de57c0e5c95d397830a6a2b7a7cfe37)
@@ -291,4 +291,63 @@
 }
 
+typedef struct {
+	ehci_rh_t *hub;
+	unsigned port;
+} ehci_rh_job_t;
+
+static int stop_reset(void *arg)
+{
+	ehci_rh_job_t *job = arg;
+	async_usleep(50000);
+	EHCI_CLR(job->hub->registers->portsc[job->port],
+	    USB_PORTSC_PORT_RESET_FLAG);
+	/* wait for reset to complete */
+	while (EHCI_RD(job->hub->registers->portsc[job->port]) &
+	    USB_PORTSC_PORT_RESET_FLAG) {
+		async_usleep(1);
+	};
+	/* Handle port ownership, if the port is not enabled
+	 * after reset it's a full speed device */
+	if (!(EHCI_RD(job->hub->registers->portsc[job->port]) &
+	    USB_PORTSC_ENABLED_FLAG)) {
+		EHCI_SET(job->hub->registers->portsc[job->port],
+		    USB_PORTSC_PORT_OWNER_FLAG);
+	} else {
+		job->hub->reset_flag[job->port] = true;
+	}
+	ehci_rh_interrupt(job->hub);
+	free(job);
+	return 0;
+}
+
+static int stop_resume(void *arg)
+{
+	ehci_rh_job_t *job = arg;
+	async_usleep(20000);
+	EHCI_CLR(job->hub->registers->portsc[job->port],
+	    USB_PORTSC_RESUME_FLAG);
+	job->hub->resume_flag[job->port] = true;
+	ehci_rh_interrupt(job->hub);
+	free(job);
+	return 0;
+}
+
+static int delayed_job(int (*func)(void*), ehci_rh_t *rh, unsigned port)
+{
+	ehci_rh_job_t *job = malloc(sizeof(*job));
+	if (!job)
+		return ENOMEM;
+	job->hub = rh;
+	job->port = port;
+	fid_t fib = fibril_create(func, job);
+	if (!fib) {
+		free(job);
+		return ENOMEM;
+	}
+	fibril_add_ready(fib);
+	return EOK;
+}
+
+
 /** Port clear feature request handler.
  * @param device Virtual hub device
@@ -328,8 +387,5 @@
 		EHCI_SET(hub->registers->portsc[port],
 		    USB_PORTSC_RESUME_FLAG);
-		async_usleep(20000);
-		EHCI_CLR(hub->registers->portsc[port],
-		    USB_PORTSC_RESUME_FLAG);
-		hub->resume_flag[port] = true;
+		delayed_job(stop_resume, hub, port);
 		return EOK;
 
@@ -386,22 +442,5 @@
 		EHCI_SET(hub->registers->portsc[port],
 		    USB_PORTSC_PORT_RESET_FLAG);
-		async_usleep(50000);
-		EHCI_CLR(hub->registers->portsc[port],
-		    USB_PORTSC_PORT_RESET_FLAG);
-		/* wait for reset to complete */
-		while (EHCI_RD(hub->registers->portsc[port]) &
-		    USB_PORTSC_PORT_RESET_FLAG) {
-			async_usleep(1);
-		};
-		/* Handle port ownership, if the port is not enabled
-		 * after reset it's a full speed device */
-		if (!(EHCI_RD(hub->registers->portsc[port]) &
-		    USB_PORTSC_ENABLED_FLAG)) {
-			EHCI_SET(hub->registers->portsc[port],
-			    USB_PORTSC_PORT_OWNER_FLAG);
-		} else {
-			hub->reset_flag[port] = true;
-		}
-
+		delayed_job(stop_reset, hub, port);
 		return EOK;
 	case USB_HUB_FEATURE_PORT_POWER:   /*8*/
