Index: uspace/lib/drv/include/usbhc_iface.h
===================================================================
--- uspace/lib/drv/include/usbhc_iface.h	(revision af16ebece2cb3bc7592cffdd6e1a6da6698dc8db)
+++ uspace/lib/drv/include/usbhc_iface.h	(revision fc3dfe6d5430c1408baf598d3bab95dc3cc4b4c8)
@@ -126,4 +126,22 @@
 } usb_pipe_desc_t;
 
+typedef struct usb_pipe_transfer_request {
+	usb_direction_t dir;
+	usb_endpoint_t endpoint;
+	usb_stream_t stream;
+
+	uint64_t setup;			/**< Valid iff the transfer is of control type */
+
+	/**
+	 * Base address of the buffer to share. Must be at least offset + size
+	 * large. Is patched after being transmitted over IPC, so the pointer is
+	 * still valid.
+	 */
+	void *base;			
+	size_t offset;			/**< Offset to the buffer */
+	size_t size;			/**< Requested size. */
+	dma_policy_t buffer_policy;	/**< Properties of the buffer. */
+} usbhc_iface_transfer_request_t;
+
 /** This structure follows standard endpoint descriptor + superspeed companion
  * descriptor, and exists to avoid dependency of libdrv on libusb. Keep the
@@ -157,6 +175,5 @@
 extern errno_t usbhc_unregister_endpoint(async_exch_t *, const usb_pipe_desc_t *);
 
-extern errno_t usbhc_transfer(async_exch_t *, usb_endpoint_t, usb_direction_t,
-    uint64_t, void *, size_t, size_t *);
+extern errno_t usbhc_transfer(async_exch_t *, const usbhc_iface_transfer_request_t *, size_t *);
 
 /** Callback for outgoing transfer */
@@ -173,7 +190,6 @@
 	errno_t (*unregister_endpoint)(ddf_fun_t *, const usb_pipe_desc_t *);
 
-	errno_t (*transfer)(ddf_fun_t *, usb_target_t,
-		usb_direction_t, uint64_t, char *, size_t,
-		usbhc_iface_transfer_callback_t, void *);
+	errno_t (*transfer)(ddf_fun_t *, const usbhc_iface_transfer_request_t *,
+	    usbhc_iface_transfer_callback_t, void *);
 } usbhc_iface_t;
 
