Index: uspace/lib/usbhost/src/hcd.c
===================================================================
--- uspace/lib/usbhost/src/hcd.c	(revision 013e5d32c9af4ea5eff1d29e41946a398895b296)
+++ uspace/lib/usbhost/src/hcd.c	(revision 0ba88ae042ba1ecb5cbd7f866be49542da08acc3)
@@ -149,12 +149,12 @@
  * If this method fails, a polling fibril is started instead.
  *
- * @param[in] hcd Host controller device.
- * @param[in] hw_res Resources to be used.
- *
- * @return IRQ capability handle on success.
- * @return Negative error code.
+ * @param[in]  hcd         Host controller device.
+ * @param[in]  hw_res      Resources to be used.
+ * @param[out] irq_handle  Storage for the returned IRQ handle
+ *
+ * @return Error code.
  */
 static errno_t hcd_ddf_setup_interrupts(hc_device_t *hcd,
-    const hw_res_list_parsed_t *hw_res)
+    const hw_res_list_parsed_t *hw_res, cap_irq_handle_t *irq_handle)
 {
 	assert(hcd);
@@ -169,17 +169,17 @@
 	if (ret != EOK) {
 		usb_log_error("Failed to generate IRQ code: %s.",
-		    str_error(irq));
-		return irq;
+		    str_error(ret));
+		return ret;
 	}
 
 	/* Register handler to avoid interrupt lockup */
-	int irq_cap;
+	cap_irq_handle_t ihandle;
 	ret = register_interrupt_handler(hcd->ddf_dev, irq, irq_handler,
-	    &irq_code, &irq_cap);
+	    &irq_code, &ihandle);
 	irq_code_clean(&irq_code);
 	if (ret != EOK) {
 		usb_log_error("Failed to register interrupt handler: %s.",
-		    str_error(irq_cap));
-		return irq_cap;
+		    str_error(ret));
+		return ret;
 	}
 
@@ -189,8 +189,10 @@
 		usb_log_error("Failed to enable interrupts: %s.",
 		    str_error(ret));
-		unregister_interrupt_handler(hcd->ddf_dev, irq_cap);
+		unregister_interrupt_handler(hcd->ddf_dev, ihandle);
 		return ret;
 	}
-	return irq_cap;
+
+	*irq_handle = ihandle;
+	return EOK;
 }
 
@@ -245,6 +247,8 @@
 
 	/* Setup interrupts  */
-	hcd->irq_cap = hcd_ddf_setup_interrupts(hcd, &hw_res);
-	if (hcd->irq_cap >= 0) {
+	hcd->irq_handle = CAP_NIL;
+	errno_t irqerr = hcd_ddf_setup_interrupts(hcd, &hw_res,
+	    &hcd->irq_handle);
+	if (irqerr == EOK) {
 		usb_log_debug("Hw interrupts enabled.");
 	}
@@ -270,5 +274,5 @@
 
 	/* Need working irq replacement to setup root hub */
-	if (hcd->irq_cap < 0 && ops->status) {
+	if (irqerr != EOK && ops->status) {
 		hcd->polling_fibril = fibril_create(interrupt_polling, hcd->bus);
 		if (!hcd->polling_fibril) {
@@ -279,5 +283,5 @@
 		fibril_add_ready(hcd->polling_fibril);
 		usb_log_warning("Failed to enable interrupts: %s."
-		    " Falling back to polling.", str_error(hcd->irq_cap));
+		    " Falling back to polling.", str_error(irqerr));
 	}
 
@@ -305,5 +309,5 @@
 		hc_driver->stop(hcd);
 err_irq:
-	unregister_interrupt_handler(device, hcd->irq_cap);
+	unregister_interrupt_handler(device, hcd->irq_handle);
 	if (hc_driver->hc_remove)
 		hc_driver->hc_remove(hcd);
@@ -324,5 +328,5 @@
 			return err;
 
-	unregister_interrupt_handler(dev, hcd->irq_cap);
+	unregister_interrupt_handler(dev, hcd->irq_handle);
 
 	if (hc_driver->hc_remove)
