Index: uspace/drv/uhci-hcd/uhci.c
===================================================================
--- uspace/drv/uhci-hcd/uhci.c	(revision 6298d806bfbee483788e8fa047dce6116a5deda6)
+++ uspace/drv/uhci-hcd/uhci.c	(revision ff34e5aa0ca881086c2c718f37808d217179c40f)
@@ -174,5 +174,5 @@
 	    "Failed(%d) to disable legacy USB: %s.\n", ret, str_error(ret));
 
-#if 0
+	bool interrupts = false;
 	ret = pci_enable_interrupts(device);
 	if (ret != EOK) {
@@ -180,13 +180,16 @@
 		    "Failed(%d) to enable interrupts, fall back to polling.\n",
 		    ret);
+	} else {
+		usb_log_debug("Hw interrupts enabled.\n");
+		interrupts = true;
 	}
-#endif
 
 	instance->hc_fun = ddf_fun_create(device, fun_exposed, "uhci-hc");
 	ret = (instance->hc_fun == NULL) ? ENOMEM : EOK;
-	CHECK_RET_DEST_FUN_RETURN(ret, "Failed(%d) to create HC function.\n", ret);
-
-	ret = uhci_hc_init(
-	    &instance->hc, instance->hc_fun, (void*)io_reg_base, io_reg_size);
+	CHECK_RET_DEST_FUN_RETURN(ret,
+	    "Failed(%d) to create HC function.\n", ret);
+
+	ret = uhci_hc_init(&instance->hc, instance->hc_fun,
+	    (void*)io_reg_base, io_reg_size, interrupts);
 	CHECK_RET_DEST_FUN_RETURN(ret, "Failed(%d) to init uhci-hcd.\n", ret);
 	instance->hc_fun->ops = &uhci_hc_ops;
@@ -234,5 +237,4 @@
 #undef CHECK_RET_FINI_RETURN
 }
-
 /**
  * @}
Index: uspace/drv/uhci-hcd/uhci_hc.c
===================================================================
--- uspace/drv/uhci-hcd/uhci_hc.c	(revision 6298d806bfbee483788e8fa047dce6116a5deda6)
+++ uspace/drv/uhci-hcd/uhci_hc.c	(revision ff34e5aa0ca881086c2c718f37808d217179c40f)
@@ -82,5 +82,6 @@
  * interrupt fibrils.
  */
-int uhci_hc_init(uhci_hc_t *instance, ddf_fun_t *fun, void *regs, size_t reg_size)
+int uhci_hc_init(uhci_hc_t *instance, ddf_fun_t *fun,
+    void *regs, size_t reg_size, bool interrupts)
 {
 	assert(reg_size >= sizeof(regs_t));
@@ -95,4 +96,5 @@
 	} else (void) 0
 
+	instance->hw_interrupts = interrupts;
 	/* Setup UHCI function. */
 	instance->ddf_instance = fun;
@@ -113,7 +115,9 @@
 
 	uhci_hc_init_hw(instance);
-	instance->cleaner =
-	    fibril_create(uhci_hc_interrupt_emulator, instance);
-	fibril_add_ready(instance->cleaner);
+	if (!interrupts) {
+		instance->cleaner =
+		    fibril_create(uhci_hc_interrupt_emulator, instance);
+		fibril_add_ready(instance->cleaner);
+	}
 
 	instance->debug_checker = fibril_create(uhci_hc_debug_checker, instance);
@@ -149,7 +153,9 @@
 	pio_write_32(&registers->flbaseadd, pa);
 
-	/* Enable all interrupts, but resume interrupt */
-	pio_write_16(&instance->registers->usbintr,
-	    UHCI_INTR_CRC | UHCI_INTR_COMPLETE | UHCI_INTR_SHORT_PACKET);
+	if (instance->hw_interrupts) {
+		/* Enable all interrupts, but resume interrupt */
+		pio_write_16(&instance->registers->usbintr,
+		    UHCI_INTR_CRC | UHCI_INTR_COMPLETE | UHCI_INTR_SHORT_PACKET);
+	}
 
 	uint16_t status = pio_read_16(&registers->usbcmd);
Index: uspace/drv/uhci-hcd/uhci_hc.h
===================================================================
--- uspace/drv/uhci-hcd/uhci_hc.h	(revision 6298d806bfbee483788e8fa047dce6116a5deda6)
+++ uspace/drv/uhci-hcd/uhci_hc.h	(revision ff34e5aa0ca881086c2c718f37808d217179c40f)
@@ -99,9 +99,11 @@
 	fid_t cleaner;
 	fid_t debug_checker;
+	bool hw_interrupts;
 
 	ddf_fun_t *ddf_instance;
 } uhci_hc_t;
 
-int uhci_hc_init(uhci_hc_t *instance, ddf_fun_t *fun, void *regs, size_t reg_size);
+int uhci_hc_init(uhci_hc_t *instance, ddf_fun_t *fun,
+    void *regs, size_t reg_size, bool interupts);
 
 int uhci_hc_schedule(uhci_hc_t *instance, batch_t *batch);
