Index: uspace/drv/bus/usb/ehci/ehci_batch.c
===================================================================
--- uspace/drv/bus/usb/ehci/ehci_batch.c	(revision 21f36e04eebafba5f479b65a3c5da54963ca8ff9)
+++ uspace/drv/bus/usb/ehci/ehci_batch.c	(revision cc7575c46dbf985fc65485ace80193e7b90cef47)
@@ -284,5 +284,5 @@
 	td_init(
 	    ehci_batch->tds[0], ehci_batch->tds[1], USB_DIRECTION_BOTH,
-	    buffer, ehci_batch->usb_batch->setup_size, toggle);
+	    buffer, ehci_batch->usb_batch->setup_size, toggle, false);
 	usb_log_debug("Created CONTROL SETUP TD: %08x:%08x:%08x",
 	    ehci_batch->tds[0]->status, ehci_batch->tds[0]->next,
@@ -299,6 +299,6 @@
 
 		td_init(ehci_batch->tds[td_current],
-		    ehci_batch->tds[td_current + 1],
-		    data_dir, buffer, transfer_size, toggle);
+		    ehci_batch->tds[td_current + 1], data_dir, buffer,
+		    transfer_size, toggle, false);
 		usb_log_debug("Created CONTROL DATA TD: %08x:%08x:%08x",
 		    ehci_batch->tds[td_current]->status,
@@ -315,5 +315,5 @@
 	assert(td_current == ehci_batch->td_count - 1);
 	td_init(ehci_batch->tds[td_current], ehci_batch->tds[td_current + 1],
-	    status_dir, NULL, 0, 1);
+	    status_dir, NULL, 0, 1, true);
 	usb_log_debug("Created CONTROL STATUS TD: %08x:%08x:%08x",
 	    ehci_batch->tds[td_current]->status,
@@ -357,5 +357,5 @@
 		td_init(
 		    ehci_batch->tds[td_current], ehci_batch->tds[td_current + 1],
-		    dir, buffer, transfer_size, -1);
+		    dir, buffer, transfer_size, -1, remain_size == transfer_size);
 
 		usb_log_debug("Created DATA TD: %08x:%08x:%08x",
Index: uspace/drv/bus/usb/ehci/hw_struct/transfer_descriptor.c
===================================================================
--- uspace/drv/bus/usb/ehci/hw_struct/transfer_descriptor.c	(revision 21f36e04eebafba5f479b65a3c5da54963ca8ff9)
+++ uspace/drv/bus/usb/ehci/hw_struct/transfer_descriptor.c	(revision cc7575c46dbf985fc65485ace80193e7b90cef47)
@@ -81,5 +81,6 @@
  */
 void td_init(td_t *instance, const td_t *next,
-    usb_direction_t direction, const void *buffer, size_t size, int toggle)
+    usb_direction_t direction, const void *buffer, size_t size, int toggle,
+    bool ioc)
 {
 	assert(instance);
@@ -89,5 +90,6 @@
 	EHCI_MEM32_WR(instance->status,
 	    ((dir[direction] & TD_STATUS_PID_MASK) << TD_STATUS_PID_SHIFT) |
-	    ((size & TD_STATUS_TOTAL_MASK) << TD_STATUS_TOTAL_SHIFT));
+	    ((size & TD_STATUS_TOTAL_MASK) << TD_STATUS_TOTAL_SHIFT) |
+	    (ioc ? TD_STATUS_IOC_FLAG : 0) );
 
 	if (toggle == 0 || toggle == 1) {
Index: uspace/drv/bus/usb/ehci/hw_struct/transfer_descriptor.h
===================================================================
--- uspace/drv/bus/usb/ehci/hw_struct/transfer_descriptor.h	(revision 21f36e04eebafba5f479b65a3c5da54963ca8ff9)
+++ uspace/drv/bus/usb/ehci/hw_struct/transfer_descriptor.h	(revision cc7575c46dbf985fc65485ace80193e7b90cef47)
@@ -90,5 +90,5 @@
 
 void td_init(td_t *td, const td_t *next, usb_direction_t dir, const void * buf,
-    size_t buf_size, int toggle);
+    size_t buf_size, int toggle, bool ioc);
 
 #endif
