Index: uspace/lib/usbhost/include/usb/host/usb_transfer_batch.h
===================================================================
--- uspace/lib/usbhost/include/usb/host/usb_transfer_batch.h	(revision fdc2253b3ae7378b237bd037a2075887d6336b2d)
+++ uspace/lib/usbhost/include/usb/host/usb_transfer_batch.h	(revision 239eea4167f0ebbd6c42050e2c252fd03a7f3c08)
@@ -41,4 +41,5 @@
 #include <stddef.h>
 #include <stdint.h>
+#include <usb/dma_buffer.h>
 #include <usb/request.h>
 #include <usb/usb.h>
@@ -56,15 +57,9 @@
 	/** Target for communication */
 	usb_target_t target;
+	/** Direction of the transfer */
+	usb_direction_t dir;
 
 	/** Endpoint used for communication */
 	endpoint_t *ep;
-
-	/** Direction of the transfer */
-	usb_direction_t dir;
-
-	/** Function called on completion */
-	usbhc_iface_transfer_callback_t on_complete;
-	/** Arbitrary data for the handler */
-	void *on_complete_data;
 
 	/** Place to store SETUP data needed by control transfers */
@@ -75,13 +70,24 @@
 	} setup;
 
-	/** Place for data to send/receive */
-	char *buffer;
-	/** Size of memory pointed to by buffer member */
+	/** DMA buffer with enforced policy */
+	dma_buffer_t dma_buffer;
+	/** Size of memory buffer */
 	size_t buffer_size;
+
+	/**
+	 * In case the DMA buffer is allocated, the original buffer must to be
+	 * stored to be filled after the IN transaction is finished.
+	 */
+	char *original_buffer;
+
+	/** Indicates success/failure of the communication */
+	errno_t error;
 	/** Actually used portion of the buffer */
 	size_t transferred_size;
 
-	/** Indicates success/failure of the communication */
-	errno_t error;
+	/** Function called on completion */
+	usbhc_iface_transfer_callback_t on_complete;
+	/** Arbitrary data for the handler */
+	void *on_complete_data;
 } usb_transfer_batch_t;
 
@@ -108,4 +114,7 @@
 void usb_transfer_batch_init(usb_transfer_batch_t *, endpoint_t *);
 
+/** Buffer preparation */
+errno_t usb_transfer_batch_prepare_buffer(usb_transfer_batch_t *, char *);
+
 /** Batch finalization. */
 void usb_transfer_batch_finish(usb_transfer_batch_t *);
