Index: uspace/drv/uhci-hcd/main.c
===================================================================
--- uspace/drv/uhci-hcd/main.c	(revision acce4fc50672538875733a749abc40aa3ffd1cf5)
+++ uspace/drv/uhci-hcd/main.c	(revision 733a9a86e541af855e643d98b787df442b8f5ac1)
@@ -34,4 +34,8 @@
 #include <driver.h>
 #include <usb_iface.h>
+#include <ipc/irc.h>
+#include <ipc/ns.h>
+#include <ipc/services.h>
+#include <sysinfo.h>
 
 #include <errno.h>
@@ -76,4 +80,25 @@
 };
 /*----------------------------------------------------------------------------*/
+static irq_cmd_t uhci_cmds[] = {
+	{
+		.cmd = CMD_PIO_READ_16,
+		.addr = (void*)0xc022,
+		.dstarg = 1
+	},
+	{
+		.cmd = CMD_PIO_WRITE_16,
+		.addr = (void*)0xc022,
+		.value = 0x1f
+	},
+	{
+		.cmd = CMD_ACCEPT
+	}
+};
+/*----------------------------------------------------------------------------*/
+static irq_code_t uhci_code = {
+	sizeof(uhci_cmds) / sizeof(irq_cmd_t),
+	uhci_cmds
+};
+/*----------------------------------------------------------------------------*/
 static void irq_handler(device_t *device, ipc_callid_t iid, ipc_call_t *call)
 {
@@ -81,6 +106,7 @@
 	uhci_t *hc = dev_to_uhci(device);
 	usb_log_info("LOL HARDWARE INTERRUPT: %p.\n", hc);
+	uint16_t status = IPC_GET_ARG1(*call);
 	assert(hc);
-	uhci_interrupt(hc);
+	uhci_interrupt(hc, status);
 }
 /*----------------------------------------------------------------------------*/
@@ -109,5 +135,28 @@
 	    io_reg_base, io_reg_size, irq);
 
-	ret = register_interrupt_handler(device, irq, irq_handler, NULL);
+
+  sysarg_t apic;
+  sysarg_t i8259;
+	int irc_phone = -1;
+	int irc_service = 0;
+
+  if ((sysinfo_get_value("apic", &apic) == EOK) && (apic)) {
+    irc_service = SERVICE_APIC;
+		usb_log_debug("SERVICE_APIC\n");
+	} else if ((sysinfo_get_value("i8259", &i8259) == EOK) && (i8259)) {
+    irc_service = SERVICE_I8259;
+		usb_log_debug("SERVICE_I8259\n");
+	}
+
+  if (irc_service) {
+    while (irc_phone < 0)
+      irc_phone = service_connect_blocking(irc_service, 0, 0);
+  }
+	usb_log_debug("Interrupt conttroller phone: %d\n", irc_phone);
+
+	async_msg_1(irc_phone, IRC_ENABLE_INTERRUPT, irq);
+//	async_hangup(irc_phone);
+
+	ret = register_interrupt_handler(device, irq, irq_handler, &uhci_code);
 	usb_log_debug("Registered interrupt handler %d.\n", ret);
 
