Index: uspace/drv/bus/usb/uhci/uhci.c
===================================================================
--- uspace/drv/bus/usb/uhci/uhci.c	(revision 8d401811f32af8424341d4b6ab679c4c344e713c)
+++ uspace/drv/bus/usb/uhci/uhci.c	(revision ea69749f2b160c57150edd17d97d0361f6b44644)
@@ -105,6 +105,6 @@
 	if (!hc) {
 		usb_log_error("Failed to allocate UHCI HC structure.\n");
-		hcd_ddf_clean_hc(device);
-		return ENOMEM;
+		ret = ENOMEM;
+		goto ddf_hc_clean;
 	}
 
@@ -113,6 +113,5 @@
 		usb_log_error("Failed to register interrupt handler: %s.\n",
 		    str_error(ret));
-		hcd_ddf_clean_hc(device);
-		return ret;
+		goto hc_free;
 	}
 
@@ -122,4 +121,5 @@
 		usb_log_warning("Failed to enable interrupts: %s."
 		    " Falling back to polling.\n", str_error(ret));
+		unregister_interrupt_handler(device, irq);
 	} else {
 		usb_log_debug("Hw interrupts enabled.\n");
@@ -131,6 +131,5 @@
 		usb_log_error("Failed to disable legacy USB: %s.\n",
 		    str_error(ret));
-		hcd_ddf_clean_hc(device);
-		return ret;
+		goto irq_unregister;
 	}
 
@@ -138,7 +137,6 @@
 	if (ret != EOK) {
 		usb_log_error("Failed to init uhci_hcd: %s.\n", str_error(ret));
-		hcd_ddf_clean_hc(device);
-		// TODO unregister interrupt handler
-		return ret;
+		goto irq_unregister;
+		// TODO This is unfortunate, we have neither legacy nor real USB
 	}
 
@@ -151,13 +149,15 @@
 	ret = hcd_ddf_setup_root_hub(device);
 	if (ret != EOK) {
-		hc_fini(hc);
-		hcd_ddf_clean_hc(device);
-		// TODO unregister interrupt handler
 		usb_log_error("Failed to setup UHCI root hub: %s.\n",
 		    str_error(ret));
-		return ret;
+		hc_fini(hc);
+irq_unregister:
+		unregister_interrupt_handler(device, irq);
+hc_free:
+		free(hc);
+ddf_hc_clean:
+		hcd_ddf_clean_hc(device);
 	}
-
-	return EOK;
+	return ret;
 }
 /**
