Index: uspace/drv/audio/hdaudio/hdactl.c
===================================================================
--- uspace/drv/audio/hdaudio/hdactl.c	(revision a10f3f3b6106c1d86b3f1af1b1938d758100f784)
+++ uspace/drv/audio/hdaudio/hdactl.c	(revision 903eff5b1e7b0523b580da39935eb0d5e3a89319)
@@ -485,5 +485,6 @@
 	    intctl | BIT_V(uint32_t, intctl_gie) | BIT_V(uint32_t, intctl_cie));
 	hda_reg32_write(&hda->regs->intctl, intctl |
-	    BIT_V(uint32_t, intctl_gie) | BIT_V(uint32_t, intctl_cie));
+	    BIT_V(uint32_t, intctl_gie) | BIT_V(uint32_t, intctl_cie) |
+	    0x3fffffff);
 
 	rc = hda_corb_init(hda);
@@ -501,4 +502,9 @@
 		goto error;
 	}
+
+	async_usleep(5*1000*1000);
+	ddf_msg(LVL_NOTE, "intsts=0x%x", hda_reg32_read(&hda->regs->intsts));
+	ddf_msg(LVL_NOTE, "sdesc[%d].sts=0x%x",
+	    hda->ctl->iss, hda_reg8_read(&hda->regs->sdesc[hda->ctl->iss].sts));
 
 	return ctl;
Index: uspace/drv/audio/hdaudio/hdaudio.c
===================================================================
--- uspace/drv/audio/hdaudio/hdaudio.c	(revision a10f3f3b6106c1d86b3f1af1b1938d758100f784)
+++ uspace/drv/audio/hdaudio/hdaudio.c	(revision 903eff5b1e7b0523b580da39935eb0d5e3a89319)
@@ -81,5 +81,5 @@
 	{
 		.cmd = CMD_PIO_READ_8,
-		.addr = NULL,
+		.addr = NULL, /* rirbsts */
 		.dstarg = 2
 	},
@@ -97,5 +97,5 @@
 	{
 		.cmd = CMD_PIO_WRITE_8,
-		.addr = NULL,
+		.addr = NULL, /* rirbsts */
 		.value = BIT_V(uint8_t, rirbsts_intfl),
 	},
Index: uspace/drv/audio/hdaudio/stream.c
===================================================================
--- uspace/drv/audio/hdaudio/stream.c	(revision a10f3f3b6106c1d86b3f1af1b1938d758100f784)
+++ uspace/drv/audio/hdaudio/stream.c	(revision 903eff5b1e7b0523b580da39935eb0d5e3a89319)
@@ -34,7 +34,10 @@
 
 #include <as.h>
+#include <bitops.h>
+#include <byteorder.h>
 #include <ddf/log.h>
 #include <ddi.h>
 #include <errno.h>
+#include <macros.h>
 #include <stdlib.h>
 
@@ -90,4 +93,7 @@
 			goto error;
 
+		ddf_msg(LVL_NOTE, "Stream buf phys=0x%llx virt=%p",
+		    (unsigned long long)buffer_phys, buffer);
+
 		stream->buf[i] = buffer;
 		stream->buf_phys[i] = buffer_phys;
@@ -105,7 +111,7 @@
 	/* Fill in BDL */
 	for (i = 0; i < stream->nbuffers; i++) {
-		stream->bdl[i].address = stream->buf_phys[i];
-		stream->bdl[i].length = stream->bufsize;
-		stream->bdl[i].flags = 0;
+		stream->bdl[i].address = host2uint64_t_le(stream->buf_phys[i]);
+		stream->bdl[i].length = host2uint32_t_le(stream->bufsize);
+		stream->bdl[i].flags = 0/*BIT_V(uint32_t, bdf_ioc)*/;
 	}
 
@@ -118,9 +124,18 @@
 {
 	hda_sdesc_regs_t *sdregs;
+	uint8_t ctl1;
+	uint8_t ctl3;
+
+	ctl3 = (stream->sid << 4);
+	ctl1 = 0x4;
 
 	sdregs = &stream->hda->regs->sdesc[stream->sdid];
+	hda_reg8_write(&sdregs->ctl3, ctl3);
+	hda_reg8_write(&sdregs->ctl1, ctl1);
 	hda_reg32_write(&sdregs->cbl, stream->nbuffers * stream->bufsize);
 	hda_reg16_write(&sdregs->lvi, stream->nbuffers - 1);
 	hda_reg16_write(&sdregs->fmt, stream->fmt);
+	hda_reg32_write(&sdregs->bdpl, LOWER32(stream->bdl_phys));
+	hda_reg32_write(&sdregs->bdpu, UPPER32(stream->bdl_phys));
 }
 
