Index: uspace/lib/ata/include/ata/ata.h
===================================================================
--- uspace/lib/ata/include/ata/ata.h	(revision 645d38325f770af3d73b15f6b1c95d0c2f9de91b)
+++ uspace/lib/ata/include/ata/ata.h	(revision a38d50441a00157a8528ae5eeedffc144c4df62e)
@@ -63,4 +63,6 @@
 	/** Use DMA transfers */
 	bool use_dma;
+	/** Maximum number of bytes that we can DMA in one I/O operation */
+	size_t max_dma_xfer;
 	/** Read 16 bits from the data port */
 	void (*write_data_16)(void *, uint16_t *, size_t);
Index: uspace/lib/ata/src/ata.c
===================================================================
--- uspace/lib/ata/src/ata.c	(revision 645d38325f770af3d73b15f6b1c95d0c2f9de91b)
+++ uspace/lib/ata/src/ata.c	(revision a38d50441a00157a8528ae5eeedffc144c4df62e)
@@ -1419,4 +1419,5 @@
 {
 	size_t maxnb;
+	size_t dma_maxnb;
 
 	maxnb = 0;
@@ -1441,4 +1442,8 @@
 	 * exceed DMA buffer size.
 	 */
+	dma_maxnb = d->chan->params.max_dma_xfer / d->block_size;
+	if (dma_maxnb < maxnb)
+		maxnb = dma_maxnb;
+
 	return maxnb;
 }
