From e2c322280296d18f9afa33fe3e27f1c4c2309acf Mon Sep 17 00:00:00 2001
From: Raymond Knopp <raymond.knopp@eurecom.fr>
Date: Mon, 9 May 2016 23:40:36 -0700
Subject: [PATCH] removal of EXPRESSMIMO #ifdef's in lte-ue. move UE-specific
 code from lte-softmodem.c to lte-ue.c

---
 cmake_targets/CMakeLists.txt     |  13 -
 targets/RT/USER/lte-softmodem.c  |  54 +--
 targets/RT/USER/lte-ue.c         | 669 ++++---------------------------
 targets/RT/USER/sched_dlsch.c    | 354 ----------------
 targets/RT/USER/sched_rx_pdsch.c | 321 ---------------
 targets/RT/USER/sched_ulsch.c    | 255 ------------
 6 files changed, 96 insertions(+), 1570 deletions(-)
 delete mode 100644 targets/RT/USER/sched_dlsch.c
 delete mode 100644 targets/RT/USER/sched_rx_pdsch.c
 delete mode 100644 targets/RT/USER/sched_ulsch.c

diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt
index 166da4a48d..966ef6e085 100644
--- a/cmake_targets/CMakeLists.txt
+++ b/cmake_targets/CMakeLists.txt
@@ -259,15 +259,6 @@ if (${ENABLE_ITTI})
 endif (${ENABLE_ITTI})
 
 add_boolean_option(RTAI False "Use RTAI")
-if (${RTAI})
-  set(LOWLATENCY False)
-  set(CPU_AFFINITY False)
-  add_definitions("-DENABLE_RTAI_CLOCK")
-  add_definitions("-DCONFIG_RTAI_LXRT_INLINE")
-  include_directories ("/usr/realtime/include")
-  include_directories ("/usr/realtime/include/asm")
-  set(RTAI_SOURCE sched_dlsch.c sched_rx_pdsch.c rt_wrapper.c vcd_signal_dumper.c log.c)
-endif (${RTAI})
 
 #############################
 # ASN.1 grammar C code generation & dependancies
@@ -1574,8 +1565,6 @@ add_executable(lte-softmodem
   ${rrc_h}
   ${s1ap_h}
   ${OPENAIR_BIN_DIR}/messages_xml.h
-  ${OPENAIR_TARGETS}/RT/USER/sched_dlsch.c
-  ${OPENAIR_TARGETS}/RT/USER/sched_rx_pdsch.c
   ${OPENAIR_TARGETS}/RT/USER/rt_wrapper.c
   ${OPENAIR_TARGETS}/RT/USER/lte-ue.c
   ${OPENAIR_TARGETS}/RT/USER/lte-softmodem.c
@@ -1611,8 +1600,6 @@ add_executable(lte-softmodem-nos1
   ${rrc_h}
   ${s1ap_h}
   ${OPENAIR_BIN_DIR}/messages_xml.h
-  ${OPENAIR_TARGETS}/RT/USER/sched_dlsch.c
-  ${OPENAIR_TARGETS}/RT/USER/sched_rx_pdsch.c
   ${OPENAIR_TARGETS}/RT/USER/rt_wrapper.c
   ${OPENAIR_TARGETS}/RT/USER/lte-ue.c
   ${OPENAIR_TARGETS}/RT/USER/lte-softmodem.c
diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c
index 4664b0aa21..822409f302 100644
--- a/targets/RT/USER/lte-softmodem.c
+++ b/targets/RT/USER/lte-softmodem.c
@@ -113,12 +113,18 @@ unsigned short config_frames[4] = {2,9,11,13};
 #include "stats.h"
 #endif
 
+// In lte-enb.c
 int setup_eNB_buffers(PHY_VARS_eNB **phy_vars_eNB, openair0_config_t *openair0_cfg, openair0_rf_map rf_map[MAX_NUM_CCs]);
-int setup_ue_buffers(PHY_VARS_UE **phy_vars_ue, openair0_config_t *openair0_cfg, openair0_rf_map rf_map[MAX_NUM_CCs]);
+
 extern void init_eNB(void);
 extern void stop_eNB(void);
+extern void kill_eNB_proc(void);
 
+// In lte-ue.c
+int setup_ue_buffers(PHY_VARS_UE **phy_vars_ue, openair0_config_t *openair0_cfg, openair0_rf_map rf_map[MAX_NUM_CCs]);
 void fill_ue_band_info(void);
+extern void init_UE(void);
+
 #ifdef XFORMS
 // current status is that every UE has a DL scope for a SINGLE eNB (eNB_id=0)
 // at eNB 0, an UL scope for every UE
@@ -130,9 +136,6 @@ unsigned char                   scope_enb_num_ue = 2;
 #endif //XFORMS
 
 
-pthread_t                       main_ue_thread;
-
-pthread_attr_t                  attr_UE_thread;
 
 
 
@@ -144,7 +147,6 @@ int sync_var=-1; //!< protected by mutex \ref sync_mutex.
 
 
 
-struct sched_param              sched_param_UE_thread;
 
 
 #ifdef XFORMS
@@ -284,9 +286,8 @@ openair0_config_t openair0_cfg[MAX_CARDS];
 double cpuf;
 
 char uecap_xer[1024],uecap_xer_in=0;
-extern void *UE_thread(void *arg);
-extern void init_UE_threads(void);
-extern void kill_eNB_proc(void);
+
+
 
 /*---------------------BMC: timespec helpers -----------------------------*/
 
@@ -1120,7 +1121,6 @@ int main( int argc, char **argv )
   uint16_t Nid_cell = 0;
   uint8_t  cooperation_flag=0,  abstraction_flag=0;
   uint8_t beta_ACK=0,beta_RI=0,beta_CQI=2;
-  int error_code;
 
 #if defined (XFORMS)
   int ret;
@@ -1752,43 +1752,11 @@ int main( int argc, char **argv )
   rt_sleep_ns(10*100000000ULL);
 
 
-  pthread_attr_init (&attr_UE_thread);
-  pthread_attr_setstacksize(&attr_UE_thread,8192);//5*PTHREAD_STACK_MIN);
 
-#ifndef LOWLATENCY
-  sched_param_UE_thread.sched_priority = sched_get_priority_max(SCHED_FIFO);
-  pthread_attr_setschedparam(&attr_UE_thread,&sched_param_UE_thread);
-#endif
 
   // start the main thread
-  if (UE_flag == 1) {
-    printf("Intializing UE Threads ...\n");
-    init_UE_threads();
-    sleep(1);
-    error_code = pthread_create(&main_ue_thread, &attr_UE_thread, UE_thread, NULL);
-
-    if (error_code!= 0) {
-      LOG_D(HW,"[lte-softmodem.c] Could not allocate UE_thread, error %d\n",error_code);
-      return(error_code);
-    } else {
-      LOG_D( HW, "[lte-softmodem.c] Allocate UE_thread successful\n" );
-      pthread_setname_np( main_ue_thread, "main UE" );
-    }
-
-    printf("UE threads created\n");
-#ifdef USE_MME
-
-    while (start_UE == 0) {
-      sleep(1);
-    }
-
-#endif
-
-
-
-  } else {
-    init_eNB();
-  }
+  if (UE_flag == 1) init_UE();
+  else init_eNB();
 
   // Sleep to allow all threads to setup
   sleep(1);
diff --git a/targets/RT/USER/lte-ue.c b/targets/RT/USER/lte-ue.c
index 561554516c..3049fd4e02 100644
--- a/targets/RT/USER/lte-ue.c
+++ b/targets/RT/USER/lte-ue.c
@@ -69,11 +69,7 @@
 #undef MALLOC //there are two conflicting definitions, so we better make sure we don't use it at all
 //#undef FRAME_LENGTH_COMPLEX_SAMPLES //there are two conflicting definitions, so we better make sure we don't use it at all
 
-#ifdef EXMIMO
-#include "openair0_lib.h"
-#else
 #include "../../ARCH/COMMON/common_lib.h"
-#endif
 
 #include "PHY/extern.h"
 #include "SCHED/extern.h"
@@ -96,10 +92,9 @@ typedef enum {
   si=2
 } sync_mode_t;
 
-int init_dlsch_threads(void);
-void cleanup_dlsch_threads(void);
-int32_t init_rx_pdsch_thread(void);
-void cleanup_rx_pdsch_thread(void);
+void init_UE_threads(void);
+void *UE_thread(void *arg);
+void init_UE(void);
 
 extern pthread_cond_t sync_cond;
 extern pthread_mutex_t sync_mutex;
@@ -125,19 +120,6 @@ extern uint64_t num_missed_slots; // counter for the number of missed slots
 
 extern void exit_fun(const char* s);
 
-#ifdef EXMIMO
-
-extern unsigned int             rxg_max[4];
-extern unsigned int             rxg_med[4];
-extern unsigned int             rxg_byp[4];
-extern unsigned int             nf_max[4];
-extern unsigned int             nf_med[4];
-extern unsigned int             nf_byp[4];
-extern rx_gain_t                rx_gain_mode[MAX_NUM_CCs][4];
-
-extern double tx_gain[MAX_NUM_CCs][4];
-extern double rx_gain[MAX_NUM_CCs][4];
-#endif
 #define KHz (1000UL)
 #define MHz (1000 * KHz)
 
@@ -189,6 +171,38 @@ static const eutra_band_t eutra_bands[] = {
   {44, 703    * MHz, 803    * MHz, 703    * MHz, 803    * MHz, TDD},
 };
 
+pthread_t                       main_ue_thread;
+pthread_attr_t                  attr_UE_thread;
+struct sched_param              sched_param_UE_thread;
+
+void init_UE() {
+
+  int error_code;
+  
+  printf("Intializing UE Threads ...\n");
+  init_UE_threads();
+  sleep(1);
+  error_code = pthread_create(&main_ue_thread, &attr_UE_thread, UE_thread, NULL);
+  
+  if (error_code!= 0) {
+    LOG_D(HW,"[lte-softmodem.c] Could not allocate UE_thread, error %d\n",error_code);
+    return;
+  } else {
+    LOG_D( HW, "[lte-softmodem.c] Allocate UE_thread successful\n" );
+    pthread_setname_np( main_ue_thread, "main UE" );
+  }
+
+  printf("UE threads created\n");
+#ifdef USE_MME
+  
+  while (start_UE == 0) {
+    sleep(1);
+  }
+  
+#endif
+  
+}
+
 /*!
  * \brief This is the UE synchronize thread.
  * It performs band scanning and synchonization.
@@ -512,15 +526,10 @@ static void *UE_thread_synch(void *arg)
 	    //            openair0_cfg[0].rx_gain[0] -= 0;
 	    break;
 	  }
-#ifndef EXMIMO
+
 	  openair0.trx_set_freq_func(&openair0,&openair0_cfg[0],0);
 	  //openair0.trx_set_gains_func(&openair0,&openair0_cfg[0]);
 	  //openair0.trx_stop_func(0);	  
-#else
-	  openair0_set_frequencies(&openair0,&openair0_cfg[0],0);
-	  openair0_set_gains(&openair0,&openair0_cfg[0]);
-	  openair0_stop(0);
-#endif
 	  sleep(1);
 	  init_frame_parms(&UE->lte_frame_parms,1);
 	}
@@ -550,13 +559,9 @@ static void *UE_thread_synch(void *arg)
 	 }
 	 
 
-#ifndef EXMIMO
+
 	  UE->slot_rx = 0;
 	  UE->slot_tx = 4;
-#else
-	  UE->slot_rx = 18;
-	  UE->slot_tx = 2;
-#endif
 	}
       } else {
         // initial sync failed
@@ -598,42 +603,13 @@ static void *UE_thread_synch(void *arg)
           for (i=0; i<openair0_cfg[card].rx_num_channels; i++) {
             openair0_cfg[card].rx_freq[i] = downlink_frequency[card][i]+freq_offset;
             openair0_cfg[card].tx_freq[i] = downlink_frequency[card][i]+uplink_frequency_offset[card][i]+freq_offset;
-#ifndef EXMIMO
+
 	    openair0.trx_set_freq_func(&openair0,&openair0_cfg[0],0);
 	    
-#else
-	    openair0_set_frequencies(&openair0,&openair0_cfg[0],0);
-	    
-#endif
 
-#if defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)
             openair0_cfg[card].rx_gain[i] = UE->rx_total_gain_dB;//-USRP_GAIN_OFFSET;
 	    
 	    
-#if 0
-            switch(UE->lte_frame_parms.N_RB_DL) {
-            case 6:
-              openair0_cfg[card].rx_gain[i] -= 12;
-              break;
-
-            case 25:
-              openair0_cfg[card].rx_gain[i] -= 6;
-              break;
-
-            case 50:
-              openair0_cfg[card].rx_gain[i] -= 0;//3;
-              break;
-
-            case 100:
-              openair0_cfg[card].rx_gain[i] -= 0;
-              break;
-
-            default:
-              printf("Unknown number of RBs %d\n",UE->lte_frame_parms.N_RB_DL);
-              break;
-            }
-#endif	    
-#endif
           }
         }
 	if (UE->UE_scan_carrier==1) {
@@ -690,17 +666,6 @@ static void *UE_thread_tx(void *arg)
 
   UE->instance_cnt_tx=-1;
 
-#ifdef RTAI
-  RT_TASK *task = rt_task_init_schmod(nam2num("UE TX Thread"), 0, 0, 0, SCHED_FIFO, 0xF);
-
-  if (task==NULL) {
-    LOG_E(PHY,"[SCHED][UE] Problem starting UE TX thread!!!!\n");
-    return 0;
-  }
-
-  LOG_D(HW,"Started UE TX thread (id %p)\n",task);
-#else
-
 #ifdef LOWLATENCY
   struct sched_attr attr;
   unsigned int flags = 0;
@@ -745,7 +710,7 @@ static void *UE_thread_tx(void *arg)
       exit_fun("Error setting processor affinity");
     }
   }
-  #endif
+#endif
 
   /* Check the actual affinity mask assigned to the thread */
 
@@ -790,7 +755,6 @@ static void *UE_thread_tx(void *arg)
                    (int) sparam.sched_priority, cpu_affinity);
 
 
-#endif
 #endif
 
   printf("waiting for sync (UE_thread_tx)\n");
@@ -909,17 +873,6 @@ static void *UE_thread_rx(void *arg)
 
   UE->instance_cnt_rx=-1;
 
-#ifdef RTAI
-  RT_TASK *task = rt_task_init_schmod(nam2num("UE RX Thread"), 0, 0, 0, SCHED_FIFO, 0xF);
-
-  if (task==NULL) {
-    LOG_E(PHY,"[SCHED][UE] Problem starting UE RX thread!!!!\n");
-    return &UE_thread_rx_retval;
-  }
-
-  LOG_D(HW,"Started UE RX thread (id %p)\n",task);
-#else
-
 #ifdef LOWLATENCY
   struct sched_attr attr;
   unsigned int flags = 0;
@@ -1008,7 +961,6 @@ static void *UE_thread_rx(void *arg)
                    (int) sparam.sched_priority, cpu_affinity);
 
 
-#endif
 #endif
 
   // Lock memory from swapping. This is a process wide call (not constraint to this thread).
@@ -1186,7 +1138,7 @@ static void *UE_thread_rx(void *arg)
 
 
 
-#ifndef EXMIMO
+
 #define RX_OFF_MAX 10
 #define RX_OFF_MIN 5
 #define RX_OFF_MID ((RX_OFF_MAX+RX_OFF_MIN)/2)
@@ -1227,16 +1179,6 @@ void *UE_thread(void *arg)
   MessageDef *message_p;
 #endif
 
-#ifdef RTAI
-  RT_TASK *task = rt_task_init_schmod(nam2num("UE thread"), 0, 0, 0, SCHED_FIFO, 0xF);
-
-  if (task==NULL) {
-    LOG_E(PHY,"[SCHED][UE] Problem starting UE thread!!!!\n");
-    return 0;
-  }
-
-#else
-
 #ifdef LOWLATENCY
   struct sched_attr attr;
   unsigned int flags = 0;
@@ -1264,7 +1206,6 @@ void *UE_thread(void *arg)
   struct sched_param sp;
   sp.sched_priority = sched_get_priority_max(SCHED_FIFO);
   pthread_setschedparam(pthread_self(),SCHED_FIFO,&sp);
-#endif
 #endif
 
   // Lock memory from swapping. This is a process wide call (not constraint to this thread).
@@ -1591,409 +1532,8 @@ void *UE_thread(void *arg)
 
   return &UE_thread_retval;
 }
-#endif
-
-
-
-#ifdef EXMIMO
-/* This is the main UE thread. Initially it is doing a periodic get_frame. One synchronized it gets woken up by the kernel driver using the RTAI message mechanism (rt_send and rt_receive). */
-void *UE_thread(void *arg)
-{
-  PHY_VARS_UE *UE=PHY_vars_UE_g[0][0];
-#ifdef RTAI
-  RT_TASK *task;
-#endif
-  // RTIME in, out, diff;
-  int slot=0,frame=0,hw_slot;
-  // unsigned int aa;
-  int delay_cnt;
-  RTIME time_in;
-  int /* hw_slot_offset=0, */ rx_offset_mbox=0,mbox_target=0,mbox_current=0;
-  int diff2;
-  int /* i, */ ret;
-  int /* CC_id, */ card;
-  volatile unsigned int *DAQ_MBOX = openair0_daq_cnt();
-
-  int wait_sync_cnt = 0;
-  int first_synch = 1;
-#ifdef LOWLATENCY
-  struct sched_attr attr;
-  unsigned int flags = 0;
-  //  unsigned long mask = 1; // processor 0
-#endif
-  int freq_offset;
-
-
-#ifdef RTAI
-  task = rt_task_init_schmod(nam2num("UE thread"), 0, 0, 0, SCHED_FIFO, 0xF);
-
-  if (task==NULL) {
-    LOG_E(PHY,"[SCHED][UE] Problem starting UE thread!!!!\n");
-    return 0;
-  }
-
-#endif
-
-
-#ifdef HARD_RT
-  rt_make_hard_real_time();
-#endif
-
-
-#ifdef LOWLATENCY
-  attr.size = sizeof(attr);
-  attr.sched_flags = 0;
-  attr.sched_nice = 0;
-  attr.sched_priority = 0;
-
-  // This creates a .25 ms  reservation
-  attr.sched_policy = SCHED_DEADLINE;
-  attr.sched_runtime  = (0.1  * 100) * 10000;
-  attr.sched_deadline = (0.25 * 100) * 10000;
-  attr.sched_period   = (0.5  * 100) * 10000;
-
-  // pin the UE main thread to CPU0
-  // if (pthread_setaffinity_np(pthread_self(), sizeof(mask),&mask) <0) {
-  //   perror("[MAIN_ENB_THREAD] pthread_setaffinity_np failed\n");
-  //   }
-
-  if (sched_setattr(0, &attr, flags) < 0 ) {
-    perror("[SCHED] main UE thread: sched_setattr failed\n");
-    exit_fun("Nothing to add");
-  } else {
-    LOG_I(HW,"[SCHED][eNB] eNB main deadline thread %ld started on CPU %d\n",
-          gettid(),sched_getcpu());
-  }
-
-#endif
-
-
-  mlockall(MCL_CURRENT | MCL_FUTURE);
-
-  printf("waiting for sync (UE_thread)\n");
-
-  pthread_mutex_lock(&sync_mutex);
-  printf("Locked sync_mutex, waiting (UE_thread)\n");
-
-  while (sync_var<0)
-    pthread_cond_wait(&sync_cond, &sync_mutex);
-
-  pthread_mutex_unlock(&sync_mutex);
-  printf("unlocked sync_mutex, waiting (UE_thread)\n");
-
-  printf("starting UE thread\n");
-
-  freq_offset = 0; //-7500;
-
-  first_synch = 1;
-
-  while (!oai_exit)  {
-
-    hw_slot = (((((volatile unsigned int *)DAQ_MBOX)[0]+1)%150)<<1)/15; //the slot the hw is about to store
-
-
-    if (UE->is_synchronized) {
-
-      if (first_synch == 1) {
-        first_synch = 0;
-
-        for (card=0; card<openair0_num_detected_cards; card++)
-          openair0_start_rt_acquisition(card);
-
-        rt_sleep_ns(FRAME_PERIOD/10);
-      }
-
-      //this is the mbox counter that indicates the start of the frame
-      rx_offset_mbox = (UE->rx_offset * 150) / (10*UE->lte_frame_parms.samples_per_tti);
-      VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE_RX_OFFSET, UE->rx_offset);
-      VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE_OFFSET_MBOX, rx_offset_mbox);
-      //this is the mbox counter where we should be
-      mbox_target = (((((slot+1)%20)*15+1)>>1) + rx_offset_mbox + 1)%150;
-      // round up to the next multiple of two (mbox counter from express MIMO gives only even numbers)
-      mbox_target = ((mbox_target+1)-((mbox_target-1)%2))%150;
-      //this is the mbox counter where we are
-      mbox_current = ((volatile unsigned int *)DAQ_MBOX)[0];
-
-      //this is the time we need to sleep in order to synchronize with the hw (in multiples of DAQ_PERIOD)
-      if ((mbox_current>=120) && (mbox_target<30)) //handle the frame wrap-arround
-        diff2 = 150-mbox_current+mbox_target;
-      else if ((mbox_current<30) && (mbox_target>=120))
-        diff2 = -150+mbox_target-mbox_current;
-      else
-        diff2 = mbox_target - mbox_current;
-
-      if (diff2 <(-7)) {
-        LOG_D(HW,"UE Frame %d: missed slot, proceeding with next one (slot %d, hw_slot %d, diff %d)\n",frame, slot, hw_slot, diff2);
-
-        if (frame>0) {
-          if (exit_missed_slots==1)
-            exit_fun("[HW][UE] missed slot");
-          else {
-            num_missed_slots++;
-            LOG_W(HW,"[UE] just missed slot (total missed slots %ld)\n", num_missed_slots);
-          }
-        }
-
-        slot++;
-
-        if (slot==20) {
-          slot=0;
-          frame++;
-        }
-
-        // update thread slot/frame counters because of skipped slot
-        UE->slot_rx++;
-        UE->slot_tx++;
-
-        if (UE->slot_rx == 20) {
-          UE->slot_rx = 0;
-          UE->frame_rx++;
-        }
-
-        if (UE->slot_tx == 20) {
-          UE->slot_tx = 0;
-          UE->frame_tx++;
-        }
-
-        continue;
-      }
-
-      if (diff2>8)
-        LOG_D(HW,"UE Frame %d: skipped slot, waiting for hw to catch up (slot %d, hw_slot %d, mbox_current %d, mbox_target %d, diff %d)\n",frame, slot, hw_slot, mbox_current, mbox_target, diff2);
-
-
-      VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_DAQ_MBOX, *DAQ_MBOX);
-      VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_DIFF, diff2);
-
-
-
-      // This loop implements the delay of 1 slot to allow for processing
-      delay_cnt = 0;
-
-      while ((diff2>0) && (!oai_exit) )  {
-        time_in = rt_get_time_ns();
-        //LOG_D(HW,"eNB Frame %d delaycnt %d : hw_slot %d (%d), slot %d (%d), diff %d, time %llu\n",frame,delay_cnt,hw_slot,((volatile unsigned int *)DAQ_MBOX)[0],slot,mbox_target,diff2,time_in);
-        VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_DAQ_MBOX, *DAQ_MBOX);
-        VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RT_SLEEP,1);
-        ret = rt_sleep_ns(diff2*DAQ_PERIOD);
-        VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RT_SLEEP,0);
-        VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_DAQ_MBOX, *DAQ_MBOX);
-
-        if (ret)
-          LOG_D(HW,"eNB Frame %d, time %llu: rt_sleep_ns returned %d\n",frame, time_in);
-
-        hw_slot = (((((volatile unsigned int *)DAQ_MBOX)[0]+1)%150)<<1)/15;
-        //LOG_D(HW,"eNB Frame %d : hw_slot %d, time %llu\n",frame,hw_slot,rt_get_time_ns());
-        delay_cnt++;
-
-        if (delay_cnt == 30)  {
-          LOG_D(HW,"UE frame %d: HW stopped ... \n",frame);
-          exit_fun("[HW][UE] HW stopped");
-        }
-
-        mbox_current = ((volatile unsigned int *)DAQ_MBOX)[0];
-
-        if ((mbox_current>=135) && (mbox_target<15)) //handle the frame wrap-arround
-          diff2 = 150-mbox_current+mbox_target;
-        else if ((mbox_current<15) && (mbox_target>=135))
-          diff2 = -150+mbox_target-mbox_current;
-        else
-          diff2 = mbox_target - mbox_current;
-
-        VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_DAQ_MBOX, *DAQ_MBOX);
-        VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_DIFF, diff2);
-      }
-
-      // on even slots, schedule processing of entire subframe
-      if ((slot&1) == 0)  {
-
-        if (pthread_mutex_lock(&UE->mutex_rx) != 0) {
-          LOG_E(PHY,"[SCHED][UE] error locking mutex for UE RX thread\n");
-          exit_fun("nothing to add");
-        } else {
-
-	  int instance_cnt_rx = ++UE->instance_cnt_rx;
-
-          pthread_mutex_unlock(&UE->mutex_rx);
-	  VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE_INST_CNT_RX, instance_cnt_rx);
-
-
-          if (instance_cnt_rx == 0) {
-            LOG_D(HW,"Scheduling UE RX for frame %d (hw frame %d), subframe %d (%d), mode %d\n",UE->frame_rx,frame,slot>>1,UE->slot_rx>>1,UE->mode);
-
-            if (pthread_cond_signal(&UE->cond_rx) != 0) {
-              LOG_E(PHY,"[SCHED][UE] ERROR pthread_cond_signal for UE RX thread\n");
-              exit_fun("nothing to add");
-            } else {
-              //        printf("UE_thread: cond_signal for RX ok (%p) @ %llu\n",(void*)&UE->cond_rx,rt_get_time_ns()-T0);
-            }
-
-            if (UE->mode == rx_calib_ue) {
-              if (frame == 10) {
-                LOG_D(PHY,
-                      "[SCHED][UE] Found cell with N_RB_DL %d, PHICH CONFIG (%d,%d), Nid_cell %d, NB_ANTENNAS_TX %d, initial frequency offset %d Hz, frequency offset %d Hz, RSSI (digital) %d dB, measured Gain %d dB, total_rx_gain %d dB, USRP rx gain %f dB\n",
-                      UE->lte_frame_parms.N_RB_DL,
-                      UE->lte_frame_parms.phich_config_common.phich_duration,
-                      UE->lte_frame_parms.phich_config_common.phich_resource,
-                      UE->lte_frame_parms.Nid_cell,
-                      UE->lte_frame_parms.nb_antennas_tx_eNB,
-                      freq_offset,
-                      UE->lte_ue_common_vars.freq_offset,
-                      UE->PHY_measurements.rx_power_avg_dB[0],
-                      UE->PHY_measurements.rx_power_avg_dB[0] - rx_input_level_dBm,
-                      UE->rx_total_gain_dB,
-                      openair0_cfg[0].rx_gain[0]
-                     );
-                exit_fun("[HW][UE] UE in RX calibration mode, exiting");
-              }
-            }
-          } else {
-            LOG_E(PHY,"[SCHED][UE] UE RX thread busy!!\n");
-            exit_fun("nothing to add");
-          }
-        }
-
-        if (pthread_mutex_lock(&UE->mutex_tx) != 0) {
-          LOG_E(PHY,"[SCHED][UE] error locking mutex for UE TX thread\n");
-          exit_fun("nothing to add");
-        } else {
-
-          int instance_cnt_tx = ++UE->instance_cnt_tx;
-
-          pthread_mutex_unlock(&UE->mutex_tx);
-	  VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE_INST_CNT_TX, instance_cnt_tx);
-
-          if (instance_cnt_tx == 0) {
-            LOG_D(HW,"Scheduling UE TX for frame %d (hw frame %d), subframe %d (%d), mode %d\n",UE->frame_tx,frame,slot>>1,UE->slot_tx>>1,UE->mode);
-
-            if (pthread_cond_signal(&UE->cond_tx) != 0) {
-              LOG_E(PHY,"[SCHED][UE] ERROR pthread_cond_signal for UE TX thread\n");
-              exit_fun("nothing to add");
-            } else {
-              //        printf("UE_thread: cond_signal for RX ok (%p) @ %llu\n",(void*)&UE->cond_rx,rt_get_time_ns()-T0);
-            }
-          } else {
-            LOG_E(PHY,"[SCHED][UE] UE TX thread busy!!\n");
-            exit_fun("nothing to add");
-          }
-        }
-      }
-
-      /*
-      if ((slot%2000)<10)
-      LOG_D(HW,"fun0: doing very hard work\n");
-      */
-      // now increment slot and frame counters
-      slot++;
-
-      if (slot==20) {
-        slot=0;
-        frame++;
-      }
-    } else if (UE->is_synchronized == 0) { // we are not yet synchronized
-      //hw_slot_offset = 0;
-      first_synch = 1;
-      slot = 0;
-
-
-      // wait until we can lock mutex_synch
-      //printf("Locking mutex_synch (UE_thread)\n");
-      if (pthread_mutex_lock(&UE->mutex_synch) != 0) {
-        LOG_E(PHY,"[SCHED][UE] error locking mutex for UE initial synch thread\n");
-        exit_fun("noting to add");
-      } else {
-
-        if (UE->instance_cnt_synch < 0) {
-
-          wait_sync_cnt=0;
-	  openair0_config(&openair0_cfg[0],1);
-      //  openair0_set_gains(&openair0,&openair0_cfg[0]);
-
-	  printf("Getting frame\n");
-          openair0_get_frame(0);
-          rt_sleep_ns(FRAME_PERIOD);
-          // increment instance count for sync thread
-          UE->instance_cnt_synch++;
-          pthread_mutex_unlock(&UE->mutex_synch);
-
-          if (pthread_cond_signal(&UE->cond_synch) != 0) {
-            LOG_E(PHY,"[SCHED][UE] ERROR pthread_cond_signal for UE sync thread\n");
-            exit_fun("nothing to add");
-          }
-        } else {
-          wait_sync_cnt++;
-          pthread_mutex_unlock(&UE->mutex_synch);
-
-          if (wait_sync_cnt>1000)
-            exit_fun("waiting to long for synch thread");
-          else
-            rt_sleep_ns(FRAME_PERIOD);
-        }
-      }
-
-
-      /*
-        if (initial_sync(UE,mode)==0) {
-
-        if (mode == rx_calib_ue) {
-        exit_fun("[HW][UE] UE in RX calibration mode");
-        }
-        else {
-        is_synchronized = 1;
-        //start the streaming DMA transfers
-        for (card=0;card<openair0_num_detected_cards;card++)
-        openair0_start_rt_acquisition(card);
-
-        hw_slot_offset = (UE->rx_offset<<1) / UE->lte_frame_parms.samples_per_tti;
-        }
-        }
-        else {
-        if (freq_offset >= 0) {
-        freq_offset += 100;
-        freq_offset *= -1;
-        }
-        else {
-        freq_offset *= -1;
-        }
-        if (abs(freq_offset) > 7500) {
-        LOG_I(PHY,"[initial_sync] No cell synchronization found, abondoning\n");
-        mac_xface->macphy_exit("No cell synchronization found, abondoning");
-        }
-        else {
-        //    LOG_I(PHY,"[initial_sync] trying carrier off %d Hz\n",freq_offset);
-        #ifndef USRP
-        for (CC_id=0;CC_id<MAX_NUM_CCs;CC_id++) {
-        for (i=0; i<openair0_cfg[rf_map[CC_id].card].rx_num_channels; i++)
-        openair0_cfg[rf_map[CC_id].card].rx_freq[rf_map[CC_id].chain+i] = downlink_frequency[CC_id][i]+freq_offset;
-        for (i=0; i<openair0_cfg[rf_map[CC_id].card].tx_num_channels; i++)
-        openair0_cfg[rf_map[CC_id].card].tx_freq[rf_map[CC_id].chain+i] = downlink_frequency[CC_id][i]+freq_offset;
-        }
-        openair0_config(&openair0_cfg[0],UE_flag);
-        #endif
-        rt_sleep_ns(FRAME_PERIOD);
-        }
-        }
-      */
-    }
-  }
-
-  LOG_D(HW,"UE_thread: finished, ran %d times.\n",frame);
-
-#ifdef HARD_RT
-  rt_make_soft_real_time();
-#endif
-
-  // clean task
-#ifdef RTAI
-  rt_task_delete(task);
-#endif
-  LOG_D(HW,"Task deleted. returning\n");
-  return 0;
-}
 
-#else  // This is for USRP or ETHERNET targets
 
-#endif
 
 
 /*!
@@ -2008,6 +1548,14 @@ void init_UE_threads(void)
 {
   PHY_VARS_UE *UE = PHY_vars_UE_g[0][0];
 
+  pthread_attr_init (&attr_UE_thread);
+  pthread_attr_setstacksize(&attr_UE_thread,8192);//5*PTHREAD_STACK_MIN);
+
+#ifndef LOWLATENCY
+  sched_param_UE_thread.sched_priority = sched_get_priority_max(SCHED_FIFO);
+  pthread_attr_setschedparam(&attr_UE_thread,&sched_param_UE_thread);
+#endif
+
   // the threads are not yet active, therefore access is allowed without locking
   UE->instance_cnt_tx = -1;
   UE->instance_cnt_rx = -1;
@@ -2063,97 +1611,50 @@ void fill_ue_band_info(void)
 int setup_ue_buffers(PHY_VARS_UE **phy_vars_ue, openair0_config_t *openair0_cfg, openair0_rf_map rf_map[MAX_NUM_CCs])
 {
 
-  //#ifndef EXMIMO
-  //  uint16_t N_TA_offset = 0;
-  //#endif
-
   int i, CC_id;
   LTE_DL_FRAME_PARMS *frame_parms;
-
+  
   for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
-    if (phy_vars_ue[CC_id]) {
-      frame_parms = &(phy_vars_ue[CC_id]->lte_frame_parms);
-    } else {
-      printf("phy_vars_UE[%d] not initialized\n", CC_id);
-      return(-1);
-    }
-
-
-    //#ifndef EXMIMO
-    //    if (frame_parms->frame_type == TDD) {
-    //      if (frame_parms->N_RB_DL == 100)
-    //  N_TA_offset = 624;
-    //      else if (frame_parms->N_RB_DL == 50)
-    //  N_TA_offset = 624/2;
-    //      else if (frame_parms->N_RB_DL == 25)
-    //  N_TA_offset = 624/4;
-    //    }
-    //#endif
-
-#ifdef EXMIMO
-    openair0_cfg[CC_id].tx_num_channels = 0;
-    openair0_cfg[CC_id].rx_num_channels = 0;
-
-    // replace RX signal buffers with mmaped HW versions
-    for (i=0; i<frame_parms->nb_antennas_rx; i++) {
-      printf("Mapping UE CC_id %d, rx_ant %d, freq %u on card %d, chain %d\n",CC_id,i,downlink_frequency[CC_id][i],rf_map[CC_id].card,rf_map[CC_id].chain+i);
-      free(phy_vars_ue[CC_id]->lte_ue_common_vars.rxdata[i]);
-      phy_vars_ue[CC_id]->lte_ue_common_vars.rxdata[i] = (int32_t*) openair0_exmimo_pci[rf_map[CC_id].card].adc_head[rf_map[CC_id].chain+i];
-
-      if (openair0_cfg[rf_map[CC_id].card].rx_freq[rf_map[CC_id].chain+i]) {
-        printf("Error with rf_map! A channel has already been allocated!\n");
-        return(-1);
-      } else {
-        openair0_cfg[rf_map[CC_id].card].rx_freq[rf_map[CC_id].chain+i] = downlink_frequency[CC_id][i];
-        openair0_cfg[rf_map[CC_id].card].rx_gain[rf_map[CC_id].chain+i] = rx_gain[CC_id][i];
-        openair0_cfg[rf_map[CC_id].card].rxg_mode[rf_map[CC_id].chain+i] = rx_gain_mode[CC_id][i];
-        openair0_cfg[rf_map[CC_id].card].rx_num_channels++;
-      }
-
-      printf("rxdata[%d] @ %p\n",i,phy_vars_ue[CC_id]->lte_ue_common_vars.rxdata[i]);
-    }
-
-    for (i=0; i<frame_parms->nb_antennas_tx; i++) {
-      printf("Mapping UE CC_id %d, tx_ant %d, freq %u on card %d, chain %d\n",CC_id,i,downlink_frequency[CC_id][i],rf_map[CC_id].card,rf_map[CC_id].chain+i);
-      free(phy_vars_ue[CC_id]->lte_ue_common_vars.txdata[i]);
-      phy_vars_ue[CC_id]->lte_ue_common_vars.txdata[i] = (int32_t*) openair0_exmimo_pci[rf_map[CC_id].card].dac_head[rf_map[CC_id].chain+i];
+  if (phy_vars_ue[CC_id]) {
+  frame_parms = &(phy_vars_ue[CC_id]->lte_frame_parms);
+  } else {
+    printf("phy_vars_UE[%d] not initialized\n", CC_id);
+    return(-1);
+  }
 
-      if (openair0_cfg[rf_map[CC_id].card].tx_freq[rf_map[CC_id].chain+i]) {
-        printf("Error with rf_map! A channel has already been allocated!\n");
-        return(-1);
-      } else {
-        openair0_cfg[rf_map[CC_id].card].tx_freq[rf_map[CC_id].chain+i] = downlink_frequency[CC_id][i]+uplink_frequency_offset[CC_id][i];
-        openair0_cfg[rf_map[CC_id].card].tx_gain[rf_map[CC_id].chain+i] = tx_gain[CC_id][i];
-        openair0_cfg[rf_map[CC_id].card].tx_num_channels++;
-      }
 
-      printf("txdata[%d] @ %p\n",i,phy_vars_ue[CC_id]->lte_ue_common_vars.txdata[i]);
-    }
+  if (frame_parms->frame_type == TDD) {
+    if (frame_parms->N_RB_DL == 100)
+      N_TA_offset = 624;
+    else if (frame_parms->N_RB_DL == 50)
+      N_TA_offset = 624/2;
+    else if (frame_parms->N_RB_DL == 25)
+      N_TA_offset = 624/4;
+  }
+  
 
-#else
     // replace RX signal buffers with mmaped HW versions
-    rxdata = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) );
-    txdata = (int32_t**)malloc16( frame_parms->nb_antennas_tx*sizeof(int32_t*) );
-
-    for (i=0; i<frame_parms->nb_antennas_rx; i++) {
-      printf( "Mapping UE CC_id %d, rx_ant %d, freq %u on card %d, chain %d\n", CC_id, i, downlink_frequency[CC_id][i], rf_map[CC_id].card, rf_map[CC_id].chain+i );
-      free( phy_vars_ue[CC_id]->lte_ue_common_vars.rxdata[i] );
-      rxdata[i] = (int32_t*)malloc16_clear( 307200*sizeof(int32_t) );
-      phy_vars_ue[CC_id]->lte_ue_common_vars.rxdata[i] = rxdata[i]; // what about the "-N_TA_offset" ? // N_TA offset for TDD
-    }
-
-    for (i=0; i<frame_parms->nb_antennas_tx; i++) {
-      printf( "Mapping UE CC_id %d, tx_ant %d, freq %u on card %d, chain %d\n", CC_id, i, downlink_frequency[CC_id][i], rf_map[CC_id].card, rf_map[CC_id].chain+i );
-      free( phy_vars_ue[CC_id]->lte_ue_common_vars.txdata[i] );
-      txdata[i] = (int32_t*)malloc16_clear( 307200*sizeof(int32_t) );
-      phy_vars_ue[CC_id]->lte_ue_common_vars.txdata[i] = txdata[i];
-    }
-
-    // rxdata[x] points now to the same memory region as phy_vars_ue[CC_id]->lte_ue_common_vars.rxdata[x]
-    // txdata[x] points now to the same memory region as phy_vars_ue[CC_id]->lte_ue_common_vars.txdata[x]
-    // be careful when releasing memory!
-    // because no "release_ue_buffers"-function is available, at least rxdata and txdata memory will leak (only some bytes)
-#endif
+  rxdata = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) );
+  txdata = (int32_t**)malloc16( frame_parms->nb_antennas_tx*sizeof(int32_t*) );
+
+  for (i=0; i<frame_parms->nb_antennas_rx; i++) {
+    printf( "Mapping UE CC_id %d, rx_ant %d, freq %u on card %d, chain %d\n", CC_id, i, downlink_frequency[CC_id][i], rf_map[CC_id].card, rf_map[CC_id].chain+i );
+    free( phy_vars_ue[CC_id]->lte_ue_common_vars.rxdata[i] );
+    rxdata[i] = (int32_t*)malloc16_clear( 307200*sizeof(int32_t) );
+    phy_vars_ue[CC_id]->lte_ue_common_vars.rxdata[i] = rxdata[i]; // what about the "-N_TA_offset" ? // N_TA offset for TDD
+  }
+  
+  for (i=0; i<frame_parms->nb_antennas_tx; i++) {
+    printf( "Mapping UE CC_id %d, tx_ant %d, freq %u on card %d, chain %d\n", CC_id, i, downlink_frequency[CC_id][i], rf_map[CC_id].card, rf_map[CC_id].chain+i );
+    free( phy_vars_ue[CC_id]->lte_ue_common_vars.txdata[i] );
+    txdata[i] = (int32_t*)malloc16_clear( 307200*sizeof(int32_t) );
+    phy_vars_ue[CC_id]->lte_ue_common_vars.txdata[i] = txdata[i];
+  }
+  
+  // rxdata[x] points now to the same memory region as phy_vars_ue[CC_id]->lte_ue_common_vars.rxdata[x]
+  // txdata[x] points now to the same memory region as phy_vars_ue[CC_id]->lte_ue_common_vars.txdata[x]
+  // be careful when releasing memory!
+  // because no "release_ue_buffers"-function is available, at least rxdata and txdata memory will leak (only some bytes)
 
   }
 
diff --git a/targets/RT/USER/sched_dlsch.c b/targets/RT/USER/sched_dlsch.c
deleted file mode 100644
index 48fac642a9..0000000000
--- a/targets/RT/USER/sched_dlsch.c
+++ /dev/null
@@ -1,354 +0,0 @@
-/*******************************************************************************
-    OpenAirInterface
-    Copyright(c) 1999 - 2014 Eurecom
-
-    OpenAirInterface is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-
-    OpenAirInterface is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with OpenAirInterface.The full GNU General Public License is
-    included in this distribution in the file called "COPYING". If not,
-    see <http://www.gnu.org/licenses/>.
-
-   Contact Information
-   OpenAirInterface Admin: openair_admin@eurecom.fr
-   OpenAirInterface Tech : openair_tech@eurecom.fr
-   OpenAirInterface Dev  : openair4g-devel@lists.eurecom.fr
-
-   Address      : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE
-
- *******************************************************************************/
-
-/*! \file sched_dlsch.c
-* \brief DLSCH decoding thread (RTAI)
-* \author R. Knopp, F. Kaltenberger
-* \date 2011
-* \version 0.1
-* \company Eurecom
-* \email: knopp@eurecom.fr,florian.kaltenberger@eurecom.fr
-* \note
-* \warning
-*/
-#include <stdio.h>
-#include <stdlib.h>
-#include <sched.h>
-
-#include "rt_wrapper.h"
-
-#include <sys/mman.h>
-
-#include "PHY/types.h"
-#include "PHY/defs.h"
-#include "PHY/extern.h"
-
-#include "SCHED/defs.h"
-
-#include "UTIL/LOG/vcd_signal_dumper.h"
-
-#define DEBUG_PHY
-
-/// Mutex for instance count on dlsch scheduling
-pthread_mutex_t dlsch_mutex[8];
-/// Condition variable for dlsch thread
-pthread_cond_t dlsch_cond[8];
-
-pthread_t dlsch_threads[8];
-pthread_attr_t attr_dlsch_threads;
-unsigned char dlsch_thread_indices[8];
-
-// activity indicators for harq_pid's
-int dlsch_instance_cnt[8];
-// process ids for cpu
-int dlsch_cpuid[8];
-// subframe number for each harq_pid (needed to store ack in right place for UL)
-int dlsch_subframe[8];
-
-extern int oai_exit;
-
-/*
-extern int dlsch_errors;
-extern int dlsch_received;
-extern int dlsch_errors_last;
-extern int dlsch_received_last;
-extern int dlsch_fer;
-extern int current_dlsch_cqi;
-*/
-
-/** DLSCH Decoding Thread */
-static void * dlsch_thread(void *param)
-{
-
-  //unsigned long cpuid;
-  unsigned char dlsch_thread_index = *((unsigned char *)param);
-  unsigned int ret=0;
-  uint8_t harq_pid;
-
-
-#ifdef RTAI
-  RT_TASK *task;
-  char task_name[8];
-#endif
-
-  int eNB_id = 0, UE_id = 0, CC_id=0;
-  PHY_VARS_UE *phy_vars_ue = PHY_vars_UE_g[UE_id][CC_id];
-
-  if ((dlsch_thread_index <0) || (dlsch_thread_index>7)) {
-    LOG_E(PHY,"[SCHED][DLSCH] Illegal dlsch_thread_index %d (%p)!!!!\n",dlsch_thread_index,param);
-    return 0;
-  }
-
-#ifdef RTAI
-  sprintf(task_name,"DLSCH%d",dlsch_thread_index);
-  task = rt_task_init_schmod(nam2num(task_name), 0, 0, 0, SCHED_FIFO, 0xF);
-
-  if (task==NULL) {
-    LOG_E(PHY,"[SCHED][DLSCH] Problem starting dlsch_thread_index %d (%s)!!!!\n",dlsch_thread_index,task_name);
-    return 0;
-  } else {
-    LOG_I(PHY,"[SCHED][DLSCH] dlsch_thread for process %d started with id %p\n",
-          dlsch_thread_index,
-          task);
-  }
-
-#endif
-
-  mlockall(MCL_CURRENT | MCL_FUTURE);
-
-  //rt_set_runnable_on_cpuid(task,1);
-  //cpuid = rtai_cpuid();
-
-#ifdef HARD_RT
-  rt_make_hard_real_time();
-#endif
-
-  //dlsch_cpuid[dlsch_thread_index] = cpuid;
-
-  while (!oai_exit) {
-
-    VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_THREAD0+dlsch_thread_index,0);
-
-    if (pthread_mutex_lock(&dlsch_mutex[dlsch_thread_index]) != 0) {
-      LOG_E(PHY,"[SCHED][DLSCH] error locking mutex.\n");
-    } else {
-
-      while (dlsch_instance_cnt[dlsch_thread_index] < 0) {
-        pthread_cond_wait(&dlsch_cond[dlsch_thread_index],&dlsch_mutex[dlsch_thread_index]);
-      }
-
-      if (pthread_mutex_unlock(&dlsch_mutex[dlsch_thread_index]) != 0) {
-        LOG_E(PHY,"[SCHED][DLSCH] error unlocking mutex.\n");
-      }
-    }
-
-    VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_THREAD0+dlsch_thread_index,1);
-
-    if (oai_exit) break;
-
-    LOG_I(PHY,"[SCHED][DLSCH] Frame %d: Calling dlsch_decoding with dlsch_thread_index = %d\n",phy_vars_ue->frame_rx,dlsch_thread_index);
-
-
-
-    if (phy_vars_ue->frame_rx < phy_vars_ue->dlsch_errors[eNB_id]) {
-      phy_vars_ue->dlsch_errors[eNB_id]=0;
-      phy_vars_ue->dlsch_received[eNB_id] = 0;
-    }
-
-    harq_pid = dlsch_thread_index;
-
-    if (phy_vars_ue->dlsch_ue[eNB_id][0]) {
-
-      //      rt_printk("[SCHED][DLSCH] Frame %d, slot %d, start %llu, end %llu, proc time: %llu ns\n",phy_vars_ue->frame,last_slot,time0,time1,(time1-time0));
-
-      dlsch_unscrambling(&phy_vars_ue->lte_frame_parms,
-                         0,
-                         phy_vars_ue->dlsch_ue[eNB_id][0],
-                         phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->G,
-                         phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->llr[0],
-                         0,
-                         dlsch_subframe[dlsch_thread_index]<<1);
-
-      LOG_I(PHY,"[UE %d] PDSCH Calling dlsch_decoding for subframe %d, harq_pid %d, G%d\n", phy_vars_ue->Mod_id,dlsch_subframe[dlsch_thread_index], harq_pid,
-            phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->G);
-
-      VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_DECODING0+dlsch_thread_index,1);
-      ret = dlsch_decoding(phy_vars_ue,
-                           phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->llr[0],
-                           &phy_vars_ue->lte_frame_parms,
-                           phy_vars_ue->dlsch_ue[eNB_id][0],
-                           phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid],
-                           dlsch_subframe[dlsch_thread_index],
-                           harq_pid,
-                           1, // is_crnti
-                           0);  // llr8_flag
-      VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_DECODING0+dlsch_thread_index,0);
-
-      LOG_D(PHY,"[UE  %d][PDSCH %x/%d] Frame %d subframe %d: PDSCH/DLSCH decoding iter %d (mcs %d, rv %d, TBS %d)\n",
-            phy_vars_ue->Mod_id,
-            phy_vars_ue->dlsch_ue[eNB_id][0]->rnti,harq_pid,
-            phy_vars_ue->frame_rx,dlsch_subframe[dlsch_thread_index],ret,
-            phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->mcs,
-            phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->rvidx,
-            phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->TBS);
-
-
-      if (ret == (1+MAX_TURBO_ITERATIONS)) {
-        phy_vars_ue->dlsch_errors[eNB_id]++;
-
-#ifdef DEBUG_PHY
-        LOG_I(PHY,"[UE  %d][PDSCH %x/%d] Frame %d subframe %d DLSCH in error (rv %d,mcs %d)\n",
-              phy_vars_ue->Mod_id,phy_vars_ue->dlsch_ue[eNB_id][0]->rnti,
-              harq_pid,phy_vars_ue->frame_rx,dlsch_subframe[dlsch_thread_index],
-              phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->rvidx,
-              phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->mcs);
-#endif
-      } else {
-        LOG_I(PHY,"[UE  %d][PDSCH %x/%d] Frame %d subframe %d: Received DLSCH (rv %d,mcs %d)\n",
-              phy_vars_ue->Mod_id,phy_vars_ue->dlsch_ue[eNB_id][0]->rnti,
-              harq_pid,phy_vars_ue->frame_rx,dlsch_subframe[dlsch_thread_index],
-              phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->rvidx,
-              phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->mcs);
-
-#ifdef OPENAIR2
-        mac_xface->ue_send_sdu(phy_vars_ue->Mod_id,
-                               0, // CC_id
-                               phy_vars_ue->frame_rx,
-                               phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->b,
-                               phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->TBS>>3,
-                               eNB_id);
-#endif
-        phy_vars_ue->total_TBS[eNB_id] =  phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->TBS + phy_vars_ue->total_TBS[eNB_id];
-        phy_vars_ue->total_received_bits[eNB_id] = phy_vars_ue->total_received_bits[eNB_id] + phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->TBS;
-      }
-    }
-
-    // this is done in main thread
-    /*
-    if (phy_vars_ue->frame % 100 == 0) {
-      if ((phy_vars_ue->dlsch_received[eNB_id] - phy_vars_ue->dlsch_received_last[eNB_id]) != 0)
-    phy_vars_ue->dlsch_fer[eNB_id] = (100*(phy_vars_ue->dlsch_errors[eNB_id] - phy_vars_ue->dlsch_errors_last[eNB_id]))/(phy_vars_ue->dlsch_received[eNB_id] - phy_vars_ue->dlsch_received_last[eNB_id]);
-      phy_vars_ue->dlsch_errors_last[eNB_id] = phy_vars_ue->dlsch_errors[eNB_id];
-      phy_vars_ue->dlsch_received_last[eNB_id] = phy_vars_ue->dlsch_received[eNB_id];
-    }
-    */
-
-
-#ifdef DEBUG_PHY
-
-    if (phy_vars_ue->dlsch_ue[eNB_id][0]) {
-      LOG_I(PHY,"[UE  %d][PDSCH %x/%d] Frame %d subframe %d: PDSCH/DLSCH decoding iter %d (mcs %d, rv %d, TBS %d)\n",
-            phy_vars_ue->Mod_id,
-            phy_vars_ue->dlsch_ue[eNB_id][0]->rnti,harq_pid,
-            phy_vars_ue->frame_rx,dlsch_subframe[dlsch_thread_index],ret,
-            phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->mcs,
-            phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->rvidx,
-            phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->TBS);
-
-      if (phy_vars_ue->frame_rx%100==0) {
-        LOG_D(PHY,"[UE  %d][PDSCH %x] Frame %d subframe %d dlsch_errors %d, dlsch_received %d, dlsch_fer %d, current_dlsch_cqi %d\n",
-              phy_vars_ue->Mod_id,phy_vars_ue->dlsch_ue[eNB_id][0]->rnti,
-              phy_vars_ue->frame_rx,dlsch_subframe[dlsch_thread_index],
-              phy_vars_ue->dlsch_errors[eNB_id],
-              phy_vars_ue->dlsch_received[eNB_id],
-              phy_vars_ue->dlsch_fer[eNB_id],
-              phy_vars_ue->PHY_measurements.wideband_cqi_tot[eNB_id]);
-      }
-    } else {
-      LOG_I( PHY,"[UE %d][PDSCH ?/%d] Frame %d subframe %d: PDSCH/DLSCH decoding iter %d (phy_vars_ue->dlsch_ue[eNB_id][0] == 0)\n",
-             phy_vars_ue->Mod_id,
-             harq_pid,
-             phy_vars_ue->frame_rx, dlsch_subframe[dlsch_thread_index], ret );
-    }
-
-#endif
-
-    if (pthread_mutex_lock(&dlsch_mutex[dlsch_thread_index]) != 0) {
-      msg("[openair][SCHED][DLSCH] error locking mutex.\n");
-    } else {
-      dlsch_instance_cnt[dlsch_thread_index]--;
-
-      if (pthread_mutex_unlock(&dlsch_mutex[dlsch_thread_index]) != 0) {
-        msg("[openair][SCHED][DLSCH] error unlocking mutex.\n");
-      }
-    }
-
-  }
-
-#ifdef HARD_RT
-  rt_make_soft_real_time();
-#endif
-
-  msg("[openair][SCHED][DLSCH] DLSCH thread %d exiting\n",dlsch_thread_index);
-
-  return 0;
-}
-
-int init_dlsch_threads(void)
-{
-
-  int error_code;
-  struct sched_param p;
-  unsigned char dlsch_thread_index;
-
-  pthread_attr_init (&attr_dlsch_threads);
-  pthread_attr_setstacksize(&attr_dlsch_threads,OPENAIR_THREAD_STACK_SIZE);
-  //attr_dlsch_threads.priority = 1;
-
-  p.sched_priority = OPENAIR_THREAD_PRIORITY;
-  pthread_attr_setschedparam  (&attr_dlsch_threads, &p);
-#ifndef RTAI_ISNT_POSIX
-  pthread_attr_setschedpolicy (&attr_dlsch_threads, SCHED_FIFO);
-#endif
-
-  for(dlsch_thread_index=0; dlsch_thread_index<8; dlsch_thread_index++) {
-
-    pthread_mutex_init(&dlsch_mutex[dlsch_thread_index],NULL);
-    pthread_cond_init(&dlsch_cond[dlsch_thread_index],NULL);
-
-    dlsch_instance_cnt[dlsch_thread_index] = -1;
-    dlsch_thread_indices[dlsch_thread_index] = dlsch_thread_index;
-    rt_printk("[openair][SCHED][DLSCH][INIT] Allocating DLSCH thread for dlsch_thread_index %d (%p)\n",dlsch_thread_index,&dlsch_thread_indices[dlsch_thread_index]);
-    error_code = pthread_create(&dlsch_threads[dlsch_thread_index],
-                                &attr_dlsch_threads,
-                                dlsch_thread,
-                                (void *)&dlsch_thread_indices[dlsch_thread_index]);
-
-    if (error_code!= 0) {
-      rt_printk("[openair][SCHED][DLSCH][INIT] Could not allocate dlsch_thread %d, error %d\n",dlsch_thread_index,error_code);
-      return(error_code);
-    } else {
-      rt_printk("[openair][SCHED][DLSCH][INIT] Allocate dlsch_thread %d successful\n",dlsch_thread_index);
-    }
-  }
-
-  return(0);
-}
-
-void cleanup_dlsch_threads(void)
-{
-
-  unsigned char dlsch_thread_index;
-
-  for(dlsch_thread_index=0; dlsch_thread_index<8; dlsch_thread_index++) {
-    //  pthread_exit(&dlsch_threads[dlsch_thread_index]);
-    rt_printk("[openair][SCHED][DLSCH] Scheduling dlsch_thread %d to exit\n",dlsch_thread_index);
-
-    dlsch_instance_cnt[dlsch_thread_index] = 0;
-
-    if (pthread_cond_signal(&dlsch_cond[dlsch_thread_index]) != 0)
-      rt_printk("[openair][SCHED][DLSCH] ERROR pthread_cond_signal\n");
-    else
-      rt_printk("[openair][SCHED][DLSCH] Signalled dlsch_thread %d to exit\n",dlsch_thread_index);
-
-    rt_printk("[openair][SCHED][DLSCH] Exiting ...\n");
-    pthread_cond_destroy(&dlsch_cond[dlsch_thread_index]);
-    pthread_mutex_destroy(&dlsch_mutex[dlsch_thread_index]);
-  }
-}
diff --git a/targets/RT/USER/sched_rx_pdsch.c b/targets/RT/USER/sched_rx_pdsch.c
deleted file mode 100644
index e792fe737d..0000000000
--- a/targets/RT/USER/sched_rx_pdsch.c
+++ /dev/null
@@ -1,321 +0,0 @@
-/*******************************************************************************
-    OpenAirInterface
-    Copyright(c) 1999 - 2014 Eurecom
-
-    OpenAirInterface is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-
-    OpenAirInterface is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with OpenAirInterface.The full GNU General Public License is
-    included in this distribution in the file called "COPYING". If not,
-    see <http://www.gnu.org/licenses/>.
-
-   Contact Information
-   OpenAirInterface Admin: openair_admin@eurecom.fr
-   OpenAirInterface Tech : openair_tech@eurecom.fr
-   OpenAirInterface Dev  : openair4g-devel@lists.eurecom.fr
-
-   Address      : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE
-
- *******************************************************************************/
-
-/*! \file sched_dlsch.c
-* \brief DLSCH decoding thread (RTAI)
-* \author R. Knopp, F. Kaltenberger
-* \date 2011
-* \version 0.1
-* \company Eurecom
-* \email: knopp@eurecom.fr,florian.kaltenberger@eurecom.fr
-* \note
-* \warning
-*/
-#include <stdio.h>
-#include <stdlib.h>
-#include <sched.h>
-
-#include "rt_wrapper.h"
-
-#include <sys/mman.h>
-
-#include "PHY/types.h"
-#include "PHY/defs.h"
-#include "PHY/extern.h"
-#include "SCHED/defs.h"
-#include "SCHED/extern.h"
-
-#include "UTIL/LOG/vcd_signal_dumper.h"
-
-RTIME time0,time1;
-
-#define DEBUG_PHY
-
-/// Mutex for instance count on rx_pdsch scheduling
-pthread_mutex_t rx_pdsch_mutex;
-/// Condition variable for rx_pdsch thread
-pthread_cond_t rx_pdsch_cond;
-
-pthread_t rx_pdsch_thread_var;
-pthread_attr_t attr_rx_pdsch_thread;
-
-// activity indicators for harq_pid's
-int rx_pdsch_instance_cnt;
-// process ids for cpu
-int rx_pdsch_cpuid;
-// subframe number for each harq_pid (needed to store ack in right place for UL)
-int rx_pdsch_slot;
-
-extern int oai_exit;
-extern pthread_mutex_t dlsch_mutex[8];
-extern int dlsch_instance_cnt[8];
-extern int dlsch_subframe[8];
-extern pthread_cond_t dlsch_cond[8];
-
-/** RX_PDSCH Decoding Thread */
-static void * rx_pdsch_thread(void *param)
-{
-
-  //unsigned long cpuid;
-  uint8_t dlsch_thread_index = 0;
-  uint8_t pilot2,harq_pid,subframe;
-  //  uint8_t last_slot;
-
-  uint8_t dual_stream_UE = 0;
-  uint8_t i_mod = 0;
-
-
-#ifdef RTAI
-  RT_TASK *task;
-#endif
-
-  int m,eNB_id = 0;
-  int eNB_id_i = 1;
-  PHY_VARS_UE *UE = PHY_vars_UE_g[0][0];
-
-#ifdef RTAI
-  task = rt_task_init_schmod(nam2num("RX_PDSCH_THREAD"), 0, 0, 0, SCHED_FIFO, 0xF);
-
-  if (task==NULL) {
-    LOG_E(PHY,"[SCHED][RX_PDSCH] Problem starting rx_pdsch thread!!!!\n");
-    return 0;
-  } else {
-    LOG_I(PHY,"[SCHED][RX_PDSCH] rx_pdsch_thread started for with id %p\n",task);
-  }
-
-#endif
-
-  mlockall(MCL_CURRENT | MCL_FUTURE);
-
-  //rt_set_runnable_on_cpuid(task,1);
-  //cpuid = rtai_cpuid();
-
-#ifdef HARD_RT
-  rt_make_hard_real_time();
-#endif
-
-  if (UE->lte_frame_parms.Ncp == NORMAL) {  // normal prefix
-    pilot2 = 7;
-  } else { // extended prefix
-    pilot2 = 6;
-  }
-
-
-  while (!oai_exit) {
-    VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_THREAD, 0);
-
-    if (pthread_mutex_lock(&rx_pdsch_mutex) != 0) {
-      LOG_E(PHY,"[SCHED][RX_PDSCH] error locking mutex.\n");
-    } else {
-      while (rx_pdsch_instance_cnt < 0) {
-        pthread_cond_wait(&rx_pdsch_cond,&rx_pdsch_mutex);
-      }
-
-      if (pthread_mutex_unlock(&rx_pdsch_mutex) != 0) {
-        LOG_E(PHY,"[SCHED][RX_PDSCH] error unlocking mutex.\n");
-      }
-    }
-
-    VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_THREAD, 1);
-
-    //      last_slot = rx_pdsch_slot;
-    subframe = UE->slot_rx>>1;
-    // Important! assumption that PDCCH procedure of next SF is not called yet
-    harq_pid = UE->dlsch_ue[eNB_id][0]->current_harq_pid;
-    UE->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->G = get_G(&UE->lte_frame_parms,
-        UE->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->nb_rb,
-        UE->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->rb_alloc_even,
-        get_Qm(UE->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->mcs),
-        UE->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->Nl,
-        UE->lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols,
-        UE->frame_rx,subframe);
-
-    if ((UE->transmission_mode[eNB_id] == 5) &&
-        (UE->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->dl_power_off==0) &&
-        (openair_daq_vars.use_ia_receiver > 0)) {
-      dual_stream_UE = 1;
-      eNB_id_i = UE->n_connected_eNB;
-
-      if (openair_daq_vars.use_ia_receiver == 2) {
-        i_mod =  get_Qm(((UE->frame_rx%1024)/3)%28);
-      } else {
-        i_mod =  get_Qm(UE->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->mcs);
-      }
-    } else {
-      dual_stream_UE = 0;
-      eNB_id_i = eNB_id+1;
-      i_mod = 0;
-    }
-
-    if (oai_exit) break;
-
-    LOG_D(PHY,"[SCHED][RX_PDSCH] Frame %d, slot %d: Calling rx_pdsch_decoding with harq_pid %d\n",UE->frame_rx,UE->slot_rx,harq_pid);
-
-
-    // Check if we are in even or odd slot
-    if (UE->slot_rx%2) { // odd slots
-
-      // measure time
-      //time0 = rt_get_time_ns();
-      //        rt_printk("[SCHED][RX_PDSCH][before rx_pdsch] Frame %d, slot %d, time %llu\n",UE->frame,last_slot,rt_get_time_ns());
-      for (m=pilot2; m<UE->lte_frame_parms.symbols_per_tti; m++) {
-
-        rx_pdsch(UE,
-                 PDSCH,
-                 eNB_id,
-                 eNB_id_i,
-                 subframe,
-                 m,
-                 0,
-                 dual_stream_UE,
-                 i_mod,
-                 harq_pid);
-
-      }
-
-      //        time1 = rt_get_time_ns();
-      //        rt_printk("[SCHED][RX_PDSCH] Frame %d, slot %d, start %llu, end %llu, proc time: %llu ns\n",UE->frame_rx,last_slot,time0,time1,(time1-time0));
-
-      dlsch_thread_index = harq_pid;
-
-      if (pthread_mutex_lock (&dlsch_mutex[dlsch_thread_index]) != 0) {               // Signal MAC_PHY Scheduler
-        LOG_E(PHY,"[UE  %d] ERROR pthread_mutex_lock\n",UE->Mod_id);     // lock before accessing shared resource
-        //  VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_OUT);
-        //return(-1);
-      }
-
-      dlsch_instance_cnt[dlsch_thread_index]++;
-      dlsch_subframe[dlsch_thread_index] = subframe;
-      pthread_mutex_unlock (&dlsch_mutex[dlsch_thread_index]);
-
-      if (dlsch_instance_cnt[dlsch_thread_index] == 0) {
-        if (pthread_cond_signal(&dlsch_cond[dlsch_thread_index]) != 0) {
-          LOG_E(PHY,"[UE  %d] ERROR pthread_cond_signal for dlsch_cond[%d]\n",UE->Mod_id,dlsch_thread_index);
-          //    VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_OUT);
-          //return(-1);
-        }
-      } else {
-        LOG_W(PHY,"[UE  %d] DLSCH thread for dlsch_thread_index %d busy!!!\n",UE->Mod_id,dlsch_thread_index);
-        //  VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_OUT);
-        //return(-1);
-      }
-
-    } else { // even slots
-
-      for (m=UE->lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols; m<pilot2; m++) {
-
-        rx_pdsch(UE,
-                 PDSCH,
-                 eNB_id,
-                 eNB_id_i,
-                 subframe,
-                 m,
-                 (m==UE->lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols)?1:0,   // first_symbol_flag
-                 dual_stream_UE,
-                 i_mod,
-                 harq_pid);
-      }
-    }
-
-
-    if (pthread_mutex_lock(&rx_pdsch_mutex) != 0) {
-      msg("[openair][SCHED][RX_PDSCH] error locking mutex.\n");
-    } else {
-      rx_pdsch_instance_cnt--;
-
-      if (pthread_mutex_unlock(&rx_pdsch_mutex) != 0) {
-        msg("[openair][SCHED][RX_PDSCH] error unlocking mutex.\n");
-      }
-    }
-
-  }
-
-#ifdef HARD_RT
-  rt_make_soft_real_time();
-#endif
-
-  LOG_D(PHY,"[openair][SCHED][RX_PDSCH] RX_PDSCH thread exiting\n");
-
-  return 0;
-}
-
-int init_rx_pdsch_thread(void)
-{
-
-  int error_code;
-  struct sched_param p;
-
-  pthread_mutex_init(&rx_pdsch_mutex,NULL);
-
-  pthread_cond_init(&rx_pdsch_cond,NULL);
-
-  pthread_attr_init (&attr_rx_pdsch_thread);
-  pthread_attr_setstacksize(&attr_rx_pdsch_thread,OPENAIR_THREAD_STACK_SIZE);
-
-  //attr_rx_pdsch_thread.priority = 1;
-
-  p.sched_priority = OPENAIR_THREAD_PRIORITY;
-  pthread_attr_setschedparam  (&attr_rx_pdsch_thread, &p);
-#ifndef RTAI_ISNT_POSIX
-  pthread_attr_setschedpolicy (&attr_rx_pdsch_thread, SCHED_FIFO);
-#endif
-
-  rx_pdsch_instance_cnt = -1;
-  rt_printk("[openair][SCHED][RX_PDSCH][INIT] Allocating RX_PDSCH thread\n");
-  error_code = pthread_create(&rx_pdsch_thread_var,
-                              &attr_rx_pdsch_thread,
-                              rx_pdsch_thread,
-                              0);
-
-  if (error_code!= 0) {
-    rt_printk("[openair][SCHED][RX_PDSCH][INIT] Could not allocate rx_pdsch_thread, error %d\n",error_code);
-    return(error_code);
-  } else {
-    rt_printk("[openair][SCHED][RX_PDSCH][INIT] Allocate rx_pdsch_thread successful\n");
-    return(0);
-  }
-
-}
-
-void cleanup_rx_pdsch_thread(void)
-{
-
-  rt_printk("[openair][SCHED][RX_PDSCH] Scheduling rx_pdsch_thread to exit\n");
-
-  rx_pdsch_instance_cnt = 0;
-
-  if (pthread_cond_signal(&rx_pdsch_cond) != 0)
-    rt_printk("[openair][SCHED][RX_PDSCH] ERROR pthread_cond_signal\n");
-  else
-    rt_printk("[openair][SCHED][RX_PDSCH] Signalled rx_pdsch_thread to exit\n");
-
-  rt_printk("[openair][SCHED][RX_PDSCH] Exiting ...\n");
-  pthread_cond_destroy(&rx_pdsch_cond);
-  pthread_mutex_destroy(&rx_pdsch_mutex);
-}
diff --git a/targets/RT/USER/sched_ulsch.c b/targets/RT/USER/sched_ulsch.c
deleted file mode 100644
index 3ab0c312f5..0000000000
--- a/targets/RT/USER/sched_ulsch.c
+++ /dev/null
@@ -1,255 +0,0 @@
-/*******************************************************************************
-    OpenAirInterface
-    Copyright(c) 1999 - 2014 Eurecom
-
-    OpenAirInterface is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-
-    OpenAirInterface is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with OpenAirInterface.The full GNU General Public License is
-    included in this distribution in the file called "COPYING". If not,
-    see <http://www.gnu.org/licenses/>.
-
-   Contact Information
-   OpenAirInterface Admin: openair_admin@eurecom.fr
-   OpenAirInterface Tech : openair_tech@eurecom.fr
-   OpenAirInterface Dev  : openair4g-devel@lists.eurecom.fr
-
-   Address      : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE
-
- *******************************************************************************/
-
-/*! \file sched_ulsch.c
-* \brief ULSCH decoding thread (RTAI)
-* \author R. Knopp, F. Kaltenberger
-* \date 2011
-* \version 0.1
-* \company Eurecom
-* \email: knopp@eurecom.fr,florian.kaltenberger@eurecom.fr
-* \note
-* \warning
-*/
-#include <stdio.h>
-#include <stdlib.h>
-#include <sched.h>
-
-#include "rt_wrapper.h"
-
-#include <sys/mman.h>
-
-#include "PHY/types.h"
-#include "PHY/defs.h"
-#include "PHY/extern.h"
-
-#include "SCHED/defs.h"
-
-#include "MAC_INTERFACE/extern.h"
-
-#ifdef CBMIMO1
-#include "ARCH/CBMIMO1/DEVICE_DRIVER/cbmimo1_device.h"
-#include "ARCH/CBMIMO1/DEVICE_DRIVER/extern.h"
-#include "ARCH/CBMIMO1/DEVICE_DRIVER/defs.h"
-#endif // CBMIMO1
-
-
-
-#define DEBUG_PHY
-
-/// Mutex for instance count on ulsch scheduling
-pthread_mutex_t ulsch_mutex[NUMBER_OF_UE_MAX];
-/// Condition variable for ulsch thread
-pthread_cond_t ulsch_cond[NUMBER_OF_UE_MAX];
-
-pthread_t ulsch_threads[NUMBER_OF_UE_MAX];
-pthread_attr_t attr_ulsch_threads;
-
-// activity indicators for harq_pid's
-int ulsch_instance_cnt[NUMBER_OF_UE_MAX];
-// process ids for cpu
-int ulsch_cpuid[NUMBER_OF_UE_MAX];
-// subframe number for each harq_pid (needed to store ack in right place for UL)
-int ulsch_subframe[NUMBER_OF_UE_MAX];
-
-extern int oai_exit;
-
-/*
-extern int ulsch_errors;
-extern int ulsch_received;
-extern int ulsch_errors_last;
-extern int ulsch_received_last;
-extern int ulsch_fer;
-extern int current_ulsch_cqi;
-*/
-
-/** ULSCH Decoding Thread */
-static void * ulsch_thread(void *param)
-{
-
-  //unsigned long cpuid;
-  unsigned int ulsch_thread_index = (unsigned int)param;
-
-  RTIME time_in,time_out;
-#ifdef RTAI
-  RT_TASK *task;
-  char ulsch_thread_name[64];
-#endif
-
-  int eNB_id = 0, UE_id = 0;
-  PHY_VARS_eNB *phy_vars_eNB = PHY_vars_eNB_g[eNB_id];
-
-  if ((ulsch_thread_index <0) || (ulsch_thread_index>NUMBER_OF_UE_MAX)) {
-    LOG_E(PHY,"[SCHED][ULSCH] Illegal ulsch_thread_index %d!!!!\n",ulsch_thread_index);
-    return 0;
-  }
-
-#ifdef RTAI
-  sprintf(ulsch_thread_name,"ULSCH_THREAD%d",ulsch_thread_index);
-
-  LOG_I(PHY,"[SCHED][ULSCH] starting ulsch_thread %s for process %d\n",
-        ulsch_thread_name,
-        ulsch_thread_index);
-
-  task = rt_task_init_schmod(nam2num(ulsch_thread_name), 0, 0, 0, SCHED_FIFO, 0xF);
-
-  if (task==NULL) {
-    LOG_E(PHY,"[SCHED][ULSCH] Problem starting ulsch_thread_index %d!!!!\n",ulsch_thread_index);
-    return 0;
-  } else {
-    LOG_I(PHY,"[SCHED][ULSCH] ulsch_thread for process %d started with id %p\n",
-          ulsch_thread_index,
-          task);
-  }
-
-#endif
-
-  mlockall(MCL_CURRENT | MCL_FUTURE);
-
-  //rt_set_runnable_on_cpuid(task,1);
-  //cpuid = rtai_cpuid();
-
-#ifdef HARD_RT
-  rt_make_hard_real_time();
-#endif
-
-  //ulsch_cpuid[ulsch_thread_index] = cpuid;
-
-  while (!oai_exit) {
-
-    if (pthread_mutex_lock(&ulsch_mutex[ulsch_thread_index]) != 0) {
-      LOG_E(PHY,"[SCHED][ULSCH] error locking mutex.\n");
-    } else {
-
-      while (ulsch_instance_cnt[ulsch_thread_index] < 0) {
-        pthread_cond_wait(&ulsch_cond[ulsch_thread_index],&ulsch_mutex[ulsch_thread_index]);
-      }
-
-      if (pthread_mutex_unlock(&ulsch_mutex[ulsch_thread_index]) != 0) {
-        LOG_E(PHY,"[SCHED][ULSCH] error unlocking mutex.\n");
-      }
-    }
-
-    if (oai_exit) break;
-
-    LOG_D(PHY,"[SCHED][ULSCH] Frame %d: Calling ulsch_decoding with ulsch_thread_index = %d\n",phy_vars_eNB->proc[0].frame_tx,ulsch_thread_index);
-
-    time_in = rt_get_time_ns();
-
-    ulsch_decoding_procedures(ulsch_subframe[ulsch_thread_index]<<1,ulsch_thread_index,phy_vars_eNB,0);
-
-    time_out = rt_get_time_ns();
-
-    if (pthread_mutex_lock(&ulsch_mutex[ulsch_thread_index]) != 0) {
-      msg("[openair][SCHED][ULSCH] error locking mutex.\n");
-    } else {
-      ulsch_instance_cnt[ulsch_thread_index]--;
-
-      if (pthread_mutex_unlock(&ulsch_mutex[ulsch_thread_index]) != 0) {
-        msg("[openair][SCHED][ULSCH] error unlocking mutex.\n");
-      }
-    }
-  }
-
-#ifdef HARD_RT
-  rt_make_soft_real_time();
-#endif
-
-  msg("[openair][SCHED][ULSCH] ULSCH thread %d exiting\n",ulsch_thread_index);
-
-  return 0;
-}
-
-int init_ulsch_threads(void)
-{
-
-  int error_code, return_code=0;
-  struct sched_param p;
-  int ulsch_thread_index;
-
-  // later loop on all harq_pids, do 0 for now
-  for (ulsch_thread_index=0; ulsch_thread_index<NUMBER_OF_UE_MAX; ulsch_thread_index++) {
-
-    pthread_mutex_init(&ulsch_mutex[ulsch_thread_index],NULL);
-
-    pthread_cond_init(&ulsch_cond[ulsch_thread_index],NULL);
-
-    pthread_attr_init (&attr_ulsch_threads);
-    pthread_attr_setstacksize(&attr_ulsch_threads,OPENAIR_THREAD_STACK_SIZE);
-
-    //attr_ulsch_threads.priority = 1;
-
-    p.sched_priority = OPENAIR_THREAD_PRIORITY;
-    pthread_attr_setschedparam  (&attr_ulsch_threads, &p);
-#ifndef RTAI_ISNT_POSIX
-    pthread_attr_setschedpolicy (&attr_ulsch_threads, SCHED_FIFO);
-#endif
-
-    ulsch_instance_cnt[ulsch_thread_index] = -1;
-    rt_printk("[openair][SCHED][ULSCH][INIT] Allocating ULSCH thread for ulsch_thread_index %d\n",ulsch_thread_index);
-    error_code = pthread_create(&ulsch_threads[ulsch_thread_index],
-                                &attr_ulsch_threads,
-                                ulsch_thread,
-                                (void *)ulsch_thread_index);
-
-    if (error_code!= 0) {
-      rt_printk("[openair][SCHED][ULSCH][INIT] Could not allocate ulsch_thread %d, error %d\n",ulsch_thread_index,error_code);
-      return_code+=error_code;
-      //return(error_code);
-    } else {
-      rt_printk("[openair][SCHED][ULSCH][INIT] Allocate ulsch_thread %d successful\n",ulsch_thread_index);
-      //return(0);
-    }
-  }
-
-  return(return_code);
-}
-
-void cleanup_ulsch_threads(void)
-{
-
-  int ulsch_thread_index;
-
-  for (ulsch_thread_index=0; ulsch_thread_index<NUMBER_OF_UE_MAX; ulsch_thread_index++) {
-
-    //  pthread_exit(&ulsch_threads[ulsch_thread_index]);
-    rt_printk("[openair][SCHED][ULSCH] Scheduling ulsch_thread %d to exit\n",ulsch_thread_index);
-
-    ulsch_instance_cnt[ulsch_thread_index] = 0;
-
-    if (pthread_cond_signal(&ulsch_cond[ulsch_thread_index]) != 0)
-      rt_printk("[openair][SCHED][ULSCH] ERROR pthread_cond_signal\n");
-    else
-      rt_printk("[openair][SCHED][ULSCH] Signalled ulsch_thread %d to exit\n",ulsch_thread_index);
-
-    rt_printk("[openair][SCHED][ULSCH] Exiting ...\n");
-    pthread_cond_destroy(&ulsch_cond[ulsch_thread_index]);
-    pthread_mutex_destroy(&ulsch_mutex[ulsch_thread_index]);
-  }
-}
-- 
GitLab