Index: /soft/giet_vm/giet_drivers/nic_driver.c
===================================================================
--- /soft/giet_vm/giet_drivers/nic_driver.c	(revision 612)
+++ /soft/giet_vm/giet_drivers/nic_driver.c	(revision 613)
@@ -126,18 +126,48 @@
     unsigned int extend   = (X_IO << Y_WIDTH) + Y_IO;
 
+    unsigned int buf_0_addr;
+    unsigned int buf_1_addr;
+    unsigned int sts_0_addr;
+    unsigned int sts_1_addr;
+
+    unsigned int desc_lo_0;
+    unsigned int desc_lo_1;
+    unsigned int desc_hi_0;
+    unsigned int desc_hi_1;
+
     if ( is_rx )
     {
-        _nic_set_channel_register( channel, NIC_RX_DESC_LO_0, base          );
-        _nic_set_channel_register( channel, NIC_RX_DESC_LO_1, base + 0x1000 );
-        _nic_set_channel_register( channel, NIC_RX_DESC_HI_0, extend        );
-        _nic_set_channel_register( channel, NIC_RX_DESC_HI_1, extend        );
+        buf_0_addr = base;
+        buf_1_addr = base + 0x1000;
+        sts_0_addr = base + 0x4000;
+        sts_1_addr = base + 0x4040;
+
+        desc_lo_0 = (sts_0_addr >> 6) + ((buf_0_addr & 0xFC0) << 20);
+        desc_lo_1 = (sts_1_addr >> 6) + ((buf_1_addr & 0xFC0) << 20);
+        desc_hi_0 = ((buf_0_addr & 0xFFFFF000) >> 12) + ((extend & 0xFFF) << 20);
+        desc_hi_1 = ((buf_1_addr & 0xFFFFF000) >> 12) + ((extend & 0xFFF) << 20);
+
+        _nic_set_channel_register( channel, NIC_RX_DESC_LO_0, desc_lo_0     );
+        _nic_set_channel_register( channel, NIC_RX_DESC_LO_1, desc_lo_1     );
+        _nic_set_channel_register( channel, NIC_RX_DESC_HI_0, desc_hi_0     );
+        _nic_set_channel_register( channel, NIC_RX_DESC_HI_1, desc_hi_1     );
         _nic_set_channel_register( channel, NIC_RX_RUN      , 1             );
     }
     else
     {
-        _nic_set_channel_register( channel, NIC_TX_DESC_LO_0, base + 0x2000 );
-        _nic_set_channel_register( channel, NIC_TX_DESC_LO_1, base + 0x3000 );
-        _nic_set_channel_register( channel, NIC_TX_DESC_HI_0, extend        );
-        _nic_set_channel_register( channel, NIC_TX_DESC_HI_1, extend        );
+        buf_0_addr = base + 0x2000;
+        buf_1_addr = base + 0x3000;
+        sts_0_addr = base + 0x4080;
+        sts_1_addr = base + 0x40c0;
+
+        desc_lo_0 = (sts_0_addr >> 6) + ((buf_0_addr & 0xFC0) << 20);
+        desc_lo_1 = (sts_1_addr >> 6) + ((buf_1_addr & 0xFC0) << 20);
+        desc_hi_0 = ((buf_0_addr & 0xFFFFF000) >> 12) + ((extend & 0xFFF) << 20);
+        desc_hi_1 = ((buf_1_addr & 0xFFFFF000) >> 12) + ((extend & 0xFFF) << 20);
+
+        _nic_set_channel_register( channel, NIC_TX_DESC_LO_0, desc_lo_0     );
+        _nic_set_channel_register( channel, NIC_TX_DESC_LO_1, desc_lo_1     );
+        _nic_set_channel_register( channel, NIC_TX_DESC_HI_0, desc_hi_0     );
+        _nic_set_channel_register( channel, NIC_TX_DESC_HI_1, desc_hi_1     );
         _nic_set_channel_register( channel, NIC_TX_RUN      , 1             );
     }
Index: /soft/giet_vm/giet_drivers/nic_driver.h
===================================================================
--- /soft/giet_vm/giet_drivers/nic_driver.h	(revision 612)
+++ /soft/giet_vm/giet_drivers/nic_driver.h	(revision 613)
@@ -78,23 +78,30 @@
 //////////////////////////////////////////////////////////////////////////////////////////////
 //            Channel Addressable Registers
-// A buffer descriptor occupies 64 bytes, but only 8 bytes (two 32 bits words) are useful:
-// LOW WORD   contains the 32 LSB bits of the buffer paddr                
-// HIGH WORD  contains the 16 MSB bits of the buffer paddr, plus status (bit 31)
-//////////////////////////////////////////////////////////////////////////////////////////////
+// A buffer descriptor occupies 8 bytes (two 32 bits words):
+// - the 26 LSB bits of LOW WORD contain bits[31:6] of the buffer satus paddr 
+// - bits[31:26] of LOW WORD and bits[19:0] of HIGH WORD contain bits[31:6] of the buffer paddr
+// - the 12 MSB bits of HIGH WORD contain the common address extension of the buffer and its status
+// The buffer status occupies 64 bytes but only the last bit is useful (1 for full and 0 for empty)
+// The buffer address and its status address must be 64 bytes aligned (bits[5:0] equal to 0)
+///////////////////////////////////////////////////////////////////////////////////////////////
 
 enum SoclibMultiNicChannelRegisters 
 {
-    NIC_RX_DESC_LO_0          = 0,   // RX_0 descriptor low word         (Read/Write)
-    NIC_RX_DESC_HI_0          = 1,   // RX_0 descriptor high word        (Read/Write)
-    NIC_RX_DESC_LO_1          = 16,  // RX_1 descriptor low word         (Read/Write)
-    NIC_RX_DESC_HI_1          = 17,  // RX_1 descriptor high word        (Read/Write) 
-    NIC_TX_DESC_LO_0          = 32,  // TX_0 descriptor low word         (Read/Write)
-    NIC_TX_DESC_HI_0          = 33,  // TX_0 descriptor high word        (Read/Write) 
-    NIC_TX_DESC_LO_1          = 48,  // TX_1 descriptor low word         (Read/Write)
-    NIC_TX_DESC_HI_1          = 49,  // TX_1 descriptor high word        (Read/Write) 
-    NIC_MAC_4                 = 64,  // channel mac address 32 LSB bits  (Read Only)
-    NIC_MAC_2                 = 65,  // channel mac address 16 LSB bits  (Read Only)
-    NIC_RX_RUN                = 66,  // RX packets can be received       (write_only)
-    NIC_TX_RUN                = 67,  // TX packets can be transmitted    (write_only)
+    NIC_RX_STS_0              = 0,   // RX_0 status (full or empty)      (Read/Write)
+    NIC_RX_STS_1              = 16,  // RX_1 status (full or empty)      (Read/Write)
+    NIC_TX_STS_0              = 32,  // TX_0 status (full or empty)      (Read/Write)
+    NIC_TX_STS_1              = 48,  // TX_1 status (full or empty)      (Read/Write)
+    NIC_RX_DESC_LO_0          = 64,  // RX_0 descriptor low word         (Read/Write)
+    NIC_RX_DESC_HI_0          = 65,  // RX_0 descriptor high word        (Read/Write)
+    NIC_RX_DESC_LO_1          = 66,  // RX_1 descriptor low word         (Read/Write)
+    NIC_RX_DESC_HI_1          = 67,  // RX_1 descriptor high word        (Read/Write) 
+    NIC_TX_DESC_LO_0          = 68,  // TX_0 descriptor low word         (Read/Write)
+    NIC_TX_DESC_HI_0          = 69,  // TX_0 descriptor high word        (Read/Write) 
+    NIC_TX_DESC_LO_1          = 70,  // TX_1 descriptor low word         (Read/Write)
+    NIC_TX_DESC_HI_1          = 71,  // TX_1 descriptor high word        (Read/Write) 
+    NIC_MAC_4                 = 72,  // channel mac address 32 LSB bits  (Read Only)
+    NIC_MAC_2                 = 73,  // channel mac address 16 LSB bits  (Read Only)
+    NIC_RX_RUN                = 74,  // RX packets can be received       (write_only)
+    NIC_TX_RUN                = 75,  // TX packets can be transmitted    (write_only)
 };
 
