Index: uspace/drv/bus/usb/ehci/main.c
===================================================================
--- uspace/drv/bus/usb/ehci/main.c	(revision fddffb2826e5c2083834d6285660d19d7b748821)
+++ uspace/drv/bus/usb/ehci/main.c	(revision e26a9d95636fe7d9900d09ea304b6ff01e76cfb7)
@@ -64,8 +64,8 @@
 		return ENOMEM;
 
-	const int ret =  hc_init(instance, res, irq);
+	const int ret = hc_init(instance, res, irq);
 	if (ret == EOK)
 		hcd_set_implementation(hcd, instance, hc_schedule,
-		    NULL, NULL, ehci_interrupt);
+		    NULL, NULL, ehci_interrupt, NULL);
 	return ret;
 }
@@ -78,5 +78,5 @@
 
 	free(hcd->driver.data);
-	hcd_set_implementation(hcd, NULL, NULL, NULL, NULL, NULL);
+	hcd_set_implementation(hcd, NULL, NULL, NULL, NULL, NULL, NULL);
 }
 
Index: uspace/drv/bus/usb/ohci/hc.c
===================================================================
--- uspace/drv/bus/usb/ohci/hc.c	(revision fddffb2826e5c2083834d6285660d19d7b748821)
+++ uspace/drv/bus/usb/ohci/hc.c	(revision e26a9d95636fe7d9900d09ea304b6ff01e76cfb7)
@@ -273,4 +273,19 @@
 }
 
+int hc_status(hcd_t *hcd, uint32_t *status)
+{
+	assert(hcd);
+	assert(status);
+	hc_t *instance = hcd->driver.data;
+	assert(instance);
+
+	async_usleep(10000);
+	if (instance->registers){
+		*status = OHCI_RD(instance->registers->interrupt_status);
+		OHCI_WR(instance->registers->interrupt_status, *status);
+	}
+	return EOK;
+}
+
 /** Add USB transfer to the schedule.
  *
Index: uspace/drv/bus/usb/ohci/hc.h
===================================================================
--- uspace/drv/bus/usb/ohci/hc.h	(revision fddffb2826e5c2083834d6285660d19d7b748821)
+++ uspace/drv/bus/usb/ohci/hc.h	(revision e26a9d95636fe7d9900d09ea304b6ff01e76cfb7)
@@ -83,4 +83,5 @@
 void hc_dequeue_endpoint(hc_t *instance, const endpoint_t *ep);
 int hc_schedule(hcd_t *hcd, usb_transfer_batch_t *batch);
+int hc_status(hcd_t *hcd, uint32_t *status);
 
 void hc_interrupt(hc_t *instance, uint32_t status);
Index: uspace/drv/bus/usb/ohci/main.c
===================================================================
--- uspace/drv/bus/usb/ohci/main.c	(revision fddffb2826e5c2083834d6285660d19d7b748821)
+++ uspace/drv/bus/usb/ohci/main.c	(revision e26a9d95636fe7d9900d09ea304b6ff01e76cfb7)
@@ -66,5 +66,6 @@
 	if (ret == EOK)
 		hcd_set_implementation(hcd, instance, hc_schedule,
-		    ohci_endpoint_init, ohci_endpoint_fini, ohci_interrupt);
+		    ohci_endpoint_init, ohci_endpoint_fini, ohci_interrupt,
+		    hc_status);
 	return ret;
 }
@@ -77,5 +78,5 @@
 
 	free(hcd->driver.data);
-	hcd_set_implementation(hcd, NULL, NULL, NULL, NULL, NULL);
+	hcd_set_implementation(hcd, NULL, NULL, NULL, NULL, NULL, NULL);
 }
 
Index: uspace/drv/bus/usb/uhci/hc.c
===================================================================
--- uspace/drv/bus/usb/uhci/hc.c	(revision fddffb2826e5c2083834d6285660d19d7b748821)
+++ uspace/drv/bus/usb/uhci/hc.c	(revision e26a9d95636fe7d9900d09ea304b6ff01e76cfb7)
@@ -412,4 +412,20 @@
 }
 
+int hc_status(hcd_t *hcd, uint32_t *status)
+{
+	assert(hcd);
+	assert(status);
+	hc_t *instance = hcd->driver.data;
+	assert(instance);
+
+	*status = 0;
+	if (instance->registers) {
+		uint16_t s = pio_read_16(&instance->registers->usbsts);
+		pio_write_16(&instance->registers->usbsts, s);
+		*status = s;
+	}
+	return EOK;
+}
+
 /** Schedule batch for execution.
  *
Index: uspace/drv/bus/usb/uhci/hc.h
===================================================================
--- uspace/drv/bus/usb/uhci/hc.h	(revision fddffb2826e5c2083834d6285660d19d7b748821)
+++ uspace/drv/bus/usb/uhci/hc.h	(revision e26a9d95636fe7d9900d09ea304b6ff01e76cfb7)
@@ -127,8 +127,10 @@
 } hc_t;
 
-int hc_gen_irq_code(irq_code_t *code, const hw_res_list_parsed_t *hw_res);
-void hc_interrupt(hc_t *instance, uint16_t status);
 int hc_init(hc_t *instance, const hw_res_list_parsed_t *hw_res, bool interupts);
 void hc_fini(hc_t *instance);
+int hc_gen_irq_code(irq_code_t *code, const hw_res_list_parsed_t *hw_res);
+
+void hc_interrupt(hc_t *instance, uint16_t status);
+int hc_status(hcd_t *hcd, uint32_t *status);
 int hc_schedule(hcd_t *hcd, usb_transfer_batch_t *batch);
 
Index: uspace/drv/bus/usb/uhci/main.c
===================================================================
--- uspace/drv/bus/usb/uhci/main.c	(revision fddffb2826e5c2083834d6285660d19d7b748821)
+++ uspace/drv/bus/usb/uhci/main.c	(revision e26a9d95636fe7d9900d09ea304b6ff01e76cfb7)
@@ -68,5 +68,5 @@
 	if (ret == EOK)
 		hcd_set_implementation(hcd, instance, hc_schedule, NULL, NULL,
-		    uhci_interrupt);
+		    uhci_interrupt, hc_status);
 	return ret;
 }
@@ -79,5 +79,5 @@
 
 	free(hcd->driver.data);
-	hcd_set_implementation(hcd, NULL, NULL, NULL, NULL, NULL);
+	hcd_set_implementation(hcd, NULL, NULL, NULL, NULL, NULL, NULL);
 }
 
Index: uspace/drv/bus/usb/vhc/main.c
===================================================================
--- uspace/drv/bus/usb/vhc/main.c	(revision fddffb2826e5c2083834d6285660d19d7b748821)
+++ uspace/drv/bus/usb/vhc/main.c	(revision e26a9d95636fe7d9900d09ea304b6ff01e76cfb7)
@@ -95,5 +95,5 @@
 	}
 
-	hcd_set_implementation(dev_to_hcd(dev), data, vhc_schedule, NULL, NULL, NULL);
+	hcd_set_implementation(dev_to_hcd(dev), data, vhc_schedule, NULL, NULL, NULL, NULL);
 
 	/* Add virtual hub device */
