Index: uspace/drv/bus/usb/ehci/main.c
===================================================================
--- uspace/drv/bus/usb/ehci/main.c	(revision d93098016e1edb95431e7ca5092c5889f70c514a)
+++ uspace/drv/bus/usb/ehci/main.c	(revision cffa14e6a3bd4ce597e7947bdeaf548e0a312d19)
@@ -33,10 +33,8 @@
  * Main routines of EHCI driver.
  */
-
 #include <ddf/driver.h>
 #include <ddf/interrupt.h>
 #include <device/hw_res.h>
 #include <errno.h>
-#include <stdbool.h>
 #include <str_error.h>
 
@@ -72,8 +70,10 @@
 static int ehci_dev_add(ddf_dev_t *device)
 {
-	ddf_fun_t *hc_fun = NULL;
-	bool fun_bound = false;
-
 	assert(device);
+#define CHECK_RET_RETURN(ret, message...) \
+if (ret != EOK) { \
+	usb_log_error(message); \
+	return ret; \
+}
 
 	uintptr_t reg_base = 0;
@@ -81,54 +81,37 @@
 	int irq = 0;
 
-	int rc = get_my_registers(device, &reg_base, &reg_size, &irq);
-	if (rc != EOK) {
-		usb_log_error("Failed to get memory addresses for %" PRIun
-		    ": %s.\n", ddf_dev_get_handle(device), str_error(rc));
-		goto error;
-	}
-
+	int ret = get_my_registers(device, &reg_base, &reg_size, &irq);
+	CHECK_RET_RETURN(ret,
+	    "Failed to get memory addresses for %" PRIun ": %s.\n",
+	    ddf_dev_get_handle(device), str_error(ret));
 	usb_log_info("Memory mapped regs at 0x%" PRIxn " (size %zu), IRQ %d.\n",
 	    reg_base, reg_size, irq);
 
-	rc = disable_legacy(device, reg_base, reg_size);
-	if (rc != EOK) {
-		usb_log_error("Failed to disable legacy USB: %s.\n",
-		    str_error(rc));
-		goto error;
-	}
+	ret = disable_legacy(device, reg_base, reg_size);
+	CHECK_RET_RETURN(ret,
+	    "Failed to disable legacy USB: %s.\n", str_error(ret));
 
-	hc_fun = ddf_fun_create(device, fun_exposed, "ehci_hc");
+	ddf_fun_t *hc_fun = ddf_fun_create(device, fun_exposed, "ehci_hc");
 	if (hc_fun == NULL) {
 		usb_log_error("Failed to create EHCI function.\n");
-		rc = ENOMEM;
-		goto error;
+		return ENOMEM;
 	}
-
 	hcd_t *ehci_hc = ddf_fun_data_alloc(hc_fun, sizeof(hcd_t));
 	if (ehci_hc == NULL) {
 		usb_log_error("Failed to alloc generic HC driver.\n");
-		rc = ENOMEM;
-		goto error;
+		return ENOMEM;
 	}
-
 	/* High Speed, no bandwidth */
 	hcd_init(ehci_hc, USB_SPEED_HIGH, 0, NULL);
 	ddf_fun_set_ops(hc_fun,  &hc_ops);
 
-	rc = ddf_fun_bind(hc_fun);
-	if (rc != EOK) {
-		usb_log_error("Failed to bind EHCI function: %s.\n",
-		    str_error(rc));
-		goto error;
-	}
-
-	fun_bound = true;
-
-	rc = ddf_fun_add_to_category(hc_fun, USB_HC_CATEGORY);
-	if (rc != EOK) {
-		usb_log_error("Failed to add EHCI to HC class: %s.\n",
-		    str_error(rc));
-		goto error;
-	}
+	ret = ddf_fun_bind(hc_fun);
+	CHECK_RET_RETURN(ret,
+	    "Failed to bind EHCI function: %s.\n",
+	    str_error(ret));
+	ret = ddf_fun_add_to_category(hc_fun, USB_HC_CATEGORY);
+	CHECK_RET_RETURN(ret,
+	    "Failed to add EHCI to HC class: %s.\n",
+	    str_error(ret));
 
 	usb_log_info("Controlling new EHCI device `%s' (handle %" PRIun ").\n",
@@ -136,10 +119,5 @@
 
 	return EOK;
-error:
-	if (fun_bound)
-		ddf_fun_unbind(hc_fun);
-	if (hc_fun != NULL)
-		ddf_fun_destroy(hc_fun);
-	return rc;
+#undef CHECK_RET_RETURN
 }
 
Index: uspace/drv/bus/usb/ehci/res.c
===================================================================
--- uspace/drv/bus/usb/ehci/res.c	(revision d93098016e1edb95431e7ca5092c5889f70c514a)
+++ uspace/drv/bus/usb/ehci/res.c	(revision cffa14e6a3bd4ce597e7947bdeaf548e0a312d19)
@@ -145,14 +145,17 @@
 		return ENOMEM;
 
+#define CHECK_RET_HANGUP_RETURN(ret, message...) \
+	if (ret != EOK) { \
+		usb_log_error(message); \
+		async_hangup(parent_sess); \
+		return ret; \
+	} else (void)0
+
 	/* Read the first EEC. i.e. Legacy Support register */
 	uint32_t usblegsup;
-	int rc = pci_config_space_read_32(parent_sess,
+	int ret = pci_config_space_read_32(parent_sess,
 	    eecp + USBLEGSUP_OFFSET, &usblegsup);
-	if (rc != EOK) {
-		usb_log_error("Failed to read USBLEGSUP: %s.\n",
-		    str_error(rc));
-		goto error;
-	}
-
+	CHECK_RET_HANGUP_RETURN(ret,
+	    "Failed to read USBLEGSUP: %s.\n", str_error(ret));
 	usb_log_debug("USBLEGSUP: %" PRIx32 ".\n", usblegsup);
 
@@ -160,31 +163,17 @@
 	 * byte. (OS Control semaphore)*/
 	usb_log_debug("Requesting OS control.\n");
-	rc = pci_config_space_write_8(parent_sess,
+	ret = pci_config_space_write_8(parent_sess,
 	    eecp + USBLEGSUP_OFFSET + 3, 1);
-	if (rc != EOK) {
-		usb_log_error("Failed to request OS EHCI control: %s.\n",
-		    str_error(rc));
-		goto error;
-	}
+	CHECK_RET_HANGUP_RETURN(ret, "Failed to request OS EHCI control: %s.\n",
+	    str_error(ret));
 
 	size_t wait = 0;
 	/* Wait for BIOS to release control. */
-	rc = pci_config_space_read_32(
+	ret = pci_config_space_read_32(
 	    parent_sess, eecp + USBLEGSUP_OFFSET, &usblegsup);
-	if (rc != EOK) {
-		usb_log_error("Failed reading PCI config space: %s.\n",
-		    str_error(rc));
-		goto error;
-	}
-
 	while ((wait < DEFAULT_WAIT) && (usblegsup & USBLEGSUP_BIOS_CONTROL)) {
 		async_usleep(WAIT_STEP);
-		rc = pci_config_space_read_32(parent_sess,
+		ret = pci_config_space_read_32(parent_sess,
 		    eecp + USBLEGSUP_OFFSET, &usblegsup);
-		if (rc != EOK) {
-			usb_log_error("Failed reading PCI config space: %s.\n",
-			    str_error(rc));
-			goto error;
-		}
 		wait += WAIT_STEP;
 	}
@@ -199,12 +188,8 @@
 	usb_log_warning( "BIOS failed to release control after "
 	    "%zu usecs, force it.\n", wait);
-	rc = pci_config_space_write_32(parent_sess,
+	ret = pci_config_space_write_32(parent_sess,
 	    eecp + USBLEGSUP_OFFSET, USBLEGSUP_OS_CONTROL);
-	if (rc != EOK) {
-		usb_log_error("Failed to force OS control: "
-		    "%s.\n", str_error(rc));
-		goto error;
-	}
-
+	CHECK_RET_HANGUP_RETURN(ret, "Failed to force OS control: "
+	    "%s.\n", str_error(ret));
 	/*
 	 * Check capability type here, value of 01h identifies the capability
@@ -216,12 +201,8 @@
 		/* Read the second EEC Legacy Support and Control register */
 		uint32_t usblegctlsts;
-		rc = pci_config_space_read_32(parent_sess,
+		ret = pci_config_space_read_32(parent_sess,
 		    eecp + USBLEGCTLSTS_OFFSET, &usblegctlsts);
-		if (rc != EOK) {
-			usb_log_error("Failed to get USBLEGCTLSTS: %s.\n",
-			    str_error(rc));
-			goto error;
-		}
-
+		CHECK_RET_HANGUP_RETURN(ret, "Failed to get USBLEGCTLSTS: %s.\n",
+		    str_error(ret));
 		usb_log_debug("USBLEGCTLSTS: %" PRIx32 ".\n", usblegctlsts);
 		/*
@@ -230,20 +211,12 @@
 		 * interfering. NOTE: Three upper bits are WC
 		 */
-		rc = pci_config_space_write_32(parent_sess,
+		ret = pci_config_space_write_32(parent_sess,
 		    eecp + USBLEGCTLSTS_OFFSET, 0xe0000000);
-		if (rc != EOK) {
-			usb_log_error("Failed(%d) zero USBLEGCTLSTS.\n", rc);
-			goto error;
-		}
-
+		CHECK_RET_HANGUP_RETURN(ret, "Failed(%d) zero USBLEGCTLSTS.\n", ret);
 		udelay(10);
-		rc = pci_config_space_read_32(parent_sess,
+		ret = pci_config_space_read_32(parent_sess,
 		    eecp + USBLEGCTLSTS_OFFSET, &usblegctlsts);
-		if (rc != EOK) {
-			usb_log_error("Failed to get USBLEGCTLSTS 2: %s.\n",
-			    str_error(rc));
-			goto error;
-		}
-
+		CHECK_RET_HANGUP_RETURN(ret, "Failed to get USBLEGCTLSTS 2: %s.\n",
+		    str_error(ret));
 		usb_log_debug("Zeroed USBLEGCTLSTS: %" PRIx32 ".\n",
 		    usblegctlsts);
@@ -251,18 +224,12 @@
 
 	/* Read again Legacy Support register */
-	rc = pci_config_space_read_32(parent_sess,
+	ret = pci_config_space_read_32(parent_sess,
 	    eecp + USBLEGSUP_OFFSET, &usblegsup);
-	if (rc != EOK) {
-		usb_log_error("Failed to read USBLEGSUP: %s.\n",
-		    str_error(rc));
-		goto error;
-	}
-
+	CHECK_RET_HANGUP_RETURN(ret, "Failed to read USBLEGSUP: %s.\n",
+	    str_error(ret));
 	usb_log_debug("USBLEGSUP: %" PRIx32 ".\n", usblegsup);
 	async_hangup(parent_sess);
 	return EOK;
-error:
-	async_hangup(parent_sess);
-	return rc;
+#undef CHECK_RET_HANGUP_RETURN
 }
 
@@ -272,12 +239,15 @@
 	usb_log_debug("Disabling EHCI legacy support.\n");
 
+#define CHECK_RET_RETURN(ret, message...) \
+	if (ret != EOK) { \
+		usb_log_error(message); \
+		return ret; \
+	} else (void)0
+
 	/* Map EHCI registers */
 	void *regs = NULL;
-	int rc = pio_enable((void*)reg_base, reg_size, &regs);
-	if (rc != EOK) {
-		usb_log_error("Failed to map registers %p: %s.\n",
-		    (void *) reg_base, str_error(rc));
-		return rc;
-	}
+	int ret = pio_enable((void*)reg_base, reg_size, &regs);
+	CHECK_RET_RETURN(ret, "Failed to map registers %p: %s.\n",
+	    (void *) reg_base, str_error(ret));
 
 	usb_log_debug2("Registers mapped at: %p.\n", regs);
@@ -293,10 +263,9 @@
 	usb_log_debug("Value of EECP: %x.\n", eecp);
 
-	rc = disable_extended_caps(device, eecp);
-	if (rc != EOK) {
-		usb_log_error("Failed to disable extended capabilities: %s.\n",
-		    str_error(rc));
-		return rc;
-	}
+	ret = disable_extended_caps(device, eecp);
+	CHECK_RET_RETURN(ret, "Failed to disable extended capabilities: %s.\n",
+	    str_error(ret));
+
+#undef CHECK_RET_RETURN
 
 	/*
@@ -337,5 +306,5 @@
 	    usbcmd, *usbcmd, usbsts, *usbsts, usbint, *usbint, usbconf,*usbconf);
 
-	return rc;
+	return ret;
 }
 
Index: uspace/drv/bus/usb/ohci/hc.c
===================================================================
--- uspace/drv/bus/usb/ohci/hc.c	(revision d93098016e1edb95431e7ca5092c5889f70c514a)
+++ uspace/drv/bus/usb/ohci/hc.c	(revision cffa14e6a3bd4ce597e7947bdeaf548e0a312d19)
@@ -35,5 +35,4 @@
 
 #include <errno.h>
-#include <stdbool.h>
 #include <str_error.h>
 #include <adt/list.h>
@@ -84,14 +83,4 @@
 };
 
-enum {
-	/** Number of PIO ranges used in IRQ code */
-	hc_irq_pio_range_count = 
-	    sizeof(ohci_pio_ranges) / sizeof(irq_pio_range_t),
-
-	/** Number of commands used in IRQ code */
-	hc_irq_cmd_count =
-	    sizeof(ohci_irq_commands) / sizeof(irq_cmd_t)
-};
-
 static void hc_gain_control(hc_t *instance);
 static void hc_start(hc_t *instance);
@@ -100,4 +89,20 @@
 static int interrupt_emulator(hc_t *instance);
 static int hc_schedule(hcd_t *hcd, usb_transfer_batch_t *batch);
+
+/** Get number of PIO ranges used in IRQ code.
+ * @return Number of ranges.
+ */
+size_t hc_irq_pio_range_count(void)
+{
+	return sizeof(ohci_pio_ranges) / sizeof(irq_pio_range_t);
+}
+
+/** Get number of commands used in IRQ code.
+ * @return Number of commands.
+ */
+size_t hc_irq_cmd_count(void)
+{
+	return sizeof(ohci_irq_commands) / sizeof(irq_cmd_t);
+}
 
 /** Generate IRQ code.
@@ -132,48 +137,4 @@
 }
 
-/** Register interrupt handler.
- *
- * @param[in] device Host controller DDF device
- * @param[in] reg_base Register range base
- * @param[in] reg_size Register range size
- * @param[in] irq Interrupt number
- * @paran[in] handler Interrupt handler
- *
- * @return EOK on success or negative error code
- */
-int hc_register_irq_handler(ddf_dev_t *device, uintptr_t reg_base, size_t reg_size,
-    int irq, interrupt_handler_t handler)
-{
-	int rc;
-
-	irq_pio_range_t irq_ranges[hc_irq_pio_range_count];
-	irq_cmd_t irq_cmds[hc_irq_cmd_count];
-
-	irq_code_t irq_code = {
-		.rangecount = hc_irq_pio_range_count,
-		.ranges = irq_ranges,
-		.cmdcount = hc_irq_cmd_count,
-		.cmds = irq_cmds
-	};
-
-	rc = hc_get_irq_code(irq_ranges, sizeof(irq_ranges), irq_cmds,
-	    sizeof(irq_cmds), reg_base, reg_size);
-	if (rc != EOK) {
-		usb_log_error("Failed to generate IRQ code: %s.\n",
-		    str_error(rc));
-		return rc;
-	}
-
-	/* Register handler to avoid interrupt lockup */
-	rc = register_interrupt_handler(device, irq, handler, &irq_code);
-	if (rc != EOK) {
-		usb_log_error("Failed to register interrupt handler: %s.\n",
-		    str_error(rc));
-		return rc;
-	}
-
-	return EOK;
-}
-
 /** Announce OHCI root hub to the DDF
  *
@@ -184,9 +145,4 @@
 int hc_register_hub(hc_t *instance, ddf_fun_t *hub_fun)
 {
-	bool addr_reqd = false;
-	bool ep_added = false;
-	bool fun_bound = false;
-	int rc;
-
 	assert(instance);
 	assert(hub_fun);
@@ -194,64 +150,48 @@
 	/* Try to get address 1 for root hub. */
 	instance->rh.address = 1;
-	rc = usb_device_manager_request_address(
+	int ret = usb_device_manager_request_address(
 	    &instance->generic.dev_manager, &instance->rh.address, false,
 	    USB_SPEED_FULL);
-	if (rc != EOK) {
+	if (ret != EOK) {
 		usb_log_error("Failed to get OHCI root hub address: %s\n",
-		    str_error(rc));
-		goto error;
-	}
-
-	addr_reqd = true;
-
-	rc = usb_endpoint_manager_add_ep(
+		    str_error(ret));
+		return ret;
+	}
+
+#define CHECK_RET_UNREG_RETURN(ret, message...) \
+if (ret != EOK) { \
+	usb_log_error(message); \
+	usb_endpoint_manager_remove_ep( \
+	    &instance->generic.ep_manager, instance->rh.address, 0, \
+	    USB_DIRECTION_BOTH, NULL, NULL); \
+	usb_device_manager_release_address( \
+	    &instance->generic.dev_manager, instance->rh.address); \
+	return ret; \
+} else (void)0
+
+	ret = usb_endpoint_manager_add_ep(
 	    &instance->generic.ep_manager, instance->rh.address, 0,
 	    USB_DIRECTION_BOTH, USB_TRANSFER_CONTROL, USB_SPEED_FULL, 64,
 	    0, NULL, NULL);
-	if (rc != EOK) {
-    	        usb_log_error("Failed to register root hub control endpoint: %s.\n",
-		    str_error(rc));
-		goto error;
-	}
-
-	ep_added = true;
-
-	rc = ddf_fun_add_match_id(hub_fun, "usb&class=hub", 100);
-	if (rc != EOK) {
-		usb_log_error("Failed to add root hub match-id: %s.\n",
-		    str_error(rc));
-		goto error;
-	}
-
-	rc = ddf_fun_bind(hub_fun);
-	if (rc != EOK) {
-		usb_log_error("Failed to bind root hub function: %s.\n",
-		    str_error(rc));
-		goto error;
-	}
-
-	fun_bound = true;
-
-	rc = usb_device_manager_bind_address(&instance->generic.dev_manager,
+	CHECK_RET_UNREG_RETURN(ret,
+	    "Failed to register root hub control endpoint: %s.\n",
+	    str_error(ret));
+
+	ret = ddf_fun_add_match_id(hub_fun, "usb&class=hub", 100);
+	CHECK_RET_UNREG_RETURN(ret,
+	    "Failed to add root hub match-id: %s.\n", str_error(ret));
+
+	ret = ddf_fun_bind(hub_fun);
+	CHECK_RET_UNREG_RETURN(ret,
+	    "Failed to bind root hub function: %s.\n", str_error(ret));
+
+	ret = usb_device_manager_bind_address(&instance->generic.dev_manager,
 	    instance->rh.address, ddf_fun_get_handle(hub_fun));
-	if (rc != EOK) {
+	if (ret != EOK)
 		usb_log_warning("Failed to bind root hub address: %s.\n",
-		    str_error(rc));
-	}
+		    str_error(ret));
 
 	return EOK;
-error:
-	if (fun_bound)
-		ddf_fun_unbind(hub_fun);
-	if (ep_added) {
-		usb_endpoint_manager_remove_ep(
-		    &instance->generic.ep_manager, instance->rh.address, 0,
-		    USB_DIRECTION_BOTH, NULL, NULL);
-	}
-	if (addr_reqd) {
-		usb_device_manager_release_address(
-		    &instance->generic.dev_manager, instance->rh.address);
-	}
-	return rc;
+#undef CHECK_RET_RELEASE
 }
 
@@ -268,11 +208,14 @@
 	assert(instance);
 
-	int rc =
+#define CHECK_RET_RETURN(ret, message...) \
+if (ret != EOK) { \
+	usb_log_error(message); \
+	return ret; \
+} else (void)0
+
+	int ret =
 	    pio_enable((void*)regs, reg_size, (void**)&instance->registers);
-	if (rc != EOK) {
-		usb_log_error("Failed to gain access to device registers: %s.\n",
-		    str_error(rc));
-		return rc;
-	}
+	CHECK_RET_RETURN(ret,
+	    "Failed to gain access to device registers: %s.\n", str_error(ret));
 
 	list_initialize(&instance->pending_batches);
@@ -285,10 +228,8 @@
 	instance->generic.ep_remove_hook = ohci_endpoint_fini;
 
-	rc = hc_init_memory(instance);
-	if (rc != EOK) {
-		usb_log_error("Failed to create OHCI memory structures: %s.\n",
-		    str_error(rc));
-		return rc;
-	}
+	ret = hc_init_memory(instance);
+	CHECK_RET_RETURN(ret, "Failed to create OHCI memory structures: %s.\n",
+	    str_error(ret));
+#undef CHECK_RET_RETURN
 
 	fibril_mutex_initialize(&instance->guard);
Index: uspace/drv/bus/usb/ohci/hc.h
===================================================================
--- uspace/drv/bus/usb/ohci/hc.h	(revision d93098016e1edb95431e7ca5092c5889f70c514a)
+++ uspace/drv/bus/usb/ohci/hc.h	(revision cffa14e6a3bd4ce597e7947bdeaf548e0a312d19)
@@ -35,5 +35,4 @@
 #define DRV_OHCI_HC_H
 
-#include <ddf/interrupt.h>
 #include <fibril.h>
 #include <fibril_synch.h>
@@ -75,7 +74,8 @@
 } hc_t;
 
+size_t hc_irq_pio_range_count(void);
+size_t hc_irq_cmd_count(void);
 int hc_get_irq_code(irq_pio_range_t [], size_t, irq_cmd_t [], size_t, uintptr_t,
     size_t);
-int hc_register_irq_handler(ddf_dev_t *, uintptr_t, size_t, int, interrupt_handler_t);
 int hc_register_hub(hc_t *instance, ddf_fun_t *hub_fun);
 int hc_init(hc_t *instance, uintptr_t regs, size_t reg_size, bool interrupts);
Index: uspace/drv/bus/usb/ohci/ohci.c
===================================================================
--- uspace/drv/bus/usb/ohci/ohci.c	(revision d93098016e1edb95431e7ca5092c5889f70c514a)
+++ uspace/drv/bus/usb/ohci/ohci.c	(revision cffa14e6a3bd4ce597e7947bdeaf548e0a312d19)
@@ -143,8 +143,4 @@
 int device_setup_ohci(ddf_dev_t *device)
 {
-	bool ih_registered = false;
-	bool hc_inited = false;
-	int rc;
-
 	if (device == NULL)
 		return EBADMEM;
@@ -156,23 +152,27 @@
 	}
 
+#define CHECK_RET_DEST_FREE_RETURN(ret, message...) \
+if (ret != EOK) { \
+	if (instance->hc_fun) { \
+		ddf_fun_destroy(instance->hc_fun); \
+	} \
+	if (instance->rh_fun) { \
+		ddf_fun_destroy(instance->rh_fun); \
+	} \
+	usb_log_error(message); \
+	return ret; \
+} else (void)0
+
 	instance->hc_fun = ddf_fun_create(device, fun_exposed, "ohci_hc");
-	if (instance->hc_fun == NULL) {
-		usb_log_error("Failed to create OHCI HC function: %s.\n",
-		    str_error(ENOMEM));
-		rc = ENOMEM;
-		goto error;
-	}
-
+	int ret = instance->hc_fun ? EOK : ENOMEM;
+	CHECK_RET_DEST_FREE_RETURN(ret,
+	    "Failed to create OHCI HC function: %s.\n", str_error(ret));
 	ddf_fun_set_ops(instance->hc_fun, &hc_ops);
 	ddf_fun_data_implant(instance->hc_fun, &instance->hc);
 
 	instance->rh_fun = ddf_fun_create(device, fun_inner, "ohci_rh");
-	if (instance->rh_fun == NULL) {
-		usb_log_error("Failed to create OHCI RH function: %s.\n",
-		    str_error(ENOMEM));
-		rc = ENOMEM;
-		goto error;
-	}
-
+	ret = instance->rh_fun ? EOK : ENOMEM;
+	CHECK_RET_DEST_FREE_RETURN(ret,
+	    "Failed to create OHCI RH function: %s.\n", str_error(ret));
 	ddf_fun_set_ops(instance->rh_fun, &rh_ops);
 
@@ -181,33 +181,41 @@
 	int irq = 0;
 
-	rc = get_my_registers(device, &reg_base, &reg_size, &irq);
-	if (rc != EOK) {
-		usb_log_error("Failed to get register memory addresses "
-		    "for %" PRIun ": %s.\n", ddf_dev_get_handle(device),
-		    str_error(rc));
-		goto error;
-	}
-
+	ret = get_my_registers(device, &reg_base, &reg_size, &irq);
+	CHECK_RET_DEST_FREE_RETURN(ret,
+	    "Failed to get register memory addresses for %" PRIun ": %s.\n",
+	    ddf_dev_get_handle(device), str_error(ret));
 	usb_log_debug("Memory mapped regs at %p (size %zu), IRQ %d.\n",
 	    (void *) reg_base, reg_size, irq);
 
-	rc = hc_register_irq_handler(device, reg_base, reg_size, irq, irq_handler);
-	if (rc != EOK) {
-		usb_log_error("Failed to register interrupt handler: %s.\n",
-		    str_error(rc));
-		goto error;
-	}
-
-	ih_registered = true;
+	const size_t ranges_count = hc_irq_pio_range_count();
+	const size_t cmds_count = hc_irq_cmd_count();
+	irq_pio_range_t irq_ranges[ranges_count];
+	irq_cmd_t irq_cmds[cmds_count];
+	irq_code_t irq_code = {
+		.rangecount = ranges_count,
+		.ranges = irq_ranges,
+		.cmdcount = cmds_count,
+		.cmds = irq_cmds
+	};
+
+	ret = hc_get_irq_code(irq_ranges, sizeof(irq_ranges), irq_cmds,
+	    sizeof(irq_cmds), reg_base, reg_size);
+	CHECK_RET_DEST_FREE_RETURN(ret,
+	    "Failed to generate IRQ code: %s.\n", str_error(ret));
+
+
+	/* Register handler to avoid interrupt lockup */
+	ret = register_interrupt_handler(device, irq, irq_handler, &irq_code);
+	CHECK_RET_DEST_FREE_RETURN(ret,
+	    "Failed to register interrupt handler: %s.\n", str_error(ret));
 
 	/* Try to enable interrupts */
 	bool interrupts = false;
-	rc = enable_interrupts(device);
-	if (rc != EOK) {
+	ret = enable_interrupts(device);
+	if (ret != EOK) {
 		usb_log_warning("Failed to enable interrupts: %s."
-		    " Falling back to polling\n", str_error(rc));
+		    " Falling back to polling\n", str_error(ret));
 		/* We don't need that handler */
 		unregister_interrupt_handler(device, irq);
-		ih_registered = false;
 	} else {
 		usb_log_debug("Hw interrupts enabled.\n");
@@ -215,45 +223,30 @@
 	}
 
-	rc = hc_init(&instance->hc, reg_base, reg_size, interrupts);
-	if (rc != EOK) {
-		usb_log_error("Failed to init ohci_hcd: %s.\n", str_error(rc));
-		goto error;
-	}
-
-	hc_inited = true;
-
-	rc = ddf_fun_bind(instance->hc_fun);
-	if (rc != EOK) {
-		usb_log_error("Failed to bind OHCI device function: %s.\n",
-		    str_error(rc));
-		goto error;
-	}
-
-	rc = ddf_fun_add_to_category(instance->hc_fun, USB_HC_CATEGORY);
-	if (rc != EOK) {
-		usb_log_error("Failed to add OHCI to HC category: %s.\n",
-		    str_error(rc));
-		goto error;
-	}
-
-	rc = hc_register_hub(&instance->hc, instance->rh_fun);
-	if (rc != EOK) {
-		usb_log_error("Failed to register OHCI root hub: %s.\n",
-		    str_error(rc));
-		goto error;
-	}
-
-	return EOK;
-
-error:
-	if (hc_inited)
-		hc_fini(&instance->hc);
-	if (ih_registered)
-		unregister_interrupt_handler(device, irq);
-	if (instance->hc_fun != NULL)
-		ddf_fun_destroy(instance->hc_fun);
-	if (instance->rh_fun != NULL)
-		ddf_fun_destroy(instance->rh_fun);
-	return rc;
+	ret = hc_init(&instance->hc, reg_base, reg_size, interrupts);
+	CHECK_RET_DEST_FREE_RETURN(ret,
+	    "Failed to init ohci_hcd: %s.\n", str_error(ret));
+
+#define CHECK_RET_FINI_RETURN(ret, message...) \
+if (ret != EOK) { \
+	hc_fini(&instance->hc); \
+	unregister_interrupt_handler(device, irq); \
+	CHECK_RET_DEST_FREE_RETURN(ret, message); \
+} else (void)0
+
+
+	ret = ddf_fun_bind(instance->hc_fun);
+	CHECK_RET_FINI_RETURN(ret,
+	    "Failed to bind OHCI device function: %s.\n", str_error(ret));
+
+	ret = ddf_fun_add_to_category(instance->hc_fun, USB_HC_CATEGORY);
+	CHECK_RET_FINI_RETURN(ret,
+	    "Failed to add OHCI to HC class: %s.\n", str_error(ret));
+
+	ret = hc_register_hub(&instance->hc, instance->rh_fun);
+	CHECK_RET_FINI_RETURN(ret,
+	    "Failed to register OHCI root hub: %s.\n", str_error(ret));
+	return ret;
+
+#undef CHECK_RET_FINI_RETURN
 }
 /**
Index: uspace/drv/bus/usb/uhci/hc.c
===================================================================
--- uspace/drv/bus/usb/uhci/hc.c	(revision d93098016e1edb95431e7ca5092c5889f70c514a)
+++ uspace/drv/bus/usb/uhci/hc.c	(revision cffa14e6a3bd4ce597e7947bdeaf548e0a312d19)
@@ -90,13 +90,20 @@
 static int hc_debug_checker(void *arg);
 
-enum {
-	/** Number of PIO ranges used in IRQ code */
-	hc_irq_pio_range_count =
-	    sizeof(uhci_irq_pio_ranges) / sizeof(irq_pio_range_t),
-
-	/* Number of commands used in IRQ code */
-	hc_irq_cmd_count =
-	    sizeof(uhci_irq_commands) / sizeof(irq_cmd_t)
-};
+
+/** Get number of PIO ranges used in IRQ code.
+ * @return Number of ranges.
+ */
+size_t hc_irq_pio_range_count(void)
+{
+	return sizeof(uhci_irq_pio_ranges) / sizeof(irq_pio_range_t);
+}
+
+/** Get number of commands used in IRQ code.
+ * @return Number of commands.
+ */
+size_t hc_irq_cmd_count(void)
+{
+	return sizeof(uhci_irq_commands) / sizeof(irq_cmd_t);
+}
 
 /** Generate IRQ code.
@@ -126,46 +133,4 @@
 	cmds[0].addr = &registers->usbsts;
 	cmds[3].addr = &registers->usbsts;
-
-	return EOK;
-}
-
-/** Register interrupt handler.
- *
- * @param[in] device Host controller DDF device
- * @param[in] reg_base Register range base
- * @param[in] reg_size Register range size
- * @param[in] irq Interrupt number
- * @paran[in] handler Interrupt handler
- *
- * @return EOK on success or negative error code
- */
-int hc_register_irq_handler(ddf_dev_t *device, uintptr_t reg_base, size_t reg_size,
-    int irq, interrupt_handler_t handler)
-{
-	int rc;
-	irq_pio_range_t irq_ranges[hc_irq_pio_range_count];
-	irq_cmd_t irq_cmds[hc_irq_cmd_count];
-	rc = hc_get_irq_code(irq_ranges, sizeof(irq_ranges), irq_cmds,
-	    sizeof(irq_cmds), reg_base, reg_size);
-	if (rc != EOK) {
-		usb_log_error("Failed to generate IRQ commands: %s.\n",
-		    str_error(rc));
-		return rc;
-	}
-
-	irq_code_t irq_code = {
-		.rangecount = hc_irq_pio_range_count,
-		.ranges = irq_ranges,
-		.cmdcount = hc_irq_cmd_count,
-		.cmds = irq_cmds
-	};
-
-        /* Register handler to avoid interrupt lockup */
-        rc = register_interrupt_handler(device, irq, handler, &irq_code);
-        if (rc != EOK) {
-    		usb_log_error("Failed to register interrupt handler: %s.\n",
-    		    str_error(rc));
-    		return rc;
-    	}
 
 	return EOK;
@@ -244,5 +209,11 @@
 {
 	assert(reg_size >= sizeof(uhci_regs_t));
-	int rc;
+	int ret;
+
+#define CHECK_RET_RETURN(ret, message...) \
+	if (ret != EOK) { \
+		usb_log_error(message); \
+		return ret; \
+	} else (void) 0
 
 	instance->hw_interrupts = interrupts;
@@ -251,21 +222,17 @@
 	/* allow access to hc control registers */
 	uhci_regs_t *io;
-	rc = pio_enable(regs, reg_size, (void **)&io);
-	if (rc != EOK) {
-		usb_log_error("Failed to gain access to registers at %p: %s.\n",
-		    io, str_error(rc));
-		return rc;
-	}
-
+	ret = pio_enable(regs, reg_size, (void **)&io);
+	CHECK_RET_RETURN(ret, "Failed to gain access to registers at %p: %s.\n",
+	    io, str_error(ret));
 	instance->registers = io;
 	usb_log_debug(
 	    "Device registers at %p (%zuB) accessible.\n", io, reg_size);
 
-	rc = hc_init_mem_structures(instance);
-	if (rc != EOK) {
-		usb_log_error("Failed to initialize UHCI memory structures: %s.\n",
-		    str_error(rc));
-		return rc;
-	}
+	ret = hc_init_mem_structures(instance);
+	CHECK_RET_RETURN(ret,
+	    "Failed to initialize UHCI memory structures: %s.\n",
+	    str_error(ret));
+
+#undef CHECK_RET_RETURN
 
 	hcd_init(&instance->generic, USB_SPEED_FULL,
@@ -430,4 +397,5 @@
 
 	return EOK;
+#undef CHECK_RET_CLEAR_RETURN
 }
 
Index: uspace/drv/bus/usb/uhci/hc.h
===================================================================
--- uspace/drv/bus/usb/uhci/hc.h	(revision d93098016e1edb95431e7ca5092c5889f70c514a)
+++ uspace/drv/bus/usb/uhci/hc.h	(revision cffa14e6a3bd4ce597e7947bdeaf548e0a312d19)
@@ -36,5 +36,4 @@
 #define DRV_UHCI_HC_H
 
-#include <ddf/interrupt.h>
 #include <fibril.h>
 #include <usb/host/hcd.h>
@@ -120,5 +119,6 @@
 } hc_t;
 
-int hc_register_irq_handler(ddf_dev_t *, uintptr_t, size_t, int, interrupt_handler_t);
+size_t hc_irq_pio_range_count(void);
+size_t hc_irq_cmd_count(void);
 int hc_get_irq_code(irq_pio_range_t [], size_t, irq_cmd_t [], size_t, uintptr_t,
     size_t);
Index: uspace/drv/bus/usb/uhci/uhci.c
===================================================================
--- uspace/drv/bus/usb/uhci/uhci.c	(revision d93098016e1edb95431e7ca5092c5889f70c514a)
+++ uspace/drv/bus/usb/uhci/uhci.c	(revision cffa14e6a3bd4ce597e7947bdeaf548e0a312d19)
@@ -38,5 +38,4 @@
 
 #include <errno.h>
-#include <stdbool.h>
 #include <str_error.h>
 #include <ddf/interrupt.h>
@@ -150,9 +149,4 @@
 int device_setup_uhci(ddf_dev_t *device)
 {
-	bool ih_registered = false;
-	bool hc_inited = false;
-	bool fun_bound = false;
-	int rc;
-
 	if (!device)
 		return EBADMEM;
@@ -164,21 +158,25 @@
 	}
 
+#define CHECK_RET_DEST_FREE_RETURN(ret, message...) \
+if (ret != EOK) { \
+	if (instance->hc_fun) \
+		ddf_fun_destroy(instance->hc_fun); \
+	if (instance->rh_fun) {\
+		ddf_fun_destroy(instance->rh_fun); \
+	} \
+	usb_log_error(message); \
+	return ret; \
+} else (void)0
+
+	instance->rh_fun = NULL;
 	instance->hc_fun = ddf_fun_create(device, fun_exposed, "uhci_hc");
-	if (instance->hc_fun == NULL) {
-		usb_log_error("Failed to create UHCI HC function.\n");
-		rc = ENOMEM;
-		goto error;
-	}
-
+	int ret = (instance->hc_fun == NULL) ? ENOMEM : EOK;
+	CHECK_RET_DEST_FREE_RETURN(ret, "Failed to create UHCI HC function.\n");
 	ddf_fun_set_ops(instance->hc_fun, &hc_ops);
 	ddf_fun_data_implant(instance->hc_fun, &instance->hc.generic);
 
 	instance->rh_fun = ddf_fun_create(device, fun_inner, "uhci_rh");
-	if (instance->rh_fun == NULL) {
-		usb_log_error("Failed to create UHCI RH function.\n");
-		rc = ENOMEM;
-		goto error;
-	}
-
+	ret = (instance->rh_fun == NULL) ? ENOMEM : EOK;
+	CHECK_RET_DEST_FREE_RETURN(ret, "Failed to create UHCI RH function.\n");
 	ddf_fun_set_ops(instance->rh_fun, &rh_ops);
 	ddf_fun_data_implant(instance->rh_fun, &instance->rh);
@@ -188,34 +186,41 @@
 	int irq = 0;
 
-	rc = get_my_registers(device, &reg_base, &reg_size, &irq);
-	if (rc != EOK) {
-		usb_log_error("Failed to get I/O addresses for %" PRIun ": %s.\n",
-		    ddf_dev_get_handle(device), str_error(rc));
-		goto error;
-	}
+	ret = get_my_registers(device, &reg_base, &reg_size, &irq);
+	CHECK_RET_DEST_FREE_RETURN(ret,
+	    "Failed to get I/O addresses for %" PRIun ": %s.\n",
+	    ddf_dev_get_handle(device), str_error(ret));
 	usb_log_debug("I/O regs at 0x%p (size %zu), IRQ %d.\n",
 	    (void *) reg_base, reg_size, irq);
 
-	rc = disable_legacy(device);
-	if (rc != EOK) {
-		usb_log_error("Failed to disable legacy USB: %s.\n",
-		    str_error(rc));
-		goto error;
-	}
-
-	rc = hc_register_irq_handler(device, reg_base, reg_size, irq, irq_handler);
-	if (rc != EOK) {
-		usb_log_error("Failed to register interrupt handler: %s.\n",
-		    str_error(rc));
-		goto error;
-	}
-
-	ih_registered = true;
+	ret = disable_legacy(device);
+	CHECK_RET_DEST_FREE_RETURN(ret,
+	    "Failed to disable legacy USB: %s.\n", str_error(ret));
+
+	const size_t ranges_count = hc_irq_pio_range_count();
+	const size_t cmds_count = hc_irq_cmd_count();
+	irq_pio_range_t irq_ranges[ranges_count];
+	irq_cmd_t irq_cmds[cmds_count];
+	ret = hc_get_irq_code(irq_ranges, sizeof(irq_ranges), irq_cmds,
+	    sizeof(irq_cmds), reg_base, reg_size);
+	CHECK_RET_DEST_FREE_RETURN(ret,
+	    "Failed to generate IRQ commands: %s.\n", str_error(ret));
+
+	irq_code_t irq_code = {
+		.rangecount = ranges_count,
+		.ranges = irq_ranges,
+		.cmdcount = cmds_count,
+		.cmds = irq_cmds
+	};
+
+        /* Register handler to avoid interrupt lockup */
+        ret = register_interrupt_handler(device, irq, irq_handler, &irq_code);
+        CHECK_RET_DEST_FREE_RETURN(ret,
+            "Failed to register interrupt handler: %s.\n", str_error(ret));
 
 	bool interrupts = false;
-	rc = enable_interrupts(device);
-	if (rc != EOK) {
+	ret = enable_interrupts(device);
+	if (ret != EOK) {
 		usb_log_warning("Failed to enable interrupts: %s."
-		    " Falling back to polling.\n", str_error(rc));
+		    " Falling back to polling.\n", str_error(ret));
 	} else {
 		usb_log_debug("Hw interrupts enabled.\n");
@@ -223,58 +228,34 @@
 	}
 
-	rc = hc_init(&instance->hc, (void*)reg_base, reg_size, interrupts);
-	if (rc != EOK) {
-		usb_log_error("Failed to init uhci_hcd: %s.\n", str_error(rc));
-		goto error;
-	}
-
-	hc_inited = true;
-
-	rc = ddf_fun_bind(instance->hc_fun);
-	if (rc != EOK) {
-		usb_log_error("Failed to bind UHCI device function: %s.\n",
-		    str_error(rc));
-		goto error;
-	}
-
-	fun_bound = true;
-
-	rc = ddf_fun_add_to_category(instance->hc_fun, USB_HC_CATEGORY);
-	if (rc != EOK) {
-		usb_log_error("Failed to add UHCI to HC class: %s.\n",
-		    str_error(rc));
-		goto error;
-	}
-
-	rc = rh_init(&instance->rh, instance->rh_fun,
+	ret = hc_init(&instance->hc, (void*)reg_base, reg_size, interrupts);
+	CHECK_RET_DEST_FREE_RETURN(ret,
+	    "Failed to init uhci_hcd: %s.\n", str_error(ret));
+
+#define CHECK_RET_FINI_RETURN(ret, message...) \
+if (ret != EOK) { \
+	hc_fini(&instance->hc); \
+	CHECK_RET_DEST_FREE_RETURN(ret, message); \
+	return ret; \
+} else (void)0
+
+	ret = ddf_fun_bind(instance->hc_fun);
+	CHECK_RET_FINI_RETURN(ret, "Failed to bind UHCI device function: %s.\n",
+	    str_error(ret));
+
+	ret = ddf_fun_add_to_category(instance->hc_fun, USB_HC_CATEGORY);
+	CHECK_RET_FINI_RETURN(ret,
+	    "Failed to add UHCI to HC class: %s.\n", str_error(ret));
+
+	ret = rh_init(&instance->rh, instance->rh_fun,
 	    (uintptr_t)instance->hc.registers + 0x10, 4);
-	if (rc != EOK) {
-		usb_log_error("Failed to setup UHCI root hub: %s.\n",
-		    str_error(rc));
-		goto error;
-	}
-
-	rc = ddf_fun_bind(instance->rh_fun);
-	if (rc != EOK) {
-		usb_log_error("Failed to register UHCI root hub: %s.\n",
-		    str_error(rc));
-		goto error;
-	}
+	CHECK_RET_FINI_RETURN(ret,
+	    "Failed to setup UHCI root hub: %s.\n", str_error(ret));
+
+	ret = ddf_fun_bind(instance->rh_fun);
+	CHECK_RET_FINI_RETURN(ret,
+	    "Failed to register UHCI root hub: %s.\n", str_error(ret));
 
 	return EOK;
-
-error:
-	if (fun_bound)
-		ddf_fun_unbind(instance->hc_fun);
-	if (hc_inited)
-		hc_fini(&instance->hc);
-	if (ih_registered)
-		unregister_interrupt_handler(device, irq);
-	if (instance->hc_fun != NULL)
-		ddf_fun_destroy(instance->hc_fun);
-	if (instance->rh_fun != NULL) {
-		ddf_fun_destroy(instance->rh_fun);
-	}
-	return rc;
+#undef CHECK_RET_FINI_RETURN
 }
 /**
Index: uspace/drv/bus/usb/uhcirh/main.c
===================================================================
--- uspace/drv/bus/usb/uhcirh/main.c	(revision d93098016e1edb95431e7ca5092c5889f70c514a)
+++ uspace/drv/bus/usb/uhcirh/main.c	(revision cffa14e6a3bd4ce597e7947bdeaf548e0a312d19)
@@ -93,32 +93,30 @@
 	size_t io_size = 0;
 	uhci_root_hub_t *rh = NULL;
-	int rc;
+	int ret = EOK;
 
-	rc = hc_get_my_registers(device, &io_regs, &io_size);
-	if (rc != EOK) {
-		usb_log_error( "Failed to get registers from HC: %s.\n",
-		    str_error(rc));
-		return rc;
-	}
+#define CHECK_RET_FREE_RH_RETURN(ret, message...) \
+if (ret != EOK) { \
+	usb_log_error(message); \
+	return ret; \
+} else (void)0
 
+	ret = hc_get_my_registers(device, &io_regs, &io_size);
+	CHECK_RET_FREE_RH_RETURN(ret,
+	    "Failed to get registers from HC: %s.\n", str_error(ret));
 	usb_log_debug("I/O regs at %p (size %zuB).\n",
 	    (void *) io_regs, io_size);
 
 	rh = ddf_dev_data_alloc(device, sizeof(uhci_root_hub_t));
-	if (rh == NULL) {
-		usb_log_error("Failed to allocate rh driver instance.\n");
-		return ENOMEM;
-	}
+	ret = (rh == NULL) ? ENOMEM : EOK;
+	CHECK_RET_FREE_RH_RETURN(ret,
+	    "Failed to allocate rh driver instance.\n");
 
-	rc = uhci_root_hub_init(rh, (void*)io_regs, io_size, device);
-	if (rc != EOK) {
-		usb_log_error("Failed(%d) to initialize rh driver instance: "
-		    "%s.\n", rc, str_error(rc));
-		return rc;
-	}
+	ret = uhci_root_hub_init(rh, (void*)io_regs, io_size, device);
+	CHECK_RET_FREE_RH_RETURN(ret,
+	    "Failed(%d) to initialize rh driver instance: %s.\n",
+	    ret, str_error(ret));
 
 	usb_log_info("Controlling root hub '%s' (%" PRIun ").\n",
 	    ddf_dev_get_name(device), ddf_dev_get_handle(device));
-
 	return EOK;
 }
Index: uspace/drv/bus/usb/uhcirh/port.c
===================================================================
--- uspace/drv/bus/usb/uhcirh/port.c	(revision d93098016e1edb95431e7ca5092c5889f70c514a)
+++ uspace/drv/bus/usb/uhcirh/port.c	(revision cffa14e6a3bd4ce597e7947bdeaf548e0a312d19)
@@ -150,8 +150,18 @@
 {
 	uhci_port_t *instance = port;
-	int rc;
 	assert(instance);
 
 	unsigned allowed_failures = MAX_ERROR_COUNT;
+#define CHECK_RET_FAIL(ret, msg...) \
+	if (ret != EOK) { \
+		usb_log_error(msg); \
+		if (!(allowed_failures-- > 0)) { \
+			usb_log_fatal( \
+			   "Maximum number of failures reached, " \
+			   "bailing out.\n"); \
+			return ret; \
+		} \
+		continue; \
+	} else (void)0
 
 	while (1) {
@@ -172,12 +182,7 @@
 		    instance->id_string, port_status);
 
-		rc = usb_hc_connection_open(&instance->hc_connection);
-		if (rc != EOK) {
-			usb_log_error("%s: Failed to connect to HC %s.\n",
-			    instance->id_string, str_error(rc));
-			if (!(allowed_failures-- > 0))
-				goto fatal_error;
-			continue;
-		}
+		int ret = usb_hc_connection_open(&instance->hc_connection);
+		CHECK_RET_FAIL(ret, "%s: Failed to connect to HC %s.\n",
+		    instance->id_string, str_error(ret));
 
 		/* Remove any old device */
@@ -199,19 +204,9 @@
 		}
 
-		rc = usb_hc_connection_close(&instance->hc_connection);
-		if (rc != EOK) {
-			usb_log_error("%s: Failed to disconnect from HC %s.\n",
-			    instance->id_string, str_error(rc));
-			if (!(allowed_failures-- > 0))
-				goto fatal_error;
-			continue;
-		}
-	}
-
-	return EOK;
-
-fatal_error:
-	usb_log_fatal("Maximum number of failures reached, bailing out.\n");
-	return rc;
+		ret = usb_hc_connection_close(&instance->hc_connection);
+		CHECK_RET_FAIL(ret, "%s: Failed to disconnect from hc: %s.\n",
+		    instance->id_string, str_error(ret));
+	}
+	return EOK;
 }
 
