Index: uspace/lib/usbhost/src/ddf_helpers.c
===================================================================
--- uspace/lib/usbhost/src/ddf_helpers.c	(revision 01c3bb491370247ba1459d7e381e27022f09fed4)
+++ uspace/lib/usbhost/src/ddf_helpers.c	(revision 94e3a036175ccd11c8c097a5202b483a00cde423)
@@ -742,11 +742,13 @@
  * @param[in] gen_irq_code IRQ code generator.
  *
- * @return IRQ capability handle on success.
- * @return Negative error code.
+ * @param[out] handle  IRQ capability handle on success.
+ *
+ * @return Error code.
  */
 int hcd_ddf_setup_interrupts(ddf_dev_t *device,
     const hw_res_list_parsed_t *hw_res,
     interrupt_handler_t handler,
-    int (*gen_irq_code)(irq_code_t *, const hw_res_list_parsed_t *hw_res))
+    int (*gen_irq_code)(irq_code_t *, const hw_res_list_parsed_t *hw_res),
+    cap_handle_t *handle)
 {
 
@@ -765,22 +767,21 @@
 
 	/* Register handler to avoid interrupt lockup */
-	const int irq_cap = register_interrupt_handler(device, irq, handler,
-	    &irq_code);
+	int ret = register_interrupt_handler(device, irq, handler,
+	    &irq_code, handle);
 	irq_code_clean(&irq_code);
-	if (irq_cap < 0) {
-		usb_log_error("Failed to register interrupt handler: %s.\n",
-		    str_error(irq_cap));
-		return irq_cap;
-	}
-
-	/* Enable interrupts */
-	int ret = hcd_ddf_enable_interrupt(device, irq);
 	if (ret != EOK) {
 		usb_log_error("Failed to register interrupt handler: %s.\n",
 		    str_error(ret));
-		unregister_interrupt_handler(device, irq_cap);
-		return ret;
-	}
-	return irq_cap;
+		return ret;
+	}
+
+	/* Enable interrupts */
+	ret = hcd_ddf_enable_interrupt(device, irq);
+	if (ret != EOK) {
+		usb_log_error("Failed to register interrupt handler: %s.\n",
+		    str_error(ret));
+		unregister_interrupt_handler(device, *handle);
+	}
+	return ret;
 }
 
@@ -876,17 +877,19 @@
 	interrupt_handler_t *irq_handler =
 	    driver->irq_handler ? driver->irq_handler : ddf_hcd_gen_irq_handler;
-	const int irq_cap = hcd_ddf_setup_interrupts(device, &hw_res,
-	    irq_handler, driver->irq_code_gen);
-	bool irqs_enabled = !(irq_cap < 0);
+	int irq_cap;
+	ret = hcd_ddf_setup_interrupts(device, &hw_res,
+	    irq_handler, driver->irq_code_gen, &irq_cap);
+	bool irqs_enabled = (ret == EOK);
 	if (irqs_enabled) {
 		usb_log_debug("Hw interrupts enabled.\n");
 	}
 
-	if (driver->claim)
+	if (driver->claim) {
 		ret = driver->claim(device);
-	if (ret != EOK) {
-		usb_log_error("Failed to claim `%s' for driver `%s'",
-		    ddf_dev_get_name(device), driver->name);
-		return ret;
+		if (ret != EOK) {
+			usb_log_error("Failed to claim `%s' for driver `%s'",
+			    ddf_dev_get_name(device), driver->name);
+			return ret;
+		}
 	}
 
