Index: uspace/drv/bus/usb/xhci/endpoint.c
===================================================================
--- uspace/drv/bus/usb/xhci/endpoint.c	(revision cc63815c45bec69f85b3455ff1f4c5dcc15c228c)
+++ uspace/drv/bus/usb/xhci/endpoint.c	(revision fdc2253b3ae7378b237bd037a2075887d6336b2d)
@@ -119,4 +119,15 @@
 		goto err;
 
+	/* Driver can handle non-contiguous buffers */
+	ep->transfer_buffer_policy &= ~DMA_POLICY_CONTIGUOUS;
+
+	/* Driver can handle buffers crossing boundaries */
+	ep->transfer_buffer_policy &= ~DMA_POLICY_NOT_CROSSING;
+
+	/* Some xHCs can handle 64-bit addresses */
+	xhci_bus_t *bus = bus_to_xhci_bus(ep->device->bus);
+	if (bus->hc->ac64)
+		ep->transfer_buffer_policy &= ~DMA_POLICY_4GiB;
+
 	return EOK;
 
Index: uspace/lib/drv/include/usbhc_iface.h
===================================================================
--- uspace/lib/drv/include/usbhc_iface.h	(revision cc63815c45bec69f85b3455ff1f4c5dcc15c228c)
+++ uspace/lib/drv/include/usbhc_iface.h	(revision fdc2253b3ae7378b237bd037a2075887d6336b2d)
@@ -118,4 +118,7 @@
 	/** Maximum size of one transfer */
 	size_t max_transfer_size;
+
+	/** Constraints on buffers to be transferred without copying */
+	dma_policy_t transfer_buffer_policy;
 } usb_pipe_desc_t;
 
Index: uspace/lib/usbdev/src/pipes.c
===================================================================
--- uspace/lib/usbdev/src/pipes.c	(revision cc63815c45bec69f85b3455ff1f4c5dcc15c228c)
+++ uspace/lib/usbdev/src/pipes.c	(revision fdc2253b3ae7378b237bd037a2075887d6336b2d)
@@ -171,8 +171,6 @@
 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))
+	if (dma_buffer_alloc_policy(&buf, size, pipe->desc.transfer_buffer_policy))
 		return NULL;
 
Index: uspace/lib/usbhost/include/usb/host/endpoint.h
===================================================================
--- uspace/lib/usbhost/include/usb/host/endpoint.h	(revision cc63815c45bec69f85b3455ff1f4c5dcc15c228c)
+++ uspace/lib/usbhost/include/usb/host/endpoint.h	(revision fdc2253b3ae7378b237bd037a2075887d6336b2d)
@@ -98,4 +98,7 @@
 	/** Maximum size of one transfer */
 	size_t max_transfer_size;
+	/** Policy for transfer buffers */
+	dma_policy_t transfer_buffer_policy;
+
 	/**
 	 * Number of packets that can be sent in one service interval
Index: uspace/lib/usbhost/src/ddf_helpers.c
===================================================================
--- uspace/lib/usbhost/src/ddf_helpers.c	(revision cc63815c45bec69f85b3455ff1f4c5dcc15c228c)
+++ uspace/lib/usbhost/src/ddf_helpers.c	(revision fdc2253b3ae7378b237bd037a2075887d6336b2d)
@@ -83,4 +83,5 @@
 		pipe_desc->transfer_type = ep->transfer_type;
 		pipe_desc->max_transfer_size = ep->max_transfer_size;
+		pipe_desc->transfer_buffer_policy = ep->transfer_buffer_policy;
 	}
 	endpoint_del_ref(ep);
