Index: uspace/drv/bus/usb/ohci/hc.c
===================================================================
--- uspace/drv/bus/usb/ohci/hc.c	(revision 1ecc5de1d337ceff079d76dbbb6c1ce44a6dcc3c)
+++ uspace/drv/bus/usb/ohci/hc.c	(revision 2e8a01b2cebc9fc49dcf219d055df8f0f2265a08)
@@ -177,6 +177,10 @@
 	 * and accepts physical addresses in IRQ code.
 	 * TODO: remove */
-	void *registers;
-	const int ret = pio_enable((void*)regs, reg_size, &registers);
+	ohci_regs_t *registers;
+	const int ret = pio_enable((void*)regs, reg_size, (void**)&registers);
+
+	/* Some bogus access to force create mapping. DO NOT remove,
+	 * unless whole virtual addresses in irq is replaced */
+	registers->revision;
 
 	if (ret != EOK)
@@ -185,5 +189,5 @@
 	memcpy(cmds, ohci_irq_commands, sizeof(ohci_irq_commands));
 
-	void *address = (void*)&(((ohci_regs_t*)registers)->interrupt_status);
+	void *address = (void*)&registers->interrupt_status;
 	cmds[0].addr = address;
 	cmds[3].addr = address;
Index: uspace/drv/bus/usb/ohci/ohci.c
===================================================================
--- uspace/drv/bus/usb/ohci/ohci.c	(revision 1ecc5de1d337ceff079d76dbbb6c1ce44a6dcc3c)
+++ uspace/drv/bus/usb/ohci/ohci.c	(revision 2e8a01b2cebc9fc49dcf219d055df8f0f2265a08)
@@ -194,20 +194,31 @@
 	    (void *) reg_base, reg_size, irq);
 
+	const size_t cmd_count = hc_irq_cmd_count();
+	irq_cmd_t irq_cmds[cmd_count];
+	ret =
+	    hc_get_irq_commands(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));
+
+	irq_code_t irq_code = { .cmdcount = cmd_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(%d) to register interrupt handler.\n", ret);
+
+	/* Try to enable interrupts */
 	bool interrupts = false;
-#ifdef CONFIG_USBHC_NO_INTERRUPTS
-	usb_log_warning("Interrupts disabled in OS config, "
-	    "falling back to polling.\n");
-#else
 	ret = pci_enable_interrupts(device);
 	if (ret != EOK) {
-		usb_log_warning("Failed to enable interrupts: %s.\n",
-		    str_error(ret));
-		usb_log_info("HW interrupts not available, "
-		    "falling back to polling.\n");
+		usb_log_warning("Failed to enable interrupts: %s."
+		    "Falling back to pollling\n", str_error(ret));
+		/* We don't need that handler */
+		unregister_interrupt_handler(device, irq);
 	} else {
 		usb_log_debug("Hw interrupts enabled.\n");
 		interrupts = true;
 	}
-#endif
 
 	ret = hc_init(&instance->hc, reg_base, reg_size, interrupts);
@@ -216,13 +227,9 @@
 #define CHECK_RET_FINI_RETURN(ret, message...) \
 if (ret != EOK) { \
+	unregister_interrupt_handler(device, irq); \
 	hc_fini(&instance->hc); \
 	CHECK_RET_DEST_FREE_RETURN(ret, message); \
 } else (void)0
 
-	/* It does no harm if we register this on polling */
-	ret = register_interrupt_handler(device, irq, irq_handler,
-	    &instance->hc.interrupt_code);
-	CHECK_RET_FINI_RETURN(ret,
-	    "Failed(%d) to register interrupt handler.\n", ret);
 
 	ret = ddf_fun_bind(instance->hc_fun);
