Index: uspace/drv/ohci/batch.c
===================================================================
--- uspace/drv/ohci/batch.c	(revision 27eb1feee823a9136336d32f6d64bead7cd0442e)
+++ uspace/drv/ohci/batch.c	(revision ad86349bd7acf373b4c5368444bebce81572be6f)
@@ -147,4 +147,5 @@
 	    data->ed->next);
 	size_t i = 0;
+	instance->transfered_size = instance->buffer_size;
 	for (; i < tds; ++i) {
 		assert(data->tds[i] != NULL);
@@ -156,6 +157,4 @@
 		}
 		instance->error = td_error(data->tds[i]);
-		/* FIXME: calculate real transfered size */
-		instance->transfered_size = instance->buffer_size;
 		if (instance->error != EOK) {
 			usb_log_debug("Batch(%p) found error TD(%d):%x.\n",
@@ -174,4 +173,7 @@
 	assert(hcd_ep);
 	hcd_ep->td = data->tds[i];
+	if (i > 0)
+		instance->transfered_size -= td_remain_size(data->tds[i - 1]);
+
 	/* Clear possible ED HALT */
 	data->ed->td_head &= ~ED_TDHEAD_HALTED_FLAG;
Index: uspace/drv/ohci/hw_struct/transfer_descriptor.c
===================================================================
--- uspace/drv/ohci/hw_struct/transfer_descriptor.c	(revision 27eb1feee823a9136336d32f6d64bead7cd0442e)
+++ uspace/drv/ohci/hw_struct/transfer_descriptor.c	(revision ad86349bd7acf373b4c5368444bebce81572be6f)
@@ -52,4 +52,7 @@
 		instance->status |= togg[toggle] << TD_STATUS_T_SHIFT;
 	}
+	if (dir == USB_DIRECTION_IN) {
+		instance->status |= TD_STATUS_ROUND_FLAG;
+	}
 	if (buffer != NULL) {
 		assert(size != 0);
Index: uspace/drv/ohci/hw_struct/transfer_descriptor.h
===================================================================
--- uspace/drv/ohci/hw_struct/transfer_descriptor.h	(revision 27eb1feee823a9136336d32f6d64bead7cd0442e)
+++ uspace/drv/ohci/hw_struct/transfer_descriptor.h	(revision ad86349bd7acf373b4c5368444bebce81572be6f)
@@ -59,4 +59,5 @@
 #define TD_STATUS_T_0 (0x2)
 #define TD_STATUS_T_1 (0x3)
+#define TD_STATUS_T_ED (0)
 #define TD_STATUS_EC_MASK (0x3) /* error count */
 #define TD_STATUS_EC_SHIFT (26)
@@ -102,4 +103,12 @@
 	return cc_to_rc(cc);
 }
+
+static inline size_t td_remain_size(td_t *instance)
+{
+	assert(instance);
+	if (instance->cbp == 0)
+		return 0;
+	return instance->be - instance->cbp + 1;
+}
 #endif
 /**
