Index: uspace/drv/uhci/callback.c
===================================================================
--- uspace/drv/uhci/callback.c	(revision 7fc092aa97e8ab15728e29fd3aa1ab61ca8620a3)
+++ uspace/drv/uhci/callback.c	(revision db7ed07d8ae15decfe15ea427ac19d5f2e1f0706)
@@ -1,3 +1,4 @@
 #include <errno.h>
+#include <mem.h>
 
 #include "callback.h"
@@ -26,2 +27,21 @@
 	return EOK;
 }
+/*----------------------------------------------------------------------------*/
+void callback_run(
+callback_t *instance, usb_transaction_outcome_t outcome, size_t act_size)
+{
+	assert(instance);
+
+	/* update the old buffer */
+	if (instance->new_buffer) {
+		memcpy(instance->new_buffer, instance->old_buffer, instance->buffer_size);
+		trans_free(instance->new_buffer);
+		instance->new_buffer = NULL;
+	}
+
+	if (instance->callback_in) {
+		assert(instance->callback_out == NULL);
+		instance->callback_in(
+		  instance->dev, act_size, outcome, instance->arg);
+	}
+}
Index: uspace/drv/uhci/callback.h
===================================================================
--- uspace/drv/uhci/callback.h	(revision 7fc092aa97e8ab15728e29fd3aa1ab61ca8620a3)
+++ uspace/drv/uhci/callback.h	(revision db7ed07d8ae15decfe15ea427ac19d5f2e1f0706)
@@ -35,6 +35,6 @@
 #define DRV_UHCI_CALLBACK_H
 
-#include <mem.h>
 #include <usbhc_iface.h>
+#include <usb/usb.h>
 
 #include "debug.h"
@@ -49,4 +49,5 @@
 	void *arg;
 	size_t buffer_size;
+	size_t actual_size;
 	device_t *dev;
 } callback_t;
@@ -69,4 +70,7 @@
 		trans_free(instance->new_buffer);
 }
+
+void callback_run(
+  callback_t *instance, usb_transaction_outcome_t outcome, size_t act_size);
 #endif
 /**
