Index: /soft/giet_vm/giet_drivers/dma_driver.c
===================================================================
--- /soft/giet_vm/giet_drivers/dma_driver.c	(revision 480)
+++ /soft/giet_vm/giet_drivers/dma_driver.c	(revision 481)
@@ -278,5 +278,4 @@
     }
 
-    unsigned int ko;
     unsigned int ppn;
     unsigned int flags;
@@ -313,26 +312,16 @@
 
     // get src_paddr buffer physical addresse
-    ko = _v2p_translate( (page_table_t*)pt,              // page table pointer
-                         src_vaddr>>12,                  // vpn 
-                         &ppn,                           // ppn
-                         &flags );                       // flags
-    if ( ko ) 
-    {
-        _puts("\n[DMA ERROR] in _dma_copy() : source buffer unmapped\n");
-        _exit();
-    }
+    _v2p_translate( (page_table_t*)pt,              // page table pointer
+                     src_vaddr>>12,                  // vpn 
+                     &ppn,                           // ppn
+                     &flags );                       // flags
     unsigned long long src_paddr = (((unsigned long long)ppn) << 12) | 
                                    (unsigned long long)(src_vaddr & 0x00000FFF);
 
     // get dst_paddr buffer physical addresse
-    ko = _v2p_translate( (page_table_t*)pt,              // page table pointer
-                         dst_vaddr>>12,                  // vpn 
-                         &ppn,                           // ppn
-                         &flags );                       // flags
-    if ( ko ) 
-    {
-        _puts("\n[DMA ERROR] in _dma_copy() : dest buffer unmapped\n");
-        _exit();
-    }
+    _v2p_translate( (page_table_t*)pt,              // page table pointer
+                     dst_vaddr>>12,                  // vpn 
+                     &ppn,                           // ppn
+                     &flags );                       // flags
     unsigned long long dst_paddr = (((unsigned long long)ppn) << 12) | 
                                    (unsigned long long)(dst_vaddr & 0x00000FFF);
Index: /soft/giet_vm/giet_drivers/hba_driver.c
===================================================================
--- /soft/giet_vm/giet_drivers/hba_driver.c	(revision 480)
+++ /soft/giet_vm/giet_drivers/hba_driver.c	(revision 481)
@@ -173,15 +173,10 @@
 
         // get ppn and flags 
-        ko = _v2p_translate( (page_table_t*)user_pt_vbase,
-                              vpn,
-                              &ppn,
-                              &flags );
+        _v2p_translate( (page_table_t*)user_pt_vbase,
+                        vpn,
+                        &ppn,
+                        &flags );
 
         // check access rights
-        if ( ko )
-        {
-            _puts("[GIET ERROR] in _hba_set_cmd() : user buffer unmapped\n");
-            return -1;
-        }
         if ((flags & PTE_U) == 0)
         {
@@ -261,5 +256,4 @@
     unsigned int ppn;
     unsigned int flags;
-    unsigned int fail;
     unsigned int vbase;
     unsigned int c;               // c == command index
@@ -281,13 +275,8 @@
     // Command list physical addresse
     vbase = (unsigned int)(&hba_cmd_list[channel]);
-    fail = _v2p_translate( (page_table_t*)pt,
-                           vbase>>12,
-                           &ppn,
-                           &flags );
-    if ( fail )
-    {
-        _puts("[GIET ERROR] in _hba_init() : command list unmapped\n");
-        return -1;
-    }
+    _v2p_translate( (page_table_t*)pt,
+                     vbase>>12,
+                     &ppn,
+                     &flags );
     hba_cmd_list_paddr[channel] = ((paddr_t)ppn) | (vbase & 0xFFF);
 
@@ -296,13 +285,8 @@
     {
         vbase = (unsigned int)(&hba_cmd_table[channel][c]);
-        fail = _v2p_translate( (page_table_t*)pt,
-                               vbase>>12,
-                               &ppn,
-                               &flags );
-        if ( fail )
-        {
-            _puts("[GIET ERROR] in _hba_init() : command table unmapped\n");
-            return -1;
-        }
+        _v2p_translate( (page_table_t*)pt,
+                         vbase>>12,
+                         &ppn,
+                         &flags );
         hba_cmd_table_paddr[channel][c] = ((paddr_t)ppn) | (vbase & 0xFFF);
     }
Index: /soft/giet_vm/giet_drivers/ioc_driver.c
===================================================================
--- /soft/giet_vm/giet_drivers/ioc_driver.c	(revision 480)
+++ /soft/giet_vm/giet_drivers/ioc_driver.c	(revision 481)
@@ -150,15 +150,10 @@
 
         // get user buffer first page ppn and flags
-        unsigned int ko = _v2p_translate( (page_table_t*)pt_vbase,
-                                           buf_vaddr >> 12,
-                                           &ppn,
-                                           &flags );
+        _v2p_translate( (page_table_t*)pt_vbase,
+                        buf_vaddr >> 12,
+                        &ppn,
+                        &flags );
+
         // check access rights
-        if ( ko )
-        {
-            _puts("\n[IOC ERROR] in _ioc_access() : buffer unmapped\n");
-            _exit(); 
-        }
-
         if ( (mode == IOC_USER_MODE) && ((flags & PTE_U) == 0) )
         {
Index: /soft/giet_vm/giet_drivers/mmc_driver.c
===================================================================
--- /soft/giet_vm/giet_drivers/mmc_driver.c	(revision 480)
+++ /soft/giet_vm/giet_drivers/mmc_driver.c	(revision 481)
@@ -6,8 +6,10 @@
 ///////////////////////////////////////////////////////////////////////////////////
 
-#include <giet_config.h>
+#include <hard_config.h>
 #include <mmc_driver.h>
 #include <tty0.h>
+#include <locks.h>
 #include <utils.h>
+
 #include <io.h>
 
@@ -89,15 +91,15 @@
     }
 
-    // get the hard lock protecting exclusive access to MEMC
-    while ( _mmc_get_register(cluster_xy, 0, MEMC_LOCK) );
+    // get the hard queuing lock protecting exclusive access to MEMC
+    _spin_lock_acquire( &_mmc_lock[x][y] );
 
     // write inval arguments
-    _mmc_set_register(cluster_xy, 0, MEMC_ADDR_LO   , (unsigned int)buf_paddr);
-    _mmc_set_register(cluster_xy, 0, MEMC_ADDR_HI   , (unsigned int)(buf_paddr>>32));
-    _mmc_set_register(cluster_xy, 0, MEMC_BUF_LENGTH, buf_length);
-    _mmc_set_register(cluster_xy, 0, MEMC_CMD_TYPE  , MEMC_CMD_INVAL);
+    _mmc_set_register( cluster_xy , 0 , MEMC_ADDR_LO   , (unsigned int)buf_paddr );
+    _mmc_set_register( cluster_xy , 0 , MEMC_ADDR_HI   , (unsigned int)(buf_paddr>>32) );
+    _mmc_set_register( cluster_xy , 0 , MEMC_BUF_LENGTH, buf_length );
+    _mmc_set_register( cluster_xy , 0 , MEMC_CMD_TYPE  , MEMC_CMD_INVAL );
 
     // release the lock 
-    _mmc_set_register(cluster_xy, 0, MEMC_LOCK, 0);
+    _spin_lock_release( &_mmc_lock[x][y] );
 }
 
@@ -118,6 +120,6 @@
     }
 
-    // get the hard lock protecting exclusive access to MEMC
-    while ( _mmc_get_register(cluster_xy, 0, MEMC_LOCK) );
+    // get the hard queuing lock protecting exclusive access to MEMC
+    _spin_lock_acquire( &_mmc_lock[x][y] );
 
     // write inval arguments
@@ -128,5 +130,5 @@
 
     // release the lock 
-    _mmc_set_register(cluster_xy, 0, MEMC_LOCK, 0);
+    _spin_lock_release( &_mmc_lock[x][y] );
 }
 
Index: /soft/giet_vm/giet_drivers/mmc_driver.h
===================================================================
--- /soft/giet_vm/giet_drivers/mmc_driver.h	(revision 480)
+++ /soft/giet_vm/giet_drivers/mmc_driver.h	(revision 481)
@@ -8,4 +8,7 @@
 #ifndef _GIET_MMC_DRIVERS_H_
 #define _GIET_MMC_DRIVERS_H_
+
+#include <hard_config.h>
+#include <locks.h>
 
 ///////////////////////////////////////////////////////////////////////////////////
@@ -30,4 +33,10 @@
 
 #define MMC_REG(func,idx) ((func<<7)|idx) 
+
+///////////////////////////////////////////////////////////////////////////////
+// Distributed locks protecting MMC components (one per cluster)
+///////////////////////////////////////////////////////////////////////////////
+
+spin_lock_t  _mmc_lock[X_SIZE][Y_SIZE]  __attribute__((aligned(64)));
 
 ///////////////////////////////////////////////////////////////////////////////////
Index: /soft/giet_vm/giet_drivers/nic_driver.c
===================================================================
--- /soft/giet_vm/giet_drivers/nic_driver.c	(revision 480)
+++ /soft/giet_vm/giet_drivers/nic_driver.c	(revision 481)
@@ -49,18 +49,4 @@
 # error: You must define USE_IOB in the hard_config.h file
 #endif
-
-#if !defined( GIET_NIC_NBUFS )
-# error: You must define GIET_NIC_NBUFS in the giet_config.h file
-#endif
-
-#if !defined( GIET_NIC_BUFSIZE )
-# error: You must define GIET_NIC_BUFSIZE in the giet_config.h file
-#endif
-
-#if !defined( GIET_NIC_TIMEOUT )
-# error: You must define GIET_NIC_TIMEOUT in the giet_config.h file
-#endif
-
-#define in_unckdata __attribute__((section (".unckdata")))
 
 ///////////////////////////////////////////////////////////////////////////////
Index: /soft/giet_vm/giet_drivers/nic_driver.h
===================================================================
--- /soft/giet_vm/giet_drivers/nic_driver.h	(revision 480)
+++ /soft/giet_vm/giet_drivers/nic_driver.h	(revision 481)
@@ -76,24 +76,25 @@
 };
 
-/////////////////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////////////////////
 //            Channel Addressable Registers
-// A container descriptor has the following form: 
-// LOW WORD  : 32 LSB bits of the container physical base address     
-// HIGH WORD : 16 MSB bits of the container physical base address + status (bit 31)  
-/////////////////////////////////////////////////////////////////////////////////////
+// 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)
+//////////////////////////////////////////////////////////////////////////////////////////////
+
 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          = 2,   // RX_1 descriptor low word         (Read/Write)
-    NIC_RX_DESC_HI_1          = 3,   // RX_1 descriptor high word        (Read/Write) 
-    NIC_TX_DESC_LO_0          = 4,   // TX_0 descriptor low word         (Read/Write)
-    NIC_TX_DESC_HI_0          = 5,   // TX_0 descriptor high word        (Read/Write) 
-    NIC_TX_DESC_LO_1          = 6,   // TX_1 descriptor low word         (Read/Write)
-    NIC_TX_DESC_HI_1          = 7,   // TX_1 descriptor high word        (Read/Write) 
-    NIC_MAC_4                 = 8,   // channel mac address 32 LSB bits  (Read Only)
-    NIC_MAC_2                 = 9,   // channel mac address 16 LSB bits  (Read Only)
-    NIC_RX_RUN                = 10,  // RX packets can be received       (write_only)
-    NIC_TX_RUN                = 11,  // TX packets can be transmitted    (write_only)
+    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)
 };
 
