Index: uspace/drv/ohci/main.c
===================================================================
--- uspace/drv/ohci/main.c	(revision 42dbb26020dcadba38f83b0bcdeb9bd84c4c7122)
+++ uspace/drv/ohci/main.c	(revision e7bc999ad582830200c9cdebcd975dc5ed9cc969)
@@ -48,4 +48,18 @@
 
 static int ohci_add_device(ddf_dev_t *device);
+/*----------------------------------------------------------------------------*/
+/** IRQ handling callback, identifies device
+ *
+ * @param[in] dev DDF instance of the device to use.
+ * @param[in] iid (Unused).
+ * @param[in] call Pointer to the call that represents interrupt.
+ */
+static void irq_handler(ddf_dev_t *dev, ipc_callid_t iid, ipc_call_t *call)
+{
+	assert(dev);
+	ohci_hc_t *hc = (ohci_hc_t*)dev->driver_data;
+	assert(hc);
+	ohci_hc_interrupt(hc, 0);
+}
 /*----------------------------------------------------------------------------*/
 static driver_ops_t ohci_driver_ops = {
@@ -104,5 +118,16 @@
 	}
 
-	ret = ohci_hc_init(hcd, hc_fun, mem_reg_base, mem_reg_size);
+	bool interrupts = false;
+	ret = pci_enable_interrupts(device);
+	if (ret != EOK) {
+		usb_log_warning(
+		    "Failed(%d) to enable interrupts, fall back to polling.\n",
+		    ret);
+	} else {
+		usb_log_debug("Hw interrupts enabled.\n");
+		interrupts = true;
+	}
+
+	ret = ohci_hc_init(hcd, hc_fun, mem_reg_base, mem_reg_size, interrupts);
 	if (ret != EOK) {
 		usb_log_error("Failed to initialize OHCI driver.\n");
@@ -110,4 +135,6 @@
 		return ret;
 	}
+
+	ret = register_interrupt_handler(device, irq, irq_handler, NULL);
 
 	hc_fun->ops = &hc_ops;
Index: uspace/drv/ohci/ohci_hc.c
===================================================================
--- uspace/drv/ohci/ohci_hc.c	(revision 42dbb26020dcadba38f83b0bcdeb9bd84c4c7122)
+++ uspace/drv/ohci/ohci_hc.c	(revision e7bc999ad582830200c9cdebcd975dc5ed9cc969)
@@ -45,5 +45,5 @@
 
 int ohci_hc_init(ohci_hc_t *instance, ddf_fun_t *fun,
-    uintptr_t regs, size_t reg_size)
+    uintptr_t regs, size_t reg_size, bool interrupts)
 {
 	assert(instance);
@@ -53,4 +53,8 @@
 		return ret;
 	}
+	instance->registers->interrupt_disable = 0;
+	/* enable interrupt on root hub status change */
+	instance->registers->interupt_enable |= IE_RHSC | IE_MIE;
+
 
 	ohci_rh_init(&instance->rh, instance->registers);
@@ -75,4 +79,5 @@
 {
 	assert(instance);
+	/* TODO: Check for interrupt cause */
 	ohci_rh_interrupt(&instance->rh);
 	/* TODO: implement */
Index: uspace/drv/ohci/ohci_hc.h
===================================================================
--- uspace/drv/ohci/ohci_hc.h	(revision 42dbb26020dcadba38f83b0bcdeb9bd84c4c7122)
+++ uspace/drv/ohci/ohci_hc.h	(revision e7bc999ad582830200c9cdebcd975dc5ed9cc969)
@@ -56,5 +56,5 @@
 
 int ohci_hc_init(ohci_hc_t *instance, ddf_fun_t *fun,
-     uintptr_t regs, size_t reg_size);
+     uintptr_t regs, size_t reg_size, bool interrupts);
 
 int ohci_hc_schedule(ohci_hc_t *instance, batch_t *batch);
Index: uspace/drv/ohci/ohci_regs.h
===================================================================
--- uspace/drv/ohci/ohci_regs.h	(revision 42dbb26020dcadba38f83b0bcdeb9bd84c4c7122)
+++ uspace/drv/ohci/ohci_regs.h	(revision e7bc999ad582830200c9cdebcd975dc5ed9cc969)
@@ -42,5 +42,16 @@
 	volatile uint32_t control;
 	volatile uint32_t command_status;
+	volatile uint32_t interrupt_status;
 	volatile uint32_t interupt_enable;
+#define IE_SO   (1 << 0)
+#define IE_WDH  (1 << 1)
+#define IE_SF   (1 << 2)
+#define IE_RD   (1 << 3)
+#define IE_UE   (1 << 4)
+#define IE_FNO  (1 << 5)
+#define IE_RHSC (1 << 6)
+#define IE_OC   (1 << 30)
+#define IE_MIE  (1 << 31)
+
 	volatile uint32_t interrupt_disable;
 	volatile uint32_t hcca;
@@ -60,5 +71,5 @@
 	volatile uint32_t rh_status;
 	volatile uint32_t rh_port_status[];
-} ohci_regs_t;
+} __attribute__((packed)) ohci_regs_t;
 #endif
 /**
Index: uspace/drv/ohci/ohci_rh.c
===================================================================
--- uspace/drv/ohci/ohci_rh.c	(revision 42dbb26020dcadba38f83b0bcdeb9bd84c4c7122)
+++ uspace/drv/ohci/ohci_rh.c	(revision e7bc999ad582830200c9cdebcd975dc5ed9cc969)
@@ -62,4 +62,5 @@
 void ohci_rh_interrupt(ohci_rh_t *instance)
 {
+	usb_log_info("Interrupt!!.\n");
 	/* TODO: implement */
 }
Index: uspace/drv/ohci/pci.c
===================================================================
--- uspace/drv/ohci/pci.c	(revision 42dbb26020dcadba38f83b0bcdeb9bd84c4c7122)
+++ uspace/drv/ohci/pci.c	(revision e7bc999ad582830200c9cdebcd975dc5ed9cc969)
@@ -146,4 +146,5 @@
 int pci_enable_interrupts(ddf_dev_t *device)
 {
+	return ENOTSUP;
 	int parent_phone =
 	    devman_parent_device_connect(device->handle, IPC_FLAG_BLOCKING);
