Index: uspace/lib/usbdev/include/usb/dev/pipes.h
===================================================================
--- uspace/lib/usbdev/include/usb/dev/pipes.h	(revision 98893ede399d6eed12edddf404da1f101f415345)
+++ uspace/lib/usbdev/include/usb/dev/pipes.h	(revision 50206e9574b78ae79eedeb03577fe6a9f9bb4d09)
@@ -115,4 +115,6 @@
     const void *, size_t);
 
+void *usb_pipe_alloc_buffer(usb_pipe_t *, size_t);
+void usb_pipe_free_buffer(usb_pipe_t *, void *);
 #endif
 /**
Index: uspace/lib/usbdev/src/pipes.c
===================================================================
--- uspace/lib/usbdev/src/pipes.c	(revision 98893ede399d6eed12edddf404da1f101f415345)
+++ uspace/lib/usbdev/src/pipes.c	(revision 50206e9574b78ae79eedeb03577fe6a9f9bb4d09)
@@ -36,4 +36,5 @@
 #include <usb/dev/request.h>
 #include <usb/usb.h>
+#include <usb/dma_buffer.h>
 
 #include <assert.h>
@@ -161,4 +162,29 @@
 }
 
+/**
+ * Allocate a buffer for data transmission, that satisfies the constraints
+ * imposed by the host controller.
+ *
+ * @param[in] pipe Pipe for which the buffer is allocated
+ * @param[in] size Size of the required buffer
+ */
+void *usb_pipe_alloc_buffer(usb_pipe_t *pipe, size_t size)
+{
+	// FIXME: Do not use the default policy, but the one required by HC.
+
+	dma_buffer_t buf;
+	if (dma_buffer_alloc(&buf, size))
+		return NULL;
+
+	return buf.virt;
+}
+
+void usb_pipe_free_buffer(usb_pipe_t *pipe, void *buffer)
+{
+	dma_buffer_t buf;
+	buf.virt = buffer;
+	dma_buffer_free(&buf);
+}
+
 /** Request a read (in) transfer on an endpoint pipe.
  *
