Index: uspace/drv/nic/rtl8169/driver.c
===================================================================
--- uspace/drv/nic/rtl8169/driver.c	(revision f1ac202947f4502d35b77afa64542cc9001286fc)
+++ uspace/drv/nic/rtl8169/driver.c	(revision 0764cc8a36c4a2046d7e67f9f6d923869dd12d71)
@@ -87,4 +87,11 @@
 static rtl8169_t *rtl8169_create_dev_data(ddf_dev_t *dev);
 
+static int rtl8169_unicast_set(nic_t *nic_data, nic_unicast_mode_t mode,
+    const nic_address_t *, size_t);
+static int rtl8169_multicast_set(nic_t *nic_data, nic_multicast_mode_t mode,
+    const nic_address_t *addr, size_t addr_count);
+static int rtl8169_broadcast_set(nic_t *nic_data, nic_broadcast_mode_t mode);
+
+
 /** Network interface options for RTL8169 card driver */
 static nic_iface_t rtl8169_nic_iface = {
@@ -221,4 +228,43 @@
 }
 
+static int rtl8169_allocate_buffers(rtl8169_t *rtl8169)
+{
+	int rc;
+
+	ddf_msg(LVL_DEBUG, "Allocating DMA buffer rings");
+
+	/* Allocate TX ring */
+	rc = dmamem_map_anonymous(TX_RING_SIZE, DMAMEM_4GiB, 
+	    AS_AREA_READ | AS_AREA_WRITE, 0, &rtl8169->tx_ring_phys,
+	    &rtl8169->tx_ring_virt);
+
+	if (rc != EOK)
+		return rc;
+
+	/* Allocate RX ring */
+	rc = dmamem_map_anonymous(RX_RING_SIZE, DMAMEM_4GiB, 
+	    AS_AREA_READ | AS_AREA_WRITE, 0, &rtl8169->rx_ring_phys,
+	    &rtl8169->rx_ring_virt);
+
+	if (rc != EOK)
+		return rc;
+
+	/* Allocate TX buffers */
+	rc = dmamem_map_anonymous(TX_BUFFERS_SIZE, DMAMEM_4GiB, 
+	    AS_AREA_READ | AS_AREA_WRITE, 0, &rtl8169->tx_buff_phys,
+	    &rtl8169->tx_buff_virt);
+
+	if (rc != EOK)
+		return rc;
+
+	/* Allocate RX buffers */
+	rc = dmamem_map_anonymous(RX_BUFFERS_SIZE, DMAMEM_4GiB, 
+	    AS_AREA_READ | AS_AREA_WRITE, 0, &rtl8169->rx_buff_phys,
+	    &rtl8169->rx_buff_virt);
+
+	if (rc != EOK)
+		return rc;
+}
+
 static rtl8169_t *rtl8169_create_dev_data(ddf_dev_t *dev)
 {
@@ -244,5 +290,6 @@
 		rtl8169_on_activated, NULL, rtl8169_on_stopped);
 	nic_set_filtering_change_handlers(nic_data,
-		NULL, NULL, NULL, NULL, NULL);
+		rtl8169_unicast_set, rtl8169_multicast_set, rtl8169_broadcast_set,
+		NULL, NULL);
 
 	fibril_mutex_initialize(&rtl8169->rx_lock);
@@ -255,5 +302,4 @@
 	return rtl8169;
 }
-
 
 static int rtl8169_dev_initialize(ddf_dev_t *dev)
@@ -344,7 +390,4 @@
 	ddf_msg(LVL_DEBUG, "Interrupt handler installed");
 
-	rtl8169_reset(rtl8169);
-	pio_write_16(rtl8169->regs + IMR, 0xffff);
-
 	uint8_t cr_value = pio_read_8(rtl8169->regs + CR);
 	pio_write_8(rtl8169->regs + CR, cr_value | CR_TE | CR_RE);
@@ -377,5 +420,5 @@
 		goto err_fun_bind;
 	}
-
+	
 	ddf_msg(LVL_NOTE, "The %s device has been successfully initialized.",
 	    ddf_dev_get_name(dev));
@@ -474,5 +517,15 @@
 	rtl8169_t *rtl8169 = nic_get_specific(nic_data);
 
+	/* Reset card */
+	pio_write_8(rtl8169->regs + CONFIG0, 0);
+	rtl8169_reset(rtl8169);
+
+	/* Enable TX and RX */
+	uint8_t cr = pio_read_8(rtl8169->regs + CR);
+	cr |= CR_TE | CR_RE;
+	pio_write_8(rtl8169->regs + CR, cr);
+
 	pio_write_16(rtl8169->regs + IMR, 0xffff);
+	nic_enable_interrupt(nic_data, rtl8169->irq);
 
 	return EOK;
@@ -481,4 +534,5 @@
 static int rtl8169_on_stopped(nic_t *nic_data)
 {
+	ddf_msg(LVL_NOTE, "Stopping device");
 	return EOK;
 }
@@ -522,4 +576,23 @@
 
 }
+
+static int rtl8169_unicast_set(nic_t *nic_data, nic_unicast_mode_t mode,
+    const nic_address_t *addr, size_t addr_count)
+{
+	return EOK;
+}
+
+static int rtl8169_multicast_set(nic_t *nic_data, nic_multicast_mode_t mode,
+    const nic_address_t *addr, size_t addr_count)
+{
+	return EOK;
+}
+
+static int rtl8169_broadcast_set(nic_t *nic_data, nic_broadcast_mode_t mode)
+{
+	return EOK;
+}
+
+
 
 static void rtl8169_irq_handler(ddf_dev_t *dev, ipc_callid_t iid,
Index: uspace/drv/nic/rtl8169/driver.h
===================================================================
--- uspace/drv/nic/rtl8169/driver.h	(revision f1ac202947f4502d35b77afa64542cc9001286fc)
+++ uspace/drv/nic/rtl8169/driver.h	(revision 0764cc8a36c4a2046d7e67f9f6d923869dd12d71)
@@ -38,5 +38,9 @@
 #define NAME  "rtl8169"
 
-#define	TX_BUFF_COUNT	16
+#define	TX_BUFFERS_COUNT	16
+#define	RX_BUFFERS_COUNT	16
+
+#define	TX_RING_SIZE		(sizeof(rtl8169_descr_t) * TX_BUFFERS_COUNT)
+#define	RX_RING_SIZE		(sizeof(rtl8169_descr_t) * RX_BUFFERS_COUNT)
 
 /** RTL8139 device data */
@@ -48,17 +52,18 @@
 	/** The irq assigned */
 	int irq;
-
 	/** Mask of the turned interupts (IMR value) */
 	uint16_t int_mask;
-
-	/** The memory allocated for the transmittion buffers
-	 *  Each buffer takes 2kB
-	 */
+	/** TX ring */
+	uintptr_t tx_ring_phys;
+	void *tx_ring_virt;
+	/** RX ring */
+	uintptr_t rx_ring_phys;
+	void *rx_ring_virt;
+	/** TX buffers */
 	uintptr_t tx_buff_phys;
 	void *tx_buff_virt;
-
-	/** Virtual adresses of the Tx buffers */
-	void *tx_buff[TX_BUFF_COUNT];
-
+	/** RX buffers */
+	uintptr_t rx_buff_phys;
+	void *rx_buff;
 	/** The nubmer of the next buffer to use, index = tx_next % TX_BUFF_COUNT */
 	size_t tx_next;
