Index: uspace/drv/ohci/hc.c
===================================================================
--- uspace/drv/ohci/hc.c	(revision 4d946647c3564ff649c370717e8d9749e696135a)
+++ uspace/drv/ohci/hc.c	(revision 2c617b054f38d6bc24c9be033fa1ae5398436f74)
@@ -45,4 +45,6 @@
 
 static int interrupt_emulator(hc_t *instance);
+static void hc_gain_control(hc_t *instance);
+static void hc_init_hw(hc_t *instance);
 /*----------------------------------------------------------------------------*/
 int hc_register_hub(hc_t *instance, ddf_fun_t *hub_fun)
@@ -92,5 +94,9 @@
 	}
 
+	hc_gain_control(instance);
+
 	rh_init(&instance->rh, dev, instance->registers);
+
+	hc_init_hw(instance);
 
 	/* TODO: implement */
@@ -117,4 +123,6 @@
 		rh_interrupt(&instance->rh);
 
+	usb_log_info("OHCI interrupt: %x.\n", status);
+
 	/* TODO: Check for further interrupt causes */
 	/* TODO: implement */
@@ -126,5 +134,5 @@
 	usb_log_info("Started interrupt emulator.\n");
 	while (1) {
-		uint32_t status = instance->registers->interrupt_status;
+		const uint32_t status = instance->registers->interrupt_status;
 		instance->registers->interrupt_status = status;
 		hc_interrupt(instance, status);
@@ -133,4 +141,52 @@
 	return EOK;
 }
+/*----------------------------------------------------------------------------*/
+void hc_gain_control(hc_t *instance)
+{
+	assert(instance);
+	/* Interrupt routing enabled => smm driver is active */
+	if (instance->registers->control & C_IR) {
+		usb_log_info("Found SMM driver requesting ownership change.\n");
+		instance->registers->command_status |= CS_OCR;
+		while (instance->registers->control & C_IR) {
+			async_usleep(1000);
+		}
+		usb_log_info("Ownership taken from SMM driver.\n");
+		return;
+	}
+
+	const unsigned hc_status =
+	    (instance->registers->control >> C_HCFS_SHIFT) & C_HCFS_MASK;
+	/* Interrupt routing disabled && status != USB_RESET => BIOS active */
+	if (hc_status != C_HCFS_RESET) {
+		usb_log_info("Found BIOS driver.\n");
+		if (hc_status == C_HCFS_OPERATIONAL) {
+			usb_log_info("HC operational(BIOS).\n");
+			return;
+		}
+		/* HC is suspended assert resume for 20ms */
+		instance->registers->control &= (C_HCFS_RESUME << C_HCFS_SHIFT);
+		async_usleep(20000);
+		return;
+	}
+
+	/* HC is in reset (hw startup) => no other driver
+	 * maintain reset for at least the time specified in USB spec (50 ms)*/
+	async_usleep(50000);
+}
+/*----------------------------------------------------------------------------*/
+void hc_init_hw(hc_t *instance)
+{
+	assert(instance);
+	const uint32_t fm_interval = instance->registers->fm_interval;
+	instance->registers->command_status = CS_HCR;
+	async_usleep(10);
+	instance->registers->fm_interval = fm_interval;
+	assert((instance->registers->command_status & CS_HCR) == 0);
+	/* hc is now in suspend state */
+
+	instance->registers->control &= (C_HCFS_OPERATIONAL << C_HCFS_SHIFT);
+	usb_log_info("OHCI HC up and running.\n");
+}
 /**
  * @}
Index: uspace/drv/ohci/ohci_regs.h
===================================================================
--- uspace/drv/ohci/ohci_regs.h	(revision 4d946647c3564ff649c370717e8d9749e696135a)
+++ uspace/drv/ohci/ohci_regs.h	(revision 2c617b054f38d6bc24c9be033fa1ae5398436f74)
@@ -39,7 +39,32 @@
 typedef struct ohci_regs
 {
-	volatile uint32_t revision;
+	const volatile uint32_t revision;
 	volatile uint32_t control;
+#define C_CSBR_MASK (0x3)
+#define C_CSBR_SHIFT (0)
+#define C_PLE (1 << 2)
+#define C_IE (1 << 3)
+#define C_CLE (1 << 4)
+#define C_BLE (1 << 5)
+
+#define C_HCFS_MASK (0x3)
+#define C_HCFS_SHIFT (6)
+#define C_HCFS_RESET (0x0)
+#define C_HCFS_OPERATIONAL (0x1)
+#define C_HCFS_RESUME (0x2)
+#define C_HCFS_SUSPEND (0x3)
+
+#define C_IR (1 << 8)
+#define C_RWC (1 << 9)
+#define C_RWE (1 << 10)
+
 	volatile uint32_t command_status;
+#define CS_HCR (1 << 0)
+#define CS_CLF (1 << 1)
+#define CS_BLF (1 << 2)
+#define CS_OCR (1 << 3)
+#define CS_SOC_MASK (0x3)
+#define CS_SOC_SHIFT (16)
+
 	volatile uint32_t interrupt_status;
 #define IS_SO (1 << 0)
@@ -51,4 +76,5 @@
 #define IS_RHSC (1 << 6)
 #define IS_OC (1 << 30)
+
 	volatile uint32_t interupt_enable;
 #define IE_SO   (1 << 0)
Index: uspace/drv/ohci/root_hub.c
===================================================================
--- uspace/drv/ohci/root_hub.c	(revision 4d946647c3564ff649c370717e8d9749e696135a)
+++ uspace/drv/ohci/root_hub.c	(revision 2c617b054f38d6bc24c9be033fa1ae5398436f74)
@@ -252,5 +252,5 @@
 
 
-	usb_log_info("OHCI root hub with %d ports.\n", regs->rh_desc_a & 0xff);
+	usb_log_info("OHCI root hub with %d ports.\n", instance->port_count);
 
 	//start generic usb hub driver
