Index: uspace/drv/bus/usb/ehci/hc.c
===================================================================
--- uspace/drv/bus/usb/ehci/hc.c	(revision c9e954c5d2bc19b38973a2834ef7eb10f79df43f)
+++ uspace/drv/bus/usb/ehci/hc.c	(revision 615abda20d74aedcb4566ab9cb246048e0be4e8e)
@@ -280,4 +280,34 @@
 void hc_start(hc_t *instance)
 {
+	assert(instance);
+	/*
+	 * TURN OFF EHCI FOR NOW
+	 */
+
+	usb_log_debug("USBCMD value: %x.\n",
+	    EHCI_RD(instance->registers->usbcmd));
+	if (EHCI_RD(instance->registers->usbcmd) & USB_CMD_RUN_FLAG) {
+		/* disable all interrupts */
+		EHCI_WR(instance->registers->usbintr, 0);
+		/* ack all interrupts */
+		EHCI_WR(instance->registers->usbsts, 0x3f);
+		/* release RH ports */
+		EHCI_WR(instance->registers->configflag, 0);
+		EHCI_WR(instance->registers->usbcmd, 0);
+		/* Wait until hc is halted */
+		while ((EHCI_RD(instance->registers->usbsts) & USB_STS_HC_HALTED_FLAG) == 0);
+		usb_log_info("EHCI turned off.\n");
+	} else {
+		usb_log_info("EHCI was not running.\n");
+	}
+	usb_log_debug("Registers: \n"
+	    "\t USBCMD(%p): %x(0x00080000 = at least 1ms between interrupts)\n"
+	    "\t USBSTS(%p): %x(0x00001000 = HC halted)\n"
+	    "\t USBINT(%p): %x(0x0 = no interrupts).\n"
+	    "\t CONFIG(%p): %x(0x0 = ports controlled by companion hc).\n",
+	    &instance->registers->usbcmd, EHCI_RD(instance->registers->usbcmd),
+	    &instance->registers->usbsts, EHCI_RD(instance->registers->usbsts),
+	    &instance->registers->usbintr, EHCI_RD(instance->registers->usbintr),
+	    &instance->registers->configflag, EHCI_RD(instance->registers->configflag));
 }
 
Index: uspace/drv/bus/usb/ehci/main.c
===================================================================
--- uspace/drv/bus/usb/ehci/main.c	(revision c9e954c5d2bc19b38973a2834ef7eb10f79df43f)
+++ uspace/drv/bus/usb/ehci/main.c	(revision 615abda20d74aedcb4566ab9cb246048e0be4e8e)
@@ -96,5 +96,12 @@
 	assert(device);
 
-	const int ret = ddf_hcd_device_setup_all(device, USB_SPEED_HIGH,
+	int ret = disable_legacy(device);
+	if (ret != EOK) {
+		usb_log_error("Failed to disable EHCI legacy support: %s\n",
+		    str_error(ret));
+		return ret;
+	}
+
+	ret = ddf_hcd_device_setup_all(device, USB_SPEED_HIGH,
 	    BANDWIDTH_AVAILABLE_USB20, bandwidth_count_usb11,
 	    ddf_hcd_gen_irq_handler, ehci_hc_gen_irq_code,
@@ -103,4 +110,5 @@
 		usb_log_error("Failed to initialize EHCI driver: %s.\n",
 		    str_error(ret));
+		return ret;
 	}
 	usb_log_info("Controlling new EHCI device '%s'.\n",
Index: uspace/drv/bus/usb/ehci/res.c
===================================================================
--- uspace/drv/bus/usb/ehci/res.c	(revision c9e954c5d2bc19b38973a2834ef7eb10f79df43f)
+++ uspace/drv/bus/usb/ehci/res.c	(revision 615abda20d74aedcb4566ab9cb246048e0be4e8e)
@@ -62,5 +62,5 @@
  * @return Error code.
  */
-static int disable_extended_caps(ddf_dev_t *device, unsigned eecp)
+static int disable_extended_caps(async_sess_t *parent_sess, unsigned eecp)
 {
 	/* nothing to do */
@@ -68,22 +68,12 @@
 		return EOK;
 
-	async_sess_t *parent_sess = devman_parent_device_connect(
-	    EXCHANGE_SERIALIZE, ddf_dev_get_handle(device), IPC_FLAG_BLOCKING);
-	if (!parent_sess)
-		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 ret = pci_config_space_read_32(parent_sess,
 	    eecp + USBLEGSUP_OFFSET, &usblegsup);
-	CHECK_RET_HANGUP_RETURN(ret,
-	    "Failed to read USBLEGSUP: %s.\n", str_error(ret));
+	if (ret != EOK) {
+		usb_log_error("Failed to read USBLEGSUP: %s.\n", str_error(ret));
+		return ret;
+	}
 	usb_log_debug("USBLEGSUP: %" PRIx32 ".\n", usblegsup);
 
@@ -93,6 +83,9 @@
 	ret = pci_config_space_write_8(parent_sess,
 	    eecp + USBLEGSUP_OFFSET + 3, 1);
-	CHECK_RET_HANGUP_RETURN(ret, "Failed to request OS EHCI control: %s.\n",
-	    str_error(ret));
+	if (ret != EOK) {
+		usb_log_error("Failed to request OS EHCI control: %s.\n",
+		    str_error(ret));
+		return ret;
+	}
 
 	size_t wait = 0;
@@ -110,5 +103,4 @@
 	if ((usblegsup & USBLEGSUP_BIOS_CONTROL) == 0) {
 		usb_log_info("BIOS released control after %zu usec.\n", wait);
-		async_hangup(parent_sess);
 		return EOK;
 	}
@@ -119,6 +111,10 @@
 	ret = pci_config_space_write_32(parent_sess,
 	    eecp + USBLEGSUP_OFFSET, USBLEGSUP_OS_CONTROL);
-	CHECK_RET_HANGUP_RETURN(ret, "Failed to force OS control: "
-	    "%s.\n", str_error(ret));
+	if (ret != EOK) {
+		usb_log_error("Failed to force OS control: %s.\n",
+		    str_error(ret));
+		return ret;
+	}
+
 	/*
 	 * Check capability type here, value of 01h identifies the capability
@@ -132,6 +128,9 @@
 		ret = pci_config_space_read_32(parent_sess,
 		    eecp + USBLEGCTLSTS_OFFSET, &usblegctlsts);
-		CHECK_RET_HANGUP_RETURN(ret, "Failed to get USBLEGCTLSTS: %s.\n",
-		    str_error(ret));
+		if (ret != EOK) {
+			usb_log_error("Failed to get USBLEGCTLSTS: %s.\n",
+			    str_error(ret));
+			return ret;
+		}
 		usb_log_debug("USBLEGCTLSTS: %" PRIx32 ".\n", usblegctlsts);
 		/*
@@ -142,10 +141,19 @@
 		ret = pci_config_space_write_32(parent_sess,
 		    eecp + USBLEGCTLSTS_OFFSET, 0xe0000000);
-		CHECK_RET_HANGUP_RETURN(ret, "Failed(%d) zero USBLEGCTLSTS.\n", ret);
+		if (ret != EOK) {
+			usb_log_error("Failed to zero USBLEGCTLSTS: %s\n",
+			    str_error(ret));
+			return ret;
+		}
+
 		udelay(10);
+		/* read again to amke sure it's zeroed */
 		ret = pci_config_space_read_32(parent_sess,
 		    eecp + USBLEGCTLSTS_OFFSET, &usblegctlsts);
-		CHECK_RET_HANGUP_RETURN(ret, "Failed to get USBLEGCTLSTS 2: %s.\n",
-		    str_error(ret));
+		if (ret != EOK) {
+			usb_log_error("Failed to get USBLEGCTLSTS 2: %s.\n",
+			    str_error(ret));
+			return ret;
+		}
 		usb_log_debug("Zeroed USBLEGCTLSTS: %" PRIx32 ".\n",
 		    usblegctlsts);
@@ -155,24 +163,47 @@
 	ret = pci_config_space_read_32(parent_sess,
 	    eecp + USBLEGSUP_OFFSET, &usblegsup);
-	CHECK_RET_HANGUP_RETURN(ret, "Failed to read USBLEGSUP: %s.\n",
-	    str_error(ret));
+	if (ret != EOK) {
+		usb_log_error("Failed to read USBLEGSUP: %s.\n",
+		    str_error(ret));
+		return ret;
+	}
 	usb_log_debug("USBLEGSUP: %" PRIx32 ".\n", usblegsup);
-	async_hangup(parent_sess);
-	return EOK;
-#undef CHECK_RET_HANGUP_RETURN
+	return ret;
 }
 
-int disable_legacy(ddf_dev_t *device, addr_range_t *reg_range)
+int disable_legacy(ddf_dev_t *device)
 {
 	assert(device);
+
+	async_sess_t *parent_sess = devman_parent_device_connect(
+	    EXCHANGE_SERIALIZE, ddf_dev_get_handle(device), IPC_FLAG_BLOCKING);
+	if (!parent_sess)
+		return ENOMEM;
+
 	usb_log_debug("Disabling EHCI legacy support.\n");
+
+	hw_res_list_parsed_t res;
+	hw_res_list_parsed_init(&res);
+	int ret = hw_res_get_list_parsed(parent_sess, &res, 0);
+	if (ret != EOK) {
+		usb_log_error("Failed to get resource list: %s\n",
+		    str_error(ret));
+		goto clean;
+	}
+
+	if (res.mem_ranges.count < 1) {
+		usb_log_error("Incorrect mem range count: %zu",
+		    res.mem_ranges.count);
+		ret = EINVAL;
+		goto clean;
+	}
 
 	/* Map EHCI registers */
 	void *regs = NULL;
-	int ret = pio_enable_range(reg_range, &regs);
+	ret = pio_enable_range(&res.mem_ranges.ranges[0], &regs);
 	if (ret != EOK) {
 		usb_log_error("Failed to map registers %p: %s.\n",
-		    RNGABSPTR(*reg_range), str_error(ret));
-		return ret;
+		    RNGABSPTR(res.mem_ranges.ranges[0]), str_error(ret));
+		goto clean;
 	}
 
@@ -190,44 +221,14 @@
 	usb_log_debug("Value of EECP: %x.\n", eecp);
 
-	ret = disable_extended_caps(device, eecp);
+	ret = disable_extended_caps(parent_sess, eecp);
 	if (ret != EOK) {
 		usb_log_error("Failed to disable extended capabilities: %s.\n",
 		    str_error(ret));
-		return ret;
-	}
-
-
-	/*
-	 * TURN OFF EHCI FOR NOW, DRIVER WILL REINITIALIZE IT IF NEEDED
-	 */
-
-	/* Get size of capability registers in memory space. */
-	const unsigned operation_offset = EHCI_RD8(ehci_caps->caplength);
-	usb_log_debug("USBCMD offset: %d.\n", operation_offset);
-
-	ehci_regs_t *ehci_regs = regs + operation_offset;
-
-	usb_log_debug("USBCMD value: %x.\n", EHCI_RD(ehci_regs->usbcmd));
-	if (EHCI_RD(ehci_regs->usbcmd) & USB_CMD_RUN_FLAG) {
-		EHCI_WR(ehci_regs->usbintr, 0); /* disable all interrupts */
-		EHCI_WR(ehci_regs->usbsts, 0x3f); /* ack all interrupts */
-		EHCI_WR(ehci_regs->configflag, 0); /* release RH ports */
-		EHCI_WR(ehci_regs->usbcmd, 0);
-		/* Wait until hc is halted */
-		while ((EHCI_RD(ehci_regs->usbsts) & USB_STS_HC_HALTED_FLAG) == 0);
-		usb_log_info("EHCI turned off.\n");
-	} else {
-		usb_log_info("EHCI was not running.\n");
-	}
-	usb_log_debug("Registers: \n"
-	    "\t USBCMD(%p): %x(0x00080000 = at least 1ms between interrupts)\n"
-	    "\t USBSTS(%p): %x(0x00001000 = HC halted)\n"
-	    "\t USBINT(%p): %x(0x0 = no interrupts).\n"
-	    "\t CONFIG(%p): %x(0x0 = ports controlled by companion hc).\n",
-	    &ehci_regs->usbcmd, EHCI_RD(ehci_regs->usbcmd),
-	    &ehci_regs->usbsts, EHCI_RD(ehci_regs->usbsts),
-	    &ehci_regs->usbintr, EHCI_RD(ehci_regs->usbintr),
-	    &ehci_regs->configflag, EHCI_RD(ehci_regs->configflag));
-
+		    goto clean;
+	}
+clean:
+	//TODO unmap registers
+	hw_res_list_parsed_clean(&res);
+	async_hangup(parent_sess);
 	return ret;
 }
Index: uspace/drv/bus/usb/ehci/res.h
===================================================================
--- uspace/drv/bus/usb/ehci/res.h	(revision c9e954c5d2bc19b38973a2834ef7eb10f79df43f)
+++ uspace/drv/bus/usb/ehci/res.h	(revision 615abda20d74aedcb4566ab9cb246048e0be4e8e)
@@ -39,5 +39,5 @@
 #include <device/hw_res_parsed.h>
 
-int disable_legacy(ddf_dev_t *, addr_range_t *);
+int disable_legacy(ddf_dev_t *);
 
 #endif
