Index: uspace/drv/nic/rtl8169/defs.h
===================================================================
--- uspace/drv/nic/rtl8169/defs.h	(revision e37d2f81e32dc90959db7274d4ce71f44b8c1068)
+++ uspace/drv/nic/rtl8169/defs.h	(revision 9d653e3a01f9d41e185fb25f70015668920c2660)
@@ -180,4 +180,7 @@
 	INT_RER = (1 << 1), /**< Receive error interrupt */
 	INT_ROK = (1 << 0), /**< Receive OK interrupt */
+	INT_KNOWN = (INT_SERR | INT_TIME_OUT | INT_SW | INT_TDU \
+	    | INT_FIFOOVW | INT_PUN | INT_RXOVW | INT_TER \
+	    | INT_TOK| INT_RER | INT_ROK),
 };
 
Index: uspace/drv/nic/rtl8169/driver.c
===================================================================
--- uspace/drv/nic/rtl8169/driver.c	(revision e37d2f81e32dc90959db7274d4ce71f44b8c1068)
+++ uspace/drv/nic/rtl8169/driver.c	(revision 9d653e3a01f9d41e185fb25f70015668920c2660)
@@ -27,5 +27,6 @@
  */
 
-/* XXX Fix this */
+#define	_DDF_DATA_IMPLANT
+
 #include <assert.h>
 #include <errno.h>
@@ -414,4 +415,5 @@
 	nic_set_ddf_fun(nic_data, fun);
 	ddf_fun_set_ops(fun, &rtl8169_dev_ops);
+	ddf_fun_data_implant(fun, nic_data);
 
 	rc = ddf_fun_bind(fun);
@@ -581,5 +583,4 @@
 
 	/* Configure Receive Control Register */
-	pio_write_8(rtl8169->regs + 0x50, 0xc0);
 	uint32_t rcr = pio_read_32(rtl8169->regs + RCR);
 	rcr |= RCR_ACCEPT_ALL_PHYS | RCR_ACCEPT_PHYS_MATCH \
@@ -588,5 +589,4 @@
 	pio_write_32(rtl8169->regs + RCR, rcr);
 	pio_write_16(rtl8169->regs + RMS, BUFFER_SIZE);
-	pio_write_8(rtl8169->regs + 0x50, 0x00);
 
 	ddf_msg(LVL_NOTE, "RCR: 0x%08x", pio_read_32(rtl8169->regs + RCR));
@@ -753,5 +753,5 @@
 	assert(icall);
 
-	uint16_t isr = (uint16_t) IPC_GET_ARG2(*icall);
+	uint16_t isr = (uint16_t) IPC_GET_ARG2(*icall) & INT_KNOWN;
 	nic_t *nic_data = nic_get_from_ddf_dev(dev);
 	rtl8169_t *rtl8169 = nic_get_specific(nic_data);
@@ -759,20 +759,32 @@
 	ddf_msg(LVL_NOTE, "rtl8169_irq_handler(): isr=0x%04x", isr);
 
-	/* Packet underrun or link change */
-	if (isr & INT_PUN)
-		rtl8169_link_change(dev);
-
-	/* Transmit notification */
-	if (isr & (INT_TER | INT_TOK | INT_TDU))
-		rtl8169_transmit_done(dev);
-
-	if (isr & INT_SERR)
-		ddf_msg(LVL_ERROR, "System error interrupt");
-
-	if (isr & (INT_RER | INT_ROK))
-		rtl8169_receive_done(dev);
-
+	while (isr != 0) {
+		/* Packet underrun or link change */
+		if (isr & INT_PUN) {
+			rtl8169_link_change(dev);
+			pio_write_16(rtl8169->regs + ISR, INT_PUN);
+		}
+
+		/* Transmit notification */
+		if (isr & (INT_TER | INT_TOK | INT_TDU)) {
+			rtl8169_transmit_done(dev);
+			pio_write_16(rtl8169->regs + ISR, (INT_TER | INT_TOK | INT_TDU));
+		}
+
+		if (isr & INT_SERR) {
+			ddf_msg(LVL_ERROR, "System error interrupt");
+			pio_write_16(rtl8169->regs + ISR, INT_SERR);
+		}
+
+		if (isr & (INT_RER | INT_ROK)) {
+			rtl8169_receive_done(dev);
+			pio_write_16(rtl8169->regs + ISR, (INT_RER | INT_ROK));
+		}
+
+		isr = pio_read_16(rtl8169->regs + ISR) & INT_KNOWN;
+	}
+
+	pio_write_16(rtl8169->regs + IMR, 0xffff);
 	pio_write_16(rtl8169->regs + ISR, 0xffff);
-	pio_write_16(rtl8169->regs + IMR, 0xffff);
 }
 
@@ -835,4 +847,7 @@
 	/* Notify NIC of pending packets */
 	pio_write_8(rtl8169->regs + TPPOLL, TPPOLL_NPQ);
+	write_barrier();
+
+	ddf_msg(LVL_NOTE, "triggered TPPOLL");
 
 	fibril_mutex_unlock(&rtl8169->tx_lock);
