Index: uspace/drv/audio/sb16/dma_controller.c
===================================================================
--- uspace/drv/audio/sb16/dma_controller.c	(revision b7f718339a075df756c4787788a17e041ceb2dc8)
+++ uspace/drv/audio/sb16/dma_controller.c	(revision 7785e951c522cf682df070458c9dffa4a898105e)
@@ -217,5 +217,6 @@
 }
 /*----------------------------------------------------------------------------*/
-int dma_setup_channel(unsigned channel, uintptr_t pa, uint16_t size)
+int dma_setup_channel(
+    unsigned channel, uintptr_t pa, uint16_t size, uint8_t mode)
 {
 	if (channel == 0 || channel == 4)
@@ -242,6 +243,7 @@
 	const dma_channel_t dma_channel = controller_8237.channels[channel];
 
-	ddf_log_debug("Setting channel %u, to address %p(%zu).\n",
-	    channel, pa, size);
+	ddf_log_debug("Setting channel %u, to address %p(%zu), mode %hhx.\n",
+	    channel, pa, size, mode);
+
 	/* Mask DMA request */
 	uint8_t value = DMA_SINGLE_MASK_CHAN_TO_REG(channel)
@@ -249,4 +251,8 @@
 	pio_write_8(dma_channel.single_mask_address, value);
 
+	/* Set mode */
+	value = DMA_MODE_CHAN_TO_REG(channel) | mode;
+	pio_write_8(dma_channel.mode_address, value);
+
 	/* Set address -- reset flip-flop*/
 	pio_write_8(dma_channel.flip_flop_address, 0);
@@ -279,38 +285,4 @@
 	ddf_log_verbose("Writing size high byte: %hhx.\n", value);
 	pio_write_8(dma_channel.offset_reg_address, value);
-
-	/* Unmask DMA request */
-	value = DMA_SINGLE_MASK_CHAN_TO_REG(channel);
-	pio_write_8(dma_channel.single_mask_address, value);
-
-	return EOK;
-}
-/*----------------------------------------------------------------------------*/
-int dma_prepare_channel(
-    unsigned channel, bool write, bool auto_mode, transfer_mode_t mode)
-{
-	if (channel == 0 || channel == 4)
-		return ENOTSUP;
-	if (channel > 7)
-		return ENOENT;
-
-	if (!controller_8237.initialized)
-		return EIO;
-
-	const dma_channel_t dma_channel = controller_8237.channels[channel];
-
-	/* Mask DMA request */
-	uint8_t value = DMA_SINGLE_MASK_CHAN_TO_REG(channel)
-	    | DMA_SINGLE_MASK_MASKED_FLAG;
-	pio_write_8(dma_channel.single_mask_address, value);
-
-	/* Set DMA mode */
-	value = DMA_MODE_CHAN_TO_REG(channel)
-	    | ((write ? DMA_MODE_CHAN_TRA_WRITE : DMA_MODE_CHAN_TRA_READ)
-	        << DMA_MODE_CHAN_TRA_SHIFT)
-	    | (auto_mode ? DMA_MODE_CHAN_AUTO_FLAG : 0)
-	    | (mode << DMA_MODE_CHAN_MODE_SHIFT);
-	ddf_log_verbose("Setting DMA mode: %hhx.\n", value);
-	pio_write_8(dma_channel.mode_address, value);
 
 	/* Unmask DMA request */
Index: uspace/drv/audio/sb16/dma_controller.h
===================================================================
--- uspace/drv/audio/sb16/dma_controller.h	(revision b7f718339a075df756c4787788a17e041ceb2dc8)
+++ uspace/drv/audio/sb16/dma_controller.h	(revision 7785e951c522cf682df070458c9dffa4a898105e)
@@ -43,9 +43,13 @@
 } transfer_mode_t;
 
-int dma_setup_channel(unsigned channel, uintptr_t pa, uint16_t size);
+#define DMA_MODE_WRITE (1 << 2)
+#define DMA_MODE_READ (1 << 3)
+#define DMA_MODE_AUTO (1 << 4)
+#define DMA_MODE_DOWN (1 << 5)
+#define DMA_MODE_SINGLE (1 << 6)
+#define DMA_MODE_BLOCK (1 << 7)
 
-int dma_prepare_channel(
-    unsigned channel, bool write, bool auto_mode, transfer_mode_t mode);
-
+int dma_setup_channel(
+    unsigned channel, uintptr_t pa, uint16_t size, uint8_t mode);
 #endif
 /**
Index: uspace/drv/audio/sb16/dsp.c
===================================================================
--- uspace/drv/audio/sb16/dsp.c	(revision b7f718339a075df756c4787788a17e041ceb2dc8)
+++ uspace/drv/audio/sb16/dsp.c	(revision 7785e951c522cf682df070458c9dffa4a898105e)
@@ -115,7 +115,7 @@
 	const uintptr_t pa = addr_to_phys(buffer);
 	assert(pa < (1 << 25));
-//	assert((pa & 0xffff) == 0);
 	/* Set 16 bit channel */
-	const int ret = dma_setup_channel(SB_DMA_CHAN_16, pa, BUFFER_SIZE);
+	const int ret = dma_setup_channel(SB_DMA_CHAN_16, pa, BUFFER_SIZE,
+	    DMA_MODE_READ | DMA_MODE_AUTO | DMA_MODE_SINGLE);
 	if (ret == EOK) {
 		dsp->buffer.data = buffer;
@@ -123,15 +123,4 @@
 		dsp->buffer.size = BUFFER_SIZE;
 		bzero(buffer, BUFFER_SIZE);
-		dma_prepare_channel(
-		    SB_DMA_CHAN_16, false, AUTO_DMA_MODE, BLOCK_DMA);
-		/* Set 8bit channel */
-		const int ret = dma_setup_channel(SB_DMA_CHAN_8, pa, BUFFER_SIZE);
-		if (ret == EOK) {
-			dma_prepare_channel(
-			    SB_DMA_CHAN_8, false, AUTO_DMA_MODE, BLOCK_DMA);
-		} else {
-			ddf_log_warning("Failed to setup DMA8 channel: %s.\n",
-			    str_error(ret));
-		}
 	} else {
 		ddf_log_error("Failed to setup DMA16 channel %s.\n",
@@ -275,5 +264,5 @@
 	dsp->playing.mode =
 	    (bit_depth == 16 ? 0x10 : 0) | (channels == 2 ? 0x20 : 0);
-	ddf_log_debug("Setting mode %hhx.\n", dsp->playing.mode);
+	ddf_log_debug("Setting DSP mode %hhx.\n", dsp->playing.mode);
 
 	ddf_log_debug("Playing sound: %zu(%zu) bytes.\n", play_size, size);
@@ -287,8 +276,8 @@
 	    sampling_rate >> 8, sampling_rate & 0xff);
 
-	if (AUTO_DMA_MODE) {
+	if (!AUTO_DMA_MODE || play_size == size) {
+		sb_dsp_write(dsp, SINGLE_DMA_16B_DA_FIFO);
+	} else {
 		sb_dsp_write(dsp, AUTO_DMA_16B_DA_FIFO);
-	} else {
-		sb_dsp_write(dsp, SINGLE_DMA_16B_DA_FIFO);
 	}
 	sb_dsp_write(dsp, dsp->playing.mode);
